I am not sure I understand what you wrote. Although I have been using UIMA
for 2 years now, I am still baffled by it most of the time ;-).

It SOUNDS like you are saying that it's possible to add new types in the
XML typesystem file, and tell a RUNNING application to reload the XML file
without having to recompile that application. Is that correct?

If so, I don't see a need for Dynamically typed annotations after all.


On Sat, Dec 15, 2018 at 5:40 PM Richard Eckart de Castilho <r...@apache.org>
wrote:

> Hi folks
>
> > On 15. Dec 2018, at 13:41, Nicolas Paris <nicolas.pa...@riseup.net>
> wrote:
> >
> > On Sat, Dec 15, 2018 at 07:20:33AM -0500, Alain Désilets wrote:
> >> Is it possible to create dynamically typed annotations in UIMA? In other
> >> words, would it be possible for users of my system to create a new type
> of
> >> annotation without having to recompile the Java code?
>
> My take on the problem is to redefine the CAS in-place. The following
> code is used by the WebAnno annotation editor to handle the case where
> the user modifies the type system:
>
> ---
>
>     /**
>      * Load the contents from the source CAS, upgrade it to the target
> type system and write the
>      * results to the target CAS. An in-place upgrade can be achieved by
> using the same CAS as
>      * source and target.
>      */
>     private void upgradeCas(CAS aSourceCas, CAS aTargetCas,
> TypeSystemDescription aTargetTypeSystem)
>         throws UIMAException, IOException
>     {
>         // Save source CAS type system (do this early since we might do an
> in-place upgrade)
>         TypeSystem sourceTypeSystem = aSourceCas.getTypeSystem();
>
>         // Save source CAS contents
>         ByteArrayOutputStream serializedCasContents = new
> ByteArrayOutputStream();
>         Serialization.serializeWithCompression(aSourceCas,
> serializedCasContents, sourceTypeSystem);
>
>         // Re-initialize the target CAS with new type system
>         CAS tempCas = JCasFactory.createJCas(aTargetTypeSystem).getCas();
>         CASCompleteSerializer serializer =
> Serialization.serializeCASComplete((CASImpl) tempCas);
>         Serialization.deserializeCASComplete(serializer, (CASImpl)
> aTargetCas);
>
>         // Leniently load the source CAS contents into the target CAS
>         CasIOUtils.load(new
> ByteArrayInputStream(serializedCasContents.toByteArray()), aTargetCas,
>                 sourceTypeSystem);
>
>         // Make sure JCas is properly initialized too
>         aTargetCas.getJCas();
>     }
>
> ---
>
> This procedure takes a bit so it shouldn't be done often and also it
> discards any non-reachable
> feature structures - but it works. It also discards any information that
> is not compatible with
> the target type system - within any limits that lenient CAS loading may
> impose.
>
> Basically you call it with
>
>           upgradeCas(aCas, aCas, aTargetTypeSystem);
>
> in order to perform an in-place upgrade of a singla CAS to the given type
> system.
>
> Cheers,
>
> -- Richard

Reply via email to