private void serviceDeliver( String targetId, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws ServletException, IOException { if (gateway.getClientDelegate(targetId) == null) { // Expired client tries to deliver without handshake httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED); return; } byte[] body = Utils.read(httpRequest.getInputStream()); RHTTPResponse response = RHTTPResponse.fromFrameBytes(body); ExternalRequest externalRequest = gateway.removeExternalRequest(response.getId()); if (externalRequest != null) { externalRequest.respond(response); logger.debug( "Deliver request from device {}, gateway request {}, response {}", new Object[] {targetId, externalRequest, response}); } else { // We can arrive here for a race with the continuation expiration, which expired just before // the gateway client responded with a valid response; log this case ignore it. logger.debug( "Deliver request from device {}, missing gateway request, response {}", targetId, response); } }
private void serviceHandshake( String targetId, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException { ClientDelegate client = gateway.getClientDelegate(targetId); if (client != null) throw new IOException("Client with targetId " + targetId + " is already connected"); client = gateway.newClientDelegate(targetId); ClientDelegate existing = gateway.addClientDelegate(targetId, client); if (existing != null) throw new IOException("Client with targetId " + targetId + " is already connected"); flush(client, httpRequest, httpResponse); }
private void serviceConnect( String targetId, HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException { unschedule(targetId); ClientDelegate client = gateway.getClientDelegate(targetId); if (client == null) { // Expired client tries to connect without handshake httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED); return; } flush(client, httpRequest, httpResponse); if (client.isClosed()) gateway.removeClientDelegate(targetId); }
private void serviceDisconnect( String targetId, HttpServletRequest request, HttpServletResponse response) { // Do not remove the ClientDelegate from the gateway here, // since closing the ClientDelegate will resume the connect request // and we remove the ClientDelegate from the gateway there ClientDelegate client = gateway.getClientDelegate(targetId); if (client != null) client.close(); }
@Override public void run() { try { Thread.sleep(_delay); _zkServer.start(); } catch (Exception e) { // ignore } }
private void expireConnect(ClientDelegate client, long time) { String targetId = client.getTargetId(); logger.info( "Client with targetId {} missing, last seen {} ms ago, closing it", targetId, System.currentTimeMillis() - time); client.close(); // If the client expired, means that it did not connect, // so there no request to resume, and we cleanup here // (while normally this cleanup is done in serviceConnect()) unschedule(targetId); gateway.removeClientDelegate(targetId); }
private void publicaSensor(Gateway gateway, Sensor sensor) throws Exception { // make sure cookies is turn on CookieHandler.setDefault(new CookieManager()); HTTPClient http = new HTTPClient(); List<NameValuePair> postp = new ArrayList<>(); postp.add(new BasicNameValuePair("login", "huberto")); postp.add(new BasicNameValuePair("password", "99766330")); http.sendPost(this.urlLogin, postp); List<NameValuePair> SensorParams = new ArrayList<>(); SensorParams.add(new BasicNameValuePair("sensor_nome", sensor.getNome())); SensorParams.add(new BasicNameValuePair("sensor_desc", sensor.getDescricao())); SensorParams.add(new BasicNameValuePair("sensor_modelo", sensor.getModelo())); SensorParams.add(new BasicNameValuePair("sensor_precisao", sensor.getPrecisao())); SensorParams.add(new BasicNameValuePair("sensor_tipo", sensor.getTipo())); SensorParams.add( new BasicNameValuePair("sensor_servidorborda", Integer.toString(this.ServidorBordaID))); SensorParams.add(new BasicNameValuePair("sensor_gateway", Integer.toString(gateway.getId()))); String result = http.GetPageContent(this.insertSensorURI, SensorParams); // System.out.println(result); String publicType = result.split(":")[0]; String sensorID = result.split(":")[1]; sensor.setId(Integer.parseInt(sensorID)); if (null != publicType) switch (publicType) { case "insert": System.out.println( "-> Sensor " + sensor.getNome() + "(" + sensor.getId() + ") cadastrado no Servidor de Contexto com sucesso."); break; case "update": System.out.println( "-> Sensor " + sensor.getNome() + "(" + sensor.getId() + ") atualizado no Servidor de Contexto com sucesso."); break; } }
private void toggleGateway(Gateway gateway, String job) throws Exception { CookieHandler.setDefault(new CookieManager()); HTTPClient http = new HTTPClient(); List<NameValuePair> postp = new ArrayList<>(); postp.add(new BasicNameValuePair("login", "huberto")); postp.add(new BasicNameValuePair("password", "99766330")); http.sendPost(this.urlLogin, postp); List<NameValuePair> GatewayParams = new ArrayList<>(); GatewayParams.add(new BasicNameValuePair("gateway_id", Integer.toString(gateway.getId()))); GatewayParams.add(new BasicNameValuePair("job", job)); String result = http.GetPageContent(this.toggleGateway, GatewayParams); if (null != result) switch (result) { case "desativado": System.out.println( "-> Gateway " + gateway.getNome() + "(" + gateway.getId() + ") DESATIVADO no Servidor de Contexto"); break; case "ativado": System.out.println( "-> Gateway " + gateway.getNome() + "(" + gateway.getId() + ") ATIVADO no Servidor de Contexto"); break; } }
public void run() { // /////////////////////////// Gateway.addLiveThread(this); // /////////////////////////// while (Gateway.running) { try { pdud = (PDUData) fromSMSC.dequeue(); // blocks until having // an item // pdu = (PDU) fromSMSC.dequeue(); //blocks until having an item pdu = (PDU) pdud.getPDU(); if (pdu.isRequest()) { this.RequestID = pdud.getRequestID(); processRequest(pdu); } } catch (DBException ex) { // when lost connection to db Logger.error(this.getClass().getName(), "DBException: " + ex.getMessage()); DBTools.ALERT( "RequestProcessor", "RequestProcessor", Constants.ALERT_WARN, Preference.Channel + "DBException: " + ex.getMessage(), Preference.ALERT_CONTACT); Logger.error(this.getClass().getName(), "Alert2YM DBException: " + ex.getMessage()); } catch (Exception e) { Logger.error(this.getClass().getName(), "Exception: " + e.getMessage()); DBTools.ALERT( "RequestProcessor", "RequestProcessor", Constants.ALERT_WARN, Preference.Channel + "Exception: " + e.getMessage(), Preference.ALERT_CONTACT); } try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } // ///////////////////////////// Logger.info(this.getClass().getName(), "{" + this.getClass().getName() + " stopped}"); this.destroy(); // ///////////////////////////// }
private void publicaGateway(Gateway gateway) throws Exception { // make sure cookies is turn on CookieHandler.setDefault(new CookieManager()); HTTPClient http = new HTTPClient(); List<NameValuePair> postp = new ArrayList<>(); postp.add(new BasicNameValuePair("login", "huberto")); postp.add(new BasicNameValuePair("password", "99766330")); http.sendPost(this.urlLogin, postp); List<NameValuePair> GatewayParams = new ArrayList<>(); GatewayParams.add(new BasicNameValuePair("gateway_nome", gateway.getNome())); GatewayParams.add( new BasicNameValuePair("gateway_servidorborda", Integer.toString(this.ServidorBordaID))); GatewayParams.add(new BasicNameValuePair("gateway_uid", (String) gateway.getUid())); String result = http.GetPageContent(this.insertGatewayURI, GatewayParams); // System.out.println(result); String publicType = result.split(":")[0]; String gatewayID = result.split(":")[1]; gateway.setId(Integer.parseInt(gatewayID)); if (null != publicType) switch (publicType) { case "insert": System.out.println( "-> Gateway " + gateway.getNome() + "(" + gateway.getId() + ") cadastrado no Servidor de Contexto com sucesso."); break; case "update": System.out.println( "-> Gateway " + gateway.getNome() + "(" + gateway.getId() + ") atualizado no Servidor de Contexto com sucesso."); toggleGateway(gateway, "activate"); break; } }
private void performStateRecovery(boolean enforceRecoverAfterTime, String reason) { final Gateway.GatewayStateRecoveredListener recoveryListener = new GatewayRecoveryListener(); if (enforceRecoverAfterTime && recoverAfterTime != null) { if (scheduledRecovery.compareAndSet(false, true)) { logger.info("delaying initial state recovery for [{}]. {}", recoverAfterTime, reason); threadPool.schedule( recoverAfterTime, ThreadPool.Names.GENERIC, () -> { if (recovered.compareAndSet(false, true)) { logger.info( "recover_after_time [{}] elapsed. performing state recovery...", recoverAfterTime); gateway.performStateRecovery(recoveryListener); } }); } } else { if (recovered.compareAndSet(false, true)) { threadPool .generic() .execute( new AbstractRunnable() { @Override public void onFailure(Exception e) { logger.warn("Recovery failed", e); // we reset `recovered` in the listener don't reset it here otherwise there // might be a race // that resets it to false while a new recover is already running? recoveryListener.onFailure("state recovery failed: " + e.getMessage()); } @Override protected void doRun() throws Exception { gateway.performStateRecovery(recoveryListener); } }); } } }
public void destroy() { Gateway.removeThread(this); }
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { logger.debug("History Export Servlet called"); String key = request.getParameter("key"); logger.debug("Checking session for object with key " + key); EnergyDataHistoryQueryResult result = (EnergyDataHistoryQueryResult) request.getSession().getAttribute(key); // Cehck to see if the object exists if (result == null) { if (logger.isWarnEnabled()) logger.warn("Results not found for key " + key); response.setStatus(HttpServletResponse.SC_NOT_FOUND); PrintWriter out = response.getWriter(); out.write("Gateway Not Found."); out.close(); return; } StringBuilder fileNameBuilder = new StringBuilder(); fileNameBuilder .append("export-") .append(result.getGroup().getDescription()) .append("-") .append(result.getHistoryType()) .append("-") .append(result.getStartTime()) .append(".csv"); String fileName = cleanFileName(fileNameBuilder.toString().toLowerCase()); if (logger.isDebugEnabled()) logger.debug("Using filename " + fileName); response.setHeader("Content-Type", "text/csv"); response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); PrintWriter writer = response.getWriter(); // Create the header writer.append("Date"); writer.append(","); writer.append("Total Energy"); writer.append(","); writer.append("Total Cost"); for (Gateway g : result.getGatewayList()) { writer.append(","); writer .append(g.getDescription()) .append(" (") .append(Long.toHexString(g.getId()).toUpperCase()) .append(") Power"); writer.append(","); writer .append(g.getDescription()) .append(" (") .append(Long.toHexString(g.getId()).toUpperCase()) .append(") Cost"); } writer.append("\n"); SimpleDateFormat dateFormat = getDateFormat(result.getHistoryType()); DecimalFormat pwrFormat = new DecimalFormat("0.000"); DecimalFormat cstFormat = new DecimalFormat("0.00"); int index = 0; // Write each line of data. for (EnergyDataHistory history : result.getNetHistoryList()) { writer.append(dateFormat.format(history.getHistoryDate().getTime())); writer.append(","); writer.append(pwrFormat.format(history.getEnergy() / 1000.0)); writer.append(","); writer.append(cstFormat.format(history.getCost())); for (Gateway g : result.getGatewayList()) { EnergyDataHistory gh = result.getGatewayHistoryList().get(g.getId()).get(index); writer.append(","); writer.append(pwrFormat.format(gh.getEnergy() / 1000.0)); writer.append(","); writer.append(cstFormat.format(gh.getCost())); } writer.append("\n"); index++; } writer.flush(); writer.close(); logger.debug("Clearing out session object"); request.getSession().removeAttribute(key); } catch (Exception ex) { response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); logger.error("Error parsing inbound xml:" + ex.getMessage(), ex); } }