001: /*
002: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
003: *
004: * Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
005: *
006: * The contents of this file are subject to the terms of either the GNU
007: * General Public License Version 2 only ("GPL") or the Common
008: * Development and Distribution License("CDDL") (collectively, the
009: * "License"). You may not use this file except in compliance with the
010: * License. You can obtain a copy of the License at
011: * http://www.netbeans.org/cddl-gplv2.html
012: * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
013: * specific language governing permissions and limitations under the
014: * License. When distributing the software, include this License Header
015: * Notice in each file and include the License file at
016: * nbbuild/licenses/CDDL-GPL-2-CP. Sun designates this
017: * particular file as subject to the "Classpath" exception as provided
018: * by Sun in the GPL Version 2 section of the License file that
019: * accompanied this code. If applicable, add the following below the
020: * License Header, with the fields enclosed by brackets [] replaced by
021: * your own identifying information:
022: * "Portions Copyrighted [year] [name of copyright owner]"
023: *
024: * Contributor(s):
025: *
026: * The Original Software is NetBeans. The Initial Developer of the Original
027: * Software is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun
028: * Microsystems, Inc. All Rights Reserved.
029: *
030: * If you wish your version of this file to be governed by only the CDDL
031: * or only the GPL Version 2, indicate your decision by adding
032: * "[Contributor] elects to include this software in this distribution
033: * under the [CDDL or GPL Version 2] license." If you do not indicate a
034: * single choice of license, a recipient has the option to distribute
035: * your version of this file under either the CDDL, the GPL Version 2 or
036: * to extend the choice of license to its licensees as provided above.
037: * However, if you add GPL Version 2 code and therefore, elected the GPL
038: * Version 2 license, then the option applies only if the new code is
039: * made subject to such option by the copyright holder.
040: */
041:
042: package org.netbeans.modules.search;
043:
044: import java.util.Collection;
045: import java.util.Iterator;
046: import org.openide.loaders.DataObject;
047: import org.openidex.search.DataObjectSearchGroup;
048: import org.openidex.search.SearchType;
049:
050: /**
051: *
052: * @author Marian Petras
053: */
054: final class SpecialSearchGroup extends DataObjectSearchGroup {
055:
056: final BasicSearchCriteria basicCriteria;
057: final boolean hasExtraSearchTypes;
058: private final SearchScope searchScope;
059: private SearchTask listeningSearchTask;
060:
061: SpecialSearchGroup(BasicSearchCriteria basicCriteria,
062: Collection<SearchType> extraSearchTypes,
063: SearchScope searchScope) {
064: super ();
065: this .basicCriteria = basicCriteria;
066: hasExtraSearchTypes = !extraSearchTypes.isEmpty();
067: this .searchScope = searchScope;
068:
069: if ((basicCriteria == null) && !hasExtraSearchTypes) {
070: assert false;
071: throw new IllegalArgumentException();
072: }
073:
074: if (hasExtraSearchTypes) {
075: for (SearchType searchType : extraSearchTypes) {
076: add(searchType);
077: }
078: }
079: }
080:
081: @Override
082: public void doSearch() {
083: for (Iterator j = searchScope.getSearchInfo().objectsToSearch(); j
084: .hasNext();) {
085: if (stopped) {
086: return;
087: }
088: processSearchObject(/*DataObject*/j.next());
089: }
090: }
091:
092: /**
093: * Provides search on one search object instance. The object is added to
094: * set of searched objects and passed to all search types encapsulated by
095: * this search group. In the case the object passes all search types is added
096: * to the result set and fired an event <code>PROP_FOUND</code> about successful
097: * match to interested property change listeners.
098: *
099: * @param searchObject object to provide actuall test on it. The actual instance
100: * has to be of type returned by all <code>SearchKey.getSearchObjectType</code>
101: * returned by <code>SearchType</code> of this <code>SearchGroup</code>
102: */
103: @Override
104: protected void processSearchObject(Object searchObject) {
105: if (!hasExtraSearchTypes) {
106: assert basicCriteria != null;
107: DataObject dataObj = (DataObject) searchObject;
108: if (basicCriteria.matches(dataObj)) {
109: notifyMatchingObjectFound(dataObj);
110: }
111: return;
112: }
113:
114: if ((basicCriteria == null)
115: || basicCriteria.matches((DataObject) searchObject)) {
116: super .processSearchObject(searchObject);
117: }
118: }
119:
120: @Override
121: protected void firePropertyChange(String name, Object oldValue,
122: Object newValue) {
123: notifyMatchingObjectFound((DataObject) newValue);
124: }
125:
126: private void notifyMatchingObjectFound(DataObject obj) {
127: if (listeningSearchTask != null) {
128: listeningSearchTask.matchingObjectFound(obj);
129: } else {
130: assert false;
131: }
132: }
133:
134: void setListeningSearchTask(SearchTask searchTask) {
135: listeningSearchTask = searchTask;
136: }
137:
138: }
|