/* * 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.fit.factory; import static java.util.Arrays.asList; import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngine; import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineDescription; import static org.apache.uima.fit.factory.AnalysisEngineFactory.createEngineFromPath; import static org.apache.uima.fit.factory.TypeSystemDescriptionFactory.createTypeSystemDescription; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.commons.io.FileUtils; import org.apache.uima.UIMAException; import org.apache.uima.UIMAFramework; import org.apache.uima.analysis_component.AnalysisComponent; import org.apache.uima.analysis_engine.AnalysisEngine; import org.apache.uima.analysis_engine.AnalysisEngineDescription; import org.apache.uima.analysis_engine.AnalysisEngineProcessException; import org.apache.uima.analysis_engine.metadata.SofaMapping; import org.apache.uima.cas.CAS; import org.apache.uima.cas.FSIterator; import org.apache.uima.fit.ComponentTestBase; import org.apache.uima.fit.component.JCasAnnotator_ImplBase; import org.apache.uima.fit.component.NoOpAnnotator; import org.apache.uima.fit.descriptor.OperationalProperties; import org.apache.uima.fit.descriptor.ResourceMetaData; import org.apache.uima.fit.factory.testAes.Annotator1; import org.apache.uima.fit.factory.testAes.Annotator2; import org.apache.uima.fit.factory.testAes.Annotator3; import org.apache.uima.fit.factory.testAes.Annotator4; import org.apache.uima.fit.factory.testAes.ParameterizedAE; import org.apache.uima.fit.factory.testAes.SerializationTestAnnotator; import org.apache.uima.fit.factory.testAes.ViewNames; import org.apache.uima.fit.pipeline.SimplePipeline; import org.apache.uima.fit.type.AnalyzedText; import org.apache.uima.fit.type.Sentence; import org.apache.uima.fit.type.Token; import org.apache.uima.fit.util.CasIOUtil; import org.apache.uima.fit.util.JCasUtil; import org.apache.uima.jcas.JCas; import org.apache.uima.jcas.tcas.Annotation; import org.apache.uima.pear.tools.PackageBrowser; import org.apache.uima.pear.tools.PackageInstaller; import org.apache.uima.resource.PearSpecifier; import org.apache.uima.resource.ResourceInitializationException; import org.apache.uima.resource.metadata.Capability; import org.apache.uima.resource.metadata.ConfigurationParameter; import org.apache.uima.resource.metadata.ConfigurationParameterDeclarations; import org.apache.uima.resource.metadata.ConfigurationParameterSettings; import org.apache.uima.resource.metadata.FsIndexDescription; import org.apache.uima.resource.metadata.ProcessingResourceMetaData; 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.util.XMLInputSource; import org.custommonkey.xmlunit.XMLAssert; import org.custommonkey.xmlunit.XMLUnit; import org.junit.Test; public class AnalysisEngineFactoryTest extends ComponentTestBase { @Test public void testViewAE() throws Exception { AnalysisEngineDescription aed = AnalysisEngineFactory.createEngineDescription( Annotator4.class, typeSystemDescription); AnalysisEngine ae = AnalysisEngineFactory.createEngine(aed, "A"); JCas aView = jCas.createView("A"); tokenBuilder.buildTokens(aView, "'Verb' is a noun!?"); ae.process(jCas); assertEquals("'Verb' is a noun!?", jCas.getView("A").getDocumentText()); assertEquals("NN", JCasUtil.selectByIndex(aView, Token.class, 0).getPos()); } @Test public void testCreateAnalysisEngineFromPath() throws UIMAException, IOException { AnalysisEngine engine = createEngineFromPath( "src/main/resources/org/apache/uima/fit/component/NoOpAnnotator.xml"); assertNotNull(engine); } @Test public void testCreateAnalysisEngineWithPrioritizedTypes() throws UIMAException { String[] prioritizedTypeNames = new String[] { "org.apache.uima.fit.type.Token", "org.apache.uima.fit.type.Sentence" }; AnalysisEngine engine = AnalysisEngineFactory.createEngine( org.apache.uima.fit.component.NoOpAnnotator.class, typeSystemDescription, prioritizedTypeNames, (Object[]) null); typePriorities = engine.getAnalysisEngineMetaData().getTypePriorities(); assertEquals(1, typePriorities.getPriorityLists().length); TypePriorityList typePriorityList = typePriorities.getPriorityLists()[0]; assertEquals(2, typePriorityList.getTypes().length); assertEquals("org.apache.uima.fit.type.Token", typePriorityList.getTypes()[0]); assertEquals("org.apache.uima.fit.type.Sentence", typePriorityList.getTypes()[1]); jCas = engine.newJCas(); tokenBuilder.buildTokens(jCas, "word"); FSIterator<Annotation> tokensInSentence = jCas.getAnnotationIndex().subiterator( JCasUtil.selectByIndex(jCas, Sentence.class, 0)); assertFalse(tokensInSentence.hasNext()); prioritizedTypeNames = new String[] { "org.apache.uima.fit.type.Sentence", "org.apache.uima.fit.type.Token" }; engine = AnalysisEngineFactory.createEngine( org.apache.uima.fit.component.NoOpAnnotator.class, typeSystemDescription, prioritizedTypeNames, (Object[]) null); jCas = engine.newJCas(); tokenBuilder.buildTokens(jCas, "word"); tokensInSentence = jCas.getAnnotationIndex().subiterator( JCasUtil.selectByIndex(jCas, Sentence.class, 0)); assertTrue(tokensInSentence.hasNext()); } @Test public void testAggregate() throws UIMAException { tokenBuilder.buildTokens(jCas, "Anyone up for a game of Foosball?"); SofaMapping[] sofaMappings = new SofaMapping[] { SofaMappingFactory.createSofaMapping(Annotator1.class, ViewNames.PARENTHESES_VIEW, "A"), SofaMappingFactory.createSofaMapping(Annotator2.class, ViewNames.SORTED_VIEW, "B"), SofaMappingFactory.createSofaMapping(Annotator2.class, ViewNames.SORTED_PARENTHESES_VIEW, "C"), SofaMappingFactory.createSofaMapping(Annotator2.class, ViewNames.PARENTHESES_VIEW, "A"), SofaMappingFactory.createSofaMapping(Annotator3.class, ViewNames.INITIAL_VIEW, "B") }; List<Class<? extends AnalysisComponent>> primitiveAEClasses = new ArrayList<Class<? extends AnalysisComponent>>(); primitiveAEClasses.add(Annotator1.class); primitiveAEClasses.add(Annotator2.class); primitiveAEClasses.add(Annotator3.class); AnalysisEngine aggregateEngine = AnalysisEngineFactory.createEngine(primitiveAEClasses, typeSystemDescription, null, sofaMappings); aggregateEngine.process(jCas); assertEquals("Anyone up for a game of Foosball?", jCas.getDocumentText()); assertEquals("Any(o)n(e) (u)p f(o)r (a) g(a)m(e) (o)f F(oo)sb(a)ll?", jCas.getView("A") .getDocumentText()); assertEquals("?AFaaabeeffgllmnnoooooprsuy", jCas.getView("B").getDocumentText()); assertEquals("(((((((((())))))))))?AFaaabeeffgllmnnoooooprsuy", jCas.getView("C") .getDocumentText()); assertEquals("yusrpooooonnmllgffeebaaaFA?", jCas.getView(ViewNames.REVERSE_VIEW) .getDocumentText()); } @Test public void testAggregate2() throws UIMAException, IOException { tokenBuilder.buildTokens(jCas, "Anyone up for a game of Foosball?"); SofaMapping[] sofaMappings = new SofaMapping[] { SofaMappingFactory.createSofaMapping("ann1", ViewNames.PARENTHESES_VIEW, "A"), SofaMappingFactory.createSofaMapping("ann2", ViewNames.SORTED_VIEW, "B"), SofaMappingFactory.createSofaMapping("ann2", ViewNames.SORTED_PARENTHESES_VIEW, "C"), SofaMappingFactory.createSofaMapping("ann2", ViewNames.PARENTHESES_VIEW, "A"), SofaMappingFactory.createSofaMapping("ann3", ViewNames.INITIAL_VIEW, "B") }; List<AnalysisEngineDescription> primitiveDescriptors = new ArrayList<AnalysisEngineDescription>(); primitiveDescriptors.add(AnalysisEngineFactory.createEngineDescription(Annotator1.class, typeSystemDescription, (TypePriorities) null)); primitiveDescriptors.add(AnalysisEngineFactory.createEngineDescription(Annotator2.class, typeSystemDescription, (TypePriorities) null)); primitiveDescriptors.add(AnalysisEngineFactory.createEngineDescription(Annotator3.class, typeSystemDescription, (TypePriorities) null)); List<String> componentNames = Arrays.asList("ann1", "ann2", "ann3"); AnalysisEngine aggregateEngine = AnalysisEngineFactory.createEngine(primitiveDescriptors, componentNames, null, sofaMappings); aggregateEngine.process(jCas); assertEquals("Anyone up for a game of Foosball?", jCas.getDocumentText()); assertEquals("Any(o)n(e) (u)p f(o)r (a) g(a)m(e) (o)f F(oo)sb(a)ll?", jCas.getView("A") .getDocumentText()); assertEquals("?AFaaabeeffgllmnnoooooprsuy", jCas.getView("B").getDocumentText()); assertEquals("(((((((((())))))))))?AFaaabeeffgllmnnoooooprsuy", jCas.getView("C") .getDocumentText()); assertEquals("yusrpooooonnmllgffeebaaaFA?", jCas.getView(ViewNames.REVERSE_VIEW) .getDocumentText()); CasIOUtil.readJCas(jCas, new File("src/test/resources/data/docs/test.xmi")); AnalysisEngine ae1 = AnalysisEngineFactory.createEngine(NoOpAnnotator.class, typeSystemDescription); SimplePipeline.runPipeline(jCas, ae1, aggregateEngine); } @Test public void testReflectPrimitiveDescription() throws ResourceInitializationException { AnalysisEngineDescription aed = AnalysisEngineFactory.createEngineDescription( Annotator2.class, typeSystemDescription, typePriorities); Capability[] capabilities = aed.getAnalysisEngineMetaData().getCapabilities(); assertEquals(1, capabilities.length); String[] inputSofas = capabilities[0].getInputSofas(); assertArrayEquals(new String[] { CAS.NAME_DEFAULT_SOFA, ViewNames.PARENTHESES_VIEW }, inputSofas); String[] outputSofas = capabilities[0].getOutputSofas(); assertArrayEquals(new String[] { ViewNames.SORTED_VIEW, ViewNames.SORTED_PARENTHESES_VIEW }, outputSofas); aed = AnalysisEngineFactory.createEngineDescription(ParameterizedAE.class, typeSystemDescription, typePriorities); capabilities = aed.getAnalysisEngineMetaData().getCapabilities(); assertEquals(1, capabilities.length); inputSofas = capabilities[0].getInputSofas(); assertArrayEquals(new String[] { CAS.NAME_DEFAULT_SOFA }, inputSofas); outputSofas = capabilities[0].getOutputSofas(); assertArrayEquals(new String[] {}, outputSofas); testConfigurationParameter(aed, ParameterizedAE.PARAM_STRING_1, ConfigurationParameter.TYPE_STRING, true, false, "pineapple"); testConfigurationParameter(aed, ParameterizedAE.PARAM_STRING_2, ConfigurationParameter.TYPE_STRING, false, true, new String[] { "coconut", "mango" }); testConfigurationParameter(aed, ParameterizedAE.PARAM_STRING_3, ConfigurationParameter.TYPE_STRING, false, false, null); testConfigurationParameter(aed, ParameterizedAE.PARAM_STRING_4, ConfigurationParameter.TYPE_STRING, true, true, new String[] { "apple" }); testConfigurationParameter(aed, ParameterizedAE.PARAM_STRING_5, ConfigurationParameter.TYPE_STRING, false, true, new String[] { "" }); testConfigurationParameter(aed, ParameterizedAE.PARAM_BOOLEAN_1, ConfigurationParameter.TYPE_BOOLEAN, true, false, Boolean.FALSE); testConfigurationParameter(aed, ParameterizedAE.PARAM_BOOLEAN_2, ConfigurationParameter.TYPE_BOOLEAN, false, false, null); testConfigurationParameter(aed, ParameterizedAE.PARAM_BOOLEAN_3, ConfigurationParameter.TYPE_BOOLEAN, true, true, new Boolean[] { true, true, false }); testConfigurationParameter(aed, ParameterizedAE.PARAM_BOOLEAN_4, ConfigurationParameter.TYPE_BOOLEAN, true, true, new Boolean[] { true, false, true }); testConfigurationParameter(aed, ParameterizedAE.PARAM_BOOLEAN_5, ConfigurationParameter.TYPE_BOOLEAN, true, true, new Boolean[] { false }); testConfigurationParameter(aed, ParameterizedAE.PARAM_INT_1, ConfigurationParameter.TYPE_INTEGER, true, false, 0); testConfigurationParameter(aed, ParameterizedAE.PARAM_INT_2, ConfigurationParameter.TYPE_INTEGER, true, false, 42); testConfigurationParameter(aed, ParameterizedAE.PARAM_INT_3, ConfigurationParameter.TYPE_INTEGER, true, true, new Integer[] { 42, 111 }); testConfigurationParameter(aed, ParameterizedAE.PARAM_INT_4, ConfigurationParameter.TYPE_INTEGER, true, true, new Integer[] { 2 }); testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_1, ConfigurationParameter.TYPE_FLOAT, true, false, 0.0f); testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_2, ConfigurationParameter.TYPE_FLOAT, false, false, 3.1415f); testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_3, ConfigurationParameter.TYPE_FLOAT, true, false, null); testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_4, ConfigurationParameter.TYPE_FLOAT, false, true, null); testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_5, ConfigurationParameter.TYPE_FLOAT, false, true, new Float[] { 0.0f, 3.1415f, 2.7182818f }); testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_6, ConfigurationParameter.TYPE_FLOAT, true, true, null); testConfigurationParameter(aed, ParameterizedAE.PARAM_FLOAT_7, ConfigurationParameter.TYPE_FLOAT, true, true, new Float[] { 1.1111f, 2.2222f, 3.333f }); AnalysisEngine ae = AnalysisEngineFactory .createEngine(aed, ParameterizedAE.PARAM_FLOAT_3, 3.1415f, ParameterizedAE.PARAM_FLOAT_6, new Float[] { 2.71828183f }, "file2", "foo/bar"); Object paramValue = ae.getAnalysisEngineMetaData().getConfigurationParameterSettings() .getParameterValue(ParameterizedAE.PARAM_FLOAT_3); assertEquals(paramValue, 3.1415f); paramValue = ae.getAnalysisEngineMetaData().getConfigurationParameterSettings() .getParameterValue(ParameterizedAE.PARAM_FLOAT_6); assertEquals(((Float[]) paramValue)[0].floatValue(), 2.71828183f, 0.00001f); } private void testConfigurationParameter(AnalysisEngineDescription aed, String parameterName, String parameterType, boolean mandatory, boolean multiValued, Object parameterValue) { ConfigurationParameterDeclarations cpd = aed.getMetaData() .getConfigurationParameterDeclarations(); ConfigurationParameter cp = cpd.getConfigurationParameter(null, parameterName); assertNotNull("Parameter [" + parameterName + "] does not exist!", cp); assertEquals("Parameter [" + parameterName + "] has wrong name", parameterName, cp.getName()); assertEquals("Parameter [" + parameterName + "] has wrong type", parameterType, cp.getType()); assertEquals("Parameter [" + parameterName + "] has wrong mandatory flag", mandatory, cp.isMandatory()); assertEquals("Parameter [" + parameterName + "] has wrong multi-value flag", multiValued, cp.isMultiValued()); ConfigurationParameterSettings cps = aed.getMetaData().getConfigurationParameterSettings(); Object actualValue = cps.getParameterValue(parameterName); if (parameterValue == null) { assertNull(actualValue); } else if (!multiValued) { if (parameterType.equals(ConfigurationParameter.TYPE_FLOAT)) { assertEquals(((Float) parameterValue).floatValue(), ((Float) actualValue).floatValue(), .001f); } else { assertEquals(parameterValue, actualValue); } } else { assertEquals(Array.getLength(parameterValue), Array.getLength(actualValue)); for (int i = 0; i < Array.getLength(parameterValue); ++i) { assertEquals(Array.get(parameterValue, i), Array.get(actualValue, i)); } } } @Test public void testPrimitiveDescription() throws ResourceInitializationException { AnalysisEngineDescription aed = AnalysisEngineFactory.createEngineDescription( NoOpAnnotator.class, typeSystemDescription); assertNotNull(aed); // assertEquals("org.apache.uima.fit.type.TypeSystem", // aed.getAnalysisEngineMetaData().getTypeSystem().getImports()[0].getName()); } /** * Test that a {@link OperationalProperties} annotation on an ancestor of a analysis engine class * is found and taken into account. */ @Test public void testComponentAnnotationOnAncestor() throws Exception { AnalysisEngineDescription desc1 = AnalysisEngineFactory.createEngineDescription( PristineAnnotatorClass.class, (Object[]) null); assertTrue( "Multiple deployment should be allowed on " + desc1.getAnnotatorImplementationName(), desc1.getAnalysisEngineMetaData().getOperationalProperties() .isMultipleDeploymentAllowed()); AnalysisEngineDescription desc2 = AnalysisEngineFactory.createEngineDescription( UnannotatedAnnotatorClass.class, (Object[]) null); assertFalse( "Multiple deployment should be prohibited on " + desc2.getAnnotatorImplementationName(), desc2.getAnalysisEngineMetaData().getOperationalProperties() .isMultipleDeploymentAllowed()); AnalysisEngineDescription desc3 = AnalysisEngineFactory.createEngineDescription( AnnotatedAnnotatorClass.class, (Object[]) null); assertTrue( "Multiple deployment should be allowed on " + desc3.getAnnotatorImplementationName(), desc3.getAnalysisEngineMetaData().getOperationalProperties() .isMultipleDeploymentAllowed()); } /* * This test case illustrates that UIMA throws an exception unless the multipleDeploymentAllowed * flag is properly set to false when mixing multi-deployment and non-multi-deployment AEs. */ @Test(expected = ResourceInitializationException.class) public void testAAEMultipleDeploymentPolicyProblem() throws Exception { { AnalysisEngineDescription desc1 = AnalysisEngineFactory.createEngineDescription( PristineAnnotatorClass.class, (Object[]) null); assertTrue( "Multiple deployment should be allowed on " + desc1.getAnnotatorImplementationName(), desc1.getAnalysisEngineMetaData().getOperationalProperties() .isMultipleDeploymentAllowed()); AnalysisEngineDescription desc2 = AnalysisEngineFactory.createEngineDescription( UnannotatedAnnotatorClass.class, (Object[]) null); assertFalse( "Multiple deployment should be prohibited on " + desc2.getAnnotatorImplementationName(), desc2.getAnalysisEngineMetaData() .getOperationalProperties().isMultipleDeploymentAllowed()); AnalysisEngineDescription aae = AnalysisEngineFactory .createEngineDescription(desc1, desc2); aae.getAnalysisEngineMetaData().getOperationalProperties().setMultipleDeploymentAllowed(true); UIMAFramework.produceAnalysisEngine(aae); } } @Test public void testAAEMultipleDeploymentPolicy() throws Exception { { AnalysisEngineDescription desc1 = AnalysisEngineFactory.createEngineDescription( PristineAnnotatorClass.class, (Object[]) null); assertTrue( "Multiple deployment should be allowed on " + desc1.getAnnotatorImplementationName(), desc1.getAnalysisEngineMetaData().getOperationalProperties() .isMultipleDeploymentAllowed()); AnalysisEngineDescription desc2 = AnalysisEngineFactory.createEngineDescription( UnannotatedAnnotatorClass.class, (Object[]) null); assertFalse( "Multiple deployment should be prohibited on " + desc2.getAnnotatorImplementationName(), desc2.getAnalysisEngineMetaData() .getOperationalProperties().isMultipleDeploymentAllowed()); AnalysisEngineDescription aae = AnalysisEngineFactory .createEngineDescription(desc1, desc2); UIMAFramework.produceAnalysisEngine(aae); assertFalse("Multiple deployment should be prohibited on AAE", aae .getAnalysisEngineMetaData().getOperationalProperties().isMultipleDeploymentAllowed()); } { AnalysisEngineDescription desc1 = AnalysisEngineFactory.createEngineDescription( PristineAnnotatorClass.class, (Object[]) null); assertTrue( "Multiple deployment should be allowed on " + desc1.getAnnotatorImplementationName(), desc1.getAnalysisEngineMetaData().getOperationalProperties() .isMultipleDeploymentAllowed()); AnalysisEngineDescription desc3 = AnalysisEngineFactory.createEngineDescription( AnnotatedAnnotatorClass.class, (Object[]) null); assertTrue( "Multiple deployment should be allowed on " + desc3.getAnnotatorImplementationName(), desc3.getAnalysisEngineMetaData().getOperationalProperties() .isMultipleDeploymentAllowed()); AnalysisEngineDescription aae = AnalysisEngineFactory .createEngineDescription(desc1, desc3); UIMAFramework.produceAnalysisEngine(aae); assertTrue("Multiple deployment should be prohibited on AAE", aae.getAnalysisEngineMetaData() .getOperationalProperties().isMultipleDeploymentAllowed()); } } @Test public void testResourceMetaData() throws Exception { AnalysisEngineDescription desc = AnalysisEngineFactory .createEngineDescription(AnnotatorWithMetaDataClass.class); org.apache.uima.resource.metadata.ResourceMetaData meta = desc.getMetaData(); assertEquals("dummy", meta.getName()); assertEquals("1.0", meta.getVersion()); assertEquals("Just a dummy", meta.getDescription()); assertEquals("ASL 2.0", meta.getCopyright()); assertEquals("uimaFIT", meta.getVendor()); } @ResourceMetaData(name = "dummy", version = "1.0", description = "Just a dummy", copyright = "ASL 2.0", vendor = "uimaFIT") public static class AnnotatorWithMetaDataClass extends JCasAnnotator_ImplBase { @Override public void process(JCas aJCas) throws AnalysisEngineProcessException { // Dummy } } public static class PristineAnnotatorClass extends JCasAnnotator_ImplBase { @Override public void process(JCas aJCas) throws AnalysisEngineProcessException { // Dummy } } @org.apache.uima.fit.descriptor.OperationalProperties(multipleDeploymentAllowed = false) public static class AncestorClass extends JCasAnnotator_ImplBase { @Override public void process(JCas aJCas) throws AnalysisEngineProcessException { // Dummy } } public static class UnannotatedAnnotatorClass extends AncestorClass { // Dummy } @org.apache.uima.fit.descriptor.OperationalProperties(multipleDeploymentAllowed = true) public static class AnnotatedAnnotatorClass extends UnannotatedAnnotatorClass { // Vessel for the annotation } @Test public void testIssue5a() throws ResourceInitializationException { AnalysisEngineFactory.createEngineDescription(ParameterizedAE.class, typeSystemDescription); } @Test(expected = ResourceInitializationException.class) public void testIssue5b() throws ResourceInitializationException { AnalysisEngineFactory.createEngine(ParameterizedAE.class, typeSystemDescription); } @Test(expected = IllegalArgumentException.class) public void testUnbalancedComponentAndNames() throws ResourceInitializationException { List<AnalysisEngineDescription> descriptions = new ArrayList<AnalysisEngineDescription>(); descriptions.add(AnalysisEngineFactory.createEngineDescription(NoOpAnnotator.class)); descriptions.add(AnalysisEngineFactory.createEngineDescription(NoOpAnnotator.class)); List<String> names = new ArrayList<String>(); createEngineDescription(descriptions, names, null, null, null); } /** * Configuring new types on an aggregate is not allowed, but configuring new priorities is * allowed. Just testing if it actually works. * * @see <a href="https://issues.apache.org/jira/browse/UIMA-2891">UIMA-2891</a> */ @Test public void testExtraTypeConfigsOnAggregate() throws Exception { TypeSystemDescription typeSystem = TypeSystemDescriptionFactory.createTypeSystemDescription(); TypePriorities extraPrios = TypePrioritiesFactory.createTypePriorities(Sentence.class, Token.class); // This one doesn't use any auto-configuration AnalysisEngineDescription ae = createEngineDescription(UnannotatedAnnotatorClass.class, typeSystem, null, null, null, null, null, null); // Try configuring priorities on the aggregate AnalysisEngineDescription aae = createEngineDescription(asList(ae), asList("ae1"), extraPrios, null, null); AnalysisEngine engine = createEngine(aae); ProcessingResourceMetaData meta = engine.getProcessingResourceMetaData(); // When the meta data from the ae and the aae are merged in the engine, then it should be a // new instance. assertFalse("Merged meta-data is same instance as original", aae.getMetaData().hashCode() == meta.hashCode()); assertFalse("Merged meta-data is same instance as original", ae.getMetaData().hashCode() == meta.hashCode()); // Check that the priorities arrived TypePriorities expected = ((ProcessingResourceMetaData) aae.getMetaData()).getTypePriorities(); TypePriorities actual = meta.getTypePriorities(); assertArrayEquals(expected.getPriorityLists()[0].getTypes(), actual.getPriorityLists()[0].getTypes()); } @Test public void serializeComponent() throws Exception { File reference = new File("src/test/resources/data/reference/SerializationTestAnnotator.xml"); File target = new File("target/test-output/AnalysisEngineFactoryTest/SerializationTestAnnotator.xml"); target.getParentFile().mkdirs(); AnalysisEngineDescription desc = createEngineDescription(SerializationTestAnnotator.class); try (OutputStream os = new FileOutputStream(target)) { desc.toXML(os); } String actual = FileUtils.readFileToString(target, "UTF-8"); String expected = FileUtils.readFileToString(reference, "UTF-8"); XMLUnit.setIgnoreWhitespace(true); XMLAssert.assertXMLEqual(expected, actual); // assertEquals(expected, actual); } @Test public void testPear() throws Exception { // Install PEAR package PackageBrowser instPear = PackageInstaller.installPackage( new File("target/test-output/AnalysisEngineFactoryTest/testPear"), new File("src/test/resources/pear/DateTime.pear"), true); // Create analysis engine from the installed PEAR package XMLInputSource in = new XMLInputSource(instPear.getComponentPearDescPath()); PearSpecifier specifier = UIMAFramework.getXMLParser().parsePearSpecifier(in); AnalysisEngine ae = createEngine(createEngineDescription(specifier)); // Create a CAS with a sample document text and process the CAS CAS cas = ae.newCAS(); cas.setDocumentText("Sample text to process with a date 05/29/07 and a time 9:45 AM"); cas.setDocumentLanguage("en"); ae.process(cas); } @Test public void thatCreateEngineDescriptorAutoDetectionWorks() throws Exception { AnalysisEngineDescription aed = createEngineDescription(NoOpAnnotator.class); TypeSystemDescription tsd = createTypeSystemDescription(); assertThat(tsd.getType(Token.class.getName())) .as("Token type auto-detection") .isNotNull(); assertThat(tsd.getType(Sentence.class.getName())) .as("Sentence type auto-detection") .isNotNull(); assertThat(tsd.getType(AnalyzedText.class.getName())) .as("AnalyzedText type auto-detection") .isNotNull(); TypePriorityList[] typePrioritiesLists = typePriorities.getPriorityLists(); assertThat(typePrioritiesLists.length).isEqualTo(1); assertThat(typePrioritiesLists[0].getTypes()) .as("Type priorities auto-detection") .containsExactly(Sentence.class.getName(), AnalyzedText.class.getName(), Token.class.getName()); FsIndexDescription[] indexes = aed.getAnalysisEngineMetaData().getFsIndexCollection().getFsIndexes(); assertThat(indexes.length).isEqualTo(1); assertThat(indexes[0]) .extracting(FsIndexDescription::getLabel, FsIndexDescription::getTypeName, FsIndexDescription::getKind) .containsExactly("Automatically Scanned Index", Token.class.getName(), FsIndexDescription.KIND_SORTED); } }