<?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.
 -->

<!-- Descriptor for testing configuration groups. -->

<taeDescription xmlns="http://uima.apache.org/resourceSpecifier">
<frameworkImplementation>org.apache.uima.java</frameworkImplementation>
<primitive>false</primitive>

<delegateAnalysisEngineSpecifiers>
<delegateAnalysisEngine key="Annotator1">
  <import location="AnnotatorWithConfigurationGroups.xml"/>
</delegateAnalysisEngine>

<delegateAnalysisEngine key="Annotator2">
  <import location="AnnotatorWithConfigurationGroups.xml"/>
</delegateAnalysisEngine>
</delegateAnalysisEngineSpecifiers> 
	
<analysisEngineMetaData>
<name>Invalid Aggregate - Undefined Key in Flow</name>
<description>This aggregate descriptor uses key "Annotator3" in its flow, but that key
   is not defined.  This should be caught during validation.</description>
<version>1.0</version>
<vendor>The Apache Software Foundation</vendor>

<flowConstraints>
  <fixedFlow>
    <node>Annotator1</node>
    <node>Annotator2</node>
    <node>Annotator3</node> <!-- Invalid -->
  </fixedFlow>
</flowConstraints>

<!-- Capabilities: Inputs and Outputs -->
<capabilities>
<capability>
<inputs/>
<outputs/>
<languagesSupported/>
</capability>
</capabilities>

<operationalProperties>
  <modifiesCas>true</modifiesCas>
  <multipleDeploymentAllowed>true</multipleDeploymentAllowed>
  <outputsNewCASes>false</outputsNewCASes>
</operationalProperties>
	
</analysisEngineMetaData>

</taeDescription>
