blob: 287199bb43c925a509317b77369eddeec5f2e6e3 [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.collection.impl.cpm;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import org.apache.uima.UIMAFramework;
import org.apache.uima.collection.impl.metadata.cpe.CpeDescriptorFactory;
import org.apache.uima.collection.metadata.CasProcessorErrorHandling;
import org.apache.uima.collection.metadata.CpeCasProcessor;
import org.apache.uima.collection.metadata.CpeCasProcessors;
import org.apache.uima.collection.metadata.CpeCollectionReader;
import org.apache.uima.collection.metadata.CpeCollectionReaderCasInitializer;
import org.apache.uima.collection.metadata.CpeCollectionReaderIterator;
import org.apache.uima.collection.metadata.CpeComponentDescriptor;
import org.apache.uima.collection.metadata.CpeConfiguration;
import org.apache.uima.collection.metadata.CpeDescription;
import org.apache.uima.collection.metadata.CpeIntegratedCasProcessor;
import org.apache.uima.collection.metadata.CpeLocalCasProcessor;
import org.apache.uima.test.junit_extension.JUnitExtension;
import org.apache.uima.util.XMLInputSource;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
/**
* reading an example Descriptor from FileSystem and adding other CasProcessors via API
*
* After generating a new Descriptor with the modified data, the generated descriptor file must be
* equivalent to the referenced file.
*/
public class CpeDescriptorSerialization_Test {
private File testBaseDir;
private CpeDescription cpeDesc = null;
/**
* @see junit.framework.TestCase#setUp()
*/
@BeforeEach
public void setUp() throws Exception {
// get test base path setting
this.testBaseDir = JUnitExtension.getFile("CpmTests/CpeAPITest");
}
/**
* test to be sure, that first reading and then writing a discriptor produces the same file as the
* original.(old configuration file format)
*
* @throws Exception
* -
*/
@Test
public void testReadDescriptor() throws Exception {
// input file
File cpeDescFile = JUnitExtension.getFile("CpmTests/CpeAPITest/refConf.xml");
XMLInputSource in = new XMLInputSource(cpeDescFile);
cpeDesc = UIMAFramework.getXMLParser().parseCpeDescription(in);
// output file
File outputFile = new File(this.testBaseDir, "outConf.xml");
// serialize input file to output file
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
cpeDesc.toXML(outStream);
FileOutputStream fOut = new FileOutputStream(outputFile);
fOut.write(outStream.toByteArray());
fOut.close();
// compare input and output
equal(cpeDescFile, cpeDesc);
outputFile.delete();
}
/**
* test to be sure, that first reading and then writing a discriptor produces the same file as the
* original (new configuration file format).
*
* @throws Exception
* -
*/
@Test
public void testReadDescriptor2() throws Exception {
// input file
File cpeDescFile = JUnitExtension.getFile("CpmTests/CpeAPITest/refConf2.xml");
XMLInputSource in = new XMLInputSource(cpeDescFile);
cpeDesc = UIMAFramework.getXMLParser().parseCpeDescription(in);
// output file
File outputFile = new File(this.testBaseDir, "outConf2.xml");
// serialize input file to output file
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
cpeDesc.toXML(outStream);
FileOutputStream fOut = new FileOutputStream(outputFile);
fOut.write(outStream.toByteArray());
fOut.close();
equal(cpeDescFile, cpeDesc);
outputFile.delete();
}
/**
* Create a remote CasProcesser via API and add him to an existing cpe configuration read from a
* given descriptor from a file. Write the new descriptor back to a file and compare this with an
* expected descriptor configuration.
*
* @throws Exception
* -
*/
@Test
public void testAddRemoteCasProcessor() throws Exception {
// parse cpe descriptor file
File cpeDescFile = JUnitExtension.getFile("CpmTests/CpeAPITest/refConf3.xml");
XMLInputSource in = new XMLInputSource(cpeDescFile);
cpeDesc = UIMAFramework.getXMLParser().parseCpeDescription(in);
// init files
File refFile = JUnitExtension.getFile("CpmTests/CpeAPITest/testRemoteDesc.xml");
// generate a new casProcessor
CpeCasProcessor casProcessor = CpeDescriptorFactory
.produceRemoteCasProcessor("myTestCasPocessor");
// set specifier path
casProcessor.setDescriptor("any kind of string");
// add CasProcessor to the CPM descriptor
cpeDesc.addCasProcessor(casProcessor);
casProcessor.addDeployParam("ES_REMOTE_DEPLOYMENT_KEY", "ES_REMOTE_DEPLOYMENT_VALUE");
// these calls should ont add default errorhandling etc. to the casProcessor
cpeDesc.getCpeCasProcessors().getAllCpeCasProcessors();
cpeDesc.getCpeCasProcessors().getAllCpeCasProcessors();
cpeDesc.getCpeCasProcessors().getAllCpeCasProcessors();
equal(refFile, cpeDesc);
}
/**
* Create a local CasProcesser via API and add him to an existing cpe configuration read from a
* given descriptor from a file. Write the new descriptor back to a file and compare this with an
* expected descriptor configuration.
*
* @throws Exception
* -
*/
@Test
public void testAddLocalCasProcessor() throws Exception {
// parse cpe descriptor file
File cpeDescFile = JUnitExtension.getFile("CpmTests/CpeAPITest/refConf3.xml");
XMLInputSource in = new XMLInputSource(cpeDescFile);
cpeDesc = UIMAFramework.getXMLParser().parseCpeDescription(in);
// output file
File refFile = JUnitExtension.getFile("CpmTests/CpeAPITest/testLocalDesc.xml");
// Create Detag CasProcessor
CpeLocalCasProcessor localProcessor = CpeDescriptorFactory
.produceLocalCasProcessor("DupShingle Miner", "Detag:DetagContent");
localProcessor.setDescriptor("c://cpm/annotators/example.xml");
localProcessor.setExecutable("/some/path/executable.sh");
localProcessor.addDeployParam("Parm1", "Value1x");
cpeDesc.addCasProcessor(localProcessor);
// these calls should ont add default errorhandling etc. to the casProcessor
cpeDesc.getCpeCasProcessors().getAllCpeCasProcessors();
cpeDesc.getCpeCasProcessors().getAllCpeCasProcessors();
cpeDesc.getCpeCasProcessors().getAllCpeCasProcessors();
equal(refFile, cpeDesc);
}
/**
* Create a integrated CasProcesser via API and add him to an existing cpe configuration read from
* a given descriptor from a file. Write the new descriptor back to a file and compare this with
* an expected descriptor configuration.
*
* @throws Exception
* -
*/
@Test
public void testAddIntegratedCasProcessor() throws Exception {
// parse cpe descriptor file
File cpeDescFile = JUnitExtension.getFile("CpmTests/CpeAPITest/refConf3.xml");
XMLInputSource in = new XMLInputSource(cpeDescFile);
cpeDesc = UIMAFramework.getXMLParser().parseCpeDescription(in);
// output file
File refFile = JUnitExtension.getFile("CpmTests/CpeAPITest/testIntegratedDesc.xml");
// add a new iCpe
CpeIntegratedCasProcessor integratedProcessor = CpeDescriptorFactory
.produceCasProcessor("WF Writer_X");
integratedProcessor.setDescriptor("c://cpm/conf/consumers/bla.xml");
integratedProcessor.setBatchSize(99);
cpeDesc.addCasProcessor(integratedProcessor);
// every call adds default errorhandling etc. to the casProcessor
cpeDesc.getCpeCasProcessors().getAllCpeCasProcessors();
cpeDesc.getCpeCasProcessors().getAllCpeCasProcessors();
cpeDesc.getCpeCasProcessors().getAllCpeCasProcessors();
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
cpeDesc.toXML(outStream);
equal(refFile, cpeDesc);
}
public void equal(File aReferenceDescriptorFile, CpeDescription aGeneratedDescriptor) {
try {
XMLInputSource in = new XMLInputSource(aReferenceDescriptorFile);
CpeDescription referenceDesc = UIMAFramework.getXMLParser().parseCpeDescription(in);
// First Check Collection Reader
CpeCollectionReader[] readers = referenceDesc.getAllCollectionCollectionReaders();
if (readers[0] != null) {
if (aGeneratedDescriptor.getAllCollectionCollectionReaders() == null
|| aGeneratedDescriptor.getAllCollectionCollectionReaders()[0] == null) {
fail("<collectionReader> element not found in generated CPE Descriptor");
} else {
// Collection Reader element is present in the generated descriptor
if (readers[0].getCollectionIterator() != null) {
assertTrue(isCollectionIteratorTheSame(readers[0].getCollectionIterator(),
aGeneratedDescriptor.getAllCollectionCollectionReaders()[0]
.getCollectionIterator()));
}
if (readers[0].getCasInitializer() != null) {
assertTrue(isCasInitializerTheSame(readers[0].getCasInitializer(),
aGeneratedDescriptor.getAllCollectionCollectionReaders()[0]
.getCasInitializer()));
}
}
}
CpeConfiguration refCpeConfig = referenceDesc.getCpeConfiguration();
if (refCpeConfig != null) {
if (aGeneratedDescriptor.getCpeConfiguration() == null) {
fail("<cpeConfig> element not found in generated CPE Descriptor");
} else {
isConfigTheSame(refCpeConfig, aGeneratedDescriptor.getCpeConfiguration());
}
}
CpeCasProcessors refCasProcessors = referenceDesc.getCpeCasProcessors();
if (refCasProcessors != null) {
if (aGeneratedDescriptor.getCpeCasProcessors() == null) {
fail("<casProcessors> element not found in generated CPE Descriptor");
} else {
compareCasProcessors(referenceDesc.getCpeCasProcessors(),
aGeneratedDescriptor.getCpeCasProcessors());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void compareCasProcessors(CpeCasProcessors aRefCasProcessors,
CpeCasProcessors aGenCasProcessors) {
assertEquals(aRefCasProcessors.getCasPoolSize(), aGenCasProcessors.getCasPoolSize());
assertEquals(aRefCasProcessors.getConcurrentPUCount(),
aGenCasProcessors.getConcurrentPUCount());
try {
int expectedCasProcessorCount = aRefCasProcessors.getAllCpeCasProcessors().length;
if (aGenCasProcessors.getAllCpeCasProcessors() == null) {
fail("Generated CPE Descriptor does not have any Cas Processors. Expected <"
+ expectedCasProcessorCount + "> Cas Processors");
} else {
assertEquals(
"Generated CPE Descriptor does not have expected number of Cas Processors. "
+ "Expected <" + expectedCasProcessorCount + "> Cas Processors. Got <"
+ aGenCasProcessors.getAllCpeCasProcessors().length + ">",
expectedCasProcessorCount, aGenCasProcessors.getAllCpeCasProcessors().length);
}
CpeCasProcessor[] refCasProcessorList = aRefCasProcessors.getAllCpeCasProcessors();
for (int i = 0; i < aRefCasProcessors.getAllCpeCasProcessors().length; i++) {
if (refCasProcessorList[i].getDeployment().equals("integrated")) {
compareIntegratedCasProcessors(refCasProcessorList[i],
aGenCasProcessors.getAllCpeCasProcessors()[i]);
} else if (refCasProcessorList[i].getDeployment().equals("remote")) {
compareRemoteCasProcessors(refCasProcessorList[i],
aGenCasProcessors.getAllCpeCasProcessors()[i]);
} else if (refCasProcessorList[i].getDeployment().equals("local")) {
compareLocalCasProcessors(refCasProcessorList[i],
aGenCasProcessors.getAllCpeCasProcessors()[i]);
}
}
} catch (Exception e) {
fail("Exception::" + e.getMessage()
+ " thrown while retrieving Cas Processors From CPE Descriptor");
}
}
public void compareCommonElements(CpeCasProcessor aRefCasProcessor,
CpeCasProcessor aGenCasProcessor) {
assertEquals(aRefCasProcessor.getDeployment(), aGenCasProcessor.getDeployment());
assertEquals(aRefCasProcessor.getName(), aGenCasProcessor.getName());
assertEquals(aRefCasProcessor.getDescriptor(), aGenCasProcessor.getDescriptor());
if (aRefCasProcessor.getDeploymentParams() == null) {
if (aGenCasProcessor.getDeploymentParams() != null) {
fail(aRefCasProcessor.getDeployment() + " Cas Processor with name="
+ aGenCasProcessor.getName()
+ " contains <deploymentParameters> element. Expected to find empty <deploymentParameters> element");
}
}
if (aRefCasProcessor.getCasProcessorFilter() == null) {
if (aGenCasProcessor.getCasProcessorFilter() != null) {
fail(aRefCasProcessor.getDeployment() + " Cas Processor with name="
+ aGenCasProcessor.getName()
+ " contains <filter> element. Expected to find empty <filter> element");
}
}
if (aRefCasProcessor.getErrorHandling() != null) {
compareErrorHandling(aRefCasProcessor.getErrorHandling(), aGenCasProcessor.getErrorHandling(),
aRefCasProcessor.getName());
}
if (aRefCasProcessor.getCheckpoint() != null) {
if (aGenCasProcessor.getCheckpoint() == null) {
fail(aRefCasProcessor.getDeployment() + " Cas Processor with name="
+ aGenCasProcessor.getName() + " is missing <checkpoint> element.");
} else {
assertEquals(
"Generated Cas Processor:" + aGenCasProcessor.getName()
+ " batch size does match expected value",
aRefCasProcessor.getCheckpoint().getBatchSize(),
aGenCasProcessor.getCheckpoint().getBatchSize());
}
}
}
public void compareLocalCasProcessors(CpeCasProcessor aRefCasProcessor,
CpeCasProcessor aGenCasProcessor) {
compareCommonElements(aRefCasProcessor, aGenCasProcessor);
}
public void compareRemoteCasProcessors(CpeCasProcessor aRefCasProcessor,
CpeCasProcessor aGenCasProcessor) {
compareCommonElements(aRefCasProcessor, aGenCasProcessor);
}
public void compareIntegratedCasProcessors(CpeCasProcessor aRefCasProcessor,
CpeCasProcessor aGenCasProcessor) {
compareCommonElements(aRefCasProcessor, aGenCasProcessor);
}
public void compareErrorHandling(CasProcessorErrorHandling aRefCasProcessorErrorHandling,
CasProcessorErrorHandling aGenCasProcessorErrorHandling, String aComponentName) {
if (aGenCasProcessorErrorHandling == null) {
fail("Integrated Cas Processor with name=" + aComponentName
+ " is missing <errorHandling> element.");
} else {
if (aRefCasProcessorErrorHandling.getErrorRateThreshold() != null) {
if (aGenCasProcessorErrorHandling.getErrorRateThreshold() == null) {
fail("Expected element <errorRateThreshold> is missing from the CPE Descriptor for Cas Processor with name:"
+ aComponentName);
} else {
assertEquals(aRefCasProcessorErrorHandling.getErrorRateThreshold().getAction(),
aGenCasProcessorErrorHandling.getErrorRateThreshold().getAction());
assertEquals(aRefCasProcessorErrorHandling.getErrorRateThreshold().getMaxErrorCount(),
aGenCasProcessorErrorHandling.getErrorRateThreshold().getMaxErrorCount());
assertEquals(
aRefCasProcessorErrorHandling.getErrorRateThreshold().getMaxErrorSampleSize(),
aGenCasProcessorErrorHandling.getErrorRateThreshold().getMaxErrorSampleSize());
}
}
if (aRefCasProcessorErrorHandling.getMaxConsecutiveRestarts() != null) {
if (aGenCasProcessorErrorHandling.getMaxConsecutiveRestarts() == null) {
fail("Expected element <maxConsecutiveRestarts> is missing from the CPE Descriptor for Cas Processor with name:"
+ aComponentName);
} else {
assertEquals(aRefCasProcessorErrorHandling.getMaxConsecutiveRestarts().getAction(),
aGenCasProcessorErrorHandling.getMaxConsecutiveRestarts().getAction());
assertEquals(aRefCasProcessorErrorHandling.getMaxConsecutiveRestarts().getRestartCount(),
aGenCasProcessorErrorHandling.getMaxConsecutiveRestarts().getRestartCount());
assertEquals(
aRefCasProcessorErrorHandling.getMaxConsecutiveRestarts()
.getWaitTimeBetweenRetries(),
aGenCasProcessorErrorHandling.getMaxConsecutiveRestarts()
.getWaitTimeBetweenRetries());
}
}
if (aRefCasProcessorErrorHandling.getTimeout() != null) {
if (aGenCasProcessorErrorHandling.getTimeout() == null) {
fail("Expected element <timeout> is missing from the CPE Descriptor for Cas Processor with name:"
+ aComponentName);
} else {
assertEquals(aRefCasProcessorErrorHandling.getTimeout().get(),
aGenCasProcessorErrorHandling.getTimeout().get());
}
}
}
}
public void isConfigTheSame(CpeConfiguration aRefCpeConfig, CpeConfiguration aGenCpeConfig) {
try {
assertEquals(aRefCpeConfig.getNumToProcess(), aGenCpeConfig.getNumToProcess());
assertEquals(aRefCpeConfig.getDeployment(), aGenCpeConfig.getDeployment());
assertEquals(aRefCpeConfig.getTimerImpl(), aGenCpeConfig.getTimerImpl());
if (aRefCpeConfig.getStartingEntityId() != null) {
assertEquals(aRefCpeConfig.getStartingEntityId(), aGenCpeConfig.getStartingEntityId());
} else {
if (aGenCpeConfig.getStartingEntityId() != null) {
assertTrue(
"Generated Cpe Descriptor has an invalid value for <startAt> in <cpeConfig>.Expected no value OR empty string. Instead got value of:"
+ aGenCpeConfig.getStartingEntityId(),
aGenCpeConfig.getStartingEntityId().trim().length() == 0);
}
}
if (aRefCpeConfig.getCheckpoint() != null) {
if (aGenCpeConfig.getCheckpoint() == null) {
fail("Expected <checkpoint> element in <cpeConfig> not found in generated Cpe Descriptor.");
} else {
if (aRefCpeConfig.getCheckpoint().getFilePath() != null) {
if (aGenCpeConfig.getCheckpoint().getFilePath() == null) {
fail("Expected attribute 'file' in <checkpoint> element in <cpeConfig> not found in generated Cpe Descriptor.");
} else {
assertEquals(aRefCpeConfig.getCheckpoint().getFilePath(),
aGenCpeConfig.getCheckpoint().getFilePath());
}
}
assertEquals(aRefCpeConfig.getCheckpoint().getBatchSize(),
aGenCpeConfig.getCheckpoint().getBatchSize());
assertEquals(aRefCpeConfig.getCheckpoint().getFrequency(),
aGenCpeConfig.getCheckpoint().getFrequency());
}
}
} catch (Exception e) {
fail("Exception::" + e.getMessage()
+ " thrown comparing configuration <cpeConfig> in CPE Descriptor");
}
}
public void compareDescriptors(CpeComponentDescriptor aRefDescriptor,
CpeComponentDescriptor aGenDescritptor, String aComponentName) {
if (aRefDescriptor.getInclude() != null) {
if (aGenDescritptor.getInclude() == null) {
fail("Component Descriptor of " + aComponentName
+ " missing from a generated CPE Descriptor");
} else {
String refFilePath = aRefDescriptor.getInclude().get();
String genFilePath = aGenDescritptor.getInclude().get();
if (refFilePath != null) {
assertEquals(
"Component Descriptor in Generated CPE Descriptor has unexpected value. Expected:"
+ refFilePath + " Got:" + genFilePath + " Instead.",
refFilePath, genFilePath);
}
}
}
}
public boolean isCollectionIteratorTheSame(CpeCollectionReaderIterator aRefIterator,
CpeCollectionReaderIterator aGenIterator) {
if (aRefIterator.getDescriptor() != null) {
if (aGenIterator.getDescriptor() == null) {
return false;
} else {
if (aRefIterator.getDescriptor().getInclude() != null) {
if (aGenIterator.getDescriptor().getInclude() == null) {
return false;
} else {
String refFilePath = aRefIterator.getDescriptor().getInclude().get();
String genFilePath = aGenIterator.getDescriptor().getInclude().get();
if (refFilePath != null) {
boolean ret = refFilePath.equals(genFilePath);
return ret;
}
}
}
}
}
return false;
}
public boolean isCasInitializerTheSame(CpeCollectionReaderCasInitializer aRefCasInitializer,
CpeCollectionReaderCasInitializer aGenCasInitializer) {
if (aRefCasInitializer.getDescriptor() != null) {
if (aGenCasInitializer.getDescriptor() == null) {
return false;
} else {
if (aRefCasInitializer.getDescriptor().getInclude() != null) {
if (aGenCasInitializer.getDescriptor().getInclude() == null) {
return false;
} else {
String refFilePath = aRefCasInitializer.getDescriptor().getInclude().get();
String genFilePath = aGenCasInitializer.getDescriptor().getInclude().get();
if (refFilePath != null) {
boolean ret = refFilePath.equals(genFilePath);
return ret;
}
}
}
}
}
return false;
}
}