blob: ad6ea2c1b61604526d930cc914b6e1eaf3ded6e3 [file] [log] [blame]
/** \file casdefinition.cpp .
-----------------------------------------------------------------------------
* 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.
-----------------------------------------------------------------------------
Description:
-----------------------------------------------------------------------------
-------------------------------------------------------------------------- */
/* ----------------------------------------------------------------------- */
/* Include dependencies */
/* ----------------------------------------------------------------------- */
#include "uima/pragmas.hpp"
#include "xercesc/util/PlatformUtils.hpp"
#include "xercesc/parsers/XercesDOMParser.hpp"
#include "xercesc/parsers/SAXParser.hpp"
#include "xercesc/dom/DOMException.hpp"
#include "xercesc/dom/DOMNamedNodeMap.hpp"
#include "xercesc/dom/DOMDocument.hpp"
#include "xercesc/dom/DOMElement.hpp"
#include "xercesc/dom/DOMNodeList.hpp"
#include "xercesc/sax/ErrorHandler.hpp"
#include "xercesc/sax/AttributeList.hpp"
#include "xercesc/sax/SAXParseException.hpp"
#include "xercesc/framework/LocalFileInputSource.hpp"
#include "xercesc/framework/MemBufInputSource.hpp"
#include "uima/macros.h"
#include "uima/engine.hpp" // for exception declarations
#include "uima/msg.h"
#include "uima/casdefinition.hpp"
#include "uima/lowlevel_typesystem.hpp"
#include "uima/lowlevel_indexdefinition.hpp"
#include "uima/annotator_context.hpp"
#include "uima/resmgr.hpp"
#include "uima/taespecifierbuilder.hpp"
#include "uima/xmlerror_handler.hpp"
using namespace std;
/* ----------------------------------------------------------------------- */
/* Constants */
/* ----------------------------------------------------------------------- */
namespace uima {
lowlevel::TypeSystem::StTypeInfo gs_arCASTypes[] = {
{ CAS::TYPE_NAME_SOFA, CAS::TYPE_NAME_TOP, "Predefined sofa type"},
{ CAS::TYPE_NAME_ANNOTATION_BASE, CAS::TYPE_NAME_TOP, "Predefined annotation type"},
{ CAS::TYPE_NAME_ANNOTATION, CAS::TYPE_NAME_ANNOTATION_BASE, "Predefined annotation type"},
{ CAS::TYPE_NAME_DOCUMENT_ANNOTATION, CAS::TYPE_NAME_ANNOTATION, "Predefined document annotation type"},
};
lowlevel::TypeSystem::StFeatureInfo gs_arCASFeatures[] = {
{ CAS::FEATURE_BASE_NAME_SOFANUM, CAS::TYPE_NAME_SOFA, CAS::TYPE_NAME_INTEGER, false, "Predefined feature for sofa"},
{ CAS::FEATURE_BASE_NAME_SOFAID, CAS::TYPE_NAME_SOFA, CAS::TYPE_NAME_STRING, false, "Predefined feature for sofa"},
{ CAS::FEATURE_BASE_NAME_SOFAMIME, CAS::TYPE_NAME_SOFA, CAS::TYPE_NAME_STRING, false, "Predefined feature for sofa"},
{ CAS::FEATURE_BASE_NAME_SOFAARRAY, CAS::TYPE_NAME_LOCALSOFA, CAS::TYPE_NAME_TOP, false, "Predefined feature for sofa"},
{ CAS::FEATURE_BASE_NAME_SOFASTRING, CAS::TYPE_NAME_LOCALSOFA, CAS::TYPE_NAME_STRING, false, "Predefined feature for sofa"},
{ CAS::FEATURE_BASE_NAME_SOFAURI, CAS::TYPE_NAME_REMOTESOFA, CAS::TYPE_NAME_STRING, false, "Predefined feature for sofa"},
{ CAS::FEATURE_BASE_NAME_SOFA, CAS::TYPE_NAME_ANNOTATION, CAS::TYPE_NAME_SOFA, false, "Predefined sofaReference feature for annotations"},
{ CAS::FEATURE_BASE_NAME_BEGIN, CAS::TYPE_NAME_ANNOTATION, CAS::TYPE_NAME_INTEGER, false, "Predefined beginPosition feature for annotations"},
{ CAS::FEATURE_BASE_NAME_END, CAS::TYPE_NAME_ANNOTATION, CAS::TYPE_NAME_INTEGER, false, "Predefined endPosition feature for annotations"},
{ CAS::FEATURE_BASE_NAME_LANGUAGE, CAS::TYPE_NAME_DOCUMENT_ANNOTATION, CAS::TYPE_NAME_STRING, false, "Predefined language feature for document annotations"},
};
}
/* ----------------------------------------------------------------------- */
/* Forward declarations */
/* ----------------------------------------------------------------------- */
/* ----------------------------------------------------------------------- */
/* Types / Classes */
/* ----------------------------------------------------------------------- */
/* ----------------------------------------------------------------------- */
/* Implementation */
/* ----------------------------------------------------------------------- */
namespace uima {
namespace internal {
uima::lowlevel::TyFSType mergeType(uima::lowlevel::TypeSystem & rTypeSystem,
icu::UnicodeString const & crTypeToBeCreated,
TypeSystemDescription const & crTSDesc,
icu::UnicodeString const & crCreatorID) {
uima::lowlevel::TyFSType typeToBeCreated = rTypeSystem.getTypeByName(crTypeToBeCreated);
if (crTSDesc.hasTypeDescription(crTypeToBeCreated)) {
TypeDescription const * cpTypeDesc = crTSDesc.getTypeDescription(crTypeToBeCreated);
icu::UnicodeString const & crSuperTypeName = cpTypeDesc->getSuperTypeName();
// first merge the parent
uima::lowlevel::TyFSType parent = mergeType(rTypeSystem, crSuperTypeName, crTSDesc, crCreatorID);
// if string sub type
if (parent == uima::internal::gs_tyStringType) {
TypeDescription::TyVecpAllowedValues const & crAllowedValues = cpTypeDesc->getAllowedValues();
vector<icu::UnicodeString> allowedStringValues;
TypeDescription::TyVecpAllowedValues::const_iterator cit;
for (cit = crAllowedValues.begin(); cit != crAllowedValues.end(); ++cit) {
AllowedValue const * cpAllowedVal = (*cit);
allowedStringValues.push_back( cpAllowedVal->getName() );
}
if (typeToBeCreated == uima::lowlevel::TypeSystem::INVALID_TYPE) {
// create new string subtype
return rTypeSystem.createStringSubtype(crTypeToBeCreated, allowedStringValues, crCreatorID);
} else {
// check string subtype
vector<icu::UnicodeString> const & crStringValues = rTypeSystem.getStringsForStringSubtype(typeToBeCreated);
bool bAreStringSetsEqual = false;
if (crStringValues.size() == crAllowedValues.size()) {
size_t i,j;
size_t uiStringNum = crStringValues.size();
bAreStringSetsEqual = true;
for (i=0; i<uiStringNum; ++i) {
icu::UnicodeString const & crString = crStringValues[i];
// check that string occurs in the allowed values
bool bContainsString = false;
for (j=0; j<uiStringNum; ++j) {
if (crString != allowedStringValues[j]) {
bContainsString = true;
break;
}
}
if (! bContainsString) {
bAreStringSetsEqual = false;
break;
}
}
}
if (! bAreStringSetsEqual) {
// throw exception
// allowed values are different
UIMA_EXC_THROW_NEW(AllowedStringValuesIncompatibleException,
UIMA_ERR_ALLOWED_STRING_VALUES_INCOMPATIBLE,
ErrorMessage(UIMA_MSG_ID_EXC_ALLOWED_STRING_VALUES_INCOMPATIBLE, crTypeToBeCreated),
ErrorMessage(UIMA_MSG_ID_EXCON_CREATING_TYPESYSTEM_FROM_CONFIG),
ErrorInfo::recoverable);
return 0;
}
}
} else {
assert(parent != uima::lowlevel::TypeSystem::INVALID_TYPE);
if (typeToBeCreated == uima::lowlevel::TypeSystem::INVALID_TYPE) {
return rTypeSystem.createType(parent, crTypeToBeCreated, crCreatorID);
} else {
if (parent != rTypeSystem.getParentType(typeToBeCreated)) {
UIMA_EXC_THROW_NEW(IncompatibleParentTypesException,
UIMA_ERR_INCOMPATIBLE_PARENT_TYPES,
ErrorMessage(UIMA_MSG_ID_EXC_WRONG_PARENT_TYPE, crTypeToBeCreated),
ErrorMessage(UIMA_MSG_ID_EXCON_CREATING_TYPESYSTEM_FROM_CONFIG),
ErrorInfo::recoverable);
return 0;
}
}
}
return typeToBeCreated;
}
if (typeToBeCreated == uima::lowlevel::TypeSystem::INVALID_TYPE) {
// unknown type in XML file
UIMA_EXC_THROW_NEW(UnknownTypeException,
UIMA_ERR_UNKNOWN_TYPE,
ErrorMessage(UIMA_MSG_ID_EXC_UNKNOWN_TYPE_NAME, crTypeToBeCreated),
ErrorMessage(UIMA_MSG_ID_EXCON_CREATING_TYPESYSTEM_FROM_CONFIG),
ErrorInfo::recoverable);
}
return typeToBeCreated;
}
void CASDefinition::mergeTypeSystem(AnalysisEngineDescription const & crTAESpecifier) {
icu::UnicodeString const & crCreatorID = crTAESpecifier.getAnalysisEngineMetaData()->getName();
TypeSystemDescription const * crTSDesc = crTAESpecifier.getAnalysisEngineMetaData()->getTypeSystemDescription();
mergeTypeSystem(*crTSDesc,crCreatorID);
}
void CASDefinition::addTypePriorities(AnalysisEngineDescription const & crTAESpecifier) {
uima::AnalysisEngineMetaData::TyVecpTypePriorities const & crTypePriorities = crTAESpecifier.getAnalysisEngineMetaData()->getTypePriorities();
addTypePriorities(crTypePriorities);
}
void CASDefinition::createIndexesFromANC(AnnotatorContext const & crANC) {
AnalysisEngineMetaData::TyVecpFSIndexDescriptions const & crIndexDescVec = crANC.getFSIndexDescriptions();
createIndexesFromSpecifier(crIndexDescVec);
}
CASDefinition * CASDefinition::createCASDefinition(AnnotatorContext const & anc) {
CASDefinition * result = new CASDefinition(& anc);
assert( EXISTS(result) );
result->init();
result->commit();
return result;
}
void CASDefinition::init() {
createTypes();
}
void CASDefinition::commitTypeSystem() {
iv_typeSystem->commit();
createIndexes();
}
void CASDefinition::commitIndexDefinition() {
iv_indexDefinition->commit();
}
void CASDefinition::commit() {
commitTypeSystem();
commitIndexDefinition();
}
void CASDefinition::createTypes() {
createPredefinedCASTypes();
if ( iv_annotatorContext != NULL ) {
mergeTypeSystem(iv_annotatorContext->getTaeSpecifier());
addTypePriorities(iv_annotatorContext->getTaeSpecifier());
}
}
void CASDefinition::createIndexes() {
createPredefinedCASIndexes();
if ( iv_annotatorContext != NULL ) {
createIndexesFromANC(*iv_annotatorContext);
}
}
void CASDefinition::createPredefinedCASTypes() {
// the CAS predefined types are created in lowlevel::TypeSystem CTOR
// add CAS types here
assert( EXISTS(iv_typeSystem) );
size_t uiType;
for (uiType = 0; uiType < NUMBEROF(gs_arCASTypes); ++uiType) {
lowlevel::TyFSType tyNewType = iv_typeSystem->createType( gs_arCASTypes[uiType], CAS::ustrCREATOR_ID_CAS );
assert( iv_typeSystem->isValidType(tyNewType) );
}
size_t uiFeature;
for (uiFeature = 0; uiFeature < NUMBEROF(gs_arCASFeatures); ++uiFeature) {
lowlevel::TyFSFeature tyNewFeature = iv_typeSystem->createFeature( gs_arCASFeatures[uiFeature], CAS::ustrCREATOR_ID_CAS );
assert( iv_typeSystem->isValidFeature(tyNewFeature) );
}
}
void CASDefinition::createPredefinedCASIndexes() {
assert( EXISTS(iv_typeSystem) );
assert( EXISTS(iv_indexDefinition) );
vector<lowlevel::TyFSFeature> vecKeyFeats;
vector<uima::lowlevel::IndexComparator::EnKeyFeatureComp> vecComparators;
// create sofa index
UIMA_TPRINT("creating sofa index");
vecKeyFeats.clear();
vecComparators.clear();
vecKeyFeats.push_back( uima::internal::gs_tySofaNumFeature );
vecComparators.push_back( uima::lowlevel::IndexComparator::STANDARD_COMPARE );
assert( iv_typeSystem->isValidType( iv_typeSystem->getTypeByName(CAS::TYPE_NAME_SOFA) ) );
iv_indexDefinition->defineIndex( uima::lowlevel::IndexDefinition::enSet,
iv_typeSystem->getTypeByName(CAS::TYPE_NAME_SOFA),
vecKeyFeats,
vecComparators,
CAS::INDEXID_SOFA);
// create annotation index
UIMA_TPRINT("creating default annotation index");
vecKeyFeats.clear();
vecComparators.clear();
assert( areTypeShortcutsCorrect(*iv_typeSystem) );
vecKeyFeats.push_back( uima::internal::gs_tyBeginPosFeature );
vecComparators.push_back( uima::lowlevel::IndexComparator::STANDARD_COMPARE );
vecKeyFeats.push_back( uima::internal::gs_tyEndPosFeature );
vecComparators.push_back( uima::lowlevel::IndexComparator::REVERSE_STANDARD_COMPARE );
vecKeyFeats.push_back( uima::lowlevel::TypeSystem::INVALID_FEATURE ); // means that type priority should be respected
vecComparators.push_back( uima::lowlevel::IndexComparator::STANDARD_COMPARE );
assert( iv_typeSystem->isValidType( iv_typeSystem->getTypeByName(CAS::TYPE_NAME_ANNOTATION) ) );
iv_indexDefinition->defineIndex( uima::lowlevel::IndexDefinition::enOrdered,
iv_typeSystem->getTypeByName(CAS::TYPE_NAME_ANNOTATION),
vecKeyFeats,
vecComparators,
CAS::INDEXID_ANNOTATION);
}
CASDefinition::CASDefinition(AnnotatorContext const * anc)
: iv_typeSystem(NULL),
iv_indexDefinition(NULL),
iv_annotatorContext(anc) {
iv_typeSystem = new uima::lowlevel::TypeSystem();
bOwnsTypeSystem = true;
assert( EXISTS(iv_typeSystem) );
iv_indexDefinition = new uima::lowlevel::IndexDefinition(*iv_typeSystem);
assert( EXISTS(iv_indexDefinition) );
}
CASDefinition::~CASDefinition() {
if (iv_typeSystem != NULL && bOwnsTypeSystem) {
delete iv_typeSystem;
}
if (iv_indexDefinition != NULL) {
delete iv_indexDefinition;
}
}
uima::lowlevel::TypeSystem & CASDefinition::getTypeSystem() {
assert( EXISTS(iv_typeSystem) );
return *iv_typeSystem;
}
uima::lowlevel::TypeSystem const & CASDefinition::getTypeSystem() const {
assert( EXISTS(iv_typeSystem) );
return *iv_typeSystem;
}
uima::lowlevel::IndexDefinition & CASDefinition::getIndexDefinition() {
assert(EXISTS(iv_indexDefinition));
return *iv_indexDefinition;
}
uima::lowlevel::IndexDefinition const & CASDefinition::getIndexDefinition() const {
assert(EXISTS(iv_indexDefinition));
return *iv_indexDefinition;
}
void CASDefinition::mergeTypeSystem(TypeSystemDescription const & crTSDesc,
icu::UnicodeString const & crCreatorID) {
//icu::UnicodeString const & crCreatorID = crAEMDSpecifier.getName();
uima::lowlevel::TypeSystem & rTypeSystem = * iv_typeSystem;
TypeSystemDescription::TyVecpTypeDescriptions const & crTypeDescVector = crTSDesc.getTypeDescriptions();
TypeSystemDescription::TyVecpTypeDescriptions::const_iterator cit;
// create types
for (cit = crTypeDescVector.begin(); cit != crTypeDescVector.end(); ++cit) {
TypeDescription const * pTypeDesc = *cit;
icu::UnicodeString const & crTypeName = pTypeDesc->getName();
mergeType( rTypeSystem, crTypeName, crTSDesc, crCreatorID );
}
// create features
for (cit = crTypeDescVector.begin(); cit != crTypeDescVector.end(); ++cit) {
TypeDescription const * pTypeDesc = *cit;
uima::lowlevel::TyFSType introType = rTypeSystem.getTypeByName( pTypeDesc->getName() );
// type must have been merged before
assert( rTypeSystem.isValidType(introType) );
TypeDescription::TyVecpFeatureDescriptions const & crFeatDescs = pTypeDesc->getFeatureDescriptions();
TypeDescription::TyVecpFeatureDescriptions::const_iterator citFeats;
// for all features introduced on introType
for (citFeats = crFeatDescs.begin(); citFeats != crFeatDescs.end(); ++ citFeats) {
FeatureDescription const * pFeatDesc = *citFeats;
icu::UnicodeString const & crFeatureName = pFeatDesc->getName();
icu::UnicodeString const & crRangeTypeName = pFeatDesc->getRangeTypeName();
bool multiRefs = pFeatDesc->isMultipleReferencesAllowed();
uima::lowlevel::TyFSType rangeType = rTypeSystem.getTypeByName(crRangeTypeName);
if ( !rTypeSystem.isValidType(rangeType) ) {
// throw exception
// unknown range type
ErrorMessage errMessage(UIMA_MSG_ID_EXC_INVALID_RANGE_TYPE, crFeatureName);
errMessage.addParam( crRangeTypeName );
UIMA_EXC_THROW_NEW(UnknownRangeTypeException,
UIMA_ERR_UNKNOWN_RANGE_TYPE,
errMessage,
ErrorMessage(UIMA_MSG_ID_EXCON_CREATING_TYPESYSTEM_FROM_CONFIG),
ErrorInfo::recoverable);
}
uima::lowlevel::TyFSFeature feat = rTypeSystem.getFeatureByBaseName( introType, crFeatureName );
// if feature exists
if ( rTypeSystem.isValidFeature(feat) ) {
// check that range type is correct
uima::lowlevel::TyFSType actualRangeType = rTypeSystem.getRangeType(feat);
if (actualRangeType != rangeType) {
// throw exception
// incorrect range type of existing feature
ErrorMessage errMessage(UIMA_MSG_ID_EXC_INCOMPATIBLE_RANGE_TYPE, crFeatureName);
errMessage.addParam( crRangeTypeName );
UIMA_EXC_THROW_NEW(IncompatibleRangeTypeException,
UIMA_ERR_INCOMPATIBLE_RANGE_TYPE,
errMessage,
ErrorMessage(UIMA_MSG_ID_EXCON_CREATING_TYPESYSTEM_FROM_CONFIG),
ErrorInfo::recoverable);
}
} else {
// create feature
rTypeSystem.createFeature(introType, rangeType, multiRefs, crFeatureName, crCreatorID);
}
}
}
}
void CASDefinition::addTypePriorities(uima::AnalysisEngineMetaData::TyVecpTypePriorities const & crTypePriorities) {
uima::lowlevel::TypeSystem & rTypeSystem = *iv_typeSystem;
//uima::AnalysisEngineMetaData::TyVecpTypePriorities const & crTypePriorities = crAEMDSpecifier.getTypePriorities();
uima::AnalysisEngineMetaData::TyVecpTypePriorities::const_iterator cit;
// for all type priority chains
for (cit = crTypePriorities.begin(); cit != crTypePriorities.end(); ++cit) {
TypePriority const * cpTypePriority = *cit;
assert( EXISTS(cpTypePriority) );
vector<icu::UnicodeString> const & crTypeChain = cpTypePriority->getTypeOrder();
size_t i;
// walk along the chain
for (i=0; i<crTypeChain.size()-1; ++i) {
uima::lowlevel::TyFSType t1 = rTypeSystem.getTypeByName(crTypeChain[i]);
if (t1 == uima::lowlevel::TypeSystem::INVALID_TYPE) {
UIMA_EXC_THROW_NEW(UnknownTypeException,
UIMA_ERR_UNKNOWN_TYPE,
ErrorMessage(UIMA_MSG_ID_EXC_UNKNOWN_TYPE_NAME, crTypeChain[i]),
ErrorMessage(UIMA_MSG_ID_EXCON_CREATING_TYPEPRIORITIES_FROM_CONFIG),
ErrorInfo::recoverable);
}
uima::lowlevel::TyFSType t2 = rTypeSystem.getTypeByName(crTypeChain[i+1]);
if (t2 == uima::lowlevel::TypeSystem::INVALID_TYPE) {
UIMA_EXC_THROW_NEW(UnknownTypeException,
UIMA_ERR_UNKNOWN_TYPE,
ErrorMessage(UIMA_MSG_ID_EXC_UNKNOWN_TYPE_NAME, crTypeChain[i+1]),
ErrorMessage(UIMA_MSG_ID_EXCON_CREATING_TYPEPRIORITIES_FROM_CONFIG),
ErrorInfo::recoverable);
}
// t1 should have priority over t2
bool bTPCouldBeAdded = rTypeSystem.addTypePriority(t1, t2);
if (!bTPCouldBeAdded) {
ErrorMessage errMsg(UIMA_MSG_ID_EXC_TYPE_PRIORITY_CONFLICT);
errMsg.addParam( crTypeChain[i] );
errMsg.addParam( crTypeChain[i+1] );
UIMA_EXC_THROW_NEW(TypePriorityConflictException,
UIMA_ERR_TYPE_PRIORITY_CONFLICT,
errMsg,
ErrorMessage(UIMA_MSG_ID_EXCON_CREATING_TYPEPRIORITIES_FROM_CONFIG),
ErrorInfo::recoverable);
}
}
}
}
void CASDefinition::createIndexesFromSpecifier(AnalysisEngineMetaData::TyVecpFSIndexDescriptions const & crIndexDescVec) {
uima::lowlevel::TypeSystem const & crTypeSystem = *iv_typeSystem;
vector<uima::lowlevel::TyFSFeature> keyFeatures;
vector<uima::lowlevel::IndexComparator::EnKeyFeatureComp> comparators;
AnalysisEngineMetaData::TyVecpFSIndexDescriptions::const_iterator citIndex;
// for all index descriptions
for (citIndex = crIndexDescVec.begin(); citIndex != crIndexDescVec.end(); ++citIndex) {
FSIndexDescription const * cpIndexDesc = *citIndex;
// determine index kind
FSIndexDescription::EnIndexKind indexDescKind = cpIndexDesc->getIndexKind();
uima::lowlevel::IndexDefinition::EnIndexKind kind = uima::lowlevel::IndexDefinition::enOrdered;
switch (indexDescKind) {
case FSIndexDescription::SORTED:
kind = uima::lowlevel::IndexDefinition::enOrdered;
break;
case FSIndexDescription::SET:
kind = uima::lowlevel::IndexDefinition::enSet;
break;
case FSIndexDescription::BAG:
kind = uima::lowlevel::IndexDefinition::enFIFO;
break;
default:
assert(false);
}
icu::UnicodeString const & crTypeName = cpIndexDesc->getTypeName();
// type is the type the index is defined on
uima::lowlevel::TyFSType type = crTypeSystem.getTypeByName(crTypeName);
if (! crTypeSystem.isValidType(type) ) {
UIMA_EXC_THROW_NEW(UnknownTypeException,
UIMA_ERR_UNKNOWN_TYPE,
ErrorMessage(UIMA_MSG_ID_EXC_UNKNOWN_TYPE_NAME, crTypeName),
ErrorMessage(UIMA_MSG_ID_EXCON_CREATING_INDEXES_FROM_CONFIG),
ErrorInfo::recoverable);
}
icu::UnicodeString const & crIndexLabel = cpIndexDesc->getLabel();
// determine key features and comparison scheme for each feature
keyFeatures.clear();
comparators.clear();
uima::FSIndexDescription::TyVecpFSIndexKeys const & crIndexKeys = cpIndexDesc->getFSIndexKeys();
uima::FSIndexDescription::TyVecpFSIndexKeys::const_iterator citKeys;
// for each key feature
for (citKeys = crIndexKeys.begin(); citKeys != crIndexKeys.end(); ++citKeys) {
FSIndexKeyDescription const * cpIndexKeyDesc = *citKeys;
uima::lowlevel::TyFSFeature feat;
bool bIsTypePriority = cpIndexKeyDesc->isTypePriority();
if ( ! bIsTypePriority) {
icu::UnicodeString const & crFeatureName = cpIndexKeyDesc->getFeatureName();
feat = crTypeSystem.getFeatureByBaseName( type, crFeatureName);
if (! crTypeSystem.isValidFeature(feat) ) {
UIMA_EXC_THROW_NEW(UnknownFeatureException,
UIMA_ERR_UNKNOWN_FEATURE,
ErrorMessage(UIMA_MSG_ID_EXC_UNKNOWN_FEATURE_NAME, crFeatureName),
ErrorMessage(UIMA_MSG_ID_EXCON_CREATING_INDEXES_FROM_CONFIG),
ErrorInfo::recoverable);
}
assert( crTypeSystem.isValidFeature(feat) );
} else {
// use INVALID_FEATURE as a marker for type priority
feat = uima::lowlevel::TypeSystem::INVALID_FEATURE;
}
keyFeatures.push_back(feat);
FSIndexKeyDescription::EnComparatorType enComp = FSIndexKeyDescription::STANDARD;
// this if statement is not necessary when type priorities can have different kind of comparators!!
if (! bIsTypePriority) {
enComp = cpIndexKeyDesc->getComparator();
}
switch (enComp) {
case FSIndexKeyDescription::STANDARD:
comparators.push_back( uima::lowlevel::IndexComparator::STANDARD_COMPARE );
break;
case FSIndexKeyDescription::REVERSE:
comparators.push_back( uima::lowlevel::IndexComparator::REVERSE_STANDARD_COMPARE );
break;
default:
assert(false);
}
}
iv_indexDefinition->defineIndex( kind,
type,
keyFeatures,
comparators,
crIndexLabel );
}
}
//creates typesystem and index definition
CASDefinition * CASDefinition::createCASDefinition(AnalysisEngineDescription const & taeSpecifier) {
//resolve imports
if (taeSpecifier.isModifiable() ) {
AnalysisEngineDescription & taespec = CONST_CAST(AnalysisEngineDescription &, taeSpecifier);
taespec.commit();
}
CASDefinition * result = new CASDefinition(taeSpecifier);
assert( EXISTS(result) );
//result->init();
result->createPredefinedCASTypes();
result->mergeTypeSystem(*taeSpecifier.getAnalysisEngineMetaData()->getTypeSystemDescription(),
taeSpecifier.getAnalysisEngineMetaData()->getName());
result->addTypePriorities(taeSpecifier.getAnalysisEngineMetaData()->getTypePriorities());
//result->commit();
result->commitTypeSystemOnly();
result->createPredefinedCASIndexes();
result->createIndexesFromSpecifier(taeSpecifier.getAnalysisEngineMetaData()->getFSIndexDescriptions());
result->commitIndexDefinition();
return result;
}
//creates typesystem and index definition from
CASDefinition * CASDefinition::createCASDefinition(AnalysisEngineMetaData const & aeDesc) {
if (aeDesc.isModifiable()) {
AnalysisEngineMetaData & ae = CONST_CAST(AnalysisEngineMetaData &, aeDesc);
ae.commit();
}
CASDefinition * result = new CASDefinition();
assert( EXISTS(result) );
result->createPredefinedCASTypes();
//result->mergeTypeSystem(casSpecifier);
result->mergeTypeSystem(*aeDesc.getTypeSystemDescription(),
aeDesc.getName());
result->addTypePriorities(aeDesc.getTypePriorities());
result->commitTypeSystemOnly();
result->createPredefinedCASIndexes();
result->createIndexesFromSpecifier(aeDesc.getFSIndexDescriptions());
result->commitIndexDefinition();
return result;
}
//creates a CASDefinition with input TypeSystem object and creates index definition
//based on the specifications
CASDefinition * CASDefinition::createCASDefinition(uima::TypeSystem & typeSystem,
AnalysisEngineMetaData const & aeDesc) {
CASDefinition * result = new CASDefinition(typeSystem);
assert( EXISTS(result) );
result->createPredefinedCASIndexes();
result->createIndexesFromSpecifier(aeDesc.getFSIndexDescriptions());
result->commitIndexDefinition();
return result;
}
CASDefinition * CASDefinition::createCASDefinition(TypeSystem & typeSystem,
AnalysisEngineMetaData::TyVecpFSIndexDescriptions const & fsDesc,
AnalysisEngineMetaData::TyVecpTypePriorities const & prioDesc) {
CASDefinition * result = new CASDefinition(typeSystem);
assert( EXISTS(result) );
result->createPredefinedCASIndexes();
result->createIndexesFromSpecifier(fsDesc);
//TODO: addTypePriorities
result->commitIndexDefinition();
return result;
}
CASDefinition * CASDefinition::createCASDefinition(TypeSystem & typeSystem,
AnalysisEngineMetaData::TyVecpFSIndexDescriptions const & fsDesc) {
CASDefinition * result = new CASDefinition(typeSystem);
assert( EXISTS(result) );
result->createPredefinedCASIndexes();
result->createIndexesFromSpecifier(fsDesc);
result->commitIndexDefinition();
return result;
}
//creates a CASDefition based on input TypeSystem and creates the default/builtin index definition
CASDefinition * CASDefinition::createCASDefinition(uima::TypeSystem & typeSystem) {
CASDefinition * result = new CASDefinition(typeSystem);
assert( EXISTS(result) );
result->createPredefinedCASIndexes();
result->commitIndexDefinition();
return result;
}
uima::lowlevel::TypeSystem * CASDefinition::createTypeSystem(AnalysisEngineMetaData const & casSpecifier) {
uima::lowlevel::TypeSystem * pTypeSystem = new uima::lowlevel::TypeSystem();
assert( EXISTS(pTypeSystem) );
CASDefinition * result = new CASDefinition(*pTypeSystem);
assert( EXISTS(result) );
result->createPredefinedCASTypes();
result->mergeTypeSystem(*casSpecifier.getTypeSystemDescription(),
casSpecifier.getName());
result->addTypePriorities(casSpecifier.getTypePriorities());
pTypeSystem->commit();
delete result;
return pTypeSystem;
}
uima::lowlevel::TypeSystem * CASDefinition::createTypeSystem(TypeSystemDescription const & crTSDesc,
icu::UnicodeString const & tsName) {
//resolve imports
if (crTSDesc.isModifiable() ) {
TypeSystemDescription & tsDesc = CONST_CAST(TypeSystemDescription &, crTSDesc);
tsDesc.commit();
}
uima::lowlevel::TypeSystem * pTypeSystem = new uima::lowlevel::TypeSystem();
assert( EXISTS(pTypeSystem) );
CASDefinition * result = new CASDefinition(*pTypeSystem);
assert( EXISTS(result) );
result->createPredefinedCASTypes();
result->mergeTypeSystem(crTSDesc, tsName);
//result->addTypePriorities(casSpecifier);
pTypeSystem->commit();
delete result;
return pTypeSystem;
}
uima::lowlevel::TypeSystem * CASDefinition::createTypeSystem(TypeSystemDescription const & crTSDesc,
AnalysisEngineMetaData::TyVecpTypePriorities const & typePriorities,
icu::UnicodeString const & tsName) {
//resolve imports
if (crTSDesc.isModifiable() ) {
TypeSystemDescription & tsDesc = CONST_CAST(TypeSystemDescription &, crTSDesc);
tsDesc.commit();
}
uima::lowlevel::TypeSystem * pTypeSystem = new uima::lowlevel::TypeSystem();
assert( EXISTS(pTypeSystem) );
CASDefinition * result = new CASDefinition(*pTypeSystem);
assert( EXISTS(result) );
result->createPredefinedCASTypes();
result->mergeTypeSystem(crTSDesc, tsName);
result->addTypePriorities(typePriorities);
pTypeSystem->commit();
delete result;
return pTypeSystem;
}
void CASDefinition::commitTypeSystemOnly() {
iv_typeSystem->commit();
}
CASDefinition::CASDefinition(AnalysisEngineDescription const & taeSpecifier)
: iv_typeSystem(NULL),
iv_indexDefinition(NULL),
iv_annotatorContext(NULL) {
//resolve imports
if (taeSpecifier.isModifiable() ) {
AnalysisEngineDescription & taespec = CONST_CAST(AnalysisEngineDescription &, taeSpecifier);
taespec.commit();
}
iv_typeSystem = new uima::lowlevel::TypeSystem();
bOwnsTypeSystem = true;
assert( EXISTS(iv_typeSystem) );
iv_indexDefinition = new uima::lowlevel::IndexDefinition(*iv_typeSystem);
assert( EXISTS(iv_indexDefinition) );
}
CASDefinition::CASDefinition(uima::TypeSystem & typeSystem)
: iv_typeSystem(NULL),
iv_indexDefinition(NULL),
iv_annotatorContext(NULL) {
iv_typeSystem= (uima::lowlevel::TypeSystem*) &typeSystem;
assert( EXISTS(iv_typeSystem) );
iv_indexDefinition = new uima::lowlevel::IndexDefinition(*iv_typeSystem);
assert( EXISTS(iv_indexDefinition) );
bOwnsTypeSystem = false;
}
CASDefinition::CASDefinition()
: iv_typeSystem(NULL),
iv_indexDefinition(NULL),
iv_annotatorContext(NULL) {
iv_typeSystem = new uima::lowlevel::TypeSystem();
bOwnsTypeSystem = true;
assert( EXISTS(iv_typeSystem) );
iv_indexDefinition = new uima::lowlevel::IndexDefinition(*iv_typeSystem);
assert( EXISTS(iv_indexDefinition) );
}
}
}