<?xml version="1.0" encoding="UTF-8" ?>
<!--
 * 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.
 -->

<!-- For testing only. -->

<taeDescription xmlns="http://uima.apache.org/resourceSpecifier">
<frameworkImplementation>org.apache.uima.java</frameworkImplementation>
<primitive>true</primitive>
<annotatorImplementationName>org.apache.uima.analysis_engine.impl.TestAnnotator2</annotatorImplementationName>
 
<analysisEngineMetaData>
<name>Test Primitive TAE 2</name>
<description>For testing only.</description>
<version>1.0</version>
<vendor>The Apache Software Foundation</vendor>
 

<!-- TypeSystem Definition -->
<typeSystemDescription>
<types>

<typeDescription>
<name>Person</name>
<description>A person.</description>
<supertypeName>uima.tcas.Annotation</supertypeName>
<features>
  <featureDescription>
    <name>Gender</name>
    <description>Gender of person.</description>
    <rangeTypeName>uima.cas.String</rangeTypeName>
  </featureDescription>
</features>
</typeDescription>

<typeDescription>
<name>Place</name>
<description>A place.</description>
<supertypeName>uima.tcas.Annotation</supertypeName>
<features>
  <featureDescription>
    <name>BigPlace</name>
    <description>Big Place within a Compound Place.</description>
    <rangeTypeName>uima.cas.String</rangeTypeName>
  </featureDescription>
  <featureDescription>
    <name>LittlePlace</name>
    <description>Little Place within a Compound Place.</description>
    <rangeTypeName>uima.cas.String</rangeTypeName>
  </featureDescription>
</features>
</typeDescription>

<typeDescription>
<name>Org</name>
<description>An organization.</description>
<supertypeName>uima.tcas.Annotation</supertypeName>
</typeDescription>

</types>
</typeSystemDescription>

<typePriorities>
  <priorityList>
    <type>Person</type>
    <type>Place</type>
    <type>Org</type>
  </priorityList>
</typePriorities>  

<fsIndexes>
  <fsIndexDescription>
    <label>PlaceIndex</label>
    <typeName>Place</typeName>
    <keys>
      <fsIndexKey>
        <featureName>BigPlace</featureName>
        <comparator>standard</comparator>
      </fsIndexKey>
      <fsIndexKey>
        <featureName>LittlePlace</featureName>
        <comparator>standard</comparator>
      </fsIndexKey>
      <fsIndexKey>
        <featureName>begin</featureName>
        <comparator>standard</comparator>
      </fsIndexKey>
      <fsIndexKey>
        <featureName>end</featureName>
        <comparator>reverse</comparator>
      </fsIndexKey>
    </keys>  
  </fsIndexDescription>
</fsIndexes>    

<!-- Capabilities: Inputs and Outputs -->
<capabilities>
<capability>
<outputs>
<type>Person</type>
<type>Place</type>
<type>Org</type>
</outputs>
<languagesSupported>
<language>en</language>
</languagesSupported>
</capability>
</capabilities>

</analysisEngineMetaData>
</taeDescription>
