CasComparer.assertEquals(cas, cas2);
}
public void testMerging() throws Exception {
// deserialize a complex CAS from XCAS
CAS cas = CasCreationUtils.createCas(typeSystem, new TypePriorities_impl(), indexes);
InputStream serCasStream = new FileInputStream(JUnitExtension.getFile("ExampleCas/cas.xml"));
XCASDeserializer.deserialize(serCasStream, cas);
serCasStream.close();
int numAnnotations = cas.getAnnotationIndex().size(); //for comparison later
String docText = cas.getDocumentText(); //for comparison later
//add a new Sofa to test that multiple Sofas in original CAS work
CAS preexistingView = cas.createView("preexistingView");
String preexistingViewText = "John Smith blah blah blah";
preexistingView.setDocumentText(preexistingViewText);
createPersonAnnot(preexistingView, 0, 10);
// do XMI serialization to a string, using XmiSerializationSharedData
// to keep track of maximum ID generated
XmiSerializationSharedData serSharedData = new XmiSerializationSharedData();
String xmiStr = serialize(cas, serSharedData);
int maxOutgoingXmiId = serSharedData.getMaxXmiId();
//deserialize into two new CASes, again using XmiSerializationSharedData so
//we can get consistent IDs later.
CAS newCas1 = CasCreationUtils.createCas(typeSystem, new TypePriorities_impl(), indexes);
XmiSerializationSharedData deserSharedData1 = new XmiSerializationSharedData();
deserialize(xmiStr, newCas1, deserSharedData1, false, -1);
CAS newCas2 = CasCreationUtils.createCas(typeSystem, new TypePriorities_impl(), indexes);
XmiSerializationSharedData deserSharedData2 = new XmiSerializationSharedData();
deserialize(xmiStr, newCas2, deserSharedData2, false, -1);
//add new FS to each new CAS
createPersonAnnot(newCas1, 0, 10);
createPersonAnnot(newCas1, 20, 30);
createPersonAnnot(newCas2, 40, 50);
AnnotationFS person = createPersonAnnot(newCas2, 60, 70);
//add an Owner relation that points to an organization in the original CAS,
//to test links across merge boundary
Type orgType = newCas2.getTypeSystem().getType(
"org.apache.uima.testTypeSystem.Organization");
AnnotationFS org = (AnnotationFS)newCas2.getAnnotationIndex(orgType).iterator().next();
Type ownerType = newCas2.getTypeSystem().getType(
"org.apache.uima.testTypeSystem.Owner");
Feature argsFeat = ownerType.getFeatureByBaseName("relationArgs");
Feature componentIdFeat = ownerType.getFeatureByBaseName("componentId");
Type relArgsType = newCas2.getTypeSystem().getType(
"org.apache.uima.testTypeSystem.BinaryRelationArgs");
Feature domainFeat = relArgsType.getFeatureByBaseName("domainValue");
Feature rangeFeat = relArgsType.getFeatureByBaseName("rangeValue");
AnnotationFS ownerAnnot = newCas2.createAnnotation(ownerType, 0, 70);
FeatureStructure relArgs = newCas2.createFS(relArgsType);
relArgs.setFeatureValue(domainFeat, person);
relArgs.setFeatureValue(rangeFeat, org);
ownerAnnot.setFeatureValue(argsFeat, relArgs);
ownerAnnot.setStringValue(componentIdFeat, "XCasDeserializerTest");
newCas2.addFsToIndexes(ownerAnnot);
int orgBegin = org.getBegin();
int orgEnd = org.getEnd();
//add Sofas
CAS newView1 = newCas1.createView("newSofa1");
final String sofaText1 = "This is a new Sofa, created in CAS 1.";
newView1.setDocumentText(sofaText1);
final String annotText = "Sofa";
int annotStart1 = sofaText1.indexOf(annotText);
AnnotationFS annot1 = newView1.createAnnotation(orgType, annotStart1, annotStart1 + annotText.length());
newView1.addFsToIndexes(annot1);
CAS newView2 = newCas1.createView("newSofa2");
final String sofaText2 = "This is another new Sofa, created in CAS 2.";
newView2.setDocumentText(sofaText2);
int annotStart2 = sofaText2.indexOf(annotText);
AnnotationFS annot2 = newView2.createAnnotation(orgType, annotStart2, annotStart2 + annotText.length());
newView2.addFsToIndexes(annot2);
//re-serialize each new CAS back to XMI, keeping consistent ids
String newSerCas1 = serialize(newCas1, deserSharedData1);
String newSerCas2 = serialize(newCas2, deserSharedData2);
//merge the two XMI CASes back into the original CAS
XmiSerializationSharedData deserSharedData3 = new XmiSerializationSharedData();
deserialize(newSerCas1, cas, deserSharedData3, false, -1);
assertEquals(numAnnotations +2, cas.getAnnotationIndex().size());
deserialize(newSerCas2, cas, deserSharedData3, false, maxOutgoingXmiId);
assertEquals(numAnnotations + 5, cas.getAnnotationIndex().size());
assertEquals(docText, cas.getDocumentText());
//check covered text of annotations
FSIterator iter = cas.getAnnotationIndex().iterator();
while (iter.hasNext()) {
AnnotationFS annot = (AnnotationFS)iter.next();
assertEquals(cas.getDocumentText().substring(
annot.getBegin(), annot.getEnd()), annot.getCoveredText());
}
//check Owner annotation we created to test link across merge boundary
iter = cas.getAnnotationIndex(ownerType).iterator();
while (iter.hasNext()) {
AnnotationFS annot = (AnnotationFS)iter.next();
String componentId = annot.getStringValue(componentIdFeat);
if ("XCasDeserializerTest".equals(componentId)) {
FeatureStructure targetRelArgs = annot.getFeatureValue(argsFeat);
AnnotationFS targetDomain = (AnnotationFS)targetRelArgs.getFeatureValue(domainFeat);
assertEquals(60, targetDomain.getBegin());
assertEquals(70, targetDomain.getEnd());
AnnotationFS targetRange = (AnnotationFS)targetRelArgs.getFeatureValue(rangeFeat);
assertEquals(orgBegin, targetRange.getBegin());
assertEquals(orgEnd, targetRange.getEnd());
}
}
//check Sofas
CAS targetView1 = cas.getView("newSofa1");
assertEquals(sofaText1, targetView1.getDocumentText());
CAS targetView2 = cas.getView("newSofa2");
assertEquals(sofaText2, targetView2.getDocumentText());
AnnotationFS targetAnnot1 = (AnnotationFS)
targetView1.getAnnotationIndex(orgType).iterator().get();
assertEquals(annotText, targetAnnot1.getCoveredText());
AnnotationFS targetAnnot2 = (AnnotationFS)
targetView2.getAnnotationIndex(orgType).iterator().get();
assertEquals(annotText, targetAnnot2.getCoveredText());
assertTrue(targetView1.getSofa().getSofaRef() !=
targetView2.getSofa().getSofaRef());
CAS checkPreexistingView = cas.getView("preexistingView");
assertEquals(preexistingViewText, checkPreexistingView.getDocumentText());
Type personType = cas.getTypeSystem().getType("org.apache.uima.testTypeSystem.Person");
AnnotationFS targetAnnot3 = (AnnotationFS)
checkPreexistingView.getAnnotationIndex(personType).iterator().get();
assertEquals("John Smith", targetAnnot3.getCoveredText());
//try an initial CAS that contains multiple Sofas
}