package org.jivesoftware.messenger.handler; import java.util.ArrayList; import java.util.Iterator; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.QName; import org.jivesoftware.messenger.IQHandlerInfo; import org.jivesoftware.messenger.XMPPServer; import org.jivesoftware.messenger.auth.UnauthorizedException; import org.jivesoftware.messenger.disco.ServerFeaturesProvider; import org.jivesoftware.messenger.forms.DataForm; import org.jivesoftware.messenger.forms.FormField; import org.jivesoftware.messenger.forms.spi.XDataFormImpl; import org.jivesoftware.messenger.forms.spi.XFormFieldImpl; import org.jivesoftware.messenger.user.User; import org.jivesoftware.messenger.user.UserAlreadyExistsException; import org.jivesoftware.messenger.user.UserManager; import org.xmpp.packet.IQ; /** * Provides support for Jabber Search (JEP-0055). *
* The basic functionality is to query an information repository * regarding the possible search fields, to send a search query, * and to receive search results. This implementation below uses the * Data Forms. * * Currently, only searching by name is supported. * * @author Ryan Graham */ public class IQSearchHandler extends IQHandler implements ServerFeaturesProvider { private UserManager userManager; private XMPPServer localServer; private IQHandlerInfo info; private static Element probeResult; public IQSearchHandler() { super("IQSearchHandler"); info = new IQHandlerInfo("query", "jabber:iq:search"); } public void initialize(XMPPServer server) { super.initialize(server); localServer = server; userManager = server.getUserManager(); if (probeResult == null) { // TODO expand to use other fields, may require changes to db probeResult = DocumentHelper.createElement(QName.get("query", "jabber:iq:search")); probeResult.addElement("username"); probeResult.addElement("email"); XDataFormImpl searchForm = new XDataFormImpl(DataForm.TYPE_RESULT); searchForm.setTitle("User Search"); searchForm.addInstruction("Please provide the following information"); XFormFieldImpl field = new XFormFieldImpl("FORM_TYPE"); field.setType(FormField.TYPE_HIDDEN); field.addValue("jabber:iq:search"); searchForm.addField(field); field = new XFormFieldImpl("name"); field.setType(FormField.TYPE_TEXT_SINGLE); field.setLabel("Name"); field.addValue("b*"); field.setRequired(false); searchForm.addField(field); probeResult.add(searchForm.asXMLElement()); } } public IQ handleIQ(IQ packet) throws UnauthorizedException { if (IQ.Type.get.equals(packet.getType())) { return processGetPacket(packet); } else if (IQ.Type.set.equals(packet.getType())) { return processSetPacket(packet); } return null; } private IQ processGetPacket(IQ packet) { IQ replyPacket = IQ.createResultIQ(packet); replyPacket.setChildElement("query", "jabber:iq:search"); replyPacket.setChildElement(probeResult.createCopy()); return replyPacket; } private IQ processSetPacket(IQ packet) { IQ replyPacket = IQ.createResultIQ(packet); Element incomingForm = packet.getChildElement(); Element form = incomingForm.element(QName.get("x", "jabber:x:data")); Iterator fields = form.elementIterator("field"); Element f; while (fields.hasNext()) { f = (Element) fields.next(); if ("name".equals(f.attributeValue("var"))) { Iterator iter = f.elementIterator("value"); while (iter.hasNext()) { Element e = (Element) iter.next(); XDataFormImpl searchResults = new XDataFormImpl(DataForm.TYPE_RESULT); XFormFieldImpl field = new XFormFieldImpl("FORM_TYPE"); field.setType(FormField.TYPE_HIDDEN); searchResults.addField(field); field = new XFormFieldImpl("name"); field.setLabel("Name"); searchResults.addReportedField(field); field = new XFormFieldImpl("email"); field.setLabel("Email"); searchResults.addReportedField(field); User userBob = null; User userBill = null; try { userBob = userManager.createUser("bob", "b", "bobby", "bobby@localhost"); userBill = userManager.createUser("bill", "b", "billy", "billy@localhost"); ArrayList