diff --git a/source/org/jivesoftware/smackx/workgroup/agent/Agent.java b/source/org/jivesoftware/smackx/workgroup/agent/Agent.java
deleted file mode 100644
index bed5febae..000000000
--- a/source/org/jivesoftware/smackx/workgroup/agent/Agent.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/**
- * $RCSfile$
- * $Revision$
- * $Date$
- *
- * Copyright 2003-2004 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.agent;
-
-import org.jivesoftware.smack.packet.Presence;
-
-/**
- * An agent represents the agent role in a workgroup queue.
- *
- * @author Matt Tucker
- */
-public class Agent {
-
- private String user;
- private int maxChats = -1;
- private int currentChats = -1;
- private Presence presence = null;
-
- /**
- * Creates an Agent.
- *
- * @param user the agent's JID.
- * @param currentChats the number of chats the agent is currently in.
- * @param maxChats the maximum number of chats the agent is allowed in.
- * @param presence the agent's presence.
- */
- public Agent(String user, int currentChats, int maxChats, Presence presence) {
- this.user = user;
- this.currentChats = currentChats;
- this.maxChats = maxChats;
- this.presence = presence;
- }
-
- /**
- * Return this agent's JID.
- *
- * @return this agent's JID.
- */
- public String getUser() {
- return user;
- }
-
- /**
- * Return the maximum number of chats this agent can participate in.
- *
- * @return the maximum number of chats this agent can participate in.
- */
- public int getMaxChats() {
- return maxChats;
- }
-
- /**
- * Return the number of chats this agent is currently in.
- *
- * @return the number of chats this agent is currently in.
- */
- public int getCurrentChats() {
- return currentChats;
- }
-
- /**
- * Return this agent's presence.
- *
- * @return this agent's presence.
- */
- public Presence getPresence() {
- return presence;
- }
-}
diff --git a/source/org/jivesoftware/smackx/workgroup/agent/Offer.java b/source/org/jivesoftware/smackx/workgroup/agent/Offer.java
deleted file mode 100644
index ef18361a4..000000000
--- a/source/org/jivesoftware/smackx/workgroup/agent/Offer.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/**
- * $RCSfile$
- * $Revision$
- * $Date$
- *
- * Copyright 2003-2004 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.agent;
-
-import java.util.Date;
-import java.util.Map;
-
-import org.jivesoftware.smack.XMPPConnection;
-import org.jivesoftware.smack.packet.IQ;
-import org.jivesoftware.smack.packet.Packet;
-
-/**
- * A class embodying the semantic agent chat offer; specific instances allow
- * the acceptance or rejecting of the offer.
- *
- * @author Matt Tucker
- * @author Derek DeMoro
- */
-public class Offer {
-
- private XMPPConnection connection;
- private WorkgroupSession session;
-
- private String sessionID;
- private String userID;
- private String workgroupName;
- private Date expiresDate;
- private Map metaData;
-
- /**
- * Creates a new offer.
- *
- * @param conn the XMPP connection with which the issuing session was created.
- * @param workgroupSession the agent session instance through which this offer was issued.
- * @param userID the XMPP address of the user from which the offer originates.
- * @param workgroupName the fully qualified name of the workgroup.
- * @param expiresDate the date at which this offer expires.
- * @param sessionID the session id associated with the offer.
- * @param metaData the metadata associated with the offer.
- */
- public Offer(XMPPConnection conn, WorkgroupSession workgroupSession, String userID,
- String workgroupName, Date expiresDate,
- String sessionID, Map metaData)
- {
- this.connection = conn;
- this.session = workgroupSession;
- this.userID = userID;
- this.workgroupName = workgroupName;
- this.expiresDate = expiresDate;
- this.sessionID = sessionID;
- this.metaData = metaData;
- }
-
- /**
- * Accepts the offer.
- */
- public void accept() {
- Packet acceptPacket = new AcceptPacket( this.session.getWorkgroupName() );
- connection.sendPacket( acceptPacket );
- // TODO: listen for a reply.
- }
-
- /**
- * Rejects the offer.
- */
- public void reject() {
- RejectPacket rejectPacket = new RejectPacket( this.session.getWorkgroupName() );
- connection.sendPacket( rejectPacket );
- // TODO: listen for a reply.
- }
-
- /**
- * Returns the XMPP address of the user from which the offer originates
- * (eg jsmith@example.com/WebClient). For example, if the user jsmith initiates
- * a support request by joining the workgroup queue, then this user ID will be
- * jsmith's address.
- *
- * @return the XMPP address of the user from which the offer originates.
- */
- public String getUserID() {
- return userID;
- }
-
- /**
- * The fully qualified name of the workgroup (eg support@example.com)
- * that this offer is from.
- *
- * @return the name of the workgroup this offer is from.
- */
- public String getWorkgroupName() {
- return this.workgroupName;
- }
-
- /**
- * The date when this offer will expire. The agent must {@link #accept()}
- * the offer before the expiration date or the offer will lapse and be
- * routed to another agent. Alternatively, the agent can {@link #reject()}
- * the offer at any time if they don't wish to accept it..
- *
- * @return the date at which this offer expires.
- */
- public Date getExpiresDate() {
- return this.expiresDate;
- }
-
- /**
- * The session ID associated with this offer.
- *
- * @return the session ID associated with this offer.
- */
- public String getSessionID() {
- return this.sessionID;
- }
-
- /**
- * Returns the meta-data associated with this offer.
- *
- * @return the offer meta-data.
- */
- public Map getMetaData() {
- return this.metaData;
- }
-
- /**
- * Packet for rejecting offers.
- */
- private class RejectPacket extends IQ {
-
- RejectPacket( String workgroup ) {
- this.setTo( workgroup );
- this.setType( IQ.Type.SET );
- }
-
- public String getChildElementXML() {
- return "
- *
- * @author Matt Tucker
- * @author loki der quaeler
- * @see org.jivesoftware.smackx.workgroup.agent.WorkgroupSession
- */
-public interface OfferListener {
-
- /**
- * The implementing class instance will be notified via this when the WorkgroupSession has received
- * an offer for a chat. The instance will then have the ability to accept, reject, or ignore
- * the request (resulting in a revocation-by-timeout).
- *
- * @param request the Offer instance embodying the details of the offer
- */
- public void offerReceived (Offer request);
-
- /**
- * The implementing class instance will be notified via this when the AgentSessino has received
- * a revocation of a previously extended offer.
- *
- * @param revokedOffer the RevokedOffer instance embodying the details of the revoked offer
- */
- public void offerRevoked (RevokedOffer revokedOffer);
-
-}
diff --git a/source/org/jivesoftware/smackx/workgroup/agent/QueueAgentsListener.java b/source/org/jivesoftware/smackx/workgroup/agent/QueueAgentsListener.java
deleted file mode 100644
index 0427b4c96..000000000
--- a/source/org/jivesoftware/smackx/workgroup/agent/QueueAgentsListener.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * $RCSfile$
- * $Revision$
- * $Date$
- *
- * Copyright 2003-2004 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.agent;
-
-import java.util.Set;
-
-public interface QueueAgentsListener {
-
- /**
- * The current number of chats the agents are handling was updated.
- *
- * @param queue the workgroup queue.
- * @param currentChats the current number of chats the agents are handling.
- */
- public void currentChatsUpdated(WorkgroupQueue queue, int currentChats);
-
- /**
- * The maximum number of chats the agents can handle was updated.
- *
- * @param queue the workgroup queue.
- * @param maxChats the maximum number of chats the agents can handle.
- */
- public void maxChatsUpdated(WorkgroupQueue queue, int maxChats);
-
- /**
- * The list of available agents servicing the queue was updated.
- *
- * @param queue the workgroup queue.
- * @param agents the available agents servicing the queue.
- */
- public void agentsUpdated(WorkgroupQueue queue, Set agents);
-}
\ No newline at end of file
diff --git a/source/org/jivesoftware/smackx/workgroup/agent/QueueUsersListener.java b/source/org/jivesoftware/smackx/workgroup/agent/QueueUsersListener.java
deleted file mode 100644
index dfa0ecaa3..000000000
--- a/source/org/jivesoftware/smackx/workgroup/agent/QueueUsersListener.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * $RCSfile$
- * $Revision$
- * $Date$
- *
- * Copyright 2003-2004 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.agent;
-
-import java.util.Date;
-import java.util.Set;
-
-public interface QueueUsersListener {
-
- /**
- * The status of the queue was updated.
- *
- * @param queue the workgroup queue.
- * @param status the status of queue.
- */
- public void statusUpdated(WorkgroupQueue queue, WorkgroupQueue.Status status);
-
- /**
- * The average wait time of the queue was updated.
- *
- * @param queue the workgroup queue.
- * @param averageWaitTime the average wait time of the queue.
- */
- public void averageWaitTimeUpdated(WorkgroupQueue queue, int averageWaitTime);
-
- /**
- * The date of oldest entry waiting in the queue was updated.
- *
- * @param queue the workgroup queue.
- * @param oldestEntry the date of the oldest entry waiting in the queue.
- */
- public void oldestEntryUpdated(WorkgroupQueue queue, Date oldestEntry);
-
- /**
- * The list of users waiting in the queue was updated.
- *
- * @param queue the workgroup queue.
- * @param users the list of users waiting in the queue.
- */
- public void usersUpdated(WorkgroupQueue queue, Set users);
-}
\ No newline at end of file
diff --git a/source/org/jivesoftware/smackx/workgroup/agent/RevokedOffer.java b/source/org/jivesoftware/smackx/workgroup/agent/RevokedOffer.java
deleted file mode 100644
index 1b68a8d55..000000000
--- a/source/org/jivesoftware/smackx/workgroup/agent/RevokedOffer.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/**
- * $RCSfile$
- * $Revision$
- * $Date$
- *
- * Copyright 2003-2004 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.agent;
-
-import java.util.Date;
-
-/**
- * A revoked offer which contains the reason the offer was revoked, the
- * workgroup, the user JID, and the timestamp of the revocation.
- *
- * @author Matt Tucker
- */
-public class RevokedOffer {
-
- private String userID;
- private String workgroupName;
- private String sessionID;
- private String reason;
- private Date timestamp;
-
- /**
- * @param userID the jid of the user for which this revocation was issued.
- * @param workgroupName the fully qualified name of the workgroup.
- * @param sessionID the session id attributed to this chain of packets.
- * @param reason the server issued message as to why this revocation was issued.
- * @param timestamp the timestamp at which the revocation was issued.
- */
- public RevokedOffer(String userID, String workgroupName, String sessionID,
- String reason, Date timestamp)
- {
- this.userID = userID;
- this.workgroupName = workgroupName;
- this.sessionID = sessionID;
- this.reason = reason;
- this.timestamp = timestamp;
- }
-
- /**
- * @return the jid of the user for which this rejection was issued.
- */
- public String getUserID() {
- return this.userID;
- }
-
- /**
- * @return the fully qualified name of the workgroup
- */
- public String getWorkgroupName() {
- return this.workgroupName;
- }
-
- /**
- * @return the session id which will associate all packets for the pending chat
- */
- public String getSessionID() {
- return this.sessionID;
- }
-
- /**
- * @return the server issued message as to why this revocation was issued
- */
- public String getReason () {
- return this.reason;
- }
-
- /**
- * @return the timestamp at which the revocation was issued
- */
- public Date getTimestamp () {
- return this.timestamp;
- }
-}
\ No newline at end of file
diff --git a/source/org/jivesoftware/smackx/workgroup/agent/WorkgroupQueue.java b/source/org/jivesoftware/smackx/workgroup/agent/WorkgroupQueue.java
deleted file mode 100644
index 7433414ae..000000000
--- a/source/org/jivesoftware/smackx/workgroup/agent/WorkgroupQueue.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/**
- * $RCSfile$
- * $Revision$
- * $Date$
- *
- * Copyright 2003-2004 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.agent;
-
-import java.util.*;
-
-/**
- * A queue in a workgroup, which is a pool of agents that are routed a specific type of
- * chat request.
- *
- * @author Matt Tucker
- */
-public class WorkgroupQueue {
-
- private String name;
- private Status status = Status.CLOSED;
-
- private int averageWaitTime = -1;
- private Date oldestEntry = null;
- private Set users = Collections.EMPTY_SET;
-
- private Set agents = Collections.EMPTY_SET;
- private int maxChats = 0;
- private int currentChats = 0;
-
- /**
- * Creates a new workgroup queue instance.
- *
- * @param name the name of the queue.
- */
- WorkgroupQueue(String name) {
- this.name = name;
- }
-
- /**
- * Returns the name of this queue.
- *
- * @return the name of this queue.
- */
- public String getName() {
- return name;
- }
-
- /**
- * Returns the status of this queue.
- *
- * @return the status of this queue.
- */
- public Status getStatus() {
- return status;
- }
-
- void setStatus(Status status) {
- this.status = status;
- }
-
- /**
- * Returns the number of users in this queue that are waiting to be routed to
- * an agent.
- *
- * @return the number of users waiting in the queue.
- */
- public int getUserCount() {
- if (users == null) {
- return 0;
- }
- return users.size();
- }
-
- /**
- * Returns an Iterator for the users in this queue that are waiting
- * to be routed to an agent (QueueUser instances).
- *
- * @return an Iterator for the users waiting in the queue.
- */
- public Iterator getUsers() {
- if (users == null) {
- return Collections.EMPTY_SET.iterator();
- }
- return Collections.unmodifiableSet(users).iterator();
- }
-
- void setUsers(Set users) {
- this.users = users;
- }
-
- /**
- * Returns the average amount of time users wait in this queue before being
- * routed to an agent. If average wait time info isn't available, -1 will
- * be returned.
- *
- * @return the average wait time in this queue.
- */
- public int getAverageWaitTime() {
- return averageWaitTime;
- }
-
- void setAverageWaitTime(int averageTime) {
- this.averageWaitTime = averageTime;
- }
-
- /**
- * Returns the date of the oldest request waiting in this queue. If there
- * are no requests waiting to be routed, this method will return null.
- *
- * @return the date of the oldest request in this queue.
- */
- public Date getOldestEntry() {
- return oldestEntry;
- }
-
- void setOldestEntry(Date oldestEntry) {
- this.oldestEntry = oldestEntry;
- }
-
- /**
- * Returns the count of the currently available agents in this queue.
- *
- * @return the number of active agents in this queue.
- */
- public int getAgentCount() {
- synchronized (agents) {
- return agents.size();
- }
- }
-
- /**
- * Returns an Iterator the currently active agents (Agent instances)
- * in this queue.
- *
- * @return an Iterator for the active agents in this queue.
- */
- public Iterator getAgents() {
- return Collections.unmodifiableSet(agents).iterator();
- }
-
- void setAgents(Set agents) {
- this.agents = agents;
- }
-
- /**
- * Returns the maximum number of simultaneous chats this queue can handle.
- *
- * @return the max number of chats this queue can handle.
- */
- public int getMaxChats() {
- return maxChats;
- }
-
- void setMaxChats(int maxChats) {
- this.maxChats = maxChats;
- }
-
- /**
- * Returns the current number of active chat sessions in this queue.
- *
- * @return the current number of active chat sessions in this queue.
- */
- public int getCurrentChats() {
- return currentChats;
- }
-
- void setCurrentChats(int currentChats) {
- this.currentChats = currentChats;
- }
-
- /**
- * Represents the status of the queue. The possible values are:
- *
- *
- * - * The max chats value is the maximum number of chats the agent is willing to have routed to - * them at once. Some servers may be configured to only accept max chat values in a certain - * range; for example, between two and five. In that case, the maxChats value the agent sends - * may be adjusted by the server to a value within that range. - * - * @param presenceMode the presence mode of the agent. - * @param currentChats the current number of chats the agent is in. - * @param maxChats the maximum number of chats the agent is willing to accept. - * @throws XMPPException if an error occurs setting the agent status. - * @throws IllegalStateException if the agent is not online with the workgroup. - */ - public void setStatus(Presence.Mode presenceMode, int currentChats, int maxChats ) - throws XMPPException - { - setStatus( presenceMode, currentChats, maxChats, null ); - } - - - /** - * Sets the agent's current status with the workgroup. The presence mode affects how offers - * are routed to the agent. The possible presence modes with their meanings are as follows:
- *
- * The max chats value is the maximum number of chats the agent is willing to have routed to
- * them at once. Some servers may be configured to only accept max chat values in a certain
- * range; for example, between two and five. In that case, the maxChats value the agent sends
- * may be adjusted by the server to a value within that range.
- *
- * @param presenceMode the presence mode of the agent.
- * @param currentChats the current number of chats the agent is in.
- * @param maxChats the maximum number of chats the agent is willing to accept.
- * @param status sets the status message of the presence update.
- * @throws XMPPException if an error occurs setting the agent status.
- * @throws IllegalStateException if the agent is not online with the workgroup.
- */
- public void setStatus(Presence.Mode presenceMode, int currentChats, int maxChats, String status )
- throws XMPPException
- {
- if (!online) {
- throw new IllegalStateException("Cannot set status when the agent is not online.");
- }
-
- if (presenceMode == null) {
- presenceMode = Presence.Mode.AVAILABLE;
- }
- this.presenceMode = presenceMode;
- this.currentChats = currentChats;
- this.maxChats = maxChats;
-
- Presence presence = new Presence(Presence.Type.AVAILABLE);
- presence.setMode(presenceMode);
- presence.setTo(this.getWorkgroupName());
-
- if( status != null ) {
- presence.setStatus( status );
- }
- // Send information about max chats and current chats as a packet extension.
- DefaultPacketExtension agentStatus = new DefaultPacketExtension(AgentStatus.ELEMENT_NAME,
- AgentStatus.NAMESPACE);
- agentStatus.setValue("current-chats", ""+currentChats);
- agentStatus.setValue("max-chats", ""+maxChats);
- presence.addExtension(agentStatus);
- presence.addExtension(new MetaData(this.metaData));
-
- PacketCollector collector = this.connection.createPacketCollector(new AndFilter(
- new PacketTypeFilter(Presence.class), new FromContainsFilter(workgroupName)));
-
- this.connection.sendPacket(presence);
-
- presence = (Presence)collector.nextResult(5000);
- collector.cancel();
- if (presence == null) {
- throw new XMPPException("No response from server on status set.");
- }
-
- if (presence.getError() != null) {
- throw new XMPPException(presence.getError());
- }
- }
-
- /**
- * Removes a user from the workgroup queue. This is an administrative action that the
- *
- * The agent is not guaranteed of having privileges to perform this action; an exception
- * denying the request may be thrown.
- */
- public void dequeueUser(String userID) throws XMPPException {
- // todo: this method simply won't work right now.
- DepartQueuePacket departPacket = new DepartQueuePacket(this.workgroupName);
-
- // PENDING
- this.connection.sendPacket(departPacket);
- }
-
- /**
- * @return the fully-qualified name of the workgroup for which this session exists
- */
- public String getWorkgroupName() {
- return workgroupName;
- }
-
- /**
- * @param queueName the name of the queue
- * @return an instance of WorkgroupQueue for the argument queue name, or null if none exists
- */
- public WorkgroupQueue getQueue(String queueName) {
- return (WorkgroupQueue)queues.get(queueName);
- }
-
- public Iterator getQueues() {
- return Collections.unmodifiableMap((new HashMap(queues))).values().iterator();
- }
-
- public void addQueueUsersListener(QueueUsersListener listener) {
- synchronized(queueUsersListeners) {
- if (!queueUsersListeners.contains(listener)) {
- queueUsersListeners.add(listener);
- }
- }
- }
-
- public void removeQueueUsersListener(QueueUsersListener listener) {
- synchronized(queueUsersListeners) {
- queueUsersListeners.remove(listener);
- }
- }
-
- public void addQueueAgentsListener(QueueAgentsListener listener) {
- synchronized(queueAgentsListeners) {
- if (!queueAgentsListeners.contains(listener)) {
- queueAgentsListeners.add(listener);
- }
- }
- }
-
- public void removeQueueAgentsListener(QueueAgentsListener listener) {
- synchronized(queueAgentsListeners) {
- queueAgentsListeners.remove(listener);
- }
- }
-
- /**
- * Adds an offer listener.
- *
- * @param offerListener the offer listener.
- */
- public void addOfferListener(OfferListener offerListener) {
- synchronized(offerListeners) {
- if (!offerListeners.contains(offerListener)) {
- offerListeners.add(offerListener);
- }
- }
- }
-
- /**
- * Removes an offer listener.
- *
- * @param offerListener the offer listener.
- */
- public void removeOfferListener(OfferListener offerListener) {
- synchronized(offerListeners) {
- offerListeners.remove(offerListener);
- }
- }
-
- /**
- * Adds an invitation listener.
- *
- * @param invitationListener the invitation listener.
- */
- public void addInvitationListener(PacketListener invitationListener) {
- // TODO
- }
-
- private void fireOfferRequestEvent(OfferRequestProvider.OfferRequestPacket requestPacket) {
- Offer offer = new Offer(this.connection, this, requestPacket.getUserID(),
- this.getWorkgroupName(), new Date((new Date()).getTime()
- + (requestPacket.getTimeout() * 1000)), requestPacket.getSessionID(),
- requestPacket.getMetaData());
-
- synchronized (offerListeners) {
- for (Iterator i=offerListeners.iterator(); i.hasNext(); ) {
- OfferListener listener = (OfferListener)i.next();
- listener.offerReceived(offer);
- }
- }
- }
-
- private void fireOfferRevokeEvent(OfferRevokeProvider.OfferRevokePacket orp) {
- RevokedOffer revokedOffer = new RevokedOffer(orp.getUserID(), this.getWorkgroupName(),
- orp.getSessionID(), orp.getReason(), new Date());
-
- synchronized (offerListeners) {
- for (Iterator i=offerListeners.iterator(); i.hasNext(); ) {
- OfferListener listener = (OfferListener)i.next();
- listener.offerRevoked(revokedOffer);
- }
- }
- }
-
- private void fireQueueUsersEvent(WorkgroupQueue queue, WorkgroupQueue.Status status,
- int averageWaitTime, Date oldestEntry, Set users)
- {
- synchronized(queueUsersListeners) {
- for (Iterator i=queueUsersListeners.iterator(); i.hasNext(); ) {
- QueueUsersListener listener = (QueueUsersListener)i.next();
- if (status != null) {
- listener.statusUpdated(queue, status);
- }
- if (averageWaitTime != -1) {
- listener.averageWaitTimeUpdated(queue, averageWaitTime);
- }
- if (oldestEntry != null) {
- listener.oldestEntryUpdated(queue, oldestEntry);
- }
- if (users != null) {
- listener.usersUpdated(queue, users);
- }
- }
- }
- }
-
- private void fireQueueAgentsEvent(WorkgroupQueue queue, int currentChats,
- int maxChats, Set agents)
- {
- synchronized(queueAgentsListeners) {
- for (Iterator i=queueAgentsListeners.iterator(); i.hasNext(); ) {
- QueueAgentsListener listener = (QueueAgentsListener)i.next();
- if (currentChats != -1) {
- listener.currentChatsUpdated(queue, currentChats);
- }
- if (maxChats != -1) {
- listener.maxChatsUpdated(queue, maxChats);
- }
- if (agents != null) {
- listener.agentsUpdated(queue, agents);
- }
- }
- }
- }
-
- // PacketListener Implementation.
-
- private void handlePacket(Packet packet) {
- if (packet instanceof OfferRequestProvider.OfferRequestPacket) {
- fireOfferRequestEvent((OfferRequestProvider.OfferRequestPacket)packet);
- }
- else if (packet instanceof Presence) {
- Presence presence = (Presence)packet;
-
- // The workgroup can send us a number of different presence packets. We
- // check for different packet extensions to see what type of presence
- // packet it is.
-
- String queueName = StringUtils.parseResource(presence.getFrom());
- WorkgroupQueue queue = (WorkgroupQueue)queues.get(queueName);
- // If there isn't already an entry for the queue, create a new one.
- if (queue == null) {
- queue = new WorkgroupQueue(queueName);
- queues.put(queueName, queue);
- }
-
- // QueueOverview packet extensions contain basic information about a queue.
- QueueOverview queueOverview = (QueueOverview)presence.getExtension(
- QueueOverview.ELEMENT_NAME, QueueOverview.NAMESPACE);
- if (queueOverview != null) {
- if (queueOverview.getStatus() == null) {
- queue.setStatus(WorkgroupQueue.Status.CLOSED);
- }
- else {
- queue.setStatus(queueOverview.getStatus());
- }
- queue.setAverageWaitTime(queueOverview.getAverageWaitTime());
- queue.setOldestEntry(queueOverview.getOldestEntry());
- // Fire event.
- fireQueueUsersEvent(queue, queueOverview.getStatus(),
- queueOverview.getAverageWaitTime(), queueOverview.getOldestEntry(),
- null);
- return;
- }
-
- // QueueDetails packet extensions contain information about the users in
- // a queue.
- QueueDetails queueDetails = (QueueDetails)packet.getExtension(
- QueueDetails.ELEMENT_NAME, QueueDetails.NAMESPACE);
- if (queueDetails != null) {
- queue.setUsers(queueDetails.getUsers());
- // Fire event.
- fireQueueUsersEvent(queue, null, -1, null, queueDetails.getUsers());
- return;
- }
-
- // Notify agent packets gives an overview of agent activity in a queue.
- DefaultPacketExtension notifyAgents = (DefaultPacketExtension)presence.getExtension(
- "notify-agents", "xmpp:workgroup");
- if (notifyAgents != null) {
- int currentChats = Integer.parseInt(notifyAgents.getValue("current-chats"));
- int maxChats = Integer.parseInt(notifyAgents.getValue("max-chats"));
- queue.setCurrentChats(currentChats);
- queue.setMaxChats(maxChats);
- // Fire event.
- fireQueueAgentsEvent(queue, currentChats, maxChats, null);
- return;
- }
-
- // Agent status
- AgentStatus agentStatus = (AgentStatus)presence.getExtension(AgentStatus.ELEMENT_NAME,
- AgentStatus.NAMESPACE);
- if (agentStatus != null) {
- Set agents = agentStatus.getAgents();
- // Look for information about the agent that created this session and
- // update local status fields accordingly.
- for (Iterator i=agents.iterator(); i.hasNext(); ) {
- Agent agent = (Agent)i.next();
- if (agent.getUser().equals(StringUtils.parseBareAddress(
- connection.getUser())))
- {
- maxChats = agent.getMaxChats();
- currentChats = agent.getCurrentChats();
- }
- }
- // Set the list of agents for the queue.
- queue.setAgents(agents);
- // Fire event.
- fireQueueAgentsEvent(queue, -1, -1, agentStatus.getAgents());
- return;
- }
- }
- else if (packet instanceof OfferRevokeProvider.OfferRevokePacket) {
- fireOfferRevokeEvent((OfferRevokeProvider.OfferRevokePacket)packet);
- }
- }
-}
\ No newline at end of file
diff --git a/source/org/jivesoftware/smackx/workgroup/packet/AgentStatus.java b/source/org/jivesoftware/smackx/workgroup/packet/AgentStatus.java
deleted file mode 100644
index 240888e46..000000000
--- a/source/org/jivesoftware/smackx/workgroup/packet/AgentStatus.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/**
- * $RCSfile$
- * $Revision$
- * $Date$
- *
- * Copyright 2003-2004 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.util.*;
-import java.beans.PropertyDescriptor;
-
-import org.jivesoftware.smack.packet.*;
-import org.jivesoftware.smack.provider.PacketExtensionProvider;
-import org.jivesoftware.smack.provider.ProviderManager;
-import org.xmlpull.v1.XmlPullParser;
-import org.jivesoftware.smackx.workgroup.agent.Agent;
-
-/**
- * Packet extension implementation for agent status. Information about each agent includes
- * their JID, current chat count, max chats they can handle, and their presence in the
- * workgroup.
- *
- * @author Matt Tucker
- */
-public class AgentStatus implements PacketExtension {
-
- /**
- * Element name of the packet extension.
- */
- public static final String ELEMENT_NAME = "agent-status";
-
- /**
- * Namespace of the packet extension.
- */
- public static final String NAMESPACE = "xmpp:workgroup";
-
- private Set agents;
-
- AgentStatus() {
- agents = new HashSet();
- }
-
- void addAgent(Agent agent) {
- synchronized (agents) {
- agents.add(agent);
- }
- }
-
- public int getAgentCount() {
- synchronized (agents) {
- return agents.size();
- }
- }
-
- public Set getAgents() {
- synchronized (agents) {
- return Collections.unmodifiableSet(agents);
- }
- }
-
- public String getElementName() {
- return ELEMENT_NAME;
- }
-
- public String getNamespace() {
- return NAMESPACE;
- }
-
- public String toXML () {
- StringBuffer buf = new StringBuffer();
-
- buf.append("<").append(ELEMENT_NAME).append(" xmlns=\"").append(NAMESPACE).append("\">");
-
- synchronized (agents) {
- for (Iterator i=agents.iterator(); i.hasNext(); ) {
- Agent agent = (Agent)i.next();
- buf.append("
- *
- * This class only provides a user's perspective into a workgroup and is not intended
- * for use by agents.
- *
- * @author Matt Tucker
- */
-public class Workgroup {
-
- private String workgroupName;
- private XMPPConnection connection;
- private boolean inQueue;
- private List queueListeners;
-
- private int queuePosition = -1;
- private int queueRemainingTime = -1;
-
- private PacketListener packetListener;
-
- /**
- * Creates a new workgroup instance using the specified workgroup name
- * (eg support@example.com) and XMPP connection. The connection must have
- * undergone a successful login before being used to construct an instance of
- * this class.
- *
- * @param workgroupName the fully qualified name of the workgroup.
- * @param connection an XMPP connection which must have already undergone a
- * successful login.
- */
- public Workgroup(String workgroupName, XMPPConnection connection) {
- // Login must have been done before passing in connection.
- if (!connection.isAuthenticated()) {
- throw new IllegalStateException("Must login to server before creating workgroup.");
- }
-
- this.workgroupName = workgroupName;
- this.connection = connection;
- inQueue = false;
- queueListeners = new ArrayList();
-
- // Register as a queue listener for internal usage by this instance.
- addQueueListener(new QueueListener() {
- public void joinedQueue() {
- inQueue = true;
- }
-
- public void departedQueue() {
- inQueue = false;
- queuePosition = -1;
- queueRemainingTime = -1;
- }
-
- public void queuePositionUpdated(int currentPosition) {
- queuePosition = currentPosition;
- }
-
- public void queueWaitTimeUpdated(int secondsRemaining) {
- queueRemainingTime = secondsRemaining;
- }
- });
-
- // Register an invitation listener for internal usage by this instance.
- addInvitationListener(new PacketListener() {
-
- public void processPacket(Packet packet) {
- GroupChatInvitation invitation = (GroupChatInvitation)packet.getExtension(
- GroupChatInvitation.ELEMENT_NAME, GroupChatInvitation.NAMESPACE);
- if (invitation != null) {
- inQueue = false;
- queuePosition = -1;
- queueRemainingTime = -1;
- }
- }
- });
-
- // Register a packet listener for all queue events.
- PacketFilter orFilter = new OrFilter(new PacketTypeFilter(Message.class),
- new PacketTypeFilter(QueueUpdate.class));
-
- PacketFilter filter = new AndFilter(new FromContainsFilter(this.workgroupName), orFilter);
-
- packetListener = new PacketListener() {
-
- public void processPacket(Packet packet) {
- handlePacket(packet);
- }
- };
- connection.addPacketListener(packetListener, filter);
- }
-
- /**
- * Returns the name of this workgroup (eg support@example.com).
- *
- * @return the name of the workgroup.
- */
- public String getWorkgroupName() {
- return workgroupName;
- }
-
- /**
- * Returns true if the user is currently waiting in the workgroup queue.
- *
- * @return true if currently waiting in the queue.
- */
- public boolean isInQueue() {
- return inQueue;
- }
-
- /**
- * Returns the user's current position in the workgroup queue. A value of 0 means
- * the user is next in line to be routed; therefore, if the queue position
- * is being displayed to the end user it is usually a good idea to add 1 to
- * the value this method returns before display. If the user is not currently
- * waiting in the workgorup, or no queue position information is available, -1
- * will be returned.
- *
- * @return the user's current position in the workgorup queue, or -1 if the
- * position isn't available or if the user isn't in the queue.
- */
- public int getQueuePosition() {
- return queuePosition;
- }
-
- /**
- * Returns the estimated time (in seconds) that the user has to left wait in
- * the workgroup queue before being routed. If the user is not currently waiting
- * int he workgroup, or no queue time information is available, -1 will be
- * returned.
- *
- * @return the estimated time remaining (in seconds) that the user has to
- * wait in the workgropu queue, or -1 if time information isn't available
- * or if the user isn't int the queue.
- */
- public int getQueueRemainingTime() {
- return queueRemainingTime;
- }
-
- /**
- * Joins the workgroup queue to wait to be routed to an agent. After joining
- * the queue, queue status events will be sent to indicate the user's position and
- * estimated time left in the queue. Once joining the queue, there are three ways
- * the user will leave the queue:
- *
- * Some servers may be configured to require certain meta-data in
- * order to join the queue. In that case, the {@link #joinQueue(Map)} method
- * should be used instead of this method so that meta-data may be passed in.
- *
- * @throws XMPPException if an error occured joining the queue. An error may indicate
- * that a connection failure occured or that the server explicitly rejected the
- * request to join the queue.
- */
- public void joinQueue() throws XMPPException {
- joinQueue(null);
- }
-
- /**
- * Joins the workgroup queue to wait to be routed to an agent. After joining
- * the queue, queue status events will be sent to indicate the user's position and
- * estimated time left in the queue. Once joining the queue, there are three ways
- * the user will leave the queue:
- *
- * Arbitrary meta-data can be passed in with the queue join request in order to assist
- * the server in routing the user to an agent and to provide information about the
- * user to the agent. Some servers may be configured to require certain meta-data in
- * order to join the queue.
- *
- * The server may reject the join queue request, which will cause an XMPPException to
- * be thrown. The error codes for specific cases are as follows:
- *
- * Normally, the user would not manually leave the queue. However, they may wish to
- * under certain circumstances -- for example, if they no longer wish to be routed
- * to an agent because they've been waiting too long.
- *
- * @throws XMPPException if an error occured trying to send the depart queue
- * request to the server.
- */
- public void departQueue() throws XMPPException {
- // If not in the queue ignore the depart request.
- if (!inQueue) {
- return;
- }
-
- DepartQueuePacket departPacket = new DepartQueuePacket(this.workgroupName);
- PacketCollector collector = this.connection.createPacketCollector(
- new PacketIDFilter(departPacket.getPacketID()));
-
- connection.sendPacket(departPacket);
-
- IQ response = (IQ)collector.nextResult(5000);
- collector.cancel();
- if (response == null) {
- throw new XMPPException("No response from the server.");
- }
- if (response.getError() != null) {
- throw new XMPPException(response.getError());
- }
-
- // Notify listeners that we're no longer in the queue.
- fireQueueDepartedEvent();
- }
-
- /**
- * Adds a queue listener that will be notified of queue events for the user
- * that created this Workgroup instance.
- *
- * @param queueListener the queue listener.
- */
- public void addQueueListener(QueueListener queueListener) {
- synchronized(queueListeners) {
- if (!queueListeners.contains(queueListener)) {
- queueListeners.add(queueListener);
- }
- }
- }
-
- /**
- * Removes a queue listener.
- *
- * @param queueListener the queue listener.
- */
- public void removeQueueListener(QueueListener queueListener) {
- synchronized(queueListeners) {
- queueListeners.remove(queueListener);
- }
- }
-
- /**
- * Adds an invitation listener that will be notified of groupchat invitations
- * from the workgroup for the the user that created this Workgroup instance.
- *
- * @param packetListener the invitation listener.
- */
- public void addInvitationListener(PacketListener packetListener) {
- connection.addPacketListener(packetListener, null);
- }
-
- protected void finalize() throws Throwable {
- connection.removePacketListener(packetListener);
- }
-
- private void fireQueueJoinedEvent() {
- synchronized (queueListeners) {
- for (Iterator i=queueListeners.iterator(); i.hasNext(); ) {
- QueueListener listener = (QueueListener)i.next();
- listener.joinedQueue();
- }
- }
- }
-
- private void fireQueueDepartedEvent() {
- synchronized (queueListeners) {
- for (Iterator i=queueListeners.iterator(); i.hasNext(); ) {
- QueueListener listener = (QueueListener)i.next();
- listener.departedQueue();
- }
- }
- }
-
- private void fireQueuePositionEvent(int currentPosition) {
- synchronized (queueListeners) {
- for (Iterator i=queueListeners.iterator(); i.hasNext(); ) {
- QueueListener listener = (QueueListener)i.next();
- listener.queuePositionUpdated(currentPosition);
- }
- }
- }
-
- private void fireQueueTimeEvent(int secondsRemaining) {
- synchronized (queueListeners) {
- for (Iterator i=queueListeners.iterator(); i.hasNext(); ) {
- QueueListener listener = (QueueListener)i.next();
- listener.queueWaitTimeUpdated(secondsRemaining);
- }
- }
- }
-
- // PacketListener Implementation.
-
- private void handlePacket(Packet packet) {
- if (packet instanceof Message) {
- Message msg = (Message)packet;
- // Check to see if the user left the queue.
- PacketExtension pe = msg.getExtension("depart-queue", "xmpp:workgroup");
-
- if (pe != null) {
- fireQueueDepartedEvent();
- }
- }
- // Check to see if it's a queue update notification.
- else if (packet instanceof QueueUpdate) {
- QueueUpdate queueUpdate = (QueueUpdate)packet;
- if (queueUpdate.getPosition() != -1) {
- fireQueuePositionEvent(queueUpdate.getPosition());
- }
- if (queueUpdate.getRemaingTime() != -1) {
- fireQueueTimeEvent(queueUpdate.getRemaingTime());
- }
- }
- }
-
- /**
- * IQ packet to request joining the workgroup queue.
- */
- private class JoinQueuePacket extends IQ {
-
- private Map metaData;
-
- public JoinQueuePacket(String workgroup, Map metaData) {
- this.metaData = metaData;
-
- setTo(workgroup);
- setType(IQ.Type.SET);
- }
-
- public String getChildElementXML() {
- StringBuffer buf = new StringBuffer();
-
- buf.append("
- *
- * @author loki der quaeler
- */
-public class OfferRevokeProvider implements IQProvider {
-
- public IQ parseIQ (XmlPullParser parser) throws Exception {
- // The parser will be positioned on the opening IQ tag, so get the JID attribute.
- String uid = parser.getAttributeValue("", "jid");
- String reason = null;
- String sessionID = null;
- boolean done = false;
-
- while (!done) {
- int eventType = parser.next();
-
- if ((eventType == XmlPullParser.START_TAG) && parser.getName().equals("reason")) {
- reason = parser.nextText();
- }
- else if ((eventType == XmlPullParser.START_TAG)
- && parser.getName().equals(SessionID.ELEMENT_NAME)) {
- sessionID = parser.getAttributeValue("", "session");
- }
- else if ((eventType == XmlPullParser.END_TAG)
- && parser.getName().equals("offer-revoke")) {
- done = true;
- }
- }
-
- return new OfferRevokePacket(uid, reason, sessionID);
- }
-
- public class OfferRevokePacket extends IQ {
-
- protected String userID;
- protected String sessionID;
- protected String reason;
-
- public OfferRevokePacket (String uid, String cause, String sid) {
- this.userID = uid;
- this.reason = cause;
- this.sessionID = sid;
- }
-
- public String getUserID () {
- return this.userID;
- }
-
- public String getReason () {
- return this.reason;
- }
-
- public String getSessionID () {
- return this.sessionID;
- }
-
- public String getChildElementXML () {
- StringBuffer buf = new StringBuffer();
- buf.append("
- *
- *
- * A user cannot request to join the queue again if already in the queue. Therefore, this
- * method will do nothing if the user is already in the queue.
- *
- *
- * A user cannot request to join the queue again if already in the queue. Therefore, this
- * method will do nothing if the user is already in the queue.
- *
- *
- *
- * @param metaData the metaData for the join request.
- * @throws XMPPException if an error occured joining the queue. An error may indicate
- * that a connection failure occured or that the server explicitly rejected the
- * request to join the queue (error code 503). The error code should be checked
- * to determine the specific error.
- */
- public void joinQueue(Map metaData) throws XMPPException {
- // If already in the queue ignore the join request.
- if (inQueue) {
- return;
- }
-
- JoinQueuePacket joinPacket = new JoinQueuePacket(workgroupName, metaData);
- PacketCollector collector = connection.createPacketCollector(
- new PacketIDFilter(joinPacket.getPacketID()));
-
- this.connection.sendPacket(joinPacket);
-
- IQ response = (IQ)collector.nextResult(10000);
-
- // Cancel the collector.
- collector.cancel();
- if (response == null) {
- throw new XMPPException("No response from the server.");
- }
- if (response.getError() != null) {
- throw new XMPPException(response.getError());
- }
-
- // Notify listeners that we've joined the queue.
- fireQueueJoinedEvent();
- }
-
- /**
- * Departs the workgroup queue. If the user is not currently in the queue, this
- * method will do nothing.