예제 #1
0
  public synchronized Ticket bind(Endpoint endpoint) {
    EndOid oid = endpoint.endOid;
    registry.put(oid, endpoint);
    roster.addBuddies(oid, endpoint.buddyOids);
    roster.joinGroups(oid, endpoint.roomOids);

    Ticket ticket = new Ticket(oid.clazz, oid.name);
    Subscriber subscriber = new Subscriber(ticket);
    List<Subscriber> subscribers = routes.get(oid);
    if (subscribers == null) {
      subscribers = new ArrayList<Subscriber>();
    }
    subscribers.add(subscriber);
    routes.put(oid, subscribers);

    for (EndOid buddyOid : endpoint.buddyOids) {
      Presence presence = new Presence("online", endpoint.endOid, buddyOid);
      presence.setShow(endpoint.show);
      presence.setNick(endpoint.nick);
      presence.setStatus(endpoint.status);
      route(ticket, presence);
    }

    // join group presence
    for (EndOid grpOid : endpoint.roomOids) {
      Presence p = new Presence("grponline", endpoint.endOid, grpOid);
      p.setNick(endpoint.nick);
      p.setShow("available");
      p.setStatus(grpOid.name);
      route(ticket, p);
    }
    return ticket;
  }
예제 #2
0
 public void leave(EndOid grpOid, EndOid userOid) {
   roster.leave(grpOid, userOid);
   Presence p = new Presence("leave", userOid, grpOid);
   Endpoint ep = lookup(userOid);
   if (ep != null) {
     p.setNick(ep.nick);
     p.setShow("available");
     p.setStatus(grpOid.name);
   }
   route(null, p);
 }
예제 #3
0
  @Test
  public void setPresenceStatusTest()
      throws IOException, SAXException, ParserConfigurationException {
    final String status = "This is a test of the emergency broadcast system.";

    StringBuilder controlBuilder = new StringBuilder();
    controlBuilder
        .append("<presence>")
        .append("<status>")
        .append(status)
        .append("</status>")
        .append("</presence>");
    String control = controlBuilder.toString();

    Presence presence = getNewPresence();
    presence.setStatus(status);

    assertEquals(status, presence.getStatus());
    assertXMLEqual(control, presence.toXML());
  }
예제 #4
0
  protected synchronized void clean() {
    long now = System.currentTimeMillis();

    //		System.out.println("begin to clean: " + now);
    // clean subscribers
    Set<EndOid> keys = routes.keySet();
    for (EndOid key : keys) {
      List<Subscriber> subscribers = routes.get(key);
      Iterator<Subscriber> it = subscribers.iterator();
      while (it.hasNext()) {
        Subscriber sub = it.next();
        if ((sub.continuation == null || sub.continuation.isExpired())
            && ((sub.lastActive + 8000) < now)) {
          System.out.println("Clean NoTimeout Sub: " + sub);
          it.remove();
        } else if ((sub.lastActive + 28000) < now) {
          System.out.println("Clean Timeout Sub: " + sub);
          // TODO: when continuation cannot be expired
          if (sub.continuation != null && sub.continuation.isSuspended()) {
            sub.continuation.resume();
            sub.continuation = null;
          }
          it.remove();
        }
      }
      if (subscribers.size() == 0) {
        Endpoint ep = registry.get(key);
        if (ep != null && !ep.idle) {
          ep.idle = true;
          ep.idleTime = System.currentTimeMillis();
        }
      }
      routes.put(key, subscribers);
    }
    // clean endpoints
    Iterator<EndOid> keysIter = registry.keySet().iterator();

    //		for (EndOid key : keys) {
    while (keysIter.hasNext()) {
      EndOid key = keysIter.next();
      Endpoint ep = registry.get(key);
      if (ep.idle && (ep.idleTime + 8000) < now) {
        // System.out.println("Clean Endpoint: " + key);
        // presence
        List<Buddy> buddies = roster.buddies(key);
        for (Buddy b : buddies) {
          Presence p = new Presence("offline", key, b.fid);
          p.setNick(ep.nick);
          p.setShow("unavailable");
          p.setStatus(ep.status);
          // TODO:
          route(null, p);
        }
        // leave group presences
        for (EndOid grpOid : roster.groups(key)) {
          Presence p = new Presence("grpoffline", ep.endOid, grpOid);
          p.setNick(ep.nick);
          p.setShow("unavailable");
          p.setStatus(grpOid.name);
          route(null, p);
        }
        // remove
        //				registry.remove(key);
        keysIter.remove();
        routes.remove(key);
        roster.clean(key);
      }
    }
  }
예제 #5
0
  /**
   * Parses a presence packet.
   *
   * @param parser the XML parser, positioned at the start of a presence packet.
   * @return a Presence packet.
   * @throws Exception if an exception occurs while parsing the packet.
   */
  public static Presence parsePresence(XmlPullParser parser) throws Exception {
    Presence.Type type = Presence.Type.available;
    String typeString = parser.getAttributeValue("", "type");
    if (typeString != null && !typeString.equals("")) {
      try {
        type = Presence.Type.valueOf(typeString);
      } catch (IllegalArgumentException iae) {
        LOGGER.log(Level.SEVERE, "Found invalid presence type " + typeString);
      }
    }
    Presence presence = new Presence(type);
    presence.setTo(parser.getAttributeValue("", "to"));
    presence.setFrom(parser.getAttributeValue("", "from"));
    String id = parser.getAttributeValue("", "id");
    presence.setPacketID(id == null ? Packet.ID_NOT_AVAILABLE : id);

    String language = getLanguageAttribute(parser);
    if (language != null && !"".equals(language.trim())) {
      presence.setLanguage(language);
    }
    presence.setPacketID(id == null ? Packet.ID_NOT_AVAILABLE : id);

    // Parse sub-elements
    boolean done = false;
    while (!done) {
      int eventType = parser.next();
      if (eventType == XmlPullParser.START_TAG) {
        String elementName = parser.getName();
        String namespace = parser.getNamespace();
        if (elementName.equals("status")) {
          try {
            presence.setStatus(parser.nextText());
          } catch (Throwable t) {
            LOGGER.log(Level.SEVERE, "Error parsing presence status", t);
          }
        } else if (elementName.equals("priority")) {
          try {
            int priority = Integer.parseInt(parser.nextText());
            presence.setPriority(priority);
          } catch (NumberFormatException nfe) {
            // Ignore.
          } catch (IllegalArgumentException iae) {
            // Presence priority is out of range so assume priority to be zero
            presence.setPriority(0);
          }
        } else if (elementName.equals("show")) {
          String modeText = parser.nextText();
          try {
            presence.setMode(Presence.Mode.valueOf(modeText));
          } catch (IllegalArgumentException iae) {
            LOGGER.log(Level.SEVERE, "Found invalid presence mode " + modeText);
          }
        } else if (elementName.equals("error")) {
          presence.setError(parseError(parser));
        } else if (elementName.equals("properties") && namespace.equals(PROPERTIES_NAMESPACE)) {
          Map<String, Object> properties = parseProperties(parser);
          // Set packet properties.
          for (String name : properties.keySet()) {
            presence.setProperty(name, properties.get(name));
          }
        }
        // Otherwise, it must be a packet extension.
        else {
          presence.addExtension(
              PacketParserUtils.parsePacketExtension(elementName, namespace, parser));
        }
      } else if (eventType == XmlPullParser.END_TAG) {
        if (parser.getName().equals("presence")) {
          done = true;
        }
      }
    }
    return presence;
  }