blob: 7dd317618ef0173a98b8b255e1cfe50587830e7e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.uima.jcas.impl;
// * todo:
// *
// * Compatibility removes at some point: TypeSystemInit and it's caller
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import org.apache.uima.cas.AbstractCas;
import org.apache.uima.cas.AbstractCas_ImplBase;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.CASException;
import org.apache.uima.cas.CASRuntimeException;
import org.apache.uima.cas.CasOwner;
import org.apache.uima.cas.ConstraintFactory;
import org.apache.uima.cas.FSIndex;
import org.apache.uima.cas.FSIndexRepository;
import org.apache.uima.cas.FSIterator;
import org.apache.uima.cas.FSMatchConstraint;
import org.apache.uima.cas.Feature;
import org.apache.uima.cas.FeaturePath;
import org.apache.uima.cas.FeatureStructure;
import org.apache.uima.cas.FeatureValuePath;
import org.apache.uima.cas.SofaFS;
import org.apache.uima.cas.SofaID;
import org.apache.uima.cas.Type;
import org.apache.uima.cas.TypeSystem;
import org.apache.uima.cas.impl.CASImpl;
import org.apache.uima.cas.impl.LowLevelCAS;
import org.apache.uima.cas.impl.LowLevelIndexRepository;
import org.apache.uima.cas.impl.TypeSystemImpl;
import org.apache.uima.cas.text.AnnotationIndex;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.JFSIndexRepository;
import org.apache.uima.jcas.cas.ByteArray;
import org.apache.uima.jcas.cas.DoubleArray;
import org.apache.uima.jcas.cas.FSArray;
import org.apache.uima.jcas.cas.FloatArray;
import org.apache.uima.jcas.cas.IntegerArray;
import org.apache.uima.jcas.cas.LongArray;
import org.apache.uima.jcas.cas.ShortArray;
import org.apache.uima.jcas.cas.Sofa;
import org.apache.uima.jcas.cas.StringArray;
import org.apache.uima.jcas.cas.TOP;
import org.apache.uima.jcas.cas.TOP_Type;
import org.apache.uima.jcas.tcas.Annotation;
// *********************************
// * Implementation of JCas *
// *********************************
/**
*
* Overview
* ========
* This design uses classes for types, not Interfaces. JCas CAS types are represented in a running
* server by a collection of classes, one for each loaded equivalent-to-CAS type Foo.
*
* In v2, JCas was optional;
* In v3, JCas is still optional, but the JCas classes are used in all cases for the feature-final built-ins
* - which are those classes that are skipped when JCasgen is run
*
* Built-in JCas classes have one definition.
* Custom JCas classes have one definition per classloader
* - Running a pipeline with a custom extension classloader
* - PEAR Wrappers support contexts with the PEAR where there's potentially different JCas implementations.
* - Running with different JCas classes is possible using user (or other framework (e.g. servlet)) class loader isolation
*
* Hierarchy: The JCas class hierarchy (super class structure) follows the UIMA type hierarchy
* - with some additional shared-code style classes
* - with some additional "marker" interfaces (e.g the built-in UIMA list - marking empty and non-empty nodes)
* - TOP extends FeatureStructureImplC
* -- which has the non-JCas support for representing Feature Structures as Java Objects
*
* I N S T A N C E S of these classes
* - belong to a CAS, and record the particular CAS view used when creating the instance
* -- specifies the CAS to which the Feature Structure belongs
* -- is the view in which they were created
* --- used for instance.addToIndexes
* --- used for checking - e.g. can't create an Annotation in the "base" CAS view
*
* The CAS must be updated on a single thread.
* A read-only CAS may be accessed on multiple threads.
*
* At classloader load time, JCas classes are assigned an incrementing static integer index.
* This index is used with a table kept per Type System (possibly shared among multiple CASes)
* to locate the corresponding TypeImpl
* - this TypeImpl is set in a local field in every FS instance when the instance is created
* - multiple JCas cover classes (loaded under different classloaders) may end up having the same TypeImpl
* -- e.g. inside a PEAR
*
* _______________________________________________________________________
* T r e a t m e n t o f e m b e d d e d classloading context (PEARS)
*
* In v2, different definitions of JCas cover classes were possible within a PEAR, and the
* implementation switched among these.
*
* In v3, we copy this implementation. For those types which have new JCas definitions in the PEAR's
* classpath, special versions of Feature Structure instances of those JCas classes are constructed,
* called "trampoline" FSs. These have an internal flag set indicating they're trampolines, and their
* refs to the int[] and Object[] values are "shared" with the non-PEAR FSs.
*
* When creating new instances, if the PEAR context defines a different JCas class for this type, two FSs
* are created: a "base" FS and the trampoline FS.
*
* When iterating and retrieving a FS, if in a PEAR context and the type has a different JCas class from the base,
* return a (possibly new) trampoline for that FS.
* - the trampolines are kept in a JCasHashMap, indexed by class loader (in case there are multiple PEARs in one pipeline)
* - Once created, the same trampoline is reused when called for
*
* UIMA structures storing Feature Structures (e.g. indexes) always store the base (non-trampoline) version.
* - Methods like add-to-indexes convert a trampoline to its corresponding base
*
* (Possible future generalization for any internals-hiding AE component - not supported)
* - support non-input/output Type isolation for internals-hiding components
* -- types not specified as input/output are particularized to the internals-hiding component
* --- removed from indexes upon exit (because they're internal use only)
*/
/**
* implements the supporting infrastructure for JCas model linked with a Cas. There is one logical
* instance of this instantiated per CasView. If you hold a reference to a CAS, to get a
* reference to the corresponding JCas, use the method getJCas(). Likewise, if you hold a reference
* to this object, you can get a reference to the corresponding CAS object using the method
* getCas().
*/
public class JCasImpl extends AbstractCas_ImplBase implements AbstractCas, JCas {
// **********************************************
// * Data shared among views of a single CAS *
// * We keep one copy per CAS view set *
// **********************************************/
// *******************
// * Data per (J)CAS *
// * There may be multiples of these for one base CAS - one per "view"
// * Access to this data is assumed to be single threaded
// *******************
// not public to protect it from accidents
private final CASImpl casImpl;
private final LowLevelIndexRepository ll_IndexRepository;
private final JFSIndexRepository jfsIndexRepository;
// *********************************
// * Getters for read-only objects *
// *********************************
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getFSIndexRepository()
*/
public FSIndexRepository getFSIndexRepository() {
return casImpl.getIndexRepository();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getLowLevelIndexRepository()
*/
public LowLevelIndexRepository getLowLevelIndexRepository() {
return ll_IndexRepository;
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getCas()
*/
public CAS getCas() {
return casImpl;
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getCasImpl()
*/
public CASImpl getCasImpl() {
return casImpl;
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getLowLevelCas()
*/
public LowLevelCAS getLowLevelCas() {
return casImpl;
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getTypeSystem()
*/
public TypeSystem getTypeSystem() {
return casImpl.getTypeSystem();
}
TypeSystemImpl getTypeSystemImpl() {
return casImpl.getTypeSystemImpl();
}
/*
* @see org.apache.uima.jcas.JCas#getType(int)
*/
public TOP_Type getType(final int i) {
throw new UnsupportedOperationException("UIMA V2 operation not supported in V3");
// if (i >= typeArray.length || null == typeArray[i]) {
// getTypeInit(i);
// }
// return typeArray[i];
}
/*
* @see org.apache.uima.jcas.JCas#getType(org.apache.uima.jcas.cas.TOP)
*/
public TOP_Type getType(TOP instance) {
return getType(instance.getTypeIndexID());
}
/*
* Given Foo.type, return the corresponding CAS Type object. This is useful in the methods which
* require a CAS Type, for instance iterator creation.
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getCasType(int)
*
*/
public Type getCasType(int i) {
return getTypeSystemImpl().getJCasRegisteredType(i);
}
// /** throws (an unchecked) CASRuntimeException */
// private static void logAndThrow(Exception e) {
// CASRuntimeException casEx = new CASRuntimeException(CASRuntimeException.JCAS_CAS_MISMATCH);
// casEx.initCause(e);
// throw casEx;
// }
// never called, but have to set values to null because they're final
private JCasImpl() {
casImpl = null;
ll_IndexRepository = null;
throw new RuntimeException("JCas constructor with no args called, should never be called.");
}
/*
* Private constructor, called when new instance (either for new cas, or for old cas but new
* Annotator/Application class, needed
*
* Called by JCas.getJCas(cas)
*
* The CAS must be initialized when this is called.
*
*/
private JCasImpl(CASImpl cas) {
// * A new instance of JCas exists for each CAS
// * At this point, some but not necessarily all of the Types have been
// loaded
// * the typeArray needs to be big enough to hold all the types
// * that will be loaded.
this.casImpl = cas;
this.ll_IndexRepository = casImpl.ll_getIndexRepository();
this.jfsIndexRepository = new JFSIndexRepositoryImpl(this, cas.getIndexRepository());
}
public TOP createFS(Type type) {
return casImpl.createFS(type);
}
/**
* creates a new JCas instance that corresponds to a CAS instance. Will be called once by the UIMA
* framework when it creates the CAS.
*
* @param cas
* a CAS instance
* @return newly created and initialized JCas
// * @throws CASException -
*/
public static JCasImpl getJCas(CASImpl cas) {
return getJCasImpl(cas);
}
/**
* creates a new JCas instance that corresponds to a CAS instance. Will be called once by the UIMA
* framework when it creates the CAS.
*
* @param cas
* a CAS instance
* @return newly created and initialized JCas
*/
private static JCasImpl getJCasImpl(CASImpl cas) {
return new JCasImpl(cas);
}
// This generator class is used in place of the generator that is in each of the
// older JCasGen'd classes
// It makes use of the passed-in CAS view so one generator works for all Cas Views.
// It references the xxx_Type instance using the getType call, which will
// (lazily) instantiate the xxx_Type object if needed (due to switching class loaders:
// see comment under getType(int))
// static private class JCasFsGenerator<T extends TOP> implements FSGenerator<T> {
// // multiple reader threads in same CAS
// static final ThreadLocal<Object[]> initArgsThreadLocal = new ThreadLocal<Object[]>() {
// protected Object[] initialValue() { return new Object[2]; } };
//
// private final int type;
//
// private final Constructor<T> c;
//
// private final boolean isSubtypeOfAnnotationBase;
//
// private final int sofaNbrFeatCode;
//
// private final int annotSofaFeatCode;
//
//
// JCasFsGenerator(int type, Constructor<T> c, boolean isSubtypeOfAnnotationBase,
// int sofaNbrFeatCode, int annotSofaFeatCode) {
// this.type = type;
// this.c = c;
// this.isSubtypeOfAnnotationBase = isSubtypeOfAnnotationBase;
// this.sofaNbrFeatCode = sofaNbrFeatCode;
// this.annotSofaFeatCode = annotSofaFeatCode;
// }
/*
* Called from the CAS's this.svd.localFsGenerators
*
* Those are set up with either JCas style generators, or the
* the shared common instances of FeatureStructureImplC for non-JCas classes.
*
*/
// Called in 2 cases
// 1) a non-JCas call to create a new JCas style FS
// 2) a low-level iterator
// public T createFS(int addr, CASImpl casView) {
// try {
// JCasImpl jcasView = (JCasImpl) casView.getJCas();
// T fs = jcasView.<T>getJfsFromCaddr(addr);
// if (null != fs) {
// fs.jcasType = jcasView.getType(type);
// return fs;
// }
// return doCreateFS(addr, casView);
// } catch (CASException e1) {
// logAndThrow(e1, null);
// return null; // to avoid compile warning
// }
// }
//
// private T doCreateFS(int addr, CASImpl casView) {
// // this funny logic is because although the annotationView should always be set if
// // a type is a subtype of annotation, it isn't always set if an application uses low-level
// // api's. Rather than blow up, we limp along.
// CASImpl maybeAnnotationView = null;
// if (isSubtypeOfAnnotationBase) {
// final int sofaNbr = getSofaNbr(addr, casView);
// if (sofaNbr > 0) {
// maybeAnnotationView = (CASImpl) casView.getView(sofaNbr);
// }
// }
// final CASImpl view = (null != maybeAnnotationView) ? maybeAnnotationView : casView;
//
// try {
// JCasImpl jcasView = (JCasImpl) view.getJCas();
// final Object[] initargs = initArgsThreadLocal.get();
// initargs[0] = Integer.valueOf(addr);
// initargs[1] = jcasView.getType(type);
// T fs = null;
// try {
// fs = (T) c.newInstance(initargs);
// } catch (IllegalArgumentException e) {
// logAndThrow(e, jcasView);
// } catch (InstantiationException e) {
// logAndThrow(e, jcasView);
// } catch (IllegalAccessException e) {
// logAndThrow(e, jcasView);
// } catch (InvocationTargetException e) {
// logAndThrow(e, jcasView);
// }
// jcasView.putJfsFromCaddr(addr, fs);
// return fs;
// } catch (CASException e1) {
// logAndThrow(e1, null);
// return null;
// }
// }
// private void logAndThrow(Exception e, JCasImpl jcasView) {
// CASRuntimeException casEx = new CASRuntimeException(
// CASRuntimeException.JCAS_CAS_MISMATCH,
// new String[] { (null == jcasView) ? "-- ignore outer msg, error is can''t get value of jcas from cas"
// : (jcasView.getType(type).casType.getName() + "; exception= "
// + e.getClass().getName() + "; msg= " + e.getLocalizedMessage()) });
// casEx.initCause(e);
// throw casEx;
// }
//
// private int getSofaNbr(final int addr, final CASImpl casView) {
// final int sofa = casView.ll_getIntValue(addr, annotSofaFeatCode, false);
// return (sofa == 0) ? 0 : casView.ll_getIntValue(sofa, sofaNbrFeatCode);
// }
// }
// per JCas instance - so don't need to synch.
// private final Object[] constructorArgsFor_Type = new Object[2];
// /**
// * Make the instance of the JCas xxx_Type class for this CAS. Note: not all types will have
// * xxx_Type. Instance creation does the typeSystemInit kind of function, as well.
// *
// * @param jcasTypeInfo -
// * @param alreadyLoaded -
// * @param fsGenerators updated by side effect with new instances of the _Type class
// * @return true if a new instance of a _Type class was created
// */
// private <T extends TOP> boolean makeInstanceOf_Type(LoadedJCasType<T> jcasTypeInfo, boolean alreadyLoaded,
// FSGenerator<?>[] fsGenerators) {
//
// // return without doing anything if the _Type instance is already existing
// // this happens when a JCas has some _Type instances made (e.g, the
// // built-in ones) but the class loader was switched. Some of the
// // _Type instances for the new class loader can share previously
// // instantiated _Type instances, but others may be different
// // (due to different impls of the _Type class loaded by the different
// // class loader).
// // This can also happen in the case where
// // JCasImpl.getType is called for a non-existing class
// // What happens in this case is that the getType code has to assume that
// // perhaps none of the _Type instances were made for this JCas (yet), because
// // these are created lazily - so it calls instantiateJCas_Types to make them.
// // If they were already made, this next test short circuits this.
// int typeIndex = jcasTypeInfo.index;
// if (typeArray[typeIndex] != null) {
// return false;
// }
//
// Constructor<?> c_Type = jcasTypeInfo.constructorFor_Type;
// Constructor<T> cType = jcasTypeInfo.constructorForType;
// TypeImpl casType = (TypeImpl) casImpl.getTypeSystem().getType(jcasTypeInfo.typeName);
//
// try {
// constructorArgsFor_Type[0] = this;
// constructorArgsFor_Type[1] = casType;
// TOP_Type x_Type_instance = (TOP_Type) c_Type.newInstance(constructorArgsFor_Type);
// typeArray[typeIndex] = x_Type_instance;
// // install the standard generator
// // this is sharable by all views, since the CAS is passed to the generator
// // Also sharable by all in a CasPool, except for "swapping" due to PEARs/Classloaders.
// if (!alreadyLoaded) {
// final TypeSystemImpl ts = casImpl.getTypeSystemImpl();
// fsGenerators[casType.getCode()] = new JCasFsGenerator<T>(typeIndex, cType,
// jcasTypeInfo.isSubtypeOfAnnotationBase, TypeSystemImpl.sofaNumFeatCode, TypeSystemImpl.annotSofaFeatCode);
// // this.casImpl.getFSClassRegistry().loadJCasGeneratorForType(typeIndex, cType, casType,
// // jcasTypeInfo.isSubtypeOfAnnotationBase);
// }
// } catch (SecurityException e) {
// logAndThrow(e);
// } catch (InstantiationException e) {
// logAndThrow(e);
// } catch (IllegalAccessException e) {
// logAndThrow(e);
// } catch (InvocationTargetException e) {
// logAndThrow(e);
// } catch (ArrayIndexOutOfBoundsException e) {
// logAndThrow(e);
// }
// return true;
// }
// /**
// * Make the instance of the JCas xxx_Type class for this CAS. Note: not all types will have
// * xxx_Type. Instance creation does the typeSystemInit kind of function, as well.
// */
// /*
// * private void makeInstanceOf_Type(Type casType, Class clas, CASImpl cas) { Constructor c; Field
// * typeIndexField = null; int typeIndex; try { c = clas.getDeclaredConstructor(jcasBaseAndType);
// * try {
// *
// * typeIndexField = clas.getDeclaredField("typeIndexID"); } catch (NoSuchFieldException e) { try { //
// * old version has the index in the base type String name = clas.getName(); Class clas2 =
// * Class.forName(name.substring(0, name.length() - 5), true, cas .getJCasClassLoader()); // drop
// * _Type typeIndexField = clas2.getDeclaredField("typeIndexID"); } catch (NoSuchFieldException e2) {
// * logAndThrow(e2); } catch (ClassNotFoundException e3) { logAndThrow(e3); } } typeIndex =
// * typeIndexField.getInt(null); // null - static instance var TOP_Type x_Type_instance =
// * (TOP_Type) c.newInstance(new Object[] { this, casType }); typeArray[typeIndex] =
// * x_Type_instance; } catch (SecurityException e) { logAndThrow(e); } catch (NoSuchMethodException
// * e) { logAndThrow(e); } catch (InstantiationException e) { logAndThrow(e); } catch
// * (IllegalAccessException e) { logAndThrow(e); } catch (InvocationTargetException e) {
// * logAndThrow(e); } catch (ArrayIndexOutOfBoundsException e) { logAndThrow(e); } }
// */
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getRequiredType(java.lang.String)
*/
public Type getRequiredType(String s) throws CASException {
Type t = getTypeSystem().getType(s);
if (null == t) {
throw new CASException(CASException.JCAS_TYPENOTFOUND_ERROR, s);
}
return t;
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getRequiredFeature(org.apache.uima.cas.Type, java.lang.String)
*/
public Feature getRequiredFeature(Type t, String s) throws CASException {
Feature f = t.getFeatureByBaseName(s);
if (null == f) {
throw new CASException(CASException.JCAS_FEATURENOTFOUND_ERROR, t.getName(), s);
}
return f;
}
// /*
// * (non-Javadoc)
// *
// * @see org.apache.uima.jcas.JCas#getRequiredFeatureDE(org.apache.uima.cas.Type, java.lang.String,
// * java.lang.String, boolean)
// */
//
// public Feature getRequiredFeatureDE(Type t, String s, String rangeName, boolean featOkTst) {
// Feature f = t.getFeatureByBaseName(s);
// Type rangeType = this.getTypeSystem().getType(rangeName);
// if (null == f && !featOkTst) {
// CASException casEx = new CASException(CASException.JCAS_FEATURENOTFOUND_ERROR, t.getName(), s);
// sharedView.errorSet.add(casEx);
// }
// if (null != f)
// try {
// casImpl.checkTypingConditions(t, rangeType, f);
// } catch (LowLevelException e) {
// CASException casEx = new CASException(CASException.JCAS_FEATURE_WRONG_TYPE, t.getName(), s, rangeName, f.getRange());
// sharedView.errorSet.add(casEx);
// }
// return f;
// }
// /**
// * Internal - throw missing feature exception at runtime
// *
// * @param feat -
// * @param type -
// */
// public void throwFeatMissing(String feat, String type) {
// CASRuntimeException e = new CASRuntimeException(CASRuntimeException.INAPPROP_FEAT,
// new String[] { feat, type });
// throw e;
// }
// /*
// * (non-Javadoc)
// *
// * @see org.apache.uima.jcas.JCas#putJfsFromCaddr(int, org.apache.uima.cas.FeatureStructure)
// */
// public void putJfsFromCaddr(int casAddr, FeatureStructure fs) {
// sharedView.cAddr2Jfs.put((FeatureStructureImpl) fs);
// }
// /*
// * (non-Javadoc)
// *
// * Generics: extends FeatureStructure, not TOP, because
// * when the JCas is being used, but a particular type instance doesn't have a JCas cover class,
// * this holds instances of FeatureStructureC - the shared Class for non-JCas Java cover objects.
// *
// * @see org.apache.uima.jcas.JCas#getJfsFromCaddr(int)
// */
// @SuppressWarnings("unchecked")
// public <T extends TOP> T getJfsFromCaddr(int casAddr) {
// return (T) sharedView.cAddr2Jfs.getReserve(casAddr);
// }
// public void showJfsFromCaddrHistogram() {
// sharedView.cAddr2Jfs.showHistogram();
// }
// * Implementation of part of the Cas interface as part of JCas*
/*
* (Internal Use only) called by the CAS reset function - clears the hashtable holding the
* associations.
*/
public static void clearData(CAS cas) {
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#reset()
*/
public void reset() {
casImpl.reset();
}
// /*
// * (non-Javadoc)
// *
// * @see org.apache.uima.jcas.JCas#checkArrayBounds(int, int)
// */
// public final void checkArrayBounds(int fsRef, int pos) {
// if (NULL == fsRef) {
// // note - need to add this to ll_runtimeException
// throw new LowLevelException(LowLevelException.NULL_ARRAY_ACCESS, pos);
// }
// final int arrayLength = casImpl.ll_getArraySize(fsRef);
// if (pos < 0 || pos >= arrayLength) {
// throw new LowLevelException(LowLevelException.ARRAY_INDEX_OUT_OF_RANGE, pos);
// }
// }
// *****************
// * Sofa support *
// *****************
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getSofa(org.apache.uima.cas.SofaID)
*/
public Sofa getSofa(SofaID sofaID) {
return (Sofa) casImpl.getSofa(sofaID);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getSofa()
*/
public Sofa getSofa() {
return (Sofa) casImpl.getSofa();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#createView(java.lang.String)
*/
public JCas createView(String sofaID) throws CASException {
return casImpl.createView(sofaID).getJCas();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getJCas(org.apache.uima.jcas.cas.Sofa)
*/
public JCas getJCas(Sofa sofa) throws CASException {
return casImpl.getView(sofa).getJCas();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getSofaIterator()
*/
public FSIterator<SofaFS> getSofaIterator() {
return casImpl.getSofaIterator();
}
// *****************
// * Index support *
// *****************
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getJFSIndexRepository()
*/
public JFSIndexRepository getJFSIndexRepository() {
return jfsIndexRepository;
}
// ****************
// * TCas support *
// ****************
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getDocumentAnnotationFs()
*/
public TOP getDocumentAnnotationFs() {
return (TOP) casImpl.getDocumentAnnotation();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getDocumentText()
*/
public String getDocumentText() {
return casImpl.getDocumentText();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getSofaDataString()
*/
public String getSofaDataString() {
return casImpl.getSofaDataString();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getSofaDataArray()
*/
public FeatureStructure getSofaDataArray() {
return casImpl.getSofaDataArray();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getSofaDataURI()
*/
public String getSofaDataURI() {
return casImpl.getSofaDataURI();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getSofaMimeType()
*/
public String getSofaMimeType() {
return casImpl.getSofaMimeType();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#setDocumentText(java.lang.String)
*/
public void setDocumentText(String text) throws CASRuntimeException {
casImpl.setDocumentText(text);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#setSofaDataString(java.lang.String, java.lang.String)
*/
public void setSofaDataString(String text, String mime) throws CASRuntimeException {
casImpl.setSofaDataString(text, mime);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#setSofaDataArray(org.apache.uima.jcas.cas.TOP, java.lang.String)
*/
public void setSofaDataArray(FeatureStructure array, String mime) throws CASRuntimeException {
casImpl.setSofaDataArray(array, mime);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#setSofaDataURI(java.lang.String, java.lang.String)
*/
public void setSofaDataURI(String uri, String mime) throws CASRuntimeException {
casImpl.setSofaDataURI(uri, mime);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getDocumentLanguage()
*/
public String getDocumentLanguage() {
return casImpl.getDocumentLanguage();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#setDocumentLanguage(java.lang.String)
*/
public void setDocumentLanguage(String language) throws CASRuntimeException {
casImpl.setDocumentLanguage(language);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getSofaDataStream()
*/
public InputStream getSofaDataStream() {
return casImpl.getSofaDataStream();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getConstraintFactory()
*/
public ConstraintFactory getConstraintFactory() {
return casImpl.getConstraintFactory();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#createFeaturePath()
*/
public FeaturePath createFeaturePath() {
return casImpl.createFeaturePath();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#createFilteredIterator(org.apache.uima.cas.FSIterator,
* org.apache.uima.cas.FSMatchConstraint)
*/
public <T extends FeatureStructure> FSIterator<T> createFilteredIterator(FSIterator<T> it, FSMatchConstraint constraint) {
return casImpl.createFilteredIterator(it, constraint);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getStringArray0L()
* @deprecated use emptyXXXArray() instead
*/
@Deprecated
public StringArray getStringArray0L() {
return this.getCas().emptyStringArray();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getIntegerArray0L()
* @deprecated use emptyXXXArray() instead
*/
@Deprecated
public IntegerArray getIntegerArray0L() {
return this.getCas().emptyIntegerArray();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getFloatArray0L()
* @deprecated use emptyXXXArray() instead
*/
@Deprecated
public FloatArray getFloatArray0L() {
return this.getCas().emptyFloatArray();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getFSArray0L()
* @deprecated use emptyXXXArray() instead
*/
@Deprecated
public FSArray getFSArray0L() {
return this.getCas().emptyFSArray();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#processInit()
*/
public void processInit() {
// unused
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.cas.AbstractCas_ImplBase#setOwn
*/
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#setOwner(org.apache.uima.cas.CasOwner)
*/
public void setOwner(CasOwner aCasOwner) {
casImpl.setOwner(aCasOwner);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#release()
*/
public void release() {
casImpl.release();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getView(java.lang.String)
*/
public JCas getView(String localViewName) throws CASException {
return casImpl.getView(localViewName).getJCas();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getView(org.apache.uima.cas.SofaFS)
*/
public JCas getView(SofaFS aSofa) throws CASException {
return casImpl.getView(aSofa).getJCas();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#addFsToIndexes(org.apache.uima.cas.FeatureStructure)
*/
public void addFsToIndexes(FeatureStructure instance) {
casImpl.addFsToIndexes(instance);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#removeFsFromIndexes(org.apache.uima.cas.FeatureStructure)
*/
public void removeFsFromIndexes(FeatureStructure instance) {
casImpl.removeFsFromIndexes(instance);
}
/* (non-Javadoc)
* @see org.apache.uima.jcas.JCas#removeAllIncludingSubtypes(int)
*/
public void removeAllIncludingSubtypes(int i) {
getFSIndexRepository().removeAllIncludingSubtypes(getCasType(i));
}
/* (non-Javadoc)
* @see org.apache.uima.jcas.JCas#removeAllExcludingSubtypes(int)
*/
public void removeAllExcludingSubtypes(int i) {
getFSIndexRepository().removeAllExcludingSubtypes(getCasType(i));
}
/**
* @see org.apache.uima.cas.CAS#fs2listIterator(FSIterator)
*/
public <T extends FeatureStructure> ListIterator<T> fs2listIterator(FSIterator<T> it) {
return casImpl.fs2listIterator(it);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.cas.BaseCas#createFeatureValuePath(java.lang.String)
*/
public FeatureValuePath createFeatureValuePath(String featureValuePath)
throws CASRuntimeException {
return casImpl.createFeatureValuePath(featureValuePath);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.cas.BaseCas#createSofa(org.apache.uima.cas.SofaID, java.lang.String)
* @deprecated
*/
public SofaFS createSofa(SofaID sofaID, String mimeType) {
// extract absolute SofaName string from the ID
return casImpl.createSofa(sofaID, mimeType);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.cas.BaseCas#getIndexRepository()
*/
public FSIndexRepository getIndexRepository() {
return casImpl.getIndexRepository();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.cas.BaseCas#getViewName()
*/
public String getViewName() {
return casImpl.getViewName();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.cas.BaseCas#size()
*/
public int size() {
// TODO improve this to account for JCas
// structure sizes
return casImpl.size();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getAnnotationIndex()
*/
public AnnotationIndex<Annotation> getAnnotationIndex() {
return casImpl.<Annotation>getAnnotationIndex();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getAnnotationIndex(org.apache.uima.cas.Type)
*/
@Override
public <T extends Annotation> AnnotationIndex<T> getAnnotationIndex(Type type) throws CASRuntimeException {
return (AnnotationIndex<T>) casImpl.<T>getAnnotationIndex(type);
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getAnnotationIndex(int)
*/
public <T extends Annotation> AnnotationIndex<T> getAnnotationIndex(int type) throws CASRuntimeException {
return (AnnotationIndex<T>) casImpl.<T>getAnnotationIndex(this.getCasType(type));
}
public <T extends Annotation> AnnotationIndex<T> getAnnotationIndex(Class<T> clazz) {
return getAnnotationIndex(getCasType(clazz));
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getViewIterator()
*/
public Iterator<JCas> getViewIterator() throws CASException {
List<JCas> viewList = new ArrayList<JCas>();
Iterator<CAS> casViewIter = casImpl.getViewIterator();
while (casViewIter.hasNext()) {
viewList.add((casViewIter.next()).getJCas());
}
return viewList.iterator();
}
/*
* (non-Javadoc)
*
* @see org.apache.uima.jcas.JCas#getViewIterator(java.lang.String)
*/
public Iterator<JCas> getViewIterator(String localViewNamePrefix) throws CASException {
List<JCas> viewList = new ArrayList<JCas>();
Iterator<CAS> casViewIter = casImpl.getViewIterator(localViewNamePrefix);
while (casViewIter.hasNext()) {
viewList.add((casViewIter.next()).getJCas());
}
return viewList.iterator();
}
/* (non-Javadoc)
* @see org.apache.uima.jcas.JCas#protectIndexes()
*/
@Override
public AutoCloseable protectIndexes() {
return casImpl.protectIndexes();
}
/* (non-Javadoc)
* @see org.apache.uima.jcas.JCas#protectIndexes(java.lang.Runnable)
*/
@Override
public void protectIndexes(Runnable runnable) {
casImpl.protectIndexes(runnable);
}
/**
* Static method to get the corresponding Type for a JCas class object
*/
private static int getTypeRegistryIndex(Class<? extends FeatureStructure> clazz) {
try {
return clazz.getField("type").getInt(clazz);
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
throw new RuntimeException(e); // should never happen
}
}
/**
* Return the UIMA Type object corresponding to this JCas's JCas cover class
* (Note: different JCas's, with different type systems, may share the same cover class impl)
* @param clazz a JCas cover class
* @return the corresponding UIMA Type object
*/
public Type getCasType(Class<? extends FeatureStructure> clazz) {
return getCasType(getTypeRegistryIndex(clazz));
}
@Override
public <T extends TOP> FSIterator<T> getAllIndexedFS(Class<T> clazz) {
return getFSIndexRepository().getAllIndexedFS(getCasType(clazz));
}
@Override
public <T extends TOP> FSIndex<T> getIndex(String label, Class<T> clazz) {
return getFSIndexRepository().getIndex(label, getCasType(clazz));
}
}