blob: 78e171d2d07835cfaa11af30aa5da45e098cbf52 [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.fit.component;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.catchThrowable;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
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.cas.CAS;
import org.apache.uima.cas.CASException;
import org.apache.uima.cas.CASRuntimeException;
import org.apache.uima.fit.ComponentTestBase;
import org.apache.uima.fit.descriptor.SofaCapability;
import org.apache.uima.fit.factory.AnalysisEngineFactory;
import org.apache.uima.fit.testing.util.HideOutput;
import org.apache.uima.fit.type.Token;
import org.apache.uima.fit.util.JCasUtil;
import org.apache.uima.jcas.JCas;
import org.apache.uima.resource.ResourceInitializationException;
import org.junit.Test;
/**
* I initially thought that the behavior of mapping the default view to another yet-to-be-created
* view might be different for sofa aware and sofa unaware components. So the tests are run on using
* an analysis engine of both kinds.
*
*
*/
public class ViewCreatorAnnotatorTest extends ComponentTestBase {
@Test
public void testViewCreatorAnnotator() throws ResourceInitializationException,
AnalysisEngineProcessException, CASException {
AnalysisEngine viewCreator = AnalysisEngineFactory.createEngine(ViewCreatorAnnotator.class,
typeSystemDescription, ViewCreatorAnnotator.PARAM_VIEW_NAME, "myView");
viewCreator.process(jCas);
JCas myView = jCas.getView("myView");
assertNotNull(myView);
myView.setDocumentText("my view text");
}
/**
* This test basically demonstrates that the default view does not need to be initialized because
* it is done automatically.
*/
@SuppressWarnings("javadoc")
@Test
public void testDefaultView() throws Exception {
AnalysisEngine engine = AnalysisEngineFactory.createEngine(SofaAwareAnnotator.class,
typeSystemDescription);
engine.process(jCas);
assertEquals("some", JCasUtil.selectByIndex(jCas, Token.class, 0).getCoveredText());
engine = AnalysisEngineFactory.createEngine(SofaUnawareAnnotator.class,
typeSystemDescription);
jCas.reset();
engine.process(jCas);
assertEquals("some", JCasUtil.selectByIndex(jCas, Token.class, 0).getCoveredText());
}
/**
* This test demonstrates the bad behavior that occurs when you try to map the default view to
* some other view without initializing that other view first. This is the behavior that
* SofaInitializerAnnotator addresses.
*/
@SuppressWarnings("javadoc")
@Test
public void testOtherViewAware() throws Exception {
AnalysisEngineDescription description = AnalysisEngineFactory.createEngineDescription(
SofaAwareAnnotator.class, typeSystemDescription);
AnalysisEngine engine = AnalysisEngineFactory.createEngine(description, "myView");
Throwable thrown = catchThrowable(() -> {
// Avoid exception being logged to the console
HideOutput hider = null;
try {
hider = new HideOutput();
engine.process(jCas);
}
finally {
if (hider != null) {
hider.restoreOutput();
}
}
});
assertThat(thrown)
.as("Exception thrown when view does not exist")
.hasRootCauseInstanceOf(CASRuntimeException.class)
.hasStackTraceContaining("No sofaFS with name myView found");
}
@Test
public void testOtherViewUnaware() throws ResourceInitializationException,
AnalysisEngineProcessException {
AnalysisEngineDescription description = AnalysisEngineFactory.createEngineDescription(
SofaUnawareAnnotator.class, typeSystemDescription);
AnalysisEngine engine = AnalysisEngineFactory.createEngine(description, "myView");
Throwable thrown = catchThrowable(() -> {
// Avoid exception being logged to the console
HideOutput hider = null;
try {
hider = new HideOutput();
engine.process(jCas);
}
finally {
if (hider != null) {
hider.restoreOutput();
}
}
});
assertThat(thrown)
.as("Exception thrown when view does not exist")
.hasRootCauseInstanceOf(CASRuntimeException.class)
.hasStackTraceContaining("No sofaFS with name myView found");
}
/**
* This test demonstrates that running the viewCreator is doing the right thing (i.e. initializing
* the view "myView")
*/
@SuppressWarnings("javadoc")
@Test
public void testSofaInitializer() throws Exception {
AnalysisEngineDescription description = AnalysisEngineFactory.createEngineDescription(
SofaAwareAnnotator.class, typeSystemDescription);
AnalysisEngine engine = AnalysisEngineFactory.createEngine(description, "myView");
AnalysisEngine viewCreator = AnalysisEngineFactory.createEngine(ViewCreatorAnnotator.class,
typeSystemDescription, ViewCreatorAnnotator.PARAM_VIEW_NAME, "myView");
viewCreator.process(jCas);
engine.process(jCas);
assertEquals("some", JCasUtil.selectByIndex(jCas.getView("myView"), Token.class, 0)
.getCoveredText());
// here I run again with viewCreator running twice to make sure it
// does the right thing when the view
// has already been created
jCas.reset();
viewCreator.process(jCas);
viewCreator.process(jCas);
engine.process(jCas);
assertEquals("some", JCasUtil.selectByIndex(jCas.getView("myView"), Token.class, 0)
.getCoveredText());
description = AnalysisEngineFactory.createEngineDescription(SofaUnawareAnnotator.class,
typeSystemDescription);
engine = AnalysisEngineFactory.createEngine(description, "myView");
jCas.reset();
viewCreator.process(jCas);
engine.process(jCas);
assertEquals("some", JCasUtil.selectByIndex(jCas.getView("myView"), Token.class, 0)
.getCoveredText());
jCas.reset();
viewCreator.process(jCas);
viewCreator.process(jCas);
engine.process(jCas);
assertEquals("some", JCasUtil.selectByIndex(jCas.getView("myView"), Token.class, 0)
.getCoveredText());
}
@SofaCapability(inputSofas = CAS.NAME_DEFAULT_SOFA)
public static class SofaAwareAnnotator extends JCasAnnotator_ImplBase {
@Override
public void process(JCas jCas) throws AnalysisEngineProcessException {
JCas view;
try {
view = jCas.getView(CAS.NAME_DEFAULT_SOFA);
} catch (CASException e) {
throw new AnalysisEngineProcessException(e);
}
view.setDocumentText("some text");
Token token = new Token(view, 0, 4);
token.addToIndexes();
}
}
public static class SofaUnawareAnnotator extends JCasAnnotator_ImplBase {
@Override
public void process(JCas jCas) throws AnalysisEngineProcessException {
jCas.setDocumentText("some text");
Token token = new Token(jCas, 0, 4);
token.addToIndexes();
}
}
}