KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jivesoftware > messenger > muc > spi > IQMUCRegisterHandler


1 /**
2  * $RCSfile: IQMUCRegisterHandler.java,v $
3  * $Revision: 1.15 $
4  * $Date: 2005/07/12 21:40:16 $
5  *
6  * Copyright (C) 2004 Jive Software. All rights reserved.
7  *
8  * This software is published under the terms of the GNU Public License (GPL),
9  * a copy of which is included in this distribution.
10  */

11
12 package org.jivesoftware.messenger.muc.spi;
13
14 import org.dom4j.DocumentHelper;
15 import org.dom4j.Element;
16 import org.dom4j.QName;
17 import org.jivesoftware.messenger.forms.DataForm;
18 import org.jivesoftware.messenger.forms.FormField;
19 import org.jivesoftware.messenger.forms.spi.XDataFormImpl;
20 import org.jivesoftware.messenger.forms.spi.XFormFieldImpl;
21 import org.jivesoftware.messenger.muc.ConflictException;
22 import org.jivesoftware.messenger.muc.ForbiddenException;
23 import org.jivesoftware.messenger.muc.MUCRoom;
24 import org.jivesoftware.messenger.muc.MultiUserChatServer;
25 import org.jivesoftware.util.ElementUtil;
26 import org.jivesoftware.util.LocaleUtils;
27 import org.jivesoftware.util.Log;
28 import org.xmpp.packet.IQ;
29 import org.xmpp.packet.PacketError;
30 import org.xmpp.packet.Presence;
31
32 import java.util.ArrayList JavaDoc;
33 import java.util.Iterator JavaDoc;
34 import java.util.List JavaDoc;
35
36 /**
37  * This class is responsible for handling packets with namespace jabber:iq:register that were
38  * sent to the MUC service. MultiUserChatServer will receive all the IQ packets and if the
39  * namespace of the IQ is jabber:iq:register then this class will handle the packet.
40  *
41  * @author Gaston Dombiak
42  */

43 class IQMUCRegisterHandler {
44
45     private static Element probeResult;
46     private MultiUserChatServer mucServer;
47
48     public IQMUCRegisterHandler(MultiUserChatServer mucServer) {
49         this.mucServer = mucServer;
50         initialize();
51     }
52
53     public void initialize() {
54         if (probeResult == null) {
55             // Create the registration form of the room which contains information
56
// such as: first name, last name and nickname.
57
XDataFormImpl registrationForm = new XDataFormImpl(DataForm.TYPE_FORM);
58             registrationForm.setTitle(LocaleUtils.getLocalizedString("muc.form.reg.title"));
59             registrationForm.addInstruction(LocaleUtils
60                     .getLocalizedString("muc.form.reg.instruction"));
61
62             XFormFieldImpl field = new XFormFieldImpl("FORM_TYPE");
63             field.setType(FormField.TYPE_HIDDEN);
64             field.addValue("http://jabber.org/protocol/muc#register");
65             registrationForm.addField(field);
66
67             field = new XFormFieldImpl("muc#register_first");
68             field.setType(FormField.TYPE_TEXT_SINGLE);
69             field.setLabel(LocaleUtils.getLocalizedString("muc.form.reg.first-name"));
70             field.setRequired(true);
71             registrationForm.addField(field);
72
73             field = new XFormFieldImpl("muc#register_last");
74             field.setType(FormField.TYPE_TEXT_SINGLE);
75             field.setLabel(LocaleUtils.getLocalizedString("muc.form.reg.last-name"));
76             field.setRequired(true);
77             registrationForm.addField(field);
78
79             field = new XFormFieldImpl("muc#register_roomnick");
80             field.setType(FormField.TYPE_TEXT_SINGLE);
81             field.setLabel(LocaleUtils.getLocalizedString("muc.form.reg.nickname"));
82             field.setRequired(true);
83             registrationForm.addField(field);
84
85             field = new XFormFieldImpl("muc#register_url");
86             field.setType(FormField.TYPE_TEXT_SINGLE);
87             field.setLabel(LocaleUtils.getLocalizedString("muc.form.reg.url"));
88             registrationForm.addField(field);
89
90             field = new XFormFieldImpl("muc#register_email");
91             field.setType(FormField.TYPE_TEXT_SINGLE);
92             field.setLabel(LocaleUtils.getLocalizedString("muc.form.reg.email"));
93             registrationForm.addField(field);
94
95             field = new XFormFieldImpl("muc#register_faqentry");
96             field.setType(FormField.TYPE_TEXT_MULTI);
97             field.setLabel(LocaleUtils.getLocalizedString("muc.form.reg.faqentry"));
98             registrationForm.addField(field);
99
100             // Create the probeResult and add the registration form
101
probeResult = DocumentHelper.createElement(QName.get("query", "jabber:iq:register"));
102             probeResult.add(registrationForm.asXMLElement());
103         }
104     }
105
106     public IQ handleIQ(IQ packet) {
107         IQ reply = null;
108         // Get the target room
109
MUCRoom room = mucServer.getChatRoom(packet.getTo().getNode());
110         if (room == null) {
111             // The room doesn't exist so answer a NOT_FOUND error
112
reply = IQ.createResultIQ(packet);
113             reply.setChildElement(packet.getChildElement().createCopy());
114             reply.setError(PacketError.Condition.item_not_found);
115             return reply;
116         }
117         else if (!room.isRegistrationEnabled()) {
118             // The room does not accept users to register
119
reply = IQ.createResultIQ(packet);
120             reply.setChildElement(packet.getChildElement().createCopy());
121             reply.setError(PacketError.Condition.not_allowed);
122             return reply;
123         }
124
125         if (IQ.Type.get == packet.getType()) {
126             reply = IQ.createResultIQ(packet);
127             String JavaDoc nickname = room.getReservedNickname(packet.getFrom().toBareJID());
128             Element currentRegistration = probeResult.createCopy();
129             if (nickname != null) {
130                 // The user is already registered with the room so answer a completed form
131
ElementUtil.setProperty(currentRegistration, "query.registered", null);
132                 Element form = currentRegistration.element(QName.get("x", "jabber:x:data"));
133                 Iterator JavaDoc fields = form.elementIterator("field");
134                 Element field;
135                 while (fields.hasNext()) {
136                     field = (Element) fields.next();
137                     if ("muc#register_roomnick".equals(field.attributeValue("var"))) {
138                         field.addElement("value").addText(nickname);
139                     }
140                 }
141                 reply.setChildElement(currentRegistration);
142             }
143             else {
144                 // The user is not registered with the room so answer an empty form
145
reply.setChildElement(currentRegistration);
146             }
147         }
148         else if (IQ.Type.set == packet.getType()) {
149             try {
150                 // Keep a registry of the updated presences
151
List JavaDoc<Presence> presences = new ArrayList JavaDoc<Presence>();
152
153                 reply = IQ.createResultIQ(packet);
154                 Element iq = packet.getChildElement();
155
156                 if (ElementUtil.includesProperty(iq, "query.remove")) {
157                     // The user is deleting his registration
158
presences.addAll(room.addNone(packet.getFrom().toBareJID(), room.getRole()));
159                 }
160                 else {
161                     // The user is trying to register with a room
162
Element formElement = iq.element("x");
163                     // Check if a form was used to provide the registration info
164
if (formElement != null) {
165                         // Get the sent form
166
XDataFormImpl registrationForm = new XDataFormImpl();
167                         registrationForm.parse(formElement);
168                         // Get the desired nickname sent in the form
169
Iterator JavaDoc<String JavaDoc> values = registrationForm.getField("muc#register_roomnick")
170                                 .getValues();
171                         String JavaDoc nickname = (values.hasNext() ? values.next() : null);
172
173                         // TODO The rest of the fields of the form are ignored. If we have a
174
// requirement in the future where we need those fields we'll have to change
175
// MUCRoom.addMember in order to receive a RegistrationInfo (new class)
176

177                         // Add the new member to the members list
178
presences.addAll(room.addMember(packet.getFrom().toBareJID(),
179                                 nickname,
180                                 room.getRole()));
181                     }
182                     else {
183                         reply.setChildElement(packet.getChildElement().createCopy());
184                         reply.setError(PacketError.Condition.bad_request);
185                     }
186                 }
187                 // Send the updated presences to the room occupants
188
for (Presence presence : presences) {
189                     room.send(presence);
190                 }
191
192             }
193             catch (ForbiddenException e) {
194                 reply = IQ.createResultIQ(packet);
195                 reply.setChildElement(packet.getChildElement().createCopy());
196                 reply.setError(PacketError.Condition.forbidden);
197             }
198             catch (ConflictException e) {
199                 reply = IQ.createResultIQ(packet);
200                 reply.setChildElement(packet.getChildElement().createCopy());
201                 reply.setError(PacketError.Condition.conflict);
202             }
203             catch (Exception JavaDoc e) {
204                 Log.error(e);
205             }
206         }
207         return reply;
208     }
209 }
210
Popular Tags