blob: 424d4fa947263f1a7024bf6adc937e2f76326656 [file] [log] [blame]
/*
* 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.
*/
package org.apache.uima.analysis_engine.impl;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.apache.uima.Constants;
import org.apache.uima.ResourceSpecifierFactory;
import org.apache.uima.UIMAFramework;
import org.apache.uima.UimaContext;
import org.apache.uima.analysis_engine.AnalysisEngine;
import org.apache.uima.analysis_engine.AnalysisEngineDescription;
import org.apache.uima.analysis_engine.metadata.AnalysisEngineMetaData;
import org.apache.uima.analysis_engine.metadata.FixedFlow;
import org.apache.uima.analysis_engine.metadata.FlowControllerDeclaration;
import org.apache.uima.analysis_engine.metadata.impl.FixedFlow_impl;
import org.apache.uima.analysis_engine.metadata.impl.FlowControllerDeclaration_impl;
import org.apache.uima.cas.CAS;
import org.apache.uima.flow.FlowControllerDescription;
import org.apache.uima.flow.impl.FlowControllerDescription_impl;
import org.apache.uima.internal.util.Misc;
import org.apache.uima.internal.util.MultiThreadUtils;
import org.apache.uima.internal.util.SerializationUtils;
import org.apache.uima.resource.ConfigurationManager;
import org.apache.uima.resource.ExternalResourceDependency;
import org.apache.uima.resource.ExternalResourceDescription;
import org.apache.uima.resource.FileResourceSpecifier;
import org.apache.uima.resource.Resource;
import org.apache.uima.resource.ResourceInitializationException;
import org.apache.uima.resource.ResourceManager;
import org.apache.uima.resource.ResourceSpecifier;
import org.apache.uima.resource.impl.FileResourceSpecifier_impl;
import org.apache.uima.resource.metadata.AllowedValue;
import org.apache.uima.resource.metadata.Capability;
import org.apache.uima.resource.metadata.ConfigurationGroup;
import org.apache.uima.resource.metadata.ConfigurationParameter;
import org.apache.uima.resource.metadata.ConfigurationParameterSettings;
import org.apache.uima.resource.metadata.ExternalResourceBinding;
import org.apache.uima.resource.metadata.FsIndexDescription;
import org.apache.uima.resource.metadata.FsIndexKeyDescription;
import org.apache.uima.resource.metadata.MetaDataObject;
import org.apache.uima.resource.metadata.NameValuePair;
import org.apache.uima.resource.metadata.OperationalProperties;
import org.apache.uima.resource.metadata.ResourceManagerConfiguration;
import org.apache.uima.resource.metadata.TypeDescription;
import org.apache.uima.resource.metadata.TypePriorities;
import org.apache.uima.resource.metadata.TypePriorityList;
import org.apache.uima.resource.metadata.TypeSystemDescription;
import org.apache.uima.resource.metadata.impl.AllowedValue_impl;
import org.apache.uima.resource.metadata.impl.Capability_impl;
import org.apache.uima.resource.metadata.impl.ConfigurationGroup_impl;
import org.apache.uima.resource.metadata.impl.ConfigurationParameter_impl;
import org.apache.uima.resource.metadata.impl.FsIndexDescription_impl;
import org.apache.uima.resource.metadata.impl.FsIndexKeyDescription_impl;
import org.apache.uima.resource.metadata.impl.Import_impl;
import org.apache.uima.resource.metadata.impl.NameValuePair_impl;
import org.apache.uima.resource.metadata.impl.TypePriorities_impl;
import org.apache.uima.resource.metadata.impl.TypeSystemDescription_impl;
import org.apache.uima.test.junit_extension.JUnitExtension;
import org.apache.uima.util.CasCreationUtils;
import org.apache.uima.util.InvalidXMLException;
import org.apache.uima.util.Logger;
import org.apache.uima.util.XMLInputSource;
import org.apache.uima.util.XMLParser;
import junit.framework.TestCase;
/**
* Test the AnalysisEngineDescription_impl class.
*
*/
public class AnalysisEngineDescription_implTest extends TestCase {
// Text encoding to use for the various byte/character conversions happening in this test case.
// Public because also used by other test cases.
public static final String encoding = "utf-8";
private static final File TEST_DATA_FILE = JUnitExtension
.getFile("ResourceTest/ResourceManager_implTest_tempDataFile.dat");
private AnalysisEngineDescription primitiveDesc;
private AnalysisEngineDescription aggregateDesc;
/**
* Constructor for AnalysisEngineDescription_implTest.
*
* @param arg0
*/
public AnalysisEngineDescription_implTest(String arg0) {
super(arg0);
}
/**
* @see TestCase#setUp()
*/
@Override
protected void setUp() throws Exception {
try {
super.setUp();
UIMAFramework.getXMLParser().enableSchemaValidation(true);
TypeSystemDescription typeSystem = new TypeSystemDescription_impl();
TypeDescription type1 = typeSystem.addType("Fake", "<b>Fake</b> Type", "Annotation");
type1.addFeature("TestFeature", "For Testing Only",
CAS.TYPE_NAME_STRING);
TypeDescription enumType = typeSystem.addType("EnumType", "Test Enumerated Type",
"uima.cas.String");
enumType.setAllowedValues(new AllowedValue[] { new AllowedValue_impl("One", "First Value"),
new AllowedValue_impl("Two", "Second Value") });
TypePriorities typePriorities = new TypePriorities_impl();
TypePriorityList priorityList = typePriorities.addPriorityList();
priorityList.addType("Fake");
priorityList.addType("EnumType");
FsIndexDescription index = new FsIndexDescription_impl();
index.setLabel("testIndex");
index.setTypeName("Fake");
FsIndexKeyDescription key1 = new FsIndexKeyDescription_impl();
key1.setFeatureName("TestFeature");
key1.setComparator(1);
FsIndexKeyDescription key2 = new FsIndexKeyDescription_impl();
key2.setFeatureName("Start");
key2.setComparator(0);
FsIndexKeyDescription key3 = new FsIndexKeyDescription_impl();
key3.setTypePriority(true);
index.setKeys(new FsIndexKeyDescription[] { key1, key2, key3 });
FsIndexDescription index2 = new FsIndexDescription_impl();
index2.setLabel("testIndex2");
index2.setTypeName("Fake");
index2.setKind(FsIndexDescription.KIND_SET);
FsIndexKeyDescription key1a = new FsIndexKeyDescription_impl();
key1a.setFeatureName("TestFeature");
key1a.setComparator(1);
index2.setKeys(new FsIndexKeyDescription[] { key1a });
// create primitive AE description
primitiveDesc = new AnalysisEngineDescription_impl();
primitiveDesc.setFrameworkImplementation(Constants.JAVA_FRAMEWORK_NAME);
primitiveDesc.setPrimitive(true);
primitiveDesc.setAnnotatorImplementationName("org.apache.uima.analysis_engine.impl.TestAnnotator");
AnalysisEngineMetaData md = primitiveDesc.getAnalysisEngineMetaData();
md.setName("Test TAE");
md.setDescription("Does not do anything useful.");
md.setVersion("1.0");
md.setTypeSystem(typeSystem);
md.setTypePriorities(typePriorities);
md.setFsIndexes(new FsIndexDescription[] { index, index2 });
Capability cap1 = new Capability_impl();
cap1.setDescription("First fake capability");
cap1.addOutputType("Fake", false);
cap1.addOutputFeature("Fake:TestFeature");
Capability cap2 = new Capability_impl();
cap2.setDescription("Second fake capability");
cap2.addInputType("Fake", true);
cap2.addOutputType("Fake", true);
// SimplePrecondition precond1 = new SimplePrecondition_impl();
// precond1.setFeatureDescription(feature1);
// precond1.setComparisonValue(new String[]{"en,de"});
// precond1.setPredicate(SimplePrecondition.LANGUAGE_SUBSUMED);
// cap1.setPreconditions(new Precondition[]{precond1});
cap1.setLanguagesSupported(new String[] { "en", "de" });
cap1.setMimeTypesSupported(new String[] { "text/plain" });
md.setCapabilities(new Capability[] { cap1, cap2 });
ConfigurationParameter cfgParam1 = new ConfigurationParameter_impl();
cfgParam1.setName("param1");
cfgParam1.setDescription("Test Parameter 1");
cfgParam1.setType("String");
ConfigurationParameter cfgParam2 = new ConfigurationParameter_impl();
cfgParam2.setName("param2");
cfgParam2.setDescription("Test Parameter 2");
cfgParam2.setType("Integer");
ConfigurationGroup cfgGrp1 = new ConfigurationGroup_impl();
cfgGrp1.setNames(new String[] { "cfgGrp1" });
cfgGrp1.setConfigurationParameters(new ConfigurationParameter[] { cfgParam1, cfgParam2 });
ConfigurationParameter cfgParam3 = new ConfigurationParameter_impl();
cfgParam3.setName("param3");
cfgParam3.setDescription("Test Parameter 3");
cfgParam3.setType("Float");
ConfigurationGroup cfgGrp2 = new ConfigurationGroup_impl();
cfgGrp2.setNames(new String[] { "cfgGrp2a", "cfgGrp2b" });
cfgGrp2.setConfigurationParameters(new ConfigurationParameter[] { cfgParam3 });
md.getConfigurationParameterDeclarations().setConfigurationGroups(
new ConfigurationGroup[] { cfgGrp1, cfgGrp2 });
NameValuePair nvp1 = new NameValuePair_impl("param1", "test");
NameValuePair nvp2 = new NameValuePair_impl("param2", Integer.valueOf("42"));
NameValuePair nvp3a = new NameValuePair_impl("param3", Float.valueOf("2.718281828459045"));
NameValuePair nvp3b = new NameValuePair_impl("param3", Float.valueOf("3.1415927"));
ConfigurationParameterSettings settings = md.getConfigurationParameterSettings();
settings.getSettingsForGroups().put("cfgGrp1", new NameValuePair[] { nvp1, nvp2 });
settings.getSettingsForGroups().put("cfgGrp2a", new NameValuePair[] { nvp3a });
settings.getSettingsForGroups().put("cfgGrp2b", new NameValuePair[] { nvp3b });
// create aggregate AE description
aggregateDesc = new AnalysisEngineDescription_impl();
aggregateDesc.setFrameworkImplementation(Constants.JAVA_FRAMEWORK_NAME);
aggregateDesc.setPrimitive(false);
Map<String, MetaDataObject> delegateTaeMap = aggregateDesc.getDelegateAnalysisEngineSpecifiersWithImports();
delegateTaeMap.put("Test", primitiveDesc);
AnalysisEngineDescription_impl primDesc2 = new AnalysisEngineDescription_impl();
primDesc2.setFrameworkImplementation(Constants.JAVA_FRAMEWORK_NAME);
primDesc2.setPrimitive(true);
primDesc2.setAnnotatorImplementationName("org.apache.uima.analysis_engine.impl.TestAnnotator");
primDesc2.getAnalysisEngineMetaData().setName("fakeAnnotator");
primDesc2.getAnalysisEngineMetaData().setCapabilities(
new Capability[] { new Capability_impl() });
delegateTaeMap.put("Empty", primDesc2);
// Can't use URI specifier if we try to produce resource, because it maps to either a SOAP or VINCI adapter,
// and that adapter is not on the class path for this causes a failure in loading
// URISpecifier uriSpec = new URISpecifier_impl();
// uriSpec.setUri("http://incubator.apache.org/uima");
// uriSpec.setProtocol(Constants.PROTOCOL_SOAP);
FileResourceSpecifier fileResSpec = new FileResourceSpecifier_impl();
fileResSpec.setFileUrl(TEST_DATA_FILE.toURL().toString());
FlowControllerDeclaration fcDecl = new FlowControllerDeclaration_impl();
fcDecl.setKey("TestFlowController");
FlowControllerDescription fcDesc = new FlowControllerDescription_impl();
fcDesc.getMetaData().setName("MyTestFlowController");
fcDesc.setImplementationName("org.apache.uima.analysis_engine.impl.FlowControllerForErrorTest");
fcDecl.setSpecifier(fcDesc);
aggregateDesc.setFlowControllerDeclaration(fcDecl);
ExternalResourceDependency dep = UIMAFramework.getResourceSpecifierFactory()
.createExternalResourceDependency();
dep.setKey("ResourceKey");
dep.setDescription("Test");
aggregateDesc.setExternalResourceDependencies(new ExternalResourceDependency[] { dep });
ResourceManagerConfiguration resMgrCfg = UIMAFramework.getResourceSpecifierFactory()
.createResourceManagerConfiguration();
ExternalResourceDescription extRes = UIMAFramework.getResourceSpecifierFactory()
.createExternalResourceDescription();
extRes.setResourceSpecifier(fileResSpec);
extRes.setName("Resource1");
extRes.setDescription("Test");
resMgrCfg.setExternalResources(new ExternalResourceDescription[] { extRes });
ExternalResourceBinding binding = UIMAFramework.getResourceSpecifierFactory()
.createExternalResourceBinding();
binding.setKey("ResourceKey");
binding.setResourceName("Resource1");
resMgrCfg.setExternalResourceBindings(new ExternalResourceBinding[] {binding});
aggregateDesc.setResourceManagerConfiguration(resMgrCfg);
// AsbCreationSpecifier asbSpec = new AsbCreationSpecifier_impl();
// asbSpec.getAsbMetaData().setAsynchronousModeSupported(true);
// asbSpec.getAsbMetaData().setSupportedProtocols(new String[]{Constants.PROTOCOL_SOAP});
// aggregateDesc.setAsbSpecifier(asbSpec);
// AnalysisSequencerCrea1tionSpecifier seqSpec = new
// AnalysisSequencerCreationSpecifier_impl();
// seqSpec.getAnalysisSequencerMetaData().setSupportedPreconditionTypes(
// new String[]{SimplePrecondition.PRECONDITION_TYPE});
// aggregateDesc.setSequencerSpecifier(seqSpec);
md = aggregateDesc.getAnalysisEngineMetaData();
md.setName("Test Aggregate TAE");
md.setDescription("Does not do anything useful.");
md.setVersion("1.0");
// md.setTypeSystem(typeSystem);
// md.setFsIndexes(new FsIndexDescription[]{index});
md.setCapabilities(primitiveDesc.getAnalysisEngineMetaData().getCapabilities());
FixedFlow fixedFlow = new FixedFlow_impl();
fixedFlow.setFixedFlow(new String[] { "Test", "Empty" });
md.setFlowConstraints(fixedFlow);
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
@Override
public void tearDown() {
primitiveDesc = null;
aggregateDesc = null;
}
public void testMulticoreInitialize() throws Exception {
ResourceManager resourceManager = UIMAFramework.newDefaultResourceManager();
ConfigurationManager configManager = UIMAFramework.newConfigurationManager();
Logger logger = UIMAFramework.getLogger(this.getClass());
logger.setResourceManager(resourceManager);
UimaContext uimaContext = UIMAFramework.newUimaContext(logger, resourceManager, configManager);
final Map<String, Object> p = new HashMap<String, Object>();
p.put(UIMAFramework.CAS_INITIAL_HEAP_SIZE, 200);
p.put(Resource.PARAM_CONFIG_MANAGER, configManager);
p.put(Resource.PARAM_RESOURCE_MANAGER, UIMAFramework.newDefaultResourceManager());
p.put(Resource.PARAM_UIMA_CONTEXT, uimaContext);
int numberOfThreads = Math.min(50, Misc.numberOfCores * 5);
final AnalysisEngine[] aes = new AnalysisEngine[numberOfThreads];
System.out.format("test multicore initialize with %d threads%n",
numberOfThreads);
MultiThreadUtils.Run2isb run2isb = new MultiThreadUtils.Run2isb() {
public void call(int i, int r, StringBuilder sb) throws Exception {
Random random = new Random();
for (int j = 0; j < 2; j++) {
aes[i] = UIMAFramework.produceAnalysisEngine(primitiveDesc, p);
// System.out.println(sb.toString());
// System.out.print('.');
if ((i % 2) == 0) {
Thread.sleep(0, random.nextInt(2000));
}
}
}
};
MultiThreadUtils.tstMultiThread("MultiCoreInitialize", numberOfThreads, 100, run2isb, MultiThreadUtils.emptyReset);
assertTrue(!aes[0].equals(aes[1]));
run2isb = new MultiThreadUtils.Run2isb() {
public void call(int i, int r, StringBuilder sb) throws Exception {
Random random = new Random();
for (int j = 0; j < 2; j++) {
aes[i] = UIMAFramework.produceAnalysisEngine(aggregateDesc, p);
// System.out.println(sb.toString());
// System.out.print('.');
if ((i % 2) == 0) {
Thread.sleep(0, random.nextInt(5000));
}
}
}
};
MultiThreadUtils.tstMultiThread("MultiCoreInitialize", numberOfThreads, 100, run2isb, MultiThreadUtils.emptyReset);
assertTrue(!aes[0].equals(aes[1]));
// System.out.println("");
}
public void testXMLization() throws Exception {
try {
// write objects to XML
StringWriter writer = new StringWriter();
primitiveDesc.toXML(writer);
String primitiveDescXml = writer.getBuffer().toString();
// System.out.println(primitiveDescXml);
writer = new StringWriter();
aggregateDesc.toXML(writer);
String aggregateDescXml = writer.getBuffer().toString();
// System.out.println(aggregateDescXml);
// parse objects from XML
InputStream is = new ByteArrayInputStream(primitiveDescXml.getBytes(encoding));
AnalysisEngineDescription newPrimitiveDesc = (AnalysisEngineDescription) UIMAFramework
.getXMLParser().parse(new XMLInputSource(is, null));
is = new ByteArrayInputStream(aggregateDescXml.getBytes(encoding));
AnalysisEngineDescription newAggregateDesc = (AnalysisEngineDescription) UIMAFramework
.getXMLParser().parse(new XMLInputSource(is, null));
assertEquals(primitiveDesc, newPrimitiveDesc);
assertEquals(aggregateDesc, newAggregateDesc);
// test a complex descriptor
XMLInputSource in = new XMLInputSource(JUnitExtension
.getFile("AnnotatorContextTest/AnnotatorWithGroupsAndNonGroupParams.xml"));
AnalysisEngineDescription desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
OperationalProperties opProps = desc.getAnalysisEngineMetaData().getOperationalProperties();
assertNotNull(opProps);
assertEquals(true, opProps.getModifiesCas());
assertEquals(true, opProps.isMultipleDeploymentAllowed());
writer = new StringWriter();
desc.toXML(writer);
String descXml = writer.getBuffer().toString();
is = new ByteArrayInputStream(descXml.getBytes(encoding));
AnalysisEngineDescription newDesc = (AnalysisEngineDescription) UIMAFramework.getXMLParser()
.parse(new XMLInputSource(is, null));
assertEquals(desc, newDesc);
// test a descriptor that includes a CasConsumer
in = new XMLInputSource(JUnitExtension
.getFile("TextAnalysisEngineImplTest/AggregateTaeWithCasConsumer.xml"));
desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
writer = new StringWriter();
desc.toXML(writer);
descXml = writer.getBuffer().toString();
is = new ByteArrayInputStream(descXml.getBytes(encoding));
newDesc = (AnalysisEngineDescription) UIMAFramework.getXMLParser().parse(
new XMLInputSource(is, null));
assertEquals(desc, newDesc);
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
public void testDefaultingOperationalParameters() throws Exception {
XMLInputSource in = new XMLInputSource(JUnitExtension
.getFile("TextAnalysisEngineImplTest/TestPrimitiveOperationalParmsDefaults.xml"));
AnalysisEngineDescription desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
OperationalProperties opProps = desc.getAnalysisEngineMetaData().getOperationalProperties();
assertNotNull(opProps);
assertEquals(true, opProps.getModifiesCas());
assertEquals(false, opProps.isMultipleDeploymentAllowed());
}
public void testSerialization() throws Exception {
try {
// serialize objects to byte array
byte[] primitiveDescBytes = SerializationUtils.serialize(primitiveDesc);
byte[] aggregateDescBytes = SerializationUtils.serialize(aggregateDesc);
// deserialize
AnalysisEngineDescription newPrimitiveDesc = (AnalysisEngineDescription) SerializationUtils
.deserialize(primitiveDescBytes);
AnalysisEngineDescription newAggregateDesc = (AnalysisEngineDescription) SerializationUtils
.deserialize(aggregateDescBytes);
assertEquals(primitiveDesc, newPrimitiveDesc);
assertEquals(aggregateDesc, newAggregateDesc);
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
public void testDelegateImports() throws Exception {
// create aggregate TAE description and add delegate AE import
AnalysisEngineDescription testAgg = new AnalysisEngineDescription_impl();
Map<String, MetaDataObject> delegateMap = testAgg.getDelegateAnalysisEngineSpecifiersWithImports();
Import_impl delegateImport = new Import_impl();
delegateImport.setLocation(JUnitExtension.getFile(
"TextAnalysisEngineImplTest/TestPrimitiveTae1.xml").toURI().toURL().toString());
delegateMap.put("key", delegateImport);
// test that import is resolved
Map<String, ResourceSpecifier> mapWithImportsResolved = testAgg.getDelegateAnalysisEngineSpecifiers();
assertEquals(1, mapWithImportsResolved.size());
ResourceSpecifier obj = mapWithImportsResolved.values().iterator().next();
assertTrue(obj instanceof AnalysisEngineDescription);
// test that remove works
delegateMap.remove("key");
mapWithImportsResolved = testAgg.getDelegateAnalysisEngineSpecifiers();
assertEquals(0, mapWithImportsResolved.size());
// test the re-add works
delegateMap.put("key", delegateImport);
mapWithImportsResolved = testAgg.getDelegateAnalysisEngineSpecifiers();
assertEquals(1, mapWithImportsResolved.size());
obj = mapWithImportsResolved.values().iterator().next();
assertTrue(obj instanceof AnalysisEngineDescription);
// serialize to XML, preserving imports
testAgg.toXML(new StringWriter(), true);
// verify that imports are still resolved
mapWithImportsResolved = testAgg.getDelegateAnalysisEngineSpecifiers();
assertEquals(1, mapWithImportsResolved.size());
obj = mapWithImportsResolved.values().iterator().next();
assertTrue(obj instanceof AnalysisEngineDescription);
}
public void testDoFullValidation() throws Exception {
// try some descriptors that are invalid due to config. param problems
for (int i = 1; i <= 13; i++) {
_testInvalidDescriptor(JUnitExtension
.getFile("TextAnalysisEngineImplTest/InvalidConfigParams" + i + ".xml"));
}
// try a descriptor that's invalid due to an unsatisfied resource dependency
_testInvalidDescriptor(JUnitExtension
.getFile("TextAnalysisEngineImplTest/UnsatisfiedResourceDependency.xml"));
// try some invalid operational properties
_testInvalidDescriptor(JUnitExtension
.getFile("TextAnalysisEngineImplTest/InvalidAggregateSegmenter.xml"));
// invalid fs indexes
_testInvalidDescriptor(JUnitExtension
.getFile("TextAnalysisEngineImplTest/InvalidFsIndexes.xml"));
// circular import
_testInvalidDescriptor(JUnitExtension
.getFile("TextAnalysisEngineImplTest/AggregateThatImportsItself.xml"));
// try some that should work
XMLInputSource in = new XMLInputSource(JUnitExtension
.getFile("TextAnalysisEngineImplTest/AggregateTaeWithConfigParamOverrides.xml"));
AnalysisEngineDescription desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
desc.doFullValidation();
in = new XMLInputSource(JUnitExtension
.getFile("AnnotatorContextTest/AnnotatorWithGroupsAndNonGroupParams.xml"));
desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
desc.doFullValidation();
// try aggregate containing remote service - should work even if can't connect
in = new XMLInputSource(JUnitExtension
.getFile("TextAnalysisEngineImplTest/AggregateWithUnknownRemoteComponent.xml"));
desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
desc.doFullValidation();
// try aggregate with sofas
in = new XMLInputSource(JUnitExtension.getFile("CpeSofaTest/TransAnnotatorAggregate.xml"));
desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
desc.doFullValidation();
// try another aggregate with sofas
in = new XMLInputSource(JUnitExtension
.getFile("CpeSofaTest/TransAnnotatorAndTestAnnotatorAggregate.xml"));
desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
desc.doFullValidation();
// try primitive with duplicate configuration group definitions
in = new XMLInputSource(JUnitExtension
.getFile("TextAnalysisEngineImplTest/AnnotatorWithDuplicateConfigurationGroups.xml"));
desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
desc.doFullValidation();
// try aggregate with duplicate configuration group definitions
in = new XMLInputSource(JUnitExtension
.getFile("TextAnalysisEngineImplTest/AggregateWithDuplicateGroupOverrides.xml"));
desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
desc.doFullValidation();
//test aggregate with import by name and configuration parameter overrides
in = new XMLInputSource(JUnitExtension
.getFile("TextAnalysisEngineImplTest/AeWithConfigParamOverridesAndImportByName.xml"));
desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
ResourceManager resMgr = UIMAFramework.newDefaultResourceManager();
File dataPathDir = JUnitExtension.getFile("TextAnalysisEngineImplTest/dataPathDir");
resMgr.setDataPath(dataPathDir.getCanonicalPath());
desc.doFullValidation(resMgr);
//test UIMA C++ descriptor (should succeed even though annotator library doesn't exist)
in = new XMLInputSource(JUnitExtension
.getFile("TextAnalysisEngineImplTest/TestUimaCppAe.xml"));
desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
desc.doFullValidation();
in = new XMLInputSource(JUnitExtension
.getFile("TextAnalysisEngineImplTest/TestAggregateContainingCppAnnotator.xml"));
desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
desc.doFullValidation();
}
public void testValidate() throws Exception {
//test aggregate with import by name and configuration parameter overrides
XMLInputSource in = new XMLInputSource(JUnitExtension
.getFile("TextAnalysisEngineImplTest/AeWithConfigParamOverridesAndImportByName.xml"));
AnalysisEngineDescription desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
ResourceManager resMgr = UIMAFramework.newDefaultResourceManager();
File dataPathDir = JUnitExtension.getFile("TextAnalysisEngineImplTest/dataPathDir");
resMgr.setDataPath(dataPathDir.getCanonicalPath());
desc.validate(resMgr);
//test invalid aggregate with undefined key in flow
in = new XMLInputSource(JUnitExtension
.getFile("TextAnalysisEngineImplTest/InvalidAggregate_UndefinedKeyInFlow.xml"));
desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
try {
desc.validate();
fail();
}
catch(ResourceInitializationException e) {
//e.printStackTrace();
assertEquals(ResourceInitializationException.UNDEFINED_KEY_IN_FLOW, e.getMessageKey());
assertNotNull(e.getMessage());
assertFalse(e.getMessage().startsWith("EXCEPTION MESSAGE LOCALIZATION FAILED"));
}
}
public void testGetAllComponentSpecifiers() throws Exception {
try {
Map<String, ResourceSpecifier> allSpecs = aggregateDesc.getAllComponentSpecifiers(null);
FlowControllerDescription fcDesc = (FlowControllerDescription) allSpecs
.get("TestFlowController");
assertNotNull(fcDesc);
assertEquals("MyTestFlowController", fcDesc.getMetaData().getName());
AnalysisEngineDescription aeDesc = (AnalysisEngineDescription) allSpecs.get("Test");
assertNotNull(aeDesc);
assertEquals("Test TAE", aeDesc.getMetaData().getName());
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
public void testDocumentAnnotationRedefine() {
final String tsDescriptor =
"org/apache/uima/analysis_engine/impl/documentAnnotationRedefinitionTS.xml";
File file = JUnitExtension.getFile(tsDescriptor);
XMLParser parser = UIMAFramework.getXMLParser();
boolean resourceInitExc = false;
try {
TypeSystemDescription tsd = (TypeSystemDescription) parser.parse(new XMLInputSource(file));
CasCreationUtils.createCas(tsd, null, new FsIndexDescription[0]);
} catch (InvalidXMLException e) {
e.printStackTrace();
assertTrue(false);
} catch (IOException e) {
e.printStackTrace();
assertTrue(false);
} catch (ResourceInitializationException e) {
resourceInitExc = true;
}
assertTrue(resourceInitExc);
}
protected void _testInvalidDescriptor(File aFile) throws IOException {
assertTrue(aFile.exists());
XMLInputSource in = new XMLInputSource(aFile);
Exception ex = null;
try {
AnalysisEngineDescription desc = UIMAFramework.getXMLParser().parseAnalysisEngineDescription(in);
desc.doFullValidation();
} catch (InvalidXMLException e) {
// e.printStackTrace();
ex = e;
} catch (ResourceInitializationException e) {
// e.printStackTrace();
ex = e;
}
assertNotNull(ex);
assertNotNull(ex.getMessage());
assertFalse(ex.getMessage().startsWith("EXCEPTION MESSAGE LOCALIZATION FAILED"));
}
public void testNoDelegatesToResolve() throws Exception {
ResourceSpecifierFactory f = UIMAFramework.getResourceSpecifierFactory();
AnalysisEngineDescription outer = f.createAnalysisEngineDescription();
AnalysisEngineDescription inner = f.createAnalysisEngineDescription();
outer.getDelegateAnalysisEngineSpecifiersWithImports().put("inner", inner);
StringWriter outerXml = new StringWriter();
outer.toXML(outerXml);
// Resolving the imports removes the inner AE description
outer.resolveImports(UIMAFramework.newDefaultResourceManager());
StringWriter outerXml2 = new StringWriter();
outer.toXML(outerXml2);
assertEquals(outerXml.toString(), outerXml2.toString());
}
}