/*************************************************** * * cismet GmbH, Saarbruecken, Germany * * ... and it just works. * ****************************************************/ package Sirius.navigator.ui.tree; import Sirius.navigator.ui.tree.postfilter.PostFilter; import Sirius.navigator.ui.tree.postfilter.PostFilterGUI; import Sirius.navigator.ui.tree.postfilter.PostFilterListener; import Sirius.server.middleware.types.MetaClass; import Sirius.server.middleware.types.Node; import org.apache.log4j.Logger; import org.openide.util.Lookup; import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; import de.cismet.cids.navigator.utils.ClassCacheMultiple; import de.cismet.tools.collections.HashArrayList; /** * DOCUMENT ME! * * @author thorsten * @version $Revision$, $Date$ */ public class PostfilterEnabledSearchResultsTree extends SearchResultsTree implements PostFilterListener { //~ Static fields/initializers --------------------------------------------- private static final Logger LOG = Logger.getLogger(PostfilterEnabledSearchResultsTree.class); //~ Instance fields -------------------------------------------------------- private HashArrayList<Node> resultNodesOriginal = new HashArrayList<Node>(); private ArrayList<PostFilterGUI> availablePostFilterGUIs = new ArrayList<PostFilterGUI>(); private ArrayList<PostFilter> filterArray = new ArrayList<PostFilter>(); //~ Constructors ----------------------------------------------------------- /** * Creates a new PostfilterEnabledSearchResultsTree object. * * @throws Exception DOCUMENT ME! */ public PostfilterEnabledSearchResultsTree() throws Exception { final Collection<? extends PostFilterGUI> lookupResult = Lookup.getDefault().lookupAll(PostFilterGUI.class); availablePostFilterGUIs = new ArrayList<PostFilterGUI>(lookupResult); Collections.sort(availablePostFilterGUIs, new Comparator<PostFilterGUI>() { @Override public int compare(final PostFilterGUI o1, final PostFilterGUI o2) { return o1.getDisplayOrderKeyPrio().compareTo(o2.getDisplayOrderKeyPrio()); } }); LOG.info(availablePostFilterGUIs.size() + " post filter GUIs available"); } /** * Creates a new PostfilterEnabledSearchResultsTree object. * * @param useThread DOCUMENT ME! * @param maxThreadCount DOCUMENT ME! * * @throws Exception DOCUMENT ME! */ public PostfilterEnabledSearchResultsTree(final boolean useThread, final int maxThreadCount) throws Exception { super(useThread, maxThreadCount); } //~ Methods ---------------------------------------------------------------- /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public boolean isFiltered() { return resultNodesOriginal.size() > resultNodes.size(); } @Override public void setResultNodes(final Node[] nodes, final boolean append, final PropertyChangeListener listener, final boolean simpleSort, final boolean sortActive) { super.setResultNodes(nodes, append, listener, simpleSort, sortActive); // To change body of generated // methods, choose Tools | Templates. resultNodesOriginal = new HashArrayList<Node>(super.resultNodes); } /** * DOCUMENT ME! * * @param nodes DOCUMENT ME! * @param filteredNodes DOCUMENT ME! * @param append DOCUMENT ME! * @param listener DOCUMENT ME! * @param simpleSort DOCUMENT ME! * @param sortActive DOCUMENT ME! */ public void setFilteredResultNodes( final Node[] nodes, final Node[] filteredNodes, final boolean append, final PropertyChangeListener listener, final boolean simpleSort, final boolean sortActive) { if (LOG.isDebugEnabled()) { LOG.debug("setting " + nodes.length + " result nodes with " + filteredNodes.length + " pre-filtered nodes"); } this.setResultNodes(nodes, append, listener, simpleSort, sortActive); this.internalSetResultNodes(filteredNodes, append, listener, simpleSort, sortActive); super.fireResultNodesFiltered(); } @Override public void setResultNodes(final Node[] nodes) { super.setResultNodes(nodes); resultNodesOriginal = new HashArrayList<Node>(super.resultNodes); } /** * DOCUMENT ME! * * @param nodes DOCUMENT ME! * @param filteredNodes DOCUMENT ME! */ public void setFilteredResultNodes( final Node[] nodes, final Node[] filteredNodes) { if (LOG.isDebugEnabled()) { LOG.debug("setting " + nodes.length + " result nodes with " + filteredNodes.length + " pre-filtered nodes"); } this.setResultNodes(nodes); this.internalSetResultNodes(filteredNodes); super.fireResultNodesFiltered(); } @Override public void setResultNodes( final Node[] nodes, final boolean append, final PropertyChangeListener listener, final boolean simpleSort) { super.setResultNodes(nodes, append, listener, simpleSort); // Tools | Templates. } /** * DOCUMENT ME! * * @param nodes DOCUMENT ME! * @param filteredNodes DOCUMENT ME! * @param append DOCUMENT ME! * @param listener DOCUMENT ME! * @param simpleSort DOCUMENT ME! */ public void setFilteredResultNodes( final Node[] nodes, final Node[] filteredNodes, final boolean append, final PropertyChangeListener listener, final boolean simpleSort) { super.setResultNodes(nodes, append, listener, simpleSort); this.internalSetResultNodes(filteredNodes); super.fireResultNodesFiltered(); } @Override public void setResultNodes( final Node[] nodes, final boolean append, final PropertyChangeListener listener) { super.setResultNodes(nodes, append, listener); } /** * DOCUMENT ME! * * @param nodes DOCUMENT ME! * @param filteredNodes DOCUMENT ME! * @param append DOCUMENT ME! * @param listener DOCUMENT ME! */ public void setFilteredResultNodes( final Node[] nodes, final Node[] filteredNodes, final boolean append, final PropertyChangeListener listener) { super.setResultNodes(nodes, append, listener); this.internalSetResultNodes(filteredNodes); super.fireResultNodesFiltered(); } /** * DOCUMENT ME! * * @param nodes DOCUMENT ME! * @param append DOCUMENT ME! * @param listener DOCUMENT ME! * @param simpleSort DOCUMENT ME! * @param sortActive DOCUMENT ME! */ public void internalSetResultNodes(final Node[] nodes, final boolean append, final PropertyChangeListener listener, final boolean simpleSort, final boolean sortActive) { super.muteResultNodeListeners = true; super.setResultNodes(nodes, append, listener, simpleSort, sortActive); // To change body of generated // methods, choose Tools | Templates. super.muteResultNodeListeners = false; } /** * DOCUMENT ME! * * @param nodes DOCUMENT ME! */ public void internalSetResultNodes(final Node[] nodes) { super.muteResultNodeListeners = true; super.setResultNodes(nodes); // To change body of generated methods, choose Tools | Templates. if (nodes.length == 0) { // super.setResultNodes(nodes); does not referesh the tree by default // do it manually here: refreshTree(true); } super.muteResultNodeListeners = false; } /** * Nach jedem Suchergebnissrefresh wird ein Lookup auf die POstfilterGUIs gemacht Eine Änderung wird dann über den * PostFilterGUIContainerListener an den SearchresultTreePanel gefeuert Auf den GUI wird setSearchResults aufgerufen * Die GUIs initialisieren ihre GUI aus den search Results wenn in den PostfilterGUI ein FilterUpdate passiert wird * über einen Listener hier Bescheid gesagt wie geht das Chaining??? * * @return DOCUMENT ME! */ public ArrayList<PostFilterGUI> getAvailablePostFilterGUIs() { return availablePostFilterGUIs; } @Override public void filterContentChanged(final PostFilter pf) { if (!filterArray.contains(pf)) { filterArray.add(pf); } filter(); } /** * DOCUMENT ME! */ public void clearFilter() { filterArray.clear(); internalSetResultNodes(resultNodesOriginal.toArray(new Node[0])); super.fireResultNodesChanged(); } /** * DOCUMENT ME! */ void filter() { Collection<Node> nodes = new ArrayList<Node>(resultNodesOriginal); Collections.sort(filterArray, new Comparator<PostFilter>() { @Override public int compare(final PostFilter o1, final PostFilter o2) { return o1.getFilterChainOrderKeyPrio().compareTo(o2.getFilterChainOrderKeyPrio()); } }); if (LOG.isDebugEnabled()) { LOG.debug("applying " + filterArray.size() + " post filters to " + nodes.size() + " nodes"); } for (final PostFilter pf : filterArray) { nodes = pf.filter(nodes); } if (LOG.isDebugEnabled()) { LOG.debug(nodes.size() + " nodes left after applying " + filterArray.size() + " filters to " + resultNodesOriginal.size() + " nodes"); } internalSetResultNodes(nodes.toArray(new Node[0])); super.fireResultNodesFiltered(); } /** * DOCUMENT ME! * * @param collection DOCUMENT ME! * * @return DOCUMENT ME! */ public static Collection<MetaClass> getAllMetaClassesForNodeCollection(final Collection<Node> collection) { final ArrayList<MetaClass> result = new ArrayList<MetaClass>(); for (final Node n : collection) { final MetaClass mc = ClassCacheMultiple.getMetaClass(n.getDomain(), n.getClassId()); if (!result.contains(mc)) { result.add(mc); } } return result; } /** * DOCUMENT ME! * * @param collection DOCUMENT ME! * * @return DOCUMENT ME! */ public static Collection<String> getAllTableNamesForNodeCollection(final Collection<Node> collection) { final ArrayList<MetaClass> classes = new ArrayList<MetaClass>(getAllMetaClassesForNodeCollection(collection)); final ArrayList<String> result = new ArrayList<String>(classes.size()); for (final MetaClass mc : classes) { result.add(mc.getTableName()); } return result; } /** * DOCUMENT ME! * * @return DOCUMENT ME! */ public List<Node> getOriginalResultNodes() { final ArrayList<Node> originalResultNodes = new ArrayList<Node>(this.resultNodesOriginal.size()); originalResultNodes.addAll(this.resultNodesOriginal); return originalResultNodes; } }