/** * $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.PacketExtension; import org.jivesoftware.smack.provider.PacketExtensionProvider; import org.xmlpull.v1.XmlPullParser; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * Agent status packet. * * @author Matt Tucker */ public class AgentStatus implements PacketExtension { 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 List<ChatInfo> currentChats = new ArrayList<ChatInfo>(); private int maxChats = -1; AgentStatus() { } public String getWorkgroupJID() { return workgroupJID; } /** * 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); } public int getMaxChats() { return maxChats; } public String getElementName() { return ELEMENT_NAME; } public String getNamespace() { return NAMESPACE; } public String toXML() { 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 (Iterator<ChatInfo> it = currentChats.iterator(); it.hasNext();) { buf.append(((ChatInfo)it.next()).toXML()); } buf.append("</current-chats>"); } buf.append("</").append(this.getElementName()).append("> "); return buf.toString(); } /** * Represents information about a Chat where this Agent is participating. * * @author Gaston Dombiak */ public static class ChatInfo { private String sessionID; private String userID; private Date date; private String email; private String username; private 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 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 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 username(nickname) associated with the user. * * @return the username associated with the user. */ public String getUsername() { return username; } /** * Returns the question the user asked. * * @return the question the user asked, if any. */ public String getQuestion() { return question; } public String toXML() { 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 { public PacketExtension parseExtension(XmlPullParser parser) throws Exception { AgentStatus agentStatus = new AgentStatus(); agentStatus.workgroupJID = parser.getAttributeValue("", "jid"); boolean done = false; while (!done) { 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 ChatInfo parseChatInfo(XmlPullParser parser) { String sessionID = parser.getAttributeValue("", "sessionID"); String userID = parser.getAttributeValue("", "userID"); Date date = null; try { date = UTC_FORMAT.parse(parser.getAttributeValue("", "startTime")); } catch (ParseException e) { } String email = parser.getAttributeValue("", "email"); String username = parser.getAttributeValue("", "username"); String question = parser.getAttributeValue("", "question"); return new ChatInfo(sessionID, userID, date, email, username, question); } } }