blob: ef7b1ab050c846fd9d44d74e63c73a348baf5a94 [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.util;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.uima.UIMAFramework;
import org.apache.uima.analysis_engine.AnalysisEngineDescription;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.FSIterator;
import org.apache.uima.cas.Feature;
import org.apache.uima.cas.Type;
import org.apache.uima.cas.TypeSystem;
import org.apache.uima.cas.admin.CASFactory;
import org.apache.uima.cas.admin.CASMgr;
import org.apache.uima.cas.text.AnnotationFS;
import org.apache.uima.resource.ResourceInitializationException;
import org.apache.uima.resource.ResourceManager;
import org.apache.uima.resource.metadata.FsIndexCollection;
import org.apache.uima.resource.metadata.FsIndexDescription;
import org.apache.uima.resource.metadata.ProcessingResourceMetaData;
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.ConfigurationParameter_impl;
import org.apache.uima.resource.metadata.impl.FsIndexCollection_impl;
import org.apache.uima.resource.metadata.impl.FsIndexDescription_impl;
import org.apache.uima.resource.metadata.impl.TypePriorities_impl;
import org.apache.uima.resource.metadata.impl.TypePriorityList_impl;
import org.apache.uima.resource.metadata.impl.TypeSystemDescription_impl;
import org.apache.uima.test.junit_extension.JUnitExtension;
import org.junit.jupiter.api.Test;
public class CasCreationUtilsTest {
// this test is a skeleton
// it is currently disabled - it doesn't actually check anything
// using debug one can see that no errors are thrown if the allowed values for subtypes of string
// differ when merging
// and that no merging occurs of the allowed values - the 1st one "wins" (as of 5/2013)
// See Jira https://issues.apache.org/jira/browse/UIMA-2917
@Test
public void testStringSubtype() throws Exception {
try {
TypeSystemDescription ts1desc = UIMAFramework.getXMLParser()
.parseTypeSystemDescription(new XMLInputSource(JUnitExtension
.getFile("CasCreationUtilsTest/TypeSystemMergeStringSubtypeBasePlus.xml")));
TypeSystemDescription result = checkMergeTypeSystem(ts1desc,
"TypeSystemMergeStringSubtypeBase.xml",
ResourceInitializationException.ALLOWED_VALUES_NOT_IDENTICAL);
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
@Test
public void testMergeTypeSystems() throws Exception {
try {
TypeSystemDescription ts1desc = UIMAFramework.getXMLParser().parseTypeSystemDescription(
new XMLInputSource(JUnitExtension.getFile("CasCreationUtilsTest/TypeSystem1.xml")));
assertThat(ts1desc.getType("Type1").getFeatures()).hasSize(1);
assertThat(ts1desc.getType("Type2").getFeatures()).hasSize(1);
assertThat(ts1desc.getType("Type3").getFeatures()).hasSize(1);
TypeSystemDescription ts2desc = UIMAFramework.getXMLParser().parseTypeSystemDescription(
new XMLInputSource(JUnitExtension.getFile("CasCreationUtilsTest/TypeSystem2.xml")));
assertThat(ts2desc.getType("Type1").getFeatures()).hasSize(1);
assertThat(ts2desc.getType("Type2").getFeatures()).hasSize(1);
ArrayList<TypeSystemDescription> tsList = new ArrayList<>();
tsList.add(ts1desc);
tsList.add(ts2desc);
Map typesWithMergedFeatures = new HashMap();
TypeSystemDescription merged = CasCreationUtils.mergeTypeSystems(tsList,
UIMAFramework.newDefaultResourceManager(), typesWithMergedFeatures);
assertThat(merged.getType("Type1").getFeatures()).hasSize(2);
assertThat(merged.getType("Type2").getFeatures()).hasSize(2);
assertThat(merged.getType("Type3").getFeatures()).hasSize(1);
assertEquals(2, typesWithMergedFeatures.size());
assertTrue(typesWithMergedFeatures.containsKey("Type1"));
assertTrue(typesWithMergedFeatures.containsKey("Type2"));
// make sure one-arg version doesn't fail
CasCreationUtils.mergeTypeSystems(tsList);
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
@Test
public void testMergeTypeSystemElementType() throws Exception {
try {
TypeSystemDescription ts1desc = UIMAFramework.getXMLParser()
.parseTypeSystemDescription(new XMLInputSource(
JUnitExtension.getFile("CasCreationUtilsTest/TypeSystemMergeBase.xml")));
checkMergeTypeSystem(ts1desc, "TypeSystemMergeWrongElementType1.xml",
ResourceInitializationException.INCOMPATIBLE_ELEMENT_RANGE_TYPES);
checkMergeTypeSystem(ts1desc, "TypeSystemMergeWrongElementType2.xml",
ResourceInitializationException.INCOMPATIBLE_ELEMENT_RANGE_TYPES);
checkMergeTypeSystem(ts1desc, "TypeSystemMergeWrongMultiRef1.xml",
ResourceInitializationException.INCOMPATIBLE_MULTI_REFS);
checkMergeTypeSystem(ts1desc, "TypeSystemMergeWrongMultiRef2.xml",
ResourceInitializationException.INCOMPATIBLE_MULTI_REFS);
checkMergeTypeSystem(ts1desc, "TypeSystemMergeWrongMultiRef3.xml",
ResourceInitializationException.INCOMPATIBLE_MULTI_REFS);
checkMergeTypeSystem(ts1desc, "TypeSystemMergeOkMultiRef.xml", null);
checkMergeTypeSystem(ts1desc, "TypeSystemMergeNoElementType.xml", null);
checkMergeTypeSystem(ts1desc, "typeSystemMergeTopElementType.xml", null);
checkMergeTypeSystem(ts1desc, "TypeSystemMergeWrongElementTypeWithNone.xml",
ResourceInitializationException.INCOMPATIBLE_ELEMENT_RANGE_TYPES);
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
private TypeSystemDescription checkMergeTypeSystem(TypeSystemDescription ts1desc, String typeFile,
String msgKey) throws Exception {
TypeSystemDescription mergedTS = null;
try {
TypeSystemDescription ts2desc = UIMAFramework.getXMLParser().parseTypeSystemDescription(
new XMLInputSource(JUnitExtension.getFile("CasCreationUtilsTest/" + typeFile)));
List<TypeSystemDescription> tsList = new ArrayList<>();
tsList.add(ts1desc);
tsList.add(ts2desc);
boolean rightExceptionThrown = (null != msgKey) ? false : true;
try {
mergedTS = CasCreationUtils.mergeTypeSystems(tsList,
UIMAFramework.newDefaultResourceManager(), new HashMap());
} catch (ResourceInitializationException rie) {
rightExceptionThrown = (null != msgKey) && rie.hasMessageKey(msgKey);
}
assertTrue(rightExceptionThrown);
} catch (Exception e) {
JUnitExtension.handleException(e);
}
return mergedTS;
}
@Test
public void testMergeTypeSystemsWithDifferentSupertypes() throws Exception {
try {
TypeSystemDescription ts1desc = UIMAFramework.getXMLParser()
.parseTypeSystemDescription(new XMLInputSource(
JUnitExtension.getFile("CasCreationUtilsTest/SupertypeMergeTest1.xml")));
assertEquals("uima.tcas.Annotation", ts1desc.getType("uima.test.Sub").getSupertypeName());
TypeSystemDescription ts2desc = UIMAFramework.getXMLParser()
.parseTypeSystemDescription(new XMLInputSource(
JUnitExtension.getFile("CasCreationUtilsTest/SupertypeMergeTest2.xml")));
assertEquals("uima.test.Super", ts2desc.getType("uima.test.Sub").getSupertypeName());
List<TypeSystemDescription> tsList = new ArrayList<>();
tsList.add(ts1desc);
tsList.add(ts2desc);
TypeSystemDescription merged = CasCreationUtils.mergeTypeSystems(tsList,
UIMAFramework.newDefaultResourceManager());
assertEquals("uima.test.Super", merged.getType("uima.test.Sub").getSupertypeName());
// try merging in the other order - bug UIMA-826 was an order dependency in the behavior of
// this kind of merging
tsList = new ArrayList<>();
tsList.add(ts2desc);
tsList.add(ts1desc);
merged = CasCreationUtils.mergeTypeSystems(tsList, UIMAFramework.newDefaultResourceManager());
assertEquals("uima.test.Super", merged.getType("uima.test.Sub").getSupertypeName());
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
@Test
public void testAggregateWithImports() throws Exception {
try {
String pathSep = System.getProperty("path.separator");
ResourceManager resMgr = UIMAFramework.newDefaultResourceManager();
resMgr.setDataPath(JUnitExtension.getFile("TypeSystemDescriptionImplTest/dataPathDir")
.getAbsolutePath() + pathSep
+ JUnitExtension.getFile("TypePrioritiesImplTest/dataPathDir").getAbsolutePath()
+ pathSep
+ JUnitExtension.getFile("FsIndexCollectionImplTest/dataPathDir").getAbsolutePath());
File taeDescriptorWithImport = JUnitExtension
.getFile("CasCreationUtilsTest/AggregateTaeWithImports.xml");
AnalysisEngineDescription desc = UIMAFramework.getXMLParser()
.parseAnalysisEngineDescription(new XMLInputSource(taeDescriptorWithImport));
ArrayList<AnalysisEngineDescription> mdList = new ArrayList<>();
mdList.add(desc);
CAS tcas = CasCreationUtils.createCas(mdList,
UIMAFramework.getDefaultPerformanceTuningProperties(), resMgr);
// check that imports were resolved correctly
assertNotNull(tcas.getTypeSystem().getType("DocumentStructure"));
assertNotNull(tcas.getTypeSystem().getType("NamedEntity"));
assertNotNull(tcas.getTypeSystem().getType("TestType3"));
assertNotNull(tcas.getTypeSystem().getType("Sentence"));
assertNotNull(tcas.getIndexRepository().getIndex("TestIndex"));
assertNotNull(tcas.getIndexRepository().getIndex("ReverseAnnotationIndex"));
assertNotNull(tcas.getIndexRepository().getIndex("DocumentStructureIndex"));
// Check elementType and multipleReferencesAllowed for array feature
Feature arrayFeat = tcas.getTypeSystem().getFeatureByFullName("Paragraph:sentences");
assertNotNull(arrayFeat);
assertFalse(arrayFeat.isMultipleReferencesAllowed());
Type sentenceArrayType = arrayFeat.getRange();
assertNotNull(sentenceArrayType);
assertTrue(sentenceArrayType.isArray());
assertEquals(tcas.getTypeSystem().getType("Sentence"), sentenceArrayType.getComponentType());
Feature arrayFeat2 = tcas.getTypeSystem()
.getFeatureByFullName("Paragraph:testMultiRefAllowedFeature");
assertNotNull(arrayFeat2);
assertTrue(arrayFeat2.isMultipleReferencesAllowed());
// test imports aren't resolved more than once
Object spec1 = desc.getDelegateAnalysisEngineSpecifiers().get("Annotator1");
assertNotNull(spec1);
Object spec2 = desc.getDelegateAnalysisEngineSpecifiers().get("Annotator1");
assertTrue(spec1 == spec2);
// test removal
desc.getDelegateAnalysisEngineSpecifiersWithImports().remove("Annotator1");
assertTrue(desc.getDelegateAnalysisEngineSpecifiers().isEmpty());
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
@Test
public void testMergeDelegateAnalysisEngineTypeSystems() throws Exception {
try {
File descFile = JUnitExtension
.getFile("TextAnalysisEngineImplTest/AggregateTaeForMergeTest.xml");
AnalysisEngineDescription desc = UIMAFramework.getXMLParser()
.parseAnalysisEngineDescription(new XMLInputSource(descFile));
Map mergedTypes = new HashMap();
TypeSystemDescription typeSys = CasCreationUtils.mergeDelegateAnalysisEngineTypeSystems(desc,
UIMAFramework.newDefaultResourceManager(), mergedTypes);
// test results of merge
assertThat(typeSys.getTypes()).hasSize(8);
TypeDescription type0 = typeSys.getType("NamedEntity");
assertThat(type0).isNotNull();
assertThat(type0.getSupertypeName()).isEqualTo("uima.tcas.Annotation");
assertThat(type0.getFeatures()).hasSize(1);
TypeDescription type1 = typeSys.getType("Person");
assertThat(type1).isNotNull();
assertThat(type1.getSupertypeName()).isEqualTo("NamedEntity");
assertThat(type1.getFeatures()).hasSize(1);
TypeDescription type2 = typeSys.getType("Place");
assertThat(type2).isNotNull();
assertThat(type2.getSupertypeName()).isEqualTo("NamedEntity");
assertThat(type2.getFeatures()).hasSize(3);
TypeDescription type3 = typeSys.getType("Org");
assertThat(type3).isNotNull();
assertThat(type3.getSupertypeName()).isEqualTo("uima.tcas.Annotation");
assertThat(type3.getFeatures()).isEmpty();
TypeDescription type4 = typeSys.getType("DocumentStructure");
assertThat(type4).isNotNull();
assertThat(type4.getSupertypeName()).isEqualTo("uima.tcas.Annotation");
assertThat(type4.getFeatures()).isEmpty();
TypeDescription type5 = typeSys.getType("Paragraph");
assertThat(type5).isNotNull();
assertThat(type5.getSupertypeName()).isEqualTo("DocumentStructure");
assertThat(type5.getFeatures()).isEmpty();
TypeDescription type6 = typeSys.getType("Sentence");
assertThat(type6).isNotNull();
assertThat(type6.getSupertypeName()).isEqualTo("DocumentStructure");
assertThat(type6.getFeatures()).isEmpty();
TypeDescription type7 = typeSys.getType("test.flowController.Test");
assertThat(type7).isNotNull();
assertThat(type7.getSupertypeName()).isEqualTo("uima.tcas.Annotation");
assertThat(type7.getFeatures()).hasSize(1);
// Place has merged features, Person has different supertype
assertEquals(2, mergedTypes.size());
assertTrue(mergedTypes.containsKey("Place"));
assertTrue(mergedTypes.containsKey("Person"));
// make sure one-arg version doesn't fail
CasCreationUtils.mergeDelegateAnalysisEngineTypeSystems(desc);
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
@Test
public void testMergeDelegateAnalysisEngineTypePriorities() throws Exception {
try {
File descFile = JUnitExtension
.getFile("TextAnalysisEngineImplTest/AggregateTaeForMergeTest.xml");
AnalysisEngineDescription desc = UIMAFramework.getXMLParser()
.parseAnalysisEngineDescription(new XMLInputSource(descFile));
TypePriorities pri = CasCreationUtils.mergeDelegateAnalysisEngineTypePriorities(desc);
// test results of merge
assertThat(pri).isNotNull();
TypePriorityList[] priLists = pri.getPriorityLists();
assertThat(priLists).hasSize(3);
String[] list0 = priLists[0].getTypes();
String[] list1 = priLists[1].getTypes();
String[] list2 = priLists[2].getTypes();
// order of the three lists is not defined
assertThat((list0.length == 2 && list1.length == 2 && list2.length == 3)
|| (list0.length == 2 && list1.length == 3 && list2.length == 2)
|| (list0.length == 3 && list1.length == 2 && list2.length == 2)).isTrue();
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
@Test
public void testMergeDelegateAnalysisEngineFsIndexCollections() throws Exception {
try {
File descFile = JUnitExtension
.getFile("TextAnalysisEngineImplTest/AggregateTaeForMergeTest.xml");
AnalysisEngineDescription desc = UIMAFramework.getXMLParser()
.parseAnalysisEngineDescription(new XMLInputSource(descFile));
FsIndexCollection indexColl = CasCreationUtils
.mergeDelegateAnalysisEngineFsIndexCollections(desc);
// test results of merge
FsIndexDescription[] indexes = indexColl.getFsIndexes();
assertThat(indexes).hasSize(3);
// order of indexes is not defined
String label0 = indexes[0].getLabel();
String label1 = indexes[1].getLabel();
String label2 = indexes[2].getLabel();
assertThat(label0.equals("DocStructIndex") || label1.equals("DocStructIndex")
|| label2.equals("DocStructIndex")).isTrue();
assertThat(label0.equals("PlaceIndex") || label1.equals("PlaceIndex")
|| label2.equals("PlaceIndex")).isTrue();
assertThat(
label0.equals("FlowControllerTestIndex") || label1.equals("FlowControllerTestIndex")
|| label2.equals("FlowControllerTestIndex")).isTrue();
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
@Test
public void testSetupTypeSystem() throws Exception {
try {
// test that duplicate feature names on supertype and subtype works
// regardless of the order in which the types appear in the TypeSystemDescription
TypeSystemDescription tsd1 = new TypeSystemDescription_impl();
TypeDescription supertype = tsd1.addType("test.Super", "", "uima.cas.TOP");
supertype.addFeature("testfeat", "", "uima.cas.Integer");
TypeDescription subtype = tsd1.addType("test.Sub", "", "test.Super");
subtype.addFeature("testfeat", "", "uima.cas.Integer");
CASMgr casMgr = CASFactory.createCAS();
CasCreationUtils.setupTypeSystem(casMgr, tsd1);
assertNotNull(
casMgr.getTypeSystemMgr().getType("test.Super").getFeatureByBaseName("testfeat"));
TypeSystemDescription tsd2 = new TypeSystemDescription_impl();
tsd2.setTypes(new TypeDescription[] { subtype, supertype });
casMgr = CASFactory.createCAS();
CasCreationUtils.setupTypeSystem(casMgr, tsd2);
assertNotNull(
casMgr.getTypeSystemMgr().getType("test.Super").getFeatureByBaseName("testfeat"));
} catch (ResourceInitializationException e) {
JUnitExtension.handleException(e);
}
}
@Test
public void testCreateCasCollectionPropertiesResourceManager() throws Exception {
try {
// parse an AE descriptor
File taeDescriptorWithImport = JUnitExtension
.getFile("CasCreationUtilsTest/TaeWithImports.xml");
AnalysisEngineDescription desc = UIMAFramework.getXMLParser()
.parseAnalysisEngineDescription(new XMLInputSource(taeDescriptorWithImport));
// create Resource Manager & set data path - necessary to resolve imports
ResourceManager resMgr = UIMAFramework.newDefaultResourceManager();
String pathSep = System.getProperty("path.separator");
resMgr.setDataPath(JUnitExtension.getFile("TypeSystemDescriptionImplTest/dataPathDir")
.getAbsolutePath() + pathSep
+ JUnitExtension.getFile("TypePrioritiesImplTest/dataPathDir").getAbsolutePath()
+ pathSep
+ JUnitExtension.getFile("FsIndexCollectionImplTest/dataPathDir").getAbsolutePath());
// call method
ArrayList<AnalysisEngineDescription> descList = new ArrayList<>();
descList.add(desc);
CAS cas = CasCreationUtils.createCas(descList,
UIMAFramework.getDefaultPerformanceTuningProperties(), resMgr);
// check that imports were resolved correctly
assertNotNull(cas.getTypeSystem().getType("DocumentStructure"));
assertNotNull(cas.getTypeSystem().getType("NamedEntity"));
assertNotNull(cas.getTypeSystem().getType("TestType3"));
assertNotNull(cas.getIndexRepository().getIndex("TestIndex"));
assertNotNull(cas.getIndexRepository().getIndex("ReverseAnnotationIndex"));
assertNotNull(cas.getIndexRepository().getIndex("DocumentStructureIndex"));
// check of type priority
AnnotationFS fs1 = cas.createAnnotation(cas.getTypeSystem().getType("Paragraph"), 0, 1);
AnnotationFS fs2 = cas.createAnnotation(cas.getTypeSystem().getType("Sentence"), 0, 1);
assertTrue(cas.getAnnotationIndex().compare(fs1, fs2) < 0);
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
@Test
public void testCreateCasCollection() throws Exception {
try {
// create two Type System description objects
TypeSystemDescription tsd1 = new TypeSystemDescription_impl();
TypeDescription supertype = tsd1.addType("test.Super", "", "uima.tcas.Annotation");
supertype.addFeature("testfeat", "", "uima.cas.Integer");
TypeDescription subtype = tsd1.addType("test.Sub", "", "test.Super");
subtype.addFeature("testfeat", "", "uima.cas.Integer");
TypeSystemDescription tsd2 = new TypeSystemDescription_impl();
TypeDescription fooType = tsd1.addType("test.Foo", "", "uima.cas.TOP");
fooType.addFeature("bar", "", "uima.cas.String");
// create index and priorities descriptions
FsIndexCollection indexes = new FsIndexCollection_impl();
FsIndexDescription index = new FsIndexDescription_impl();
index.setLabel("MyIndex");
index.setTypeName("test.Foo");
index.setKind(FsIndexDescription.KIND_BAG);
indexes.addFsIndex(index);
TypePriorities priorities = new TypePriorities_impl();
TypePriorityList priList = new TypePriorityList_impl();
priList.addType("test.Foo");
priList.addType("test.Sub");
priList.addType("test.Super");
priorities.addPriorityList(priList);
// create a CAS containing all these definitions
ArrayList descList = new ArrayList();
descList.add(tsd1);
descList.add(tsd2);
descList.add(indexes);
descList.add(priorities);
CAS cas = CasCreationUtils.createCas(descList);
// check that type system has been installed
TypeSystem ts = cas.getTypeSystem();
Type supertypeHandle = ts.getType(supertype.getName());
assertNotNull(supertypeHandle);
assertNotNull(supertypeHandle.getFeatureByBaseName("testfeat"));
Type subtypeHandle = ts.getType(subtype.getName());
assertNotNull(subtypeHandle);
assertNotNull(subtypeHandle.getFeatureByBaseName("testfeat"));
Type fooTypeHandle = ts.getType(fooType.getName());
assertNotNull(fooTypeHandle);
assertNotNull(fooTypeHandle.getFeatureByBaseName("bar"));
// check that index exists
assertNotNull(cas.getIndexRepository().getIndex("MyIndex"));
// test that priorities work
cas.createFS(supertypeHandle);
cas.createFS(subtypeHandle);
FSIterator iter = cas.getAnnotationIndex().iterator();
while (iter.isValid()) {
if (iter.get().getType() == subtypeHandle) {
break;
}
if (iter.get().getType() == supertypeHandle) {
fail();
}
iter.moveToNext();
}
// test that passing an invalid object causes an error
descList.add(new ConfigurationParameter_impl());
try {
CasCreationUtils.createCas(descList);
fail();
} catch (ResourceInitializationException e) {
// expected
}
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
@Test
public void testCreateCasTypeSystemDescription() throws Exception {
try {
// parse type system description
TypeSystemDescription tsDesc = UIMAFramework.getXMLParser()
.parseTypeSystemDescription(new XMLInputSource(
JUnitExtension.getFile("CasCreationUtilsTest/SupertypeMergeTestMaster.xml")));
// call method
CAS cas = CasCreationUtils.createCas(tsDesc, null, null);
// check that imports were resolved and supertype merged properly
Type subType = cas.getTypeSystem().getType("uima.test.Sub");
assertNotNull(subType);
Type superType = cas.getTypeSystem().getType("uima.test.Super");
assertNotNull(superType);
assertTrue(cas.getTypeSystem().subsumes(superType, subType));
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
@Test
public void testMergeDelegateAnalysisEngineMetaData() throws Exception {
try {
File descFile = JUnitExtension
.getFile("TextAnalysisEngineImplTest/AggregateTaeForMergeTest.xml");
AnalysisEngineDescription desc = UIMAFramework.getXMLParser()
.parseAnalysisEngineDescription(new XMLInputSource(descFile));
Map mergedTypes = new HashMap();
ProcessingResourceMetaData mergedMetaData = CasCreationUtils
.mergeDelegateAnalysisEngineMetaData(desc, UIMAFramework.newDefaultResourceManager(),
mergedTypes, null);
TypeSystemDescription typeSys = mergedMetaData.getTypeSystem();
TypePriorities pri = mergedMetaData.getTypePriorities();
FsIndexCollection indexColl = mergedMetaData.getFsIndexCollection();
// test results of merge
// Type System
assertThat(typeSys.getTypes()).hasSize(8);
TypeDescription type0 = typeSys.getType("NamedEntity");
assertThat(type0).isNotNull();
assertThat(type0.getSupertypeName()).isEqualTo("uima.tcas.Annotation");
assertThat(type0.getFeatures()).hasSize(1);
TypeDescription type1 = typeSys.getType("Person");
assertThat(type1).isNotNull();
assertThat(type1.getSupertypeName()).isEqualTo("NamedEntity");
assertThat(type1.getFeatures()).hasSize(1);
TypeDescription type2 = typeSys.getType("Place");
assertThat(type2).isNotNull();
assertThat(type2.getSupertypeName()).isEqualTo("NamedEntity");
assertThat(type2.getFeatures()).hasSize(3);
TypeDescription type3 = typeSys.getType("Org");
assertThat(type3).isNotNull();
assertThat(type3.getSupertypeName()).isEqualTo("uima.tcas.Annotation");
assertThat(type3.getFeatures()).isEmpty();
TypeDescription type4 = typeSys.getType("DocumentStructure");
assertThat(type4).isNotNull();
assertThat(type4.getSupertypeName()).isEqualTo("uima.tcas.Annotation");
assertThat(type4.getFeatures()).isEmpty();
TypeDescription type5 = typeSys.getType("Paragraph");
assertThat(type5).isNotNull();
assertThat(type5.getSupertypeName()).isEqualTo("DocumentStructure");
assertThat(type5.getFeatures()).isEmpty();
TypeDescription type6 = typeSys.getType("Sentence");
assertThat(type6).isNotNull();
assertThat(type6.getSupertypeName()).isEqualTo("DocumentStructure");
assertThat(type6.getFeatures()).isEmpty();
TypeDescription type7 = typeSys.getType("test.flowController.Test");
assertThat(type7).isNotNull();
assertThat(type7.getSupertypeName()).isEqualTo("uima.tcas.Annotation");
assertThat(type7.getFeatures()).hasSize(1);
// Place has merged features, Person has different supertype
assertEquals(2, mergedTypes.size());
assertTrue(mergedTypes.containsKey("Place"));
assertTrue(mergedTypes.containsKey("Person"));
// Type Priorities
assertThat(pri).isNotNull();
TypePriorityList[] priLists = pri.getPriorityLists();
assertThat(priLists).hasSize(3);
String[] list0 = priLists[0].getTypes();
String[] list1 = priLists[1].getTypes();
String[] list2 = priLists[2].getTypes();
// order of the three lists is not defined
assertThat((list0.length == 2 && list1.length == 2 && list2.length == 3)
|| (list0.length == 2 && list1.length == 3 && list2.length == 2)
|| (list0.length == 3 && list1.length == 2 && list2.length == 2)).isTrue();
// Indexes
FsIndexDescription[] indexes = indexColl.getFsIndexes();
assertThat(indexes).hasSize(3);
// order of indexes is not defined
String label0 = indexes[0].getLabel();
String label1 = indexes[1].getLabel();
String label2 = indexes[2].getLabel();
assertThat(label0.equals("DocStructIndex") || label1.equals("DocStructIndex")
|| label2.equals("DocStructIndex")).isTrue();
assertThat(label0.equals("PlaceIndex") || label1.equals("PlaceIndex")
|| label2.equals("PlaceIndex")).isTrue();
assertThat(
label0.equals("FlowControllerTestIndex") || label1.equals("FlowControllerTestIndex")
|| label2.equals("FlowControllerTestIndex")).isTrue();
// Now test case where aggregate contains a remote, and we want to do the
// merge of the non-remote delegates and report the failure. (This example
// also happens to use import-by-name so we need to set the data path.)
ResourceManager resMgr = UIMAFramework.newDefaultResourceManager();
String pathSep = System.getProperty("path.separator");
resMgr.setDataPath(JUnitExtension.getFile("TypeSystemDescriptionImplTest/dataPathDir")
.getAbsolutePath() + pathSep
+ JUnitExtension.getFile("TypePrioritiesImplTest/dataPathDir").getAbsolutePath()
+ pathSep
+ JUnitExtension.getFile("FsIndexCollectionImplTest/dataPathDir").getAbsolutePath());
} catch (Exception e) {
JUnitExtension.handleException(e);
}
}
}