Hi Richard,

I'm guessing that the code which has the line

            typeSystem.commit();

is part of DKPro.  I'm wondering if you could change this to

            typeSystem = typeSystem.commit();

The reason: UIMA V3 consolidates equal type systems; so if the type system that
was just created is equal to (has the same types and features as) another
committed type system, then the new type system is thrown away and the already
committed equal type system. 

Code which calls commit for type systems needs to take this into account, in two
ways:

a) by using the ts = ts.commit() form, and
b) if the type system, prior to being committed, was accessed to get particular
type and feature instances,
       and those instances are being referred to by some local variables or 
fields,
       and those local variables or fields continue to be used after the commit,
then

       those local variables and fields need to be reinitialized incase the type
system was switch to
       an already committed equal one.

You can see this in some v3 test cases, where the type system was built up
programmatically, and some variables were used subsequently.  Here's one case:

The uimaj-core testcase class CASInitializer has a method "initCas".  For v3,
this was modified to take an extra parameter, "reinitTypeSystem".  If it is not
null, then the caller supplied a lambda which reinitializes fields after the
type system is committed.  

Please search for all ".commit("  strings in dkpro to find all instances where
type systems are being committed, and update all of them :-)

-Marshall


On 10/12/2017 4:23 PM, Richard Eckart de Castilho wrote:
> On 12.10.2017, at 15:08, Marshall Schor <m...@schor.com> wrote:
>> Maybe the test is expecting the CAS's existing type system & index def to be
>> replaced, but didn't specify REINIT?
>>
>> Or, of course, there might be a bug.
>>
>> What was the CasLoadMode for this test, and can you confirm the receiving CAS
>> did not have a committed type system?
> The test doesn't expect the CAS to be reinitialized. It is a lenient loading
> test in which the extra typesystem provides the knowledge about the types 
> in the case that is being deserialized into the target CAS.
>
> I have debugged this further. The type system which is passed as the third
> parameter to CasUtils.load(stream, cas, typesystem) is loaded using the 
> following code:
>
>             CASMgrSerializer casMgr = readCasManager();
>             typeSystem = casMgr.getTypeSystem();
>             typeSystem.commit();
>
> The problem appears to be in the third line. Although commit() is called
> explicitly here, isCommitted() still returns "false" afterwards.
>
> Btw. DKPro Core build against UIMAv3 will soon be stable. There is this
> issue and after that, one additional different exception:
>
> java.lang.ArrayIndexOutOfBoundsException: -1
>       at 
> org.apache.uima.cas.impl.CasTypeSystemMapper.getToFeature(CasTypeSystemMapper.java:197)
>       at 
> org.apache.uima.cas.impl.CasTypeSystemMapper.getSrcFeature(CasTypeSystemMapper.java:172)
>       at 
> org.apache.uima.cas.impl.BinaryCasSerDes6.deserializeAfterVersion(BinaryCasSerDes6.java:1875)
>       at 
> org.apache.uima.cas.impl.BinaryCasSerDes.reinit(BinaryCasSerDes.java:594)
>       at org.apache.uima.util.CasIOUtils.load(CasIOUtils.java:382)
>       at org.apache.uima.util.CasIOUtils.load(CasIOUtils.java:344)
>         ...
>
> Cheers,
>
> -- Richard
>
>
>

Reply via email to