예제 #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
  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);
      }
    }
  }