1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Copyright 2003-2007 Jive Software. 3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); 5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * you may not use this file except in compliance with the License. 6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * You may obtain a copy of the License at 7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * http://www.apache.org/licenses/LICENSE-2.0 9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Unless required by applicable law or agreed to in writing, software 11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * distributed under the License is distributed on an "AS IS" BASIS, 12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * See the License for the specific language governing permissions and 14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * limitations under the License. 15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 16d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.jivesoftware.smackx.search; 18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.Connection; 20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smack.XMPPException; 21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.Form; 22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.ReportedData; 23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.ServiceDiscoveryManager; 24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.packet.DiscoverInfo; 25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.jivesoftware.smackx.packet.DiscoverItems; 26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.ArrayList; 28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Collection; 29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.Iterator; 30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.util.List; 31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen/** 33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * The UserSearchManager is a facade built upon Jabber Search Services (JEP-055) to allow for searching 34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * repositories on a Jabber Server. This implementation allows for transparency of implementation of 35d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * searching (DataForms or No DataForms), but allows the user to simply use the DataForm model for both 36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * types of support. 37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * <pre> 38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Connection con = new XMPPConnection("jabber.org"); 39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * con.login("john", "doe"); 40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * UserSearchManager search = new UserSearchManager(con, "users.jabber.org"); 41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Form searchForm = search.getSearchForm(); 42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Form answerForm = searchForm.createAnswerForm(); 43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * answerForm.setAnswer("last", "DeMoro"); 44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * ReportedData data = search.getSearchResults(answerForm); 45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * // Use Returned Data 46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * </pre> 47d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @author Derek DeMoro 49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpublic class UserSearchManager { 51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private Connection con; 53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen private UserSearch userSearch; 54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Creates a new UserSearchManager. 57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param con the Connection to use. 59d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 60d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public UserSearchManager(Connection con) { 61d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen this.con = con; 62d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen userSearch = new UserSearch(); 63d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 64d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 65d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 66d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns the form to fill out to perform a search. 67d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 68d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param searchService the search service to query. 69d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the form to fill out to perform a search. 70d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @throws XMPPException thrown if a server error has occurred. 71d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 72d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public Form getSearchForm(String searchService) throws XMPPException { 73d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return userSearch.getSearchForm(con, searchService); 74d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 75d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 76d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 77d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Submits a search form to the server and returns the resulting information 78d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * in the form of <code>ReportedData</code> 79d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 80d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param searchForm the <code>Form</code> to submit for searching. 81d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @param searchService the name of the search service to use. 82d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return the ReportedData returned by the server. 83d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @throws XMPPException thrown if a server error has occurred. 84d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 85d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public ReportedData getSearchResults(Form searchForm, String searchService) throws XMPPException { 86d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return userSearch.sendSearchForm(con, searchForm, searchService); 87d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 88d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 89d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 90d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen /** 91d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * Returns a collection of search services found on the server. 92d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * 93d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @return a Collection of search services found on the server. 94d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen * @throws XMPPException thrown if a server error has occurred. 95d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen */ 96d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen public Collection<String> getSearchServices() throws XMPPException { 97d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen final List<String> searchServices = new ArrayList<String>(); 98d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen ServiceDiscoveryManager discoManager = ServiceDiscoveryManager.getInstanceFor(con); 99d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen DiscoverItems items = discoManager.discoverItems(con.getServiceName()); 100d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen Iterator<DiscoverItems.Item> iter = items.getItems(); 101d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen while (iter.hasNext()) { 102d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen DiscoverItems.Item item = iter.next(); 103d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 104d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen DiscoverInfo info; 105d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen try { 106d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen info = discoManager.discoverInfo(item.getEntityID()); 107d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 108d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen catch (XMPPException e) { 109d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // Ignore Case 110d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen continue; 111d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 112d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen 113d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen if (info.containsFeature("jabber:iq:search")) { 114d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen searchServices.add(item.getEntityID()); 115d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 116d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 117d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen catch (Exception e) { 118d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen // No info found. 119d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen break; 120d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 121d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 122d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen return searchServices; 123d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen } 124d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen} 125