1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Revision$ 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * $Date$ 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2003-2007 Jive Software. 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License. 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * http://www.apache.org/licenses/LICENSE-2.0 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS, 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License. 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx.workgroup.agent; 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.Connection; 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.IQ; 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.Packet; 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Date; 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.List; 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Map; 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * A class embodying the semantic agent chat offer; specific instances allow the acceptance or 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * rejecting of the offer.<br> 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Matt Tucker 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author loki der quaeler 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Derek DeMoro 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class Offer { 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private Connection connection; 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private AgentSession session; 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private String sessionID; 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private String userJID; 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private String userID; 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private String workgroupName; 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private Date expiresDate; 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private Map<String, List<String>> metaData; 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private OfferContent content; 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private boolean accepted = false; 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private boolean rejected = false; 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates a new offer. 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param conn the XMPP connection with which the issuing session was created. 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param agentSession the agent session instance through which this offer was issued. 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param userID the userID of the user from which the offer originates. 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param userJID the XMPP address of the user from which the offer originates. 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param workgroupName the fully qualified name of the workgroup. 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param expiresDate the date at which this offer expires. 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param sessionID the session id associated with the offer. 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param metaData the metadata associated with the offer. 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param content content of the offer. The content explains the reason for the offer 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * (e.g. user request, transfer) 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Offer(Connection conn, AgentSession agentSession, String userID, 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String userJID, String workgroupName, Date expiresDate, 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen String sessionID, Map<String, List<String>> metaData, OfferContent content) 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen { 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.connection = conn; 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.session = agentSession; 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.userID = userID; 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.userJID = userJID; 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.workgroupName = workgroupName; 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.expiresDate = expiresDate; 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.sessionID = sessionID; 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.metaData = metaData; 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.content = content; 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Accepts the offer. 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void accept() { 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Packet acceptPacket = new AcceptPacket(this.session.getWorkgroupJID()); 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen connection.sendPacket(acceptPacket); 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // TODO: listen for a reply. 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen accepted = true; 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Rejects the offer. 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public void reject() { 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen RejectPacket rejectPacket = new RejectPacket(this.session.getWorkgroupJID()); 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen connection.sendPacket(rejectPacket); 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // TODO: listen for a reply. 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen rejected = true; 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the userID that the offer originates from. In most cases, the 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * userID will simply be the JID of the requesting user. However, users can 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * also manually specify a userID for their request. In that case, that value will 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * be returned. 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the userID of the user from which the offer originates. 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getUserID() { 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return userID; 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the JID of the user that made the offer request. 117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the user's JID. 119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getUserJID() { 121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return userJID; 122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The fully qualified name of the workgroup (eg support@example.com). 126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the name of the workgroup. 128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getWorkgroupName() { 130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return this.workgroupName; 131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The date when the offer will expire. The agent must {@link #accept()} 135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * the offer before the expiration date or the offer will lapse and be 136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * routed to another agent. Alternatively, the agent can {@link #reject()} 137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * the offer at any time if they don't wish to accept it.. 138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the date at which this offer expires. 140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public Date getExpiresDate() { 142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return this.expiresDate; 143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The session ID associated with the offer. 147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the session id associated with the offer. 149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getSessionID() { 151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return this.sessionID; 152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The meta-data associated with the offer. 156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the offer meta-data. 158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public Map<String, List<String>> getMetaData() { 160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return this.metaData; 161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the content of the offer. The content explains the reason for the offer 165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * (e.g. user request, transfer) 166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the content of the offer. 168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public OfferContent getContent() { 170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return content; 171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns true if the agent accepted this offer. 175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return true if the agent accepted this offer. 177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 178d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public boolean isAccepted() { 179d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return accepted; 180d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 181d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 182d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 183d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Return true if the agent rejected this offer. 184d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 185d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return true if the agent rejected this offer. 186d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 187d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public boolean isRejected() { 188d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return rejected; 189d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 190d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 191d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 192d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Packet for rejecting offers. 193d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 194d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private class RejectPacket extends IQ { 195d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 196d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen RejectPacket(String workgroup) { 197d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.setTo(workgroup); 198d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.setType(IQ.Type.SET); 199d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 200d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 201d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getChildElementXML() { 202d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return "<offer-reject id=\"" + Offer.this.getSessionID() + 203d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "\" xmlns=\"http://jabber.org/protocol/workgroup" + "\"/>"; 204d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 205d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 206d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 207d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 208d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Packet for accepting an offer. 209d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 210d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private class AcceptPacket extends IQ { 211d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 212d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen AcceptPacket(String workgroup) { 213d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.setTo(workgroup); 214d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.setType(IQ.Type.SET); 215d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 216d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 217d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public String getChildElementXML() { 218d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return "<offer-accept id=\"" + Offer.this.getSessionID() + 219d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen "\" xmlns=\"http://jabber.org/protocol/workgroup" + "\"/>"; 220d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 221d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 222d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 223d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}