/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package Sirius.navigator.search; import Sirius.navigator.connection.SessionManager; import Sirius.navigator.method.MethodManager; import Sirius.navigator.search.dynamic.SearchControlDialog; import Sirius.navigator.search.dynamic.SearchProgressDialog; import Sirius.navigator.ui.ComponentRegistry; import Sirius.navigator.ui.status.DefaultStatusChangeSupport; import Sirius.server.middleware.types.Node; import java.awt.EventQueue; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collection; import javax.swing.SwingWorker; import de.cismet.cids.server.search.MetaObjectNodeServerSearch; import de.cismet.cids.server.search.SearchResultListener; import de.cismet.cids.server.search.SearchResultListenerProvider; import de.cismet.tools.CismetThreadPool; import de.cismet.tools.gui.StaticSwingTools; /** * DOCUMENT ME! * * @author stefan * @version $Revision$, $Date$ */ public final class CidsSearchExecutor { //~ Static fields/initializers --------------------------------------------- private static final DefaultStatusChangeSupport dscs = new DefaultStatusChangeSupport(new Object()); private static final transient org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger( CidsSearchExecutor.class); private static SearchProgressDialog searchProgressDialog; private static SearchControlDialog searchControlDialog; //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @param search DOCUMENT ME! */ public static void searchAndDisplayResultsWithDialog(final MetaObjectNodeServerSearch search) { searchAndDisplayResultsWithDialog(search, false); } /** * DOCUMENT ME! * * @param search DOCUMENT ME! * @param simpleSort if true, sorts the search results alphabetically. Usually set to false, as a more specific * sorting order is wished. */ public static void searchAndDisplayResultsWithDialog(final MetaObjectNodeServerSearch search, final boolean simpleSort) { if (searchControlDialog == null) { searchControlDialog = new SearchControlDialog(ComponentRegistry.getRegistry().getNavigator(), true); searchControlDialog.pack(); } searchControlDialog.setSearch(search); EventQueue.invokeLater(new Runnable() { @Override public void run() { searchControlDialog.startSearch(simpleSort); } }); StaticSwingTools.showDialog(searchControlDialog); } /** * DOCUMENT ME! * * @param search DOCUMENT ME! * @param listener DOCUMENT ME! * @param searchResultsListener DOCUMENT ME! * * @return DOCUMENT ME! */ public static SwingWorker<Node[], Void> searchAndDisplayResultsWithDialog(final MetaObjectNodeServerSearch search, final PropertyChangeListener listener, final PropertyChangeListener searchResultsListener) { final SwingWorker<Node[], Void> worker = new SwingWorker<Node[], Void>() { PropertyChangeListener cancelListener = null; @Override protected Node[] doInBackground() throws Exception { Thread.currentThread().setName("CidsSearchExecutor searchAndDisplayResultsWithDialog()"); EventQueue.invokeLater(new Runnable() { @Override public void run() { cancelListener = new PropertyChangeListener() { @Override public void propertyChange(final PropertyChangeEvent evt) { log.fatal("CANCEL-->" + evt); cancel(true); } }; dscs.addPropertyChangeListener(cancelListener); getSearchProgressDialog().pack(); getSearchProgressDialog().setLabelAnimation(true); StaticSwingTools.showDialog(getSearchProgressDialog()); } }); final Collection res = SessionManager.getProxy() .customServerSearch(SessionManager.getSession().getUser(), search); if (!isCancelled()) { final ArrayList<Node> aln = new ArrayList<Node>(res.size()); for (final Object o : res) { aln.add((Node)o); } final Node[] ret = aln.toArray(new Node[0]); if (!isCancelled()) { MethodManager.getManager().showSearchResults(search, ret, false, searchResultsListener); } return ret; } return null; } @Override protected void done() { try { if (!isCancelled()) { final Node[] res = get(); getSearchProgressDialog().setVisible(false); getSearchProgressDialog().setLabelAnimation(false); } } catch (Exception ex) { log.fatal("suchproblem", ex); } dscs.removePropertyChangeListener(cancelListener); } }; worker.addPropertyChangeListener(listener); CismetThreadPool.execute(worker); return worker; } /** * DOCUMENT ME! * * @param search DOCUMENT ME! * @param searchListener DOCUMENT ME! * @param searchResultsTreeListener DOCUMENT ME! * @param suppressEmptyResultMessage DOCUMENT ME! * * @return DOCUMENT ME! */ public static SwingWorker<Node[], Void> searchAndDisplayResults(final MetaObjectNodeServerSearch search, final PropertyChangeListener searchListener, final PropertyChangeListener searchResultsTreeListener, final boolean suppressEmptyResultMessage) { return searchAndDisplayResults( search, searchListener, searchResultsTreeListener, suppressEmptyResultMessage, false); } /** * DOCUMENT ME! * * @param search The search to perform. * @param searchListener A listener which will be informed about status changes of search thread. * Usually a SearchControlPanel. * @param searchResultsTreeListener A listener which will be informed about status changes of the thread which * refreshes the SearchResultsTree. Usually the same SearchControlPanel as * listener. * @param suppressEmptyResultMessage A flag indicating that the user shouldn't be informed about an empty result. * Since this message is generated in the called method to display the search * results in the SearchResultsTree this flag decides about calling thismethod * or not. * @param simpleSort if true, sorts the search results alphabetically. Usually set to false, as a * more specific sorting order is wished. * * @return DOCUMENT ME! */ public static SwingWorker<Node[], Void> searchAndDisplayResults(final MetaObjectNodeServerSearch search, final PropertyChangeListener searchListener, final PropertyChangeListener searchResultsTreeListener, final boolean suppressEmptyResultMessage, final boolean simpleSort) { final SwingWorker<Node[], Void> worker = new SwingWorker<Node[], Void>() { @Override protected Node[] doInBackground() throws Exception { Thread.currentThread().setName("CidsSearchExecutor searchAndDisplayResults()"); Node[] result = null; final Collection searchResult = SessionManager.getProxy() .customServerSearch(SessionManager.getSession().getUser(), search); if (isCancelled()) { return result; } final ArrayList<Node> nodes = new ArrayList<Node>(searchResult.size()); for (final Object singleSearchResult : searchResult) { nodes.add((Node)singleSearchResult); if (isCancelled()) { return result; } } result = nodes.toArray(new Node[0]); if (!isCancelled()) { if (!suppressEmptyResultMessage || (result.length > 0)) { MethodManager.getManager() .showSearchResults(search, result, false, searchResultsTreeListener, simpleSort); } } if (search instanceof SearchResultListenerProvider) { final SearchResultListenerProvider searchResultListenerProvider = (SearchResultListenerProvider) search; final SearchResultListener searchResultListener = searchResultListenerProvider.getSearchResultListener(); if (searchResultListener != null) { searchResultListener.searchDone(new ArrayList(searchResult)); searchResultListenerProvider.setSearchResultListener(null); } } return result; } }; worker.addPropertyChangeListener(searchListener); CismetThreadPool.execute(worker); return worker; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ private static SearchProgressDialog getSearchProgressDialog() { if (searchProgressDialog == null) { searchProgressDialog = new SearchProgressDialog(StaticSwingTools.getFirstParentFrame( ComponentRegistry.getRegistry().getDescriptionPane()), dscs); } return searchProgressDialog; } }