sorry for the partial sentence below, which should read:
" ... then the new type system is thrown away and the already committed equal
type system is used (replaced/installed into the CAS, if this is called from
casImpl.commitTypeSystem... , for instance) instead."
-Marshall
On 10/13/2017 9:19 AM, Marshall Schor wrote:
> 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 <[email protected]> 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
>>
>>
>>
>