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.packet;
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.packet.PacketExtension;
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.provider.PacketExtensionProvider;
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.xmlpull.v1.XmlPullParser;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/**
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Packet extension for {@link org.jivesoftware.smackx.workgroup.agent.InvitationRequest}.
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen *
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Gaston Dombiak
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class RoomInvitation implements PacketExtension {
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Element name of the packet extension.
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static final String ELEMENT_NAME = "invite";
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Namespace of the packet extension.
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static final String NAMESPACE = "http://jabber.org/protocol/workgroup";
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Type of entity being invited to a groupchat support session.
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private Type type;
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * JID of the entity being invited. The entity could be another agent, user , a queue or a workgroup. In
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * the case of a queue or a workgroup the server will select the best agent to invite.
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String invitee;
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Full JID of the user that sent the invitation.
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String inviter;
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * ID of the session that originated the initial user request.
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String sessionID;
60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * JID of the room to join if offer is accepted.
62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String room;
64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Text provided by the inviter explaining the reason why the invitee is invited.
66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private String reason;
68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public RoomInvitation(Type type, String invitee, String sessionID, String reason) {
70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.type = type;
71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.invitee = invitee;
72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.sessionID = sessionID;
73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        this.reason = reason;
74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    private RoomInvitation() {
77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getElementName() {
80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return ELEMENT_NAME;
81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getNamespace() {
84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return NAMESPACE;
85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getInviter() {
88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return inviter;
89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getRoom() {
92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return room;
93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getReason() {
96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return reason;
97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String getSessionID() {
100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return sessionID;
101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public String toXML() {
104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        StringBuilder buf = new StringBuilder();
105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        buf.append("<").append(ELEMENT_NAME).append(" xmlns=\"").append(NAMESPACE);
107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        buf.append("\" type=\"").append(type).append("\">");
108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        buf.append("<session xmlns=\"http://jivesoftware.com/protocol/workgroup\" id=\"").append(sessionID).append("\"></session>");
109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (invitee != null) {
110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            buf.append("<invitee>").append(invitee).append("</invitee>");
111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (inviter != null) {
113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            buf.append("<inviter>").append(inviter).append("</inviter>");
114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        if (reason != null) {
116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            buf.append("<reason>").append(reason).append("</reason>");
117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        // Add packet extensions, if any are defined.
119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        buf.append("</").append(ELEMENT_NAME).append("> ");
120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        return buf.toString();
122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    /**
125d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     * Type of entity being invited to a groupchat support session.
126d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen     */
127d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static enum Type {
128d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
129d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * A user is being invited to a groupchat support session. The user could be another agent
130d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * or just a regular XMPP user.
131d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
132d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        user,
133d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
134d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Some agent of the specified queue will be invited to the groupchat support session.
135d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
136d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        queue,
137d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        /**
138d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         * Some agent of the specified workgroup will be invited to the groupchat support session.
139d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen         */
140d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        workgroup
141d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
142d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
143d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    public static class Provider implements PacketExtensionProvider {
144d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
145d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        public PacketExtension parseExtension(XmlPullParser parser) throws Exception {
146d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            final RoomInvitation invitation = new RoomInvitation();
147d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            invitation.type = Type.valueOf(parser.getAttributeValue("", "type"));
148d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
149d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            boolean done = false;
150d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            while (!done) {
151d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                parser.next();
152d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                String elementName = parser.getName();
153d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                if (parser.getEventType() == XmlPullParser.START_TAG) {
154d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    if ("session".equals(elementName)) {
155d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        invitation.sessionID = parser.getAttributeValue("", "id");
156d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
157d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    else if ("invitee".equals(elementName)) {
158d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        invitation.invitee = parser.nextText();
159d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
160d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    else if ("inviter".equals(elementName)) {
161d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        invitation.inviter = parser.nextText();
162d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
163d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    else if ("reason".equals(elementName)) {
164d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        invitation.reason = parser.nextText();
165d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
166d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    else if ("room".equals(elementName)) {
167d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                        invitation.room = parser.nextText();
168d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    }
169d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
170d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                else if (parser.getEventType() == XmlPullParser.END_TAG && ELEMENT_NAME.equals(elementName)) {
171d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                    done = true;
172d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen                }
173d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            }
174d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen            return invitation;
175d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen        }
176d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen    }
177d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
178