/** | |
* $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 org.jivesoftware.smack.packet.IQ; | |
import org.jivesoftware.smack.provider.IQProvider; | |
import org.xmlpull.v1.XmlPullParser; | |
import java.text.SimpleDateFormat; | |
import java.util.*; | |
/** | |
* Packet used for requesting information about occupants of a room or for retrieving information | |
* such information. | |
* | |
* @author Gaston Dombiak | |
*/ | |
public class OccupantsInfo extends IQ { | |
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 String roomID; | |
private final Set<OccupantInfo> occupants; | |
public OccupantsInfo(String roomID) { | |
this.roomID = roomID; | |
this.occupants = new HashSet<OccupantInfo>(); | |
} | |
public String getRoomID() { | |
return roomID; | |
} | |
public int getOccupantsCount() { | |
return occupants.size(); | |
} | |
public Set<OccupantInfo> getOccupants() { | |
return Collections.unmodifiableSet(occupants); | |
} | |
public String getChildElementXML() { | |
StringBuilder buf = new StringBuilder(); | |
buf.append("<").append(ELEMENT_NAME).append(" xmlns=\"").append(NAMESPACE); | |
buf.append("\" roomID=\"").append(roomID).append("\">"); | |
synchronized (occupants) { | |
for (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 static class OccupantInfo { | |
private String jid; | |
private String nickname; | |
private 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 String getNickname() { | |
return nickname; | |
} | |
public Date getJoined() { | |
return joined; | |
} | |
} | |
/** | |
* Packet extension provider for AgentStatusRequest packets. | |
*/ | |
public static class Provider implements IQProvider { | |
public IQ parseIQ(XmlPullParser parser) throws Exception { | |
if (parser.getEventType() != XmlPullParser.START_TAG) { | |
throw new IllegalStateException("Parser not in proper position, or bad XML."); | |
} | |
OccupantsInfo occupantsInfo = new OccupantsInfo(parser.getAttributeValue("", "roomID")); | |
boolean done = false; | |
while (!done) { | |
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) { | |
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); | |
} | |
} | |
} |