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

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

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

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

	<analysisEngineMetaData>
		<name>TokenizerAndSentdetectAAE</name>
		<description />
		<version>${pom.version}</version>
		<vendor>Apache Software Foundation</vendor>
		<configurationParameters />
		<configurationParameterSettings />
		<flowConstraints>
			<fixedFlow>
				<node>SentenceDetector</node>
				<node>Tokenizer</node>
			</fixedFlow>
		</flowConstraints>
		<capabilities>
			<capability>
				<inputs />
				<outputs />
				<languagesSupported>
					<language>en</language>
				</languagesSupported>
			</capability>
		</capabilities>
		<operationalProperties>
			<modifiesCas>true</modifiesCas>
			<multipleDeploymentAllowed>false</multipleDeploymentAllowed>
			<outputsNewCASes>false</outputsNewCASes>
		</operationalProperties>
	</analysisEngineMetaData>

	<resourceManagerConfiguration>

		<externalResources>
			<externalResource>
				<name>SentenceModel</name>
				<fileResourceSpecifier>
					<fileUrl>file:en-sent.bin</fileUrl>
				</fileResourceSpecifier>
				<implementationName>opennlp.uima.sentdetect.SentenceModelResourceImpl</implementationName>
			</externalResource>

			<externalResource>
				<name>TokenModel</name>
				<fileResourceSpecifier>
					<fileUrl>file:en-token.bin</fileUrl>
				</fileResourceSpecifier>
				<implementationName>opennlp.uima.tokenize.TokenizerModelResourceImpl</implementationName>
			</externalResource>
		</externalResources>

		<externalResourceBindings>
			<externalResourceBinding>
				<key>SentenceDetector/opennlp.uima.ModelName</key>
				<resourceName>SentenceModel</resourceName>
			</externalResourceBinding>
			<externalResourceBinding>
				<key>Tokenizer/opennlp.uima.ModelName</key>
				<resourceName>TokenModel</resourceName>
			</externalResourceBinding>
		</externalResourceBindings>

	</resourceManagerConfiguration>
</analysisEngineDescription>