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; }
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); }
@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()); }
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); } } }
/** * 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; }