Exemplo n.º 1
0
  /** Reads the remote service (http lookup) and send updated data to JMS bus */
  @Scheduled(fixedRate = 1000)
  private void onTick() {

    // Get transport positions from the source
    String positions = getTransportPositions();

    // Connectivity OK, let's go with agent processing
    if (positions == null || positions.isEmpty()) {
      logger.warn("No transport positions readed!");
      return;
    }

    String[] lines = positions.split(LINE_SEPARATOR);

    if (lines.length == 0) {
      logger.warn("Could not split different lines from positions result string");
      return;
    }

    String[] attr;
    float latitude, longitude;
    int orientation;

    for (int i = 0; i < lines.length; i++) {

      attr = lines[i].split(FIELD_SEPARATOR);

      if (attr.length < 5) {
        logger.warn("Could not split different fields with ';' from line result: {}", lines[i]);
        continue;
      }

      latitude = 0f;
      longitude = 0f;
      orientation = 0;
      String id = EMPTY_IDENTIFIER;
      String line = EMPTY_IDENTIFIER;

      try {
        latitude = Float.valueOf(attr[3]);
        longitude = Float.valueOf(attr[2]);
        line = attr[1];
        id = attr[0];
        orientation = Integer.valueOf(attr[4]);
      } catch (Exception e) {
        logger.warn(
            "Could not parse result string for position data: {}. Exception: {}", positions, e);
        continue;
      }

      int mod = orientation % 45;
      if (mod < 23) orientation -= mod;
      else orientation += (45 - mod);

      if (orientation == 360) orientation = 0;

      boolean changed = false;

      TransportInfo transportInfo;
      if (transports.containsKey(id)) {
        transportInfo = transports.get(id);

        if (transportInfo.isOrientationDiferent(orientation)
            || transportInfo.isPositionDiferent(latitude, longitude)
            || transportInfo.isLineDiferent(line)) changed = true;

      } else {
        transportInfo = new TransportInfo();
        transportInfo.setId(id);
        transportInfo.setLine(line);
        transports.put(id, transportInfo);
        changed = true;
      }

      if (changed) {
        transportInfo.setLatitude(latitude);
        transportInfo.setLongitude(longitude);
        transportInfo.setOrientation(orientation);
        transportInfo.setLastupdate(System.currentTimeMillis());
        if (!transportInfo.isLineDiferent(line)) {
          line = EMPTY_IDENTIFIER;
        } else {
          transportInfo.setLine(line);
        }

        // Send JMS Message
        sendBusPosition(line, id, latitude, longitude, orientation);
      }
    }

    Vector<String> idsToRemove = new Vector<String>();
    for (TransportInfo info : transports.values()) {
      if ((System.currentTimeMillis() - info.getLastupdate()) > UPDATE_TIMEOUT) {
        idsToRemove.add(info.getId());
      }
    }

    for (String id : idsToRemove) {
      transports.remove(id);
    }
  }