You can call typeSystemInit() yourself from process(jcas).

I just did exactly that this morning when switching an AE from CasAnnotator_ImplBase to JCasAnnotator_ImplBase: http://mail-archives.apache.org/mod_mbox/uima-user/200706.mbox/%[email protected]%3E

HTH,
Jens

On 10/23/2013 02:36 PM, Peter Klügl wrote:
Is it correct that the type system may not change if the analysis engine
implementation extends JCasAnnotator_ImplBase? I somehow miss the method
typeSystemInit(). Hmm, should I really switch to CasAnnotator_ImplBase,
or do I have missed something?

Peter

On 23.10.2013 14:35, Peter Klügl (JIRA) wrote:
     [ 
https://issues.apache.org/jira/browse/UIMA-3357?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13802850#comment-13802850
 ]

Peter Klügl commented on UIMA-3357:
-----------------------------------

Thanks for reporting this. I added a test for now.

The problem is that the type system has changed, at least its representation in java, but 
nobody told the analysis engine about it. On the one hand, the environment of the script 
stores the known types. This is initiated  by {{initializeTypes()}} either if the 
analysis engine was not initialized yet or if the analysis engine is forced to update 
itself with each process call (parameter reloadScript). On the other hand, the internal 
"indexing" (begin and end map in RutaBasic) uses the current CAS, its 
annotations and their types. So we have different type objects that cause problems.


CONTAINS fails when running script as AE in a pipeline with a new CAS
---------------------------------------------------------------------

                 Key: UIMA-3357
                 URL: https://issues.apache.org/jira/browse/UIMA-3357
             Project: UIMA
          Issue Type: Bug
          Components: ruta, uimaFIT
    Affects Versions: 2.0.1ruta, 2.1.0ruta
            Reporter: Daniel Maeurer
            Assignee: Peter Klügl
            Priority: Minor

When running my Ruta script as an analysis engine in a pipeline, it does not 
work correctly when creating a new CAS and processing the pipeline a second 
time with the new CAS.
While reusing the old cas with "cas.reset()" is working, creating a new CAS results in 
failing rules including "CONTAINS" in the ruta script.
The ruta script used in the example:
{code:title=mystic.ruta|borderStyle=solid}
PACKAGE de.tudarmstadt.algo.vpino.ruta;
DECLARE test;
Document{CONTAINS(CW)->MARK(test)};
{code}
The following Java class can reproduce the error. It creates four xmi files. The last xmi 
file is missing the annotations created with rules including "CONTAINS".
{code:title=MysticPipe.java|borderStyle=solid}
package org.uimafit.pipeline;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.uima.UIMAFramework;
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.impl.XmiCasSerializer;
import org.apache.uima.fit.factory.AnalysisEngineFactory;
import org.apache.uima.fit.pipeline.SimplePipeline;
import org.apache.uima.resource.ResourceInitializationException;
import org.apache.uima.resource.metadata.ResourceMetaData;
import org.apache.uima.util.CasCreationUtils;
import org.apache.uima.util.InvalidXMLException;
import org.apache.uima.util.XMLInputSource;
import org.apache.uima.util.XMLSerializer;
import org.xml.sax.SAXException;
public class MysticPipe {
        public static void main(String[] args) throws Exception {
                working("This is a test.", initPipeline());
                failing("This is a test.", initPipeline());
        }
        private static AnalysisEngine initPipeline() throws 
ResourceInitializationException, IOException, InvalidXMLException {
                File specFile = new 
File("./descriptor/de/tudarmstadt/algo/vpino/ruta/mysticEngine.xml");
                XMLInputSource in = new XMLInputSource(specFile);
                AnalysisEngineDescription ruta = (AnalysisEngineDescription) 
UIMAFramework.getXMLParser().parseResourceSpecifier(in);
                return AnalysisEngineFactory.createEngine(ruta);
        }
        private static void working(String input, AnalysisEngine theEngine) 
throws ResourceInitializationException, AnalysisEngineProcessException, 
IOException,
                SAXException {
                final List<ResourceMetaData> metaData = new 
ArrayList<ResourceMetaData>();
                metaData.add(theEngine.getMetaData());
                final CAS cas = CasCreationUtils.createCas(metaData);
                System.out.println("create a new cas...");
                cas.setDocumentLanguage("de");
                cas.setDocumentText(input);
                SimplePipeline.runPipeline(cas, theEngine);
                writeXmiFile(cas, "works_test1");//CHECK
                //THE DIFFERENCE
                cas.reset();
                //END DIFFERENCE
                System.out.println("create a new cas...");
                cas.setDocumentLanguage("de");
                cas.setDocumentText(input);
                SimplePipeline.runPipeline(cas, theEngine);
                writeXmiFile(cas, "works_test2");//CHECK
        }
        private static void failing(String input, AnalysisEngine theEngine) 
throws ResourceInitializationException, AnalysisEngineProcessException, 
IOException,
                SAXException {
                final List<ResourceMetaData> metaData = new 
ArrayList<ResourceMetaData>();
                metaData.add(theEngine.getMetaData());
                final CAS cas = CasCreationUtils.createCas(metaData);
                System.out.println("create a new cas...");
                cas.setDocumentLanguage("de");
                cas.setDocumentText(input);
                SimplePipeline.runPipeline(cas, theEngine);
                writeXmiFile(cas, "works_test3"); // CHECK
                //THE DIFFERENCE
                final CAS cas2 = CasCreationUtils.createCas(metaData);
                //END DIFFERENCE
                System.out.println("create a new cas...");
                cas2.setDocumentLanguage("de");
                cas2.setDocumentText(input);
                SimplePipeline.runPipeline(cas2, theEngine);
                writeXmiFile(cas2, "fail_test4"); //FAIL
                return;
        }
        
        public static void writeXmiFile(CAS aCas, String Fname) throws 
IOException, SAXException {
                File outFile = new File("output", Fname + ".xmi");
                OutputStream out = null;
                try {
                        // out = new StringOutputStream();
                        out = new FileOutputStream(outFile);
                        XmiCasSerializer ser = new 
XmiCasSerializer(aCas.getTypeSystem());
                        XMLSerializer xmlSer = new XMLSerializer(out, false);
                        ser.serialize(aCas, xmlSer.getContentHandler());
                } finally {
                        if (out != null) {
                                out.close();
                        }
                }
        }
}
{code}


--
This message was sent by Atlassian JIRA
(v6.1#6144)





Reply via email to