/** * $Revision$ * $Date$ * * Copyright 2003-2007 Jive Software. * * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.jivesoftware.smackx.workgroup.packet; import java.text.SimpleDateFormat; import java.util.Collections; import java.util.Date; import java.util.HashSet; import java.util.Set; import java.util.TimeZone; import org.jivesoftware.smack.packet.IQ; import org.jivesoftware.smack.provider.IQProvider; import org.xmlpull.v1.XmlPullParser; /** * Packet used for requesting information about occupants of a room or for * retrieving information such information. * * @author Gaston Dombiak */ public class OccupantsInfo extends IQ { public static class OccupantInfo { private final String jid; private final String nickname; private final Date joined; public OccupantInfo(String jid, String nickname, Date joined) { this.jid = jid; this.nickname = nickname; this.joined = joined; } public String getJID() { return jid; } public Date getJoined() { return joined; } public String getNickname() { return nickname; } } /** * Packet extension provider for AgentStatusRequest packets. */ public static class Provider implements IQProvider { @Override public IQ parseIQ(XmlPullParser parser) throws Exception { if (parser.getEventType() != XmlPullParser.START_TAG) { throw new IllegalStateException( "Parser not in proper position, or bad XML."); } final OccupantsInfo occupantsInfo = new OccupantsInfo( parser.getAttributeValue("", "roomID")); boolean done = false; while (!done) { final int eventType = parser.next(); if ((eventType == XmlPullParser.START_TAG) && ("occupant".equals(parser.getName()))) { occupantsInfo.occupants.add(parseOccupantInfo(parser)); } else if (eventType == XmlPullParser.END_TAG && ELEMENT_NAME.equals(parser.getName())) { done = true; } } return occupantsInfo; } private OccupantInfo parseOccupantInfo(XmlPullParser parser) throws Exception { boolean done = false; String jid = null; String nickname = null; Date joined = null; while (!done) { final int eventType = parser.next(); if ((eventType == XmlPullParser.START_TAG) && ("jid".equals(parser.getName()))) { jid = parser.nextText(); } else if ((eventType == XmlPullParser.START_TAG) && ("nickname".equals(parser.getName()))) { nickname = parser.nextText(); } else if ((eventType == XmlPullParser.START_TAG) && ("joined".equals(parser.getName()))) { joined = UTC_FORMAT.parse(parser.nextText()); } else if (eventType == XmlPullParser.END_TAG && "occupant".equals(parser.getName())) { done = true; } } return new OccupantInfo(jid, nickname, joined); } } private static final SimpleDateFormat UTC_FORMAT = new SimpleDateFormat( "yyyyMMdd'T'HH:mm:ss"); static { UTC_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT+0")); } /** * Element name of the packet extension. */ public static final String ELEMENT_NAME = "occupants-info"; /** * Namespace of the packet extension. */ public static final String NAMESPACE = "http://jivesoftware.com/protocol/workgroup"; private final String roomID; private final Set<OccupantInfo> occupants; public OccupantsInfo(String roomID) { this.roomID = roomID; occupants = new HashSet<OccupantInfo>(); } @Override public String getChildElementXML() { final StringBuilder buf = new StringBuilder(); buf.append("<").append(ELEMENT_NAME).append(" xmlns=\"") .append(NAMESPACE); buf.append("\" roomID=\"").append(roomID).append("\">"); synchronized (occupants) { for (final OccupantInfo occupant : occupants) { buf.append("<occupant>"); // Add the occupant jid buf.append("<jid>"); buf.append(occupant.getJID()); buf.append("</jid>"); // Add the occupant nickname buf.append("<name>"); buf.append(occupant.getNickname()); buf.append("</name>"); // Add the date when the occupant joined the room buf.append("<joined>"); buf.append(UTC_FORMAT.format(occupant.getJoined())); buf.append("</joined>"); buf.append("</occupant>"); } } buf.append("</").append(ELEMENT_NAME).append("> "); return buf.toString(); } public Set<OccupantInfo> getOccupants() { return Collections.unmodifiableSet(occupants); } public int getOccupantsCount() { return occupants.size(); } public String getRoomID() { return roomID; } }