blob: f3930975beb9529464adff672a3a14fe1d584546 [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;
import java.io.InputStream;
import java.util.Iterator;
import org.apache.uima.cas.AbstractCas;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.CASException;
import org.apache.uima.cas.CASRuntimeException;
import org.apache.uima.cas.ConstraintFactory;
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.admin.CASAdminException;
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.text.AnnotationIndex;
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.Sofa;
import org.apache.uima.jcas.cas.StringArray;
import org.apache.uima.jcas.cas.TOP;
import org.apache.uima.jcas.cas.TOP_Type;
/**
* Java Cover Classes based Object-oriented CAS (Common Analysis System) API.
*
* <p>
* A <code>JCas</code> object provides the starting point for working with the CAS using
* Java Cover Classes for each type, generated by the utility JCasGen.
* <p>
* This interface extends the CAS Interface, providing all the same functionality, plus
* some specific to the JCas.
* <p>
* It supports the creation of new instances of CAS types, using the normal Java "new"
* operator.
* <p>
* You can create a <code>JCas</code> object from a CAS object by calling the getJCas()
* method on the CAS object.
*/
public interface JCas extends AbstractCas {
/**
* (internal use)
*/
public final static int INVALID_FEATURE_CODE = -1;
// *********************************
// * Getters for read-only objects *
// *********************************
/** return the FSIndexRepository object for this Cas. */
public abstract FSIndexRepository getFSIndexRepository();
public abstract LowLevelIndexRepository getLowLevelIndexRepository();
/** return the Cas object for this JCas instantiation */
public abstract CAS getCas();
/** internal use */
public abstract CASImpl getCasImpl();
/** internal use */
public abstract LowLevelCAS getLowLevelCas();
/**
* get the JCas _Type instance for a particular CAS type constant
*
* @param i
* the CAS type constant, written as Foo.type
* @return the instance of the JCas xxx_Type object for the specified type
*/
public abstract TOP_Type getType(int i);
/**
* Given Foo.type, return the corresponding CAS Type object. This is useful in the methods which
* require a CAS Type, for instance iterator creation.
*
* @param i -
* index returned by Foo.type
* @return the CAS Java Type object for this CAS Type.
*/
public abstract Type getCasType(int i);
/**
* get the JCas x_Type instance for a particular Java instance of a type
*
* @param instance
* @return the associated xxx_Type instance
* @deprecated use instance.jcasType instead - faster
*/
public abstract TOP_Type getType(TOP instance);
/**
* Internal use - looks up a type-name-string in the CAS type system and returns the Cas Type
* object. Throws CASException if the type isn't found
*/
public abstract Type getRequiredType(String s) throws CASException;
/**
* Internal use - look up a feature-name-string in the CAS type system and returns the Cas Feature
* object. Throws CASException if the feature isn't found
*/
public abstract Feature getRequiredFeature(Type t, String s) throws CASException;
/**
* Internal Use - look up a feature-name-string in the CAS type system and returns the Cas Feature
* object. If the feature isn't found, adds an exception to the errorSet but doesn't throw
*/
public abstract Feature getRequiredFeatureDE(Type t, String s, String rangeName, boolean featOkTst);
/**
* Internal Use - sets the corresponding Java instance for a Cas instance
*/
public abstract void putJfsFromCaddr(int casAddr, FeatureStructure fs);
/**
* Internal Use - sets the corresponding Java instance for a Cas instance
*/
public abstract TOP getJfsFromCaddr(int casAddr);
/**
* Internal Use.
*/
public abstract void checkArrayBounds(int fsRef, int pos);
/**
* Internal Use - throw missing feature exception at runtime.
*/
public void throwFeatMissing(String feat, String type);
/**
* @deprecated As of v2.0, use {#getView(String)}. From the view you can access the Sofa data, or
* call {@link #getSofa()} if you truly need to access the SofaFS object.
*/
public abstract Sofa getSofa(SofaID sofaID);
/**
* Get the Sofa feature structure associated with this JCas view.
*
* @return The SofaFS associated with this JCas view.
*/
public abstract Sofa getSofa();
/**
* Create a view and its underlying Sofa (subject of analysis). The view provides access to the
* Sofa data and the index repository that contains metadata (annotations and other feature
* structures) pertaining to that Sofa.
* <p>
* This method creates the underlying Sofa feature structure, but does not set the Sofa data.
* Setting ths Sofa data must be done by calling {@link #setSofaDataArray(FeatureStructure, String)},
* {@link #setSofaDataString(String, String)} or {@link #setSofaDataURI(String, String)} on the
* JCas view returned by this method.
*
* @param localViewName
* the local name, before any sofa name mapping is done, for this view (note: this is the
* same as the associated Sofa name).
*
* @return The view corresponding to this local name.
* @throws CASRuntimeException
* if a View with this name already exists in this CAS
*/
public abstract JCas createView(String sofaID) throws CASException;
/**
* Create a JCas view for a Sofa.
*
* @param aSofa
* a Sofa feature structure in this CAS.
*
* @return The JCas view for the given Sofa.
*/
public abstract JCas getJCas(Sofa sofa) throws CASException;
/**
* Gets the JCas-based interface to the Index Repository. Provides the same functionality
* as {@link #getFSIndexRepository()} except that the methods that take a "type"
* argument take type arguments obtainable easily from the JCas type.
*
* @return the JCas-based interface to the index repository
*/
public abstract JFSIndexRepository getJFSIndexRepository();
/**
* Gets the document annotation. The object returned from this method can be typecast to
* {@link org.apache.uima.jcas.tcas.DocumentAnnotation}.
* <p>
* The reason that the return type of this method is not DocumentAnnotation is because of problems
* that arise when using the UIMA Extension ClassLoader to load annotator classes. The
* DocumentAnnotation type may be defined in the UIMA extension ClassLoader, differently than in
* the framework ClassLoader.
*
* @return The one instance of the DocumentAnnotation annotation.
* @see org.apache.uima.cas.CAS#getDocumentAnnotation
*/
public abstract TOP getDocumentAnnotationFs();
/**
* A constant for each cas which holds a 0-length instance. Since this can be a common value, we
* avoid creating multiple copies of it. All uses can use the same valuee because it is not
* updatable (it has no subfields). This is initialized lazily on first reference, and reset when
* the CAS is reset.
*/
public abstract StringArray getStringArray0L();
/**
* A constant for each cas which holds a 0-length instance. Since this can be a common value, we
* avoid creating multiple copies of it. All uses can use the same valuee because it is not
* updatable (it has no subfields). This is initialized lazily on first reference, and reset when
* the CAS is reset.
*/
public abstract IntegerArray getIntegerArray0L();
/**
* A constant for each cas which holds a 0-length instance. Since this can be a common value, we
* avoid creating multiple copies of it. All uses can use the same valuee because it is not
* updatable (it has no subfields). This is initialized lazily on first reference, and reset when
* the CAS is reset.
*/
public abstract FloatArray getFloatArray0L();
/**
* A constant for each cas which holds a 0-length instance. Since this can be a common value, we
* avoid creating multiple copies of it. All uses can use the same valuee because it is not
* updatable (it has no subfields). This is initialized lazily on first reference, and reset when
* the CAS is reset.
*/
public abstract FSArray getFSArray0L();
/**
* initialize the JCas for new Cas content. Not used, does nothing.
*
* @deprecated not required, does nothing
*/
public abstract void processInit();
/**
* Get the view for a Sofa (subject of analysis). The view provides access to the Sofa data and
* the index repository that contains metadata (annotations and other feature structures)
* pertaining to that Sofa.
*
* @param localViewName
* the local name, before any sofa name mapping is done, for this view (note: this is the
* same as the associated Sofa name).
*
* @return The view corresponding to this local name.
* @throws CASException
*
*/
JCas getView(String localViewName) throws CASException;
/**
* Get the view for a Sofa (subject of analysis). The view provides access to the Sofa data and
* the index repository that contains metadata (annotations and other feature structures)
* pertaining to that Sofa.
*
* @param aSofa
* a Sofa feature structure in the CAS
*
* @return The view for the given Sofa
*/
JCas getView(SofaFS aSofa) throws CASException;
/**
* This part of the CAS interface is shared among CAS and JCAS interfaces
* If you change it in one of the interfaces, consider changing it in the
* other
*/
///////////////////////////////////////////////////////////////////////////
//
// Standard CAS Methods
//
///////////////////////////////////////////////////////////////////////////
/**
* Return the type system of this CAS instance.
*
* @return The type system, or <code>null</code> if none is available.
* @exception CASRuntimeException
* If the type system has not been committed.
*/
TypeSystem getTypeSystem() throws CASRuntimeException;
/**
* Create a Subject of Analysis. The new sofaFS is automatically added to the SofaIndex.
*
* @return The sofaFS.
*
* @deprecated As of v2.0, use {@link #createView(String)} instead.
*/
SofaFS createSofa(SofaID sofaID, String mimeType);
/**
* Get iterator for all SofaFS in the CAS.
*
* @return an iterator over SofaFS.
*/
FSIterator getSofaIterator();
/**
* Create an iterator over structures satisfying a given constraint. Constraints are described in
* the javadocs for {@link ConstraintFactory} and related classes.
*
* @param it
* The input iterator.
* @param cons
* The constraint specifying what structures should be returned.
* @return An iterator over FSs.
*/
FSIterator createFilteredIterator(FSIterator it, FSMatchConstraint cons);
/**
* Get a constraint factory. A constraint factory is a simple way of creating
* {@link org.apache.uima.cas.FSMatchConstraint FSMatchConstraints}.
*
* @return A constraint factory to create new FS constraints.
*/
ConstraintFactory getConstraintFactory();
/**
* Create a feature path. This is mainly useful for creating
* {@link org.apache.uima.cas.FSMatchConstraint FSMatchConstraints}.
*
* @return A new, empty feature path.
*/
FeaturePath createFeaturePath();
/**
* Get the index repository.
*
* @return The index repository, or <code>null</code> if none is available.
*/
FSIndexRepository getIndexRepository();
/**
* Wrap a standard Java {@link java.util.ListIterator ListIterator} around an FSListIterator. Use
* if you feel more comfortable with java style iterators.
*
* @param it
* The <code>FSListIterator</code> to be wrapped.
* @return An equivalent <code>ListIterator</code>.
*/
java.util.ListIterator fs2listIterator(FSIterator it);
/**
* Reset the CAS, emptying it of all content. Feature structures and iterators will no longer be
* valid. Note: this method may only be called from an application. Calling it from an annotator
* will trigger a runtime exception.
*
* @throws CASRuntimeException
* When called out of sequence.
* @see org.apache.uima.cas.admin.CASMgr
*/
void reset() throws CASAdminException;
/**
* Get the view name. The view name is the same as the name of the view's Sofa, retrieved by
* getSofa().getSofaID(), except for the initial View before its Sofa has been created.
*
* @return The name of the view
*/
String getViewName();
/**
* Estimate the memory consumption of this CAS instance (in bytes).
*
* @return The estimated memory used by this CAS instance.
*/
int size();
/**
* Create a feature-value path from a string.
*
* @param featureValuePath
* String representation of the feature-value path.
* @return Feature-value path object.
* @throws CASRuntimeException
* If the input string is not well-formed.
*/
FeatureValuePath createFeatureValuePath(String featureValuePath) throws CASRuntimeException;
/**
* Set the document text. Once set, Sofa data is immutable, and cannot be set again until the CAS
* has been reset.
*
* @param text
* The text to be analyzed.
* @exception CASRuntimeException
* If the Sofa data has already been set.
*/
void setDocumentText(String text) throws CASRuntimeException;
/**
* Set the document text. Once set, Sofa data is immutable, and cannot be set again until the CAS
* has been reset.
*
* @param text
* The text to be analyzed.
* @param mime
* The mime type of the data
* @exception CASRuntimeException
* If the Sofa data has already been set.
*/
void setSofaDataString(String text, String mimetype) throws CASRuntimeException;
/**
* Get the document text.
*
* @return The text being analyzed.
*/
String getDocumentText();
/**
* Get the Sofa Data String (a.k.a. the document text).
*
* @return The Sofa data string.
*/
String getSofaDataString();
/**
* Sets the language for this document. This value sets the language feature of the special
* instance of DocumentAnnotation associated with this CAS.
*
* @param languageCode
* @throws CASRuntimeException
*/
void setDocumentLanguage(String languageCode) throws CASRuntimeException;
/**
* Gets the language code for this document from the language feature of the special instance of
* the DocumentationAnnotation associated with this CAS.
*
* @return language identifier
*/
String getDocumentLanguage();
/**
* Set the Sofa data as an ArrayFS. Once set, Sofa data is immutable, and cannot be set again
* until the CAS has been reset.
*
* @param array
* The ArrayFS to be analyzed.
* @param mime
* The mime type of the data
* @exception CASRuntimeException
* If the Sofa data has already been set.
*/
void setSofaDataArray(FeatureStructure array, String mime) throws CASRuntimeException;
/**
* Get the Sofa data array.
*
* @return The Sofa Data being analyzed.
*/
FeatureStructure getSofaDataArray();
/**
* Set the Sofa data as a URI. Once set, Sofa data is immutable, and cannot be set again until the
* CAS has been reset.
*
* @param uri
* The URI of the data to be analyzed.
* @param mime
* The mime type of the data
* @exception CASRuntimeException
* If the Sofa data has already been set.
*/
void setSofaDataURI(String uri, String mime) throws CASRuntimeException;
/**
* Get the Sofa data array.
*
* @return The Sofa Data being analyzed.
*/
String getSofaDataURI();
/**
* Get the Sofa data as a byte stream.
*
* @return A stream handle to the Sofa Data.
*/
InputStream getSofaDataStream();
/**
* Get the mime type of the Sofa data being analyzed.
*
* @return the mime type of the Sofa
*/
String getSofaMimeType();
/**
* Add a feature structure to all appropriate indexes in the repository associated with this CAS
* View.
*
* <p>
* <b>Important</b>: after you have called <code>addFsToIndexes(...)</code> on a FS, do not
* change the values of any features used for indexing. If you do, the index will become corrupted
* and may be unusable. If you need to change an index feature value, first call
* {@link #removeFsFromIndexes(FeatureStructure) removeFsFromIndexes(...)} on the FS, change the
* feature values, then call <code>addFsToIndexes(...)</code> again.
*
* @param fs
* The Feature Structure to be added.
* @exception NullPointerException
* If the <code>fs</code> parameter is <code>null</code>.
*/
void addFsToIndexes(FeatureStructure fs);
/**
* Remove a feature structure from all indexes in the repository associated with this CAS View.
*
* @param fs
* The Feature Structure to be removed.
* @exception NullPointerException
* If the <code>fs</code> parameter is <code>null</code>.
*/
void removeFsFromIndexes(FeatureStructure fs);
/**
* Get the standard annotation index.
*
* @return The standard annotation index.
*/
AnnotationIndex getAnnotationIndex();
/**
* Get the standard annotation index restricted to a specific annotation type.
*
* @param type
* The annotation type the index is restricted to.
* @return The standard annotation index, restricted to <code>type</code>.
*/
AnnotationIndex getAnnotationIndex(Type type) throws CASRuntimeException;
/**
* Get the standard annotation index restricted to a specific annotation type.
*
* @param type
* The annotation type the index is restricted to,
* passed as an integer using the form
* MyAnnotationType.type
* @return The standard annotation index, restricted to <code>type</code>.
*/
AnnotationIndex getAnnotationIndex(int type) throws CASRuntimeException;
/**
* Get iterator over all views in this JCas. Each view provides access to Sofa data
* and the index repository that contains metadata (annotations and other feature
* structures) pertaining to that Sofa.
*
* @return an iterator which returns all views. Each object returned by
* the iterator is of type JCas.
*/
Iterator getViewIterator() throws CASException;
/**
* Get iterator over all views with the given name prefix. Each view provides access to Sofa data
* and the index repository that contains metadata (annotations and other feature
* structures) pertaining to that Sofa.
* <p>
* When passed the prefix <i>namePrefix</i>, the iterator will return all views who
* name is either exactly equal to <i>namePrefix</i> or is of the form
* <i>namePrefix</i><code>.</code><i>suffix</i>, where <i>suffix</i> can be any String.
*
* @param localViewNamePrefix the local name prefix, before any sofa name mapping
* is done, for this view (note: this is the same as the associated Sofa name prefix).
*
* @return an iterator which returns all views with the given name prefix.
* Each object returned by the iterator is of type JCas.
*/
Iterator getViewIterator(String localViewNamePrefix) throws CASException;
}