/* First created by JCasGen Tue Aug 09 16:26:13 CEST 2011 */
package org.apache.uima.ruta.type;

import org.apache.uima.cas.Feature;
import org.apache.uima.cas.FeatureStructure;
import org.apache.uima.cas.Type;
import org.apache.uima.cas.impl.CASImpl;
import org.apache.uima.cas.impl.FSGenerator;
import org.apache.uima.cas.impl.FeatureImpl;
import org.apache.uima.cas.impl.TypeImpl;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.JCasRegistry;

/**
 * Updated by JCasGen Thu Jul 12 10:42:33 CEST 2012
 * 
 * @generated
 */
public class DebugScriptApply_Type extends ProfiledAnnotation_Type {
  /** @generated */
  protected FSGenerator getFSGenerator() {
    return fsGenerator;
  }

  /** @generated */
  private final FSGenerator fsGenerator = new FSGenerator() {
    public FeatureStructure createFS(int addr, CASImpl cas) {
      if (DebugScriptApply_Type.this.useExistingInstance) {
        // Return eq fs instance if already created
        FeatureStructure fs = DebugScriptApply_Type.this.jcas.getJfsFromCaddr(addr);
        if (null == fs) {
          fs = new DebugScriptApply(addr, DebugScriptApply_Type.this);
          DebugScriptApply_Type.this.jcas.putJfsFromCaddr(addr, fs);
          return fs;
        }
        return fs;
      } else
        return new DebugScriptApply(addr, DebugScriptApply_Type.this);
    }
  };

  /** @generated */
  public final static int typeIndexID = DebugScriptApply.typeIndexID;

  /**
   * @generated
   * @modifiable
   */
  public final static boolean featOkTst = JCasRegistry
          .getFeatOkTst("org.apache.uima.ruta.type.DebugScriptApply");

  /** @generated */
  final Feature casFeat_element;

  /** @generated */
  final int casFeatCode_element;

  /** @generated */
  public String getElement(int addr) {
    if (featOkTst && casFeat_element == null)
      jcas.throwFeatMissing("element", "org.apache.uima.ruta.type.DebugScriptApply");
    return ll_cas.ll_getStringValue(addr, casFeatCode_element);
  }

  /** @generated */
  public void setElement(int addr, String v) {
    if (featOkTst && casFeat_element == null)
      jcas.throwFeatMissing("element", "org.apache.uima.ruta.type.DebugScriptApply");
    ll_cas.ll_setStringValue(addr, casFeatCode_element, v);
  }

  /**
   * initialize variables to correspond with Cas Type and Features
   * 
   * @generated
   */
  public DebugScriptApply_Type(JCas jcas, Type casType) {
    super(jcas, casType);
    casImpl.getFSClassRegistry().addGeneratorForType((TypeImpl) this.casType, getFSGenerator());

    casFeat_element = jcas.getRequiredFeatureDE(casType, "element", "uima.cas.String", featOkTst);
    casFeatCode_element = (null == casFeat_element) ? JCas.INVALID_FEATURE_CODE
            : ((FeatureImpl) casFeat_element).getCode();

  }
}
