001/** 
002 * Copyright (c) 2007-2008, Regents of the University of Colorado 
003 * All rights reserved.
004 * 
005 * Redistribution and use in source and binary forms, with or without
006 * modification, are permitted provided that the following conditions are met:
007 * 
008 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 
009 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 
010 * Neither the name of the University of Colorado at Boulder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 
011 * 
012 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
013 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
014 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
015 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
016 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
017 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
018 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
019 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
020 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
021 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
022 * POSSIBILITY OF SUCH DAMAGE. 
023 */
024package org.cleartk.ml.feature.extractor;
025
026import java.util.ArrayList;
027import java.util.List;
028
029import org.apache.uima.jcas.JCas;
030import org.apache.uima.jcas.tcas.Annotation;
031import org.cleartk.ml.Feature;
032
033import com.google.common.collect.Lists;
034
035/**
036 * <br>
037 * Copyright (c) 2007-2008, Regents of the University of Colorado <br>
038 * All rights reserved.
039 * 
040 * <p>
041 * 
042 * @author Philipp Wetzler
043 * 
044 */
045public class CombinedExtractor1<T extends Annotation> implements FeatureExtractor1<T> {
046
047  // public SimpleFeatureExtractor[] getExtractors() {
048  // return extractors;
049  // }
050  //
051  public List<FeatureExtractor1<T>> getExtractors() {
052    return this.extractors;
053
054  }
055
056  /**
057   * @param extractors
058   *          the array of sub-extractors to be called by this one.
059   */
060  /*
061   * public CombinedExtractor(SimpleFeatureExtractor... extractors) { this.extractors = extractors;
062   * }
063   */
064
065  private CombinedExtractor1() {
066    this.extractors = Lists.newArrayList();
067  }
068
069  public CombinedExtractor1(List<FeatureExtractor1<T>> extractors) {
070    this.extractors = extractors;
071  }
072
073  public CombinedExtractor1(
074      FeatureExtractor1<T> extractor1,
075      FeatureExtractor1<T> extractor2) {
076    this();
077    this.extractors.add(extractor1);
078    this.extractors.add(extractor2);
079  }
080
081  public CombinedExtractor1(
082      FeatureExtractor1<T> extractor1,
083      FeatureExtractor1<T> extractor2,
084      FeatureExtractor1<T> extractor3) {
085    this();
086    this.extractors.add(extractor1);
087    this.extractors.add(extractor2);
088    this.extractors.add(extractor3);
089  }
090
091  public CombinedExtractor1(
092      FeatureExtractor1<T> extractor1,
093      FeatureExtractor1<T> extractor2,
094      FeatureExtractor1<T> extractor3,
095      FeatureExtractor1<T> extractor4) {
096    this();
097    this.extractors.add(extractor1);
098    this.extractors.add(extractor2);
099    this.extractors.add(extractor3);
100    this.extractors.add(extractor4);
101  }
102
103  public CombinedExtractor1(
104      FeatureExtractor1<T> extractor1,
105      FeatureExtractor1<T> extractor2,
106      FeatureExtractor1<T> extractor3,
107      FeatureExtractor1<T> extractor4,
108      FeatureExtractor1<T> extractor5) {
109    this();
110    this.extractors.add(extractor1);
111    this.extractors.add(extractor2);
112    this.extractors.add(extractor3);
113    this.extractors.add(extractor4);
114    this.extractors.add(extractor5);
115  }
116
117  public CombinedExtractor1(
118      FeatureExtractor1<T> extractor1,
119      FeatureExtractor1<T> extractor2,
120      FeatureExtractor1<T> extractor3,
121      FeatureExtractor1<T> extractor4,
122      FeatureExtractor1<T> extractor5,
123      FeatureExtractor1<T> extractor6) {
124    this();
125    this.extractors.add(extractor1);
126    this.extractors.add(extractor2);
127    this.extractors.add(extractor3);
128    this.extractors.add(extractor4);
129    this.extractors.add(extractor5);
130    this.extractors.add(extractor6);
131  }
132
133  public CombinedExtractor1(
134      FeatureExtractor1<T> extractor1,
135      FeatureExtractor1<T> extractor2,
136      FeatureExtractor1<T> extractor3,
137      FeatureExtractor1<T> extractor4,
138      FeatureExtractor1<T> extractor5,
139      FeatureExtractor1<T> extractor6,
140      FeatureExtractor1<T> extractor7) {
141    this();
142    this.extractors.add(extractor1);
143    this.extractors.add(extractor2);
144    this.extractors.add(extractor3);
145    this.extractors.add(extractor4);
146    this.extractors.add(extractor5);
147    this.extractors.add(extractor6);
148    this.extractors.add(extractor7);
149  }
150
151  public CombinedExtractor1(
152      FeatureExtractor1<T> extractor1,
153      FeatureExtractor1<T> extractor2,
154      FeatureExtractor1<T> extractor3,
155      FeatureExtractor1<T> extractor4,
156      FeatureExtractor1<T> extractor5,
157      FeatureExtractor1<T> extractor6,
158      FeatureExtractor1<T> extractor7,
159      FeatureExtractor1<T> extractor8) {
160    this();
161    this.extractors.add(extractor1);
162    this.extractors.add(extractor2);
163    this.extractors.add(extractor3);
164    this.extractors.add(extractor4);
165    this.extractors.add(extractor5);
166    this.extractors.add(extractor6);
167    this.extractors.add(extractor7);
168    this.extractors.add(extractor8);
169  }
170
171  public CombinedExtractor1(
172      FeatureExtractor1<T> extractor1,
173      FeatureExtractor1<T> extractor2,
174      FeatureExtractor1<T> extractor3,
175      FeatureExtractor1<T> extractor4,
176      FeatureExtractor1<T> extractor5,
177      FeatureExtractor1<T> extractor6,
178      FeatureExtractor1<T> extractor7,
179      FeatureExtractor1<T> extractor8,
180      FeatureExtractor1<T> extractor9) {
181    this();
182    this.extractors.add(extractor1);
183    this.extractors.add(extractor2);
184    this.extractors.add(extractor3);
185    this.extractors.add(extractor4);
186    this.extractors.add(extractor5);
187    this.extractors.add(extractor6);
188    this.extractors.add(extractor7);
189    this.extractors.add(extractor8);
190    this.extractors.add(extractor9);
191  }
192
193  /**
194   * Extract features from the <tt>Annotation</tt> using the sub-extractors. The parameters are
195   * passed on as they are.
196   * 
197   * @return the combined list of features generated by the sub-extractors. If <tt>name</tt> was set
198   *         in the constructor, the top-level context of all features will have that as their name.
199   */
200  public List<Feature> extract(JCas view, T focusAnnotation) throws CleartkExtractorException {
201    List<Feature> result = new ArrayList<Feature>();
202    for (FeatureExtractor1<T> extractor : this.extractors) {
203      result.addAll(extractor.extract(view, focusAnnotation));
204    }
205
206    return result;
207  }
208
209  private List<FeatureExtractor1<T>> extractors;
210
211}