pylucene 3.5.0-3
[pylucene.git] / lucene-java-3.5.0 / lucene / contrib / queryparser / src / java / org / apache / lucene / queryParser / core / processors / QueryNodeProcessorPipeline.java
diff --git a/lucene-java-3.5.0/lucene/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/processors/QueryNodeProcessorPipeline.java b/lucene-java-3.5.0/lucene/contrib/queryparser/src/java/org/apache/lucene/queryParser/core/processors/QueryNodeProcessorPipeline.java
new file mode 100644 (file)
index 0000000..7e00e1a
--- /dev/null
@@ -0,0 +1,325 @@
+package org.apache.lucene.queryParser.core.processors;
+
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+
+import org.apache.lucene.queryParser.core.QueryNodeException;
+import org.apache.lucene.queryParser.core.config.QueryConfigHandler;
+import org.apache.lucene.queryParser.core.nodes.QueryNode;
+
+/**
+ * A {@link QueryNodeProcessorPipeline} class should be used to build a query
+ * node processor pipeline.
+ * 
+ * When a query node tree is processed using this class, it passes the query
+ * node tree to each processor on the pipeline and the result from each
+ * processor is passed to the next one, always following the order the
+ * processors were on the pipeline.
+ * 
+ * When a {@link QueryConfigHandler} object is set on a
+ * {@link QueryNodeProcessorPipeline}, it also takes care of setting this
+ * {@link QueryConfigHandler} on all processor on pipeline.
+ * 
+ */
+public class QueryNodeProcessorPipeline implements QueryNodeProcessor,
+    List<QueryNodeProcessor> {
+
+  private LinkedList<QueryNodeProcessor> processors = new LinkedList<QueryNodeProcessor>();
+
+  private QueryConfigHandler queryConfig;
+
+  /**
+   * Constructs an empty query node processor pipeline.
+   */
+  public QueryNodeProcessorPipeline() {
+    // empty constructor
+  }
+
+  /**
+   * Constructs with a {@link QueryConfigHandler} object.
+   */
+  public QueryNodeProcessorPipeline(QueryConfigHandler queryConfigHandler) {
+    this.queryConfig = queryConfigHandler;
+  }
+
+  /**
+   * For reference about this method check:
+   * {@link QueryNodeProcessor#getQueryConfigHandler()}.
+   * 
+   * @return QueryConfigHandler the query configuration handler to be set.
+   * 
+   * @see QueryNodeProcessor#setQueryConfigHandler(QueryConfigHandler)
+   * @see QueryConfigHandler
+   */
+  public QueryConfigHandler getQueryConfigHandler() {
+    return this.queryConfig;
+  }
+
+  /**
+   * For reference about this method check:
+   * {@link QueryNodeProcessor#process(QueryNode)}.
+   * 
+   * @param queryTree the query node tree to be processed
+   * 
+   * @throws QueryNodeException if something goes wrong during the query node
+   *         processing
+   * 
+   * @see QueryNode
+   */
+  public QueryNode process(QueryNode queryTree) throws QueryNodeException {
+
+    for (QueryNodeProcessor processor : this.processors) {
+      queryTree = processor.process(queryTree);
+    }
+
+    return queryTree;
+
+  }
+
+  /**
+   * Adds a processor to the pipeline, it's always added to the end of the
+   * pipeline.
+   * 
+   * @deprecated this class now conforms to {@link List} interface, so use
+   *             {@link #add(QueryNodeProcessor)} instead
+   * 
+   * @param processor the processor to be added
+   */
+  @Deprecated
+  public void addProcessor(QueryNodeProcessor processor) {
+    this.processors.add(processor);
+
+    processor.setQueryConfigHandler(this.queryConfig);
+
+  }
+
+  /**
+   * For reference about this method check:
+   * {@link QueryNodeProcessor#setQueryConfigHandler(QueryConfigHandler)}.
+   * 
+   * @param queryConfigHandler the query configuration handler to be set.
+   * 
+   * @see QueryNodeProcessor#getQueryConfigHandler()
+   * @see QueryConfigHandler
+   */
+  public void setQueryConfigHandler(QueryConfigHandler queryConfigHandler) {
+    this.queryConfig = queryConfigHandler;
+
+    for (QueryNodeProcessor processor : this.processors) {
+      processor.setQueryConfigHandler(this.queryConfig);
+    }
+
+  }
+
+  /**
+   * @see List#add(Object)
+   */
+  public boolean add(QueryNodeProcessor processor) {
+    boolean added = this.processors.add(processor);
+
+    if (added) {
+      processor.setQueryConfigHandler(this.queryConfig);
+    }
+
+    return added;
+
+  }
+
+  /**
+   * @see List#add(int, Object)
+   */
+  public void add(int index, QueryNodeProcessor processor) {
+    this.processors.add(index, processor);
+    processor.setQueryConfigHandler(this.queryConfig);
+
+  }
+
+  /**
+   * @see List#addAll(Collection)
+   */
+  public boolean addAll(Collection<? extends QueryNodeProcessor> c) {
+    boolean anyAdded = this.processors.addAll(c);
+
+    for (QueryNodeProcessor processor : c) {
+      processor.setQueryConfigHandler(this.queryConfig);
+    }
+
+    return anyAdded;
+
+  }
+
+  /**
+   * @see List#addAll(int, Collection)
+   */
+  public boolean addAll(int index, Collection<? extends QueryNodeProcessor> c) {
+    boolean anyAdded = this.processors.addAll(index, c);
+
+    for (QueryNodeProcessor processor : c) {
+      processor.setQueryConfigHandler(this.queryConfig);
+    }
+
+    return anyAdded;
+    
+  }
+
+  /**
+   * @see List#clear()
+   */
+  public void clear() {
+    this.processors.clear();
+  }
+
+  /**
+   * @see List#contains(Object)
+   */
+  public boolean contains(Object o) {
+    return this.processors.contains(o);
+  }
+
+  /**
+   * @see List#containsAll(Collection)
+   */
+  public boolean containsAll(Collection<?> c) {
+    return this.processors.containsAll(c);
+  }
+
+  /**
+   * @see List#get(int)
+   */
+  public QueryNodeProcessor get(int index) {
+    return this.processors.get(index);
+  }
+
+  /**
+   * @see List#indexOf(Object)
+   */
+  public int indexOf(Object o) {
+    return this.processors.indexOf(o);
+  }
+
+  /**
+   * @see List#isEmpty()
+   */
+  public boolean isEmpty() {
+    return this.processors.isEmpty();
+  }
+
+  /**
+   * @see List#iterator()
+   */
+  public Iterator<QueryNodeProcessor> iterator() {
+    return this.processors.iterator();
+  }
+
+  /**
+   * @see List#lastIndexOf(Object)
+   */
+  public int lastIndexOf(Object o) {
+    return this.processors.lastIndexOf(o);
+  }
+
+  /**
+   * @see List#listIterator()
+   */
+  public ListIterator<QueryNodeProcessor> listIterator() {
+    return this.processors.listIterator();
+  }
+
+  /**
+   * @see List#listIterator(int)
+   */
+  public ListIterator<QueryNodeProcessor> listIterator(int index) {
+    return this.processors.listIterator(index);
+  }
+
+  /**
+   * @see List#remove(Object)
+   */
+  public boolean remove(Object o) {
+    return this.processors.remove(o);
+  }
+
+  /**
+   * @see List#remove(int)
+   */
+  public QueryNodeProcessor remove(int index) {
+    return this.processors.remove(index);
+  }
+
+  /**
+   * @see List#removeAll(Collection)
+   */
+  public boolean removeAll(Collection<?> c) {
+    return this.processors.removeAll(c);
+  }
+
+  /**
+   * @see List#retainAll(Collection)
+   */
+  public boolean retainAll(Collection<?> c) {
+    return this.processors.retainAll(c);
+  }
+
+  /**
+   * @see List#set(int, Object)
+   */
+  public QueryNodeProcessor set(int index, QueryNodeProcessor processor) {
+    QueryNodeProcessor oldProcessor = this.processors.set(index, processor);
+    
+    if (oldProcessor != processor) {
+      processor.setQueryConfigHandler(this.queryConfig);
+    }
+    
+    return oldProcessor;
+    
+  }
+
+  /**
+   * @see List#size()
+   */
+  public int size() {
+    return this.processors.size();
+  }
+
+  /**
+   * @see List#subList(int, int)
+   */
+  public List<QueryNodeProcessor> subList(int fromIndex, int toIndex) {
+    return this.processors.subList(fromIndex, toIndex);
+  }
+
+  /**
+   * @see List#toArray(Object[])
+   */
+  public <T> T[] toArray(T[] array) {
+    return this.processors.toArray(array);
+  }
+
+  /**
+   * @see List#toArray()
+   */
+  public Object[] toArray() {
+    return this.processors.toArray();
+  }
+
+}