blob: 2003cb629f973f8505750128ce2b4f9f2a34b8c1 [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.tools.jcasgen;
import java.util.Iterator;
import org.apache.uima.resource.metadata.TypeDescription;
import org.apache.uima.resource.metadata.FeatureDescription;
public class JCas_TypeTemplate implements Jg.IJCasTypeTemplate {
public String generate(Object argument) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("\n");
Object [] args = (Object [])argument;
Jg jg = (Jg)args[0];
TypeDescription td = (TypeDescription)args[1];
jg.packageName = jg.getJavaPkg(td);
stringBuffer.append("/* First created by JCasGen ");
stringBuffer.append(jg.getDate());
stringBuffer.append(" */\n");
if (0 != jg.packageName.length()) {
stringBuffer.append("package ");
stringBuffer.append(jg.packageName);
stringBuffer.append(";\n");
}
stringBuffer.append("\nimport org.apache.uima.jcas.JCas;\nimport org.apache.uima.jcas.JCasRegistry;\nimport org.apache.uima.cas.impl.CASImpl;\nimport org.apache.uima.cas.impl.FSGenerator;\nimport org.apache.uima.cas.FeatureStructure;\nimport org.apache.uima.cas.impl.TypeImpl;\nimport org.apache.uima.cas.Type;\n");
if (td.getFeatures().length > 0) {
stringBuffer.append("import org.apache.uima.cas.impl.FeatureImpl;\nimport org.apache.uima.cas.Feature;\n");
}
stringBuffer.append("");
for(Iterator i=jg.collectImports(td, true).iterator(); i.hasNext();) {
String imp = (String)i.next();
if (!imp.equals(jg.getJavaNameWithPkg(td.getName()+"_Type"))) {
stringBuffer.append("import ");
stringBuffer.append(imp);
stringBuffer.append(";\n");
}}
stringBuffer.append("\n");
String typeName = jg.getJavaName(td);
String typeName_Type = typeName + "_Type";
stringBuffer.append("/** ");
stringBuffer.append(jg.nullBlank(td.getDescription()));
stringBuffer.append("\n * Updated by JCasGen ");
stringBuffer.append(jg.getDate());
stringBuffer.append("\n * @generated */\npublic class ");
stringBuffer.append(typeName_Type);
stringBuffer.append(" extends ");
stringBuffer.append(jg.getJavaName(td.getSupertypeName()) + "_Type");
stringBuffer.append(" {\n /** @generated */\n protected FSGenerator getFSGenerator() {return fsGenerator;}\n /** @generated */\n private final FSGenerator fsGenerator = \n new FSGenerator() {\n public FeatureStructure createFS(int addr, CASImpl cas) {\n if (");
stringBuffer.append(typeName_Type);
stringBuffer.append(".this.useExistingInstance) {\n // Return eq fs instance if already created\n FeatureStructure fs = ");
stringBuffer.append(typeName_Type);
stringBuffer.append(".this.jcas.getJfsFromCaddr(addr);\n if (null == fs) {\n fs = new ");
stringBuffer.append(typeName);
stringBuffer.append("(addr, ");
stringBuffer.append(typeName_Type);
stringBuffer.append(".this);\n ");
stringBuffer.append(typeName_Type);
stringBuffer.append(".this.jcas.putJfsFromCaddr(addr, fs);\n return fs;\n }\n return fs;\n } else return new ");
stringBuffer.append(typeName);
stringBuffer.append("(addr, ");
stringBuffer.append(typeName_Type);
stringBuffer.append(".this);\n }\n };\n /** @generated */\n public final static int typeIndexID = ");
stringBuffer.append(typeName);
stringBuffer.append(".typeIndexID;\n /** @generated \n @modifiable */\n public final static boolean featOkTst = JCasRegistry.getFeatOkTst(\"");
stringBuffer.append(td.getName());
stringBuffer.append("\");\n");
FeatureDescription [] fds = td.getFeatures();
for (int i = 0; i < fds.length; i++) {
FeatureDescription fd = fds[i];
String featName = fd.getName();
String featUName = jg.uc1(featName); // upper case first letter
String rangeType = jg.getJavaRangeType(fd);
String getSetNamePart = jg.sc(rangeType);
String returnType = getSetNamePart.equals("Ref") ? "int" : rangeType;
String getSetArrayNamePart = jg.getGetSetArrayNamePart(fd);
String elemType = jg.getJavaRangeArrayElementType(fd);
if (jg.sc(elemType).equals("Ref"))
elemType = "int";
String casFeatCode = "casFeatCode_" + featName;
stringBuffer.append(" \n /** @generated */\n final Feature casFeat_");
stringBuffer.append(featName);
stringBuffer.append(";\n /** @generated */\n final int ");
stringBuffer.append(casFeatCode);
stringBuffer.append(";\n /** @generated */ \n public ");
stringBuffer.append(returnType);
stringBuffer.append(" get");
stringBuffer.append(featUName);
stringBuffer.append("(int addr) {\n ");
stringBuffer.append("");
/* checks to insure that cas has the feature */
stringBuffer.append(" if (featOkTst && casFeat_");
stringBuffer.append(featName);
stringBuffer.append(" == null)\n jcas.throwFeatMissing(\"");
stringBuffer.append(featName);
stringBuffer.append("\", \"");
stringBuffer.append(td.getName());
stringBuffer.append("\");\n");
stringBuffer.append(" return ll_cas.ll_get");
stringBuffer.append(getSetNamePart);
stringBuffer.append("Value(addr, ");
stringBuffer.append(casFeatCode);
stringBuffer.append(");\n }\n /** @generated */ \n public void set");
stringBuffer.append(featUName);
stringBuffer.append("(int addr, ");
stringBuffer.append(returnType);
stringBuffer.append(" v) {\n ");
stringBuffer.append("");
/* checks to insure that cas has the feature */
stringBuffer.append(" if (featOkTst && casFeat_");
stringBuffer.append(featName);
stringBuffer.append(" == null)\n jcas.throwFeatMissing(\"");
stringBuffer.append(featName);
stringBuffer.append("\", \"");
stringBuffer.append(td.getName());
stringBuffer.append("\");\n");
stringBuffer.append(" ll_cas.ll_set");
stringBuffer.append(getSetNamePart);
stringBuffer.append("Value(addr, ");
stringBuffer.append(casFeatCode);
stringBuffer.append(", v);}\n \n ");
if (jg.hasArrayRange(fd)) {
stringBuffer.append(" /** @generated */\n public ");
stringBuffer.append(elemType);
stringBuffer.append(" get");
stringBuffer.append(featUName);
stringBuffer.append("(int addr, int i) {\n ");
stringBuffer.append("");
/* checks to insure that cas has the feature */
stringBuffer.append(" if (featOkTst && casFeat_");
stringBuffer.append(featName);
stringBuffer.append(" == null)\n jcas.throwFeatMissing(\"");
stringBuffer.append(featName);
stringBuffer.append("\", \"");
stringBuffer.append(td.getName());
stringBuffer.append("\");\n");
stringBuffer.append(" if (lowLevelTypeChecks)\n return ll_cas.ll_get");
stringBuffer.append(getSetArrayNamePart);
stringBuffer.append("ArrayValue(ll_cas.ll_getRefValue(addr, ");
stringBuffer.append(casFeatCode);
stringBuffer.append("), i, true);\n jcas.checkArrayBounds(ll_cas.ll_getRefValue(addr, ");
stringBuffer.append(casFeatCode);
stringBuffer.append("), i);\n return ll_cas.ll_get");
stringBuffer.append(getSetArrayNamePart);
stringBuffer.append("ArrayValue(ll_cas.ll_getRefValue(addr, ");
stringBuffer.append(casFeatCode);
stringBuffer.append("), i);\n }\n \n /** @generated */ \n public void set");
stringBuffer.append(featUName);
stringBuffer.append("(int addr, int i, ");
stringBuffer.append(elemType);
stringBuffer.append(" v) {\n ");
stringBuffer.append("");
/* checks to insure that cas has the feature */
stringBuffer.append(" if (featOkTst && casFeat_");
stringBuffer.append(featName);
stringBuffer.append(" == null)\n jcas.throwFeatMissing(\"");
stringBuffer.append(featName);
stringBuffer.append("\", \"");
stringBuffer.append(td.getName());
stringBuffer.append("\");\n");
stringBuffer.append(" if (lowLevelTypeChecks)\n ll_cas.ll_set");
stringBuffer.append(getSetArrayNamePart);
stringBuffer.append("ArrayValue(ll_cas.ll_getRefValue(addr, ");
stringBuffer.append(casFeatCode);
stringBuffer.append("), i, v, true);\n jcas.checkArrayBounds(ll_cas.ll_getRefValue(addr, ");
stringBuffer.append(casFeatCode);
stringBuffer.append("), i);\n ll_cas.ll_set");
stringBuffer.append(getSetArrayNamePart);
stringBuffer.append("ArrayValue(ll_cas.ll_getRefValue(addr, ");
stringBuffer.append(casFeatCode);
stringBuffer.append("), i, v);\n }\n");
}
stringBuffer.append(" \n");
}
stringBuffer.append("\n");
if (td.getName().equals("uima.cas.Annotation")) {
stringBuffer.append(" ");
stringBuffer.append(" /** @see org.apache.uima.cas.text.AnnotationFS#getCoveredText() \n * @generated */ \n public String getCoveredText(int inst) { \n final CASImpl casView = ll_cas.ll_getSofaCasView(inst);\n final String text = casView.getDocumentText();\n if (text == null) {\n return null;\n }\n return text.substring(getBegin(inst), getEnd(inst)); \n }\n");
stringBuffer.append("");
} /* of Annotation if-statement */
stringBuffer.append("\n\n /** initialize variables to correspond with Cas Type and Features\n * @generated */\n public ");
stringBuffer.append(typeName_Type);
stringBuffer.append("(JCas jcas, Type casType) {\n super(jcas, casType);\n casImpl.getFSClassRegistry().addGeneratorForType((TypeImpl)this.casType, getFSGenerator());\n\n");
for (int i = 0; i < fds.length; i++) {
FeatureDescription fd = fds[i];
String featName = fd.getName();
stringBuffer.append(" \n casFeat_");
stringBuffer.append(featName);
stringBuffer.append(" = jcas.getRequiredFeatureDE(casType, \"");
stringBuffer.append(featName);
stringBuffer.append("\", \"");
stringBuffer.append(fd.getRangeTypeName());
stringBuffer.append("\", featOkTst);\n casFeatCode_");
stringBuffer.append(featName);
stringBuffer.append(" = (null == casFeat_");
stringBuffer.append(featName);
stringBuffer.append(") ? JCas.INVALID_FEATURE_CODE : ((FeatureImpl)casFeat_");
stringBuffer.append(featName);
stringBuffer.append(").getCode();\n\n");
}
stringBuffer.append(" }\n}\n\n\n\n ");
return stringBuffer.toString();
}
}