QueueDetails.java

  1. /**
  2.  *
  3.  * Copyright 2003-2007 Jive Software.
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *     http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */

  17. package org.jivesoftware.smackx.workgroup.packet;

  18. import java.io.IOException;
  19. import java.text.ParseException;
  20. import java.text.SimpleDateFormat;
  21. import java.util.Date;
  22. import java.util.HashSet;
  23. import java.util.Iterator;
  24. import java.util.Set;
  25. import java.util.logging.Logger;

  26. import javax.xml.namespace.QName;

  27. import org.jivesoftware.smack.packet.ExtensionElement;
  28. import org.jivesoftware.smack.packet.XmlEnvironment;
  29. import org.jivesoftware.smack.provider.ExtensionElementProvider;
  30. import org.jivesoftware.smack.xml.XmlPullParser;
  31. import org.jivesoftware.smack.xml.XmlPullParserException;

  32. import org.jivesoftware.smackx.workgroup.QueueUser;

  33. /**
  34.  * Queue details stanza extension, which contains details about the users
  35.  * currently in a queue.
  36.  */
  37. public final class QueueDetails implements ExtensionElement {
  38.     private static final Logger LOGGER = Logger.getLogger(QueueDetails.class.getName());

  39.     /**
  40.      * Element name of the stanza extension.
  41.      */
  42.     public static final String ELEMENT_NAME = "notify-queue-details";

  43.     /**
  44.      * Namespace of the stanza extension.
  45.      */
  46.     public static final String NAMESPACE = "http://jabber.org/protocol/workgroup";
  47.     public static final QName QNAME = new QName(NAMESPACE, ELEMENT_NAME);

  48.     private static final String DATE_FORMAT = "yyyyMMdd'T'HH:mm:ss";

  49.     private final SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
  50.     /**
  51.      * The list of users in the queue.
  52.      */
  53.     private final Set<QueueUser> users = new HashSet<>();

  54.     /**
  55.      * Returns the number of users currently in the queue that are waiting to
  56.      * be routed to an agent.
  57.      *
  58.      * @return the number of users in the queue.
  59.      */
  60.     public int getUserCount() {
  61.         return users.size();
  62.     }

  63.     /**
  64.      * Returns the set of users in the queue that are waiting to
  65.      * be routed to an agent (as QueueUser objects).
  66.      *
  67.      * @return a Set for the users waiting in a queue.
  68.      */
  69.     public Set<QueueUser> getUsers() {
  70.         synchronized (users) {
  71.             return users;
  72.         }
  73.     }

  74.     /**
  75.      * Adds a user to the packet.
  76.      *
  77.      * @param user the user.
  78.      */
  79.     private void addUser(QueueUser user) {
  80.         synchronized (users) {
  81.             users.add(user);
  82.         }
  83.     }

  84.     @Override
  85.     public String getElementName() {
  86.         return ELEMENT_NAME;
  87.     }

  88.     @Override
  89.     public String getNamespace() {
  90.         return NAMESPACE;
  91.     }

  92.     @Override
  93.     public String toXML(org.jivesoftware.smack.packet.XmlEnvironment enclosingNamespace) {
  94.         StringBuilder buf = new StringBuilder();
  95.         buf.append('<').append(ELEMENT_NAME).append(" xmlns=\"").append(NAMESPACE).append("\">");

  96.         synchronized (users) {
  97.             for (Iterator<QueueUser> i = users.iterator(); i.hasNext(); ) {
  98.                 QueueUser user = i.next();
  99.                 int position = user.getQueuePosition();
  100.                 int timeRemaining = user.getEstimatedRemainingTime();
  101.                 Date timestamp = user.getQueueJoinTimestamp();

  102.                 buf.append("<user jid=\"").append(user.getUserID()).append("\">");

  103.                 if (position != -1) {
  104.                     buf.append("<position>").append(position).append("</position>");
  105.                 }

  106.                 if (timeRemaining != -1) {
  107.                     buf.append("<time>").append(timeRemaining).append("</time>");
  108.                 }

  109.                 if (timestamp != null) {
  110.                     buf.append("<join-time>");
  111.                     buf.append(dateFormat.format(timestamp));
  112.                     buf.append("</join-time>");
  113.                 }

  114.                 buf.append("</user>");
  115.             }
  116.         }
  117.         buf.append("</").append(ELEMENT_NAME).append('>');
  118.         return buf.toString();
  119.     }

  120.     /**
  121.      * Provider class for QueueDetails stanza extensions.
  122.      */
  123.     public static class Provider extends ExtensionElementProvider<QueueDetails> {

  124.         @Override
  125.         public QueueDetails parse(XmlPullParser parser,
  126.                         int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException,
  127.                         IOException, TextParseException, ParseException {

  128.             SimpleDateFormat dateFormat = new SimpleDateFormat(DATE_FORMAT);
  129.             QueueDetails queueDetails = new QueueDetails();

  130.             XmlPullParser.Event eventType = parser.getEventType();
  131.             while (eventType != XmlPullParser.Event.END_ELEMENT &&
  132.                     "notify-queue-details".equals(parser.getName())) {
  133.                 eventType = parser.next();
  134.                 while ((eventType == XmlPullParser.Event.START_ELEMENT) && "user".equals(parser.getName())) {
  135.                     String uid;
  136.                     int position = -1;
  137.                     int time = -1;
  138.                     Date joinTime = null;

  139.                     uid = parser.getAttributeValue("", "jid");

  140.                     if (uid == null) {
  141.                         // throw exception
  142.                     }

  143.                     eventType = parser.next();
  144.                     while (eventType != XmlPullParser.Event.END_ELEMENT
  145.                                 || !"user".equals(parser.getName())) {
  146.                         if ("position".equals(parser.getName())) {
  147.                             position = Integer.parseInt(parser.nextText());
  148.                         }
  149.                         else if ("time".equals(parser.getName())) {
  150.                             time = Integer.parseInt(parser.nextText());
  151.                         }
  152.                         else if ("join-time".equals(parser.getName())) {
  153.                                 joinTime = dateFormat.parse(parser.nextText());
  154.                         }
  155.                         else if (parser.getName().equals("waitTime")) {
  156.                             Date wait = dateFormat.parse(parser.nextText());
  157.                             LOGGER.fine(wait.toString());
  158.                         }

  159.                         eventType = parser.next();

  160.                         if (eventType != XmlPullParser.Event.END_ELEMENT) {
  161.                             // throw exception
  162.                         }
  163.                     }

  164.                     queueDetails.addUser(new QueueUser(uid, position, time, joinTime));

  165.                     eventType = parser.next();
  166.                 }
  167.             }
  168.             return queueDetails;
  169.         }
  170.     }
  171. }