package org.chartsy.chatsy.chatimpl.search.users; import org.jivesoftware.smack.XMPPException; import org.jivesoftware.smackx.ServiceDiscoveryManager; import org.jivesoftware.smackx.packet.DiscoverInfo; import org.jivesoftware.smackx.packet.DiscoverItems; import org.chartsy.chatsy.chat.ChatsyManager; import org.chartsy.chatsy.chat.search.Searchable; import org.chartsy.chatsy.chat.ui.DataFormUI; import org.chartsy.chatsy.chat.util.GraphicUtils; import org.chartsy.chatsy.chat.util.SwingWorker; import org.chartsy.chatsy.chat.util.log.Log; import javax.swing.*; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import org.openide.windows.WindowManager; public class UserSearchService implements Searchable { private Collection searchServices; public UserSearchService() { loadSearchServices(); } public void search(final String query) { SwingWorker worker = new SwingWorker() { public Object construct() { if (searchServices == null) loadSearchServices(); return true; } public void finished() { processQuery(query); } }; worker.start(); } private void processQuery(String query) { if (searchServices == null) { JOptionPane.showMessageDialog( ChatsyManager.getMainWindow(), "Unable to contact search service", "Error", JOptionPane.ERROR_MESSAGE); return; } UserSearchForm searchForm; DataFormUI dataFormUI; try { searchForm = new UserSearchForm(searchServices); dataFormUI = searchForm.getQuestionForm(); } catch (Exception e) { JOptionPane.showMessageDialog( ChatsyManager.getMainWindow(), "Unable to contact search service", "Error", JOptionPane.ERROR_MESSAGE); return; } JTextField textField = (JTextField)dataFormUI.getComponent("search"); if (textField != null) { textField.setText(query); } else { textField = (JTextField)dataFormUI.getComponent("last"); if (textField != null) textField.setText(query); } if (textField == null) { textField = (JTextField)dataFormUI.getComponent("userName"); if (textField != null) textField.setText(query); } if (textField != null) searchForm.performSearch(); JFrame frame = new JFrame(); frame.setIconImage(WindowManager.getDefault().getMainWindow().getIconImage()); final JDialog dialog = new JDialog(frame, "Buddy Search", false); dialog.getContentPane().add(searchForm); dialog.pack(); dialog.setSize(500, 500); GraphicUtils.centerWindowOnScreen(dialog); dialog.setVisible(true); } private void loadSearchServices() { try { searchServices = getServices(); } catch (Exception e) { Log.error("Unable to load search services.", e); } } private Collection getServices() throws Exception { final Set<String> searchServicesSet = new HashSet<String>(); ServiceDiscoveryManager discoManager = ServiceDiscoveryManager.getInstanceFor(ChatsyManager.getConnection()); DiscoverItems items = ChatsyManager.getSessionManager().getDiscoveredItems(); Iterator<DiscoverItems.Item> iter = items.getItems(); while (iter.hasNext()) { DiscoverItems.Item item = iter.next(); try { DiscoverInfo info; try { info = discoManager.discoverInfo(item.getEntityID()); } catch (XMPPException e) { continue; } if (info.containsFeature("jabber:iq:search")) { for (Iterator<DiscoverInfo.Identity> identities = info.getIdentities(); identities.hasNext();) { DiscoverInfo.Identity identity = identities.next(); if ("directory".equals(identity.getCategory()) && "user".equals(identity.getType())) searchServicesSet.add(item.getEntityID()); } } } catch (Exception e) { break; } } return searchServicesSet; } public Collection getSearchServices() { return searchServices; } public String getToolTip() { return "Search for other people on the server"; } public String getDefaultText() { return "Search for other people on the server"; } public String getName() { return "Person search"; } public Icon getIcon() { return null; } }