/** * $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.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Date; import java.util.List; import java.util.TimeZone; import org.jivesoftware.smack.packet.PacketExtension; import org.jivesoftware.smack.provider.PacketExtensionProvider; import org.xmlpull.v1.XmlPullParser; /** * Agent status packet. * * @author Matt Tucker */ public class AgentStatus implements PacketExtension { /** * Represents information about a Chat where this Agent is participating. * * @author Gaston Dombiak */ public static class ChatInfo { private final String sessionID; private final String userID; private final Date date; private final String email; private final String username; private final String question; public ChatInfo(String sessionID, String userID, Date date, String email, String username, String question) { this.sessionID = sessionID; this.userID = userID; this.date = date; this.email = email; this.username = username; this.question = question; } /** * Returns the date when this agent joined the chat. * * @return the date when this agent joined the chat. */ public Date getDate() { return date; } /** * Returns the email address associated with the user. * * @return the email address associated with the user. */ public String getEmail() { return email; } /** * Returns the question the user asked. * * @return the question the user asked, if any. */ public String getQuestion() { return question; } /** * Returns the sessionID associated to this chat. Each chat will have a * unique sessionID that could be used for retrieving the whole * transcript of the conversation. * * @return the sessionID associated to this chat. */ public String getSessionID() { return sessionID; } /** * Returns the user unique identification of the user that made the * initial request and for which this chat was generated. If the user * joined using an anonymous connection then the userID will be the * value of the ID attribute of the USER element. Otherwise, the userID * will be the bare JID of the user that made the request. * * @return the user unique identification of the user that made the * initial request. */ public String getUserID() { return userID; } /** * Returns the username(nickname) associated with the user. * * @return the username associated with the user. */ public String getUsername() { return username; } public String toXML() { final StringBuilder buf = new StringBuilder(); buf.append("<chat "); if (sessionID != null) { buf.append(" sessionID=\"").append(sessionID).append("\""); } if (userID != null) { buf.append(" userID=\"").append(userID).append("\""); } if (date != null) { buf.append(" startTime=\"").append(UTC_FORMAT.format(date)) .append("\""); } if (email != null) { buf.append(" email=\"").append(email).append("\""); } if (username != null) { buf.append(" username=\"").append(username).append("\""); } if (question != null) { buf.append(" question=\"").append(question).append("\""); } buf.append("/>"); return buf.toString(); } } /** * Packet extension provider for AgentStatus packets. */ public static class Provider implements PacketExtensionProvider { private ChatInfo parseChatInfo(XmlPullParser parser) { final String sessionID = parser.getAttributeValue("", "sessionID"); final String userID = parser.getAttributeValue("", "userID"); Date date = null; try { date = UTC_FORMAT.parse(parser.getAttributeValue("", "startTime")); } catch (final ParseException e) { } final String email = parser.getAttributeValue("", "email"); final String username = parser.getAttributeValue("", "username"); final String question = parser.getAttributeValue("", "question"); return new ChatInfo(sessionID, userID, date, email, username, question); } @Override public PacketExtension parseExtension(XmlPullParser parser) throws Exception { final AgentStatus agentStatus = new AgentStatus(); agentStatus.workgroupJID = parser.getAttributeValue("", "jid"); boolean done = false; while (!done) { final int eventType = parser.next(); if (eventType == XmlPullParser.START_TAG) { if ("chat".equals(parser.getName())) { agentStatus.currentChats.add(parseChatInfo(parser)); } else if ("max-chats".equals(parser.getName())) { agentStatus.maxChats = Integer.parseInt(parser .nextText()); } } else if (eventType == XmlPullParser.END_TAG && ELEMENT_NAME.equals(parser.getName())) { done = true; } } return agentStatus; } } 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 = "agent-status"; /** * Namespace of the packet extension. */ public static final String NAMESPACE = "http://jabber.org/protocol/workgroup"; private String workgroupJID; private final List<ChatInfo> currentChats = new ArrayList<ChatInfo>(); private int maxChats = -1; AgentStatus() { } /** * Returns a collection of ChatInfo where each ChatInfo represents a Chat * where this agent is participating. * * @return a collection of ChatInfo where each ChatInfo represents a Chat * where this agent is participating. */ public List<ChatInfo> getCurrentChats() { return Collections.unmodifiableList(currentChats); } @Override public String getElementName() { return ELEMENT_NAME; } public int getMaxChats() { return maxChats; } @Override public String getNamespace() { return NAMESPACE; } public String getWorkgroupJID() { return workgroupJID; } @Override public String toXML() { final StringBuilder buf = new StringBuilder(); buf.append("<").append(ELEMENT_NAME).append(" xmlns=\"") .append(NAMESPACE).append("\""); if (workgroupJID != null) { buf.append(" jid=\"").append(workgroupJID).append("\""); } buf.append(">"); if (maxChats != -1) { buf.append("<max-chats>").append(maxChats).append("</max-chats>"); } if (!currentChats.isEmpty()) { buf.append("<current-chats xmlns= \"http://jivesoftware.com/protocol/workgroup\">"); for (final ChatInfo chatInfo : currentChats) { buf.append(chatInfo.toXML()); } buf.append("</current-chats>"); } buf.append("</").append(getElementName()).append("> "); return buf.toString(); } }