TyErrorId initialize()

in scriptators/tcl/Tclator.cpp [86:225]


  TyErrorId initialize(AnnotatorContext &ac) {
    swig_type_info *ac_type;
    char srcfile[1000 + 256];

    if (ac.isParameterDefined("DebugLevel")) {
      ac.extractValue("DebugLevel", debug);
    }
    if (debug > 0) {
      cerr<< MODULENAME ": Initialize - debug=" << debug <<endl;
    }
    if (!ac.isParameterDefined("SourceFile")) {
      cerr<< MODULENAME ": Missing Tcl SourceFile" <<endl;
      return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
    }

    UnicodeString fn;
    ac.extractValue(UnicodeString("SourceFile"), fn);
    if (fn == "") {
      cerr<< MODULENAME ": Empty Tcl SourceFile" <<endl;
      return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
    }

    //    cerr << fn << endl; 

    UErrorCode err = U_ZERO_ERROR;
    fn.extract(srcfile,sizeof(srcfile),0,err);
    if (U_FAILURE(err)) {
      cerr << MODULENAME ": Unable to extract parameter, got " << u_errorName(err) << endl;
      return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
    }

    if (interp == 0) {
      // this seems to make windows work
      // would be nice to know argv[0] somehow
      Tcl_FindExecutable( 0 ); 

      interp = Tcl_CreateInterp();
      if (interp == 0) {
        cerr << MODULENAME ": failed to create interpreter" << endl;
        return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
      }

      int tclret = Tcl_Init(interp);
      if (tclret != TCL_OK) {
        cerr << MODULENAME ": failed to init interpreter - " <<
		Tcl_GetStringResult(interp) << endl;
        return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
      }

      if (Tclator_Init(interp) != TCL_OK) {
        cerr << MODULENAME ": failed to init tclator package" << endl;
        return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
      }

      commands[INITIALIZE] = Tcl_NewStringObj("initialize", -1);
      commands[TYPESYSTEMINIT] = Tcl_NewStringObj("typeSystemInit", -1);
      commands[RECONFIGURE] = Tcl_NewStringObj("reconfigure", -1);
      commands[PROCESS] = Tcl_NewStringObj("process", -1);
      commands[DESTROY] = Tcl_NewStringObj("destroy", -1);
      commands[BATCHPROCESSCOMPLETE] = Tcl_NewStringObj("batchProcessComplete", -1);
      commands[COLLECTIONPROCESSCOMPLETE] = Tcl_NewStringObj("collectionProcessComplete", -1);

      for (unsigned int i=0; i<7; ++i) Tcl_IncrRefCount(commands[i]);

      if (Tcl_Eval(interp, default_methods) != TCL_OK) {
        cerr << MODULENAME << ": Error - " << 
		Tcl_GetStringResult(interp) << endl;
        return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
      }

      if (Tcl_EvalFile(interp, srcfile) != TCL_OK) {
        cerr << MODULENAME << ": Error - " << 
		Tcl_GetStringResult(interp) << endl;
        return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
      }

      // this is a static variable because of the way that SWIG's
      // initialization code is written.      
      static swig_module_info *module = 0;
      if (module == 0) {
        MUTEX_INIT
        MUTEX_LOCK
        module = SWIG_Tcl_GetModule(interp);
      } else {
        MUTEX_LOCK
        SWIG_Tcl_SetModule(interp, module);
      }

      if (!module) {
        cerr << MODULENAME ": could not get Tcl swig module" << endl;
        MUTEX_UNLOCK
        return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
      }

      ts_type = SWIG_TypeQueryModule(module,module, "TypeSystem *");
      if (!ts_type) {
        cerr << MODULENAME ": could lookup TypeSystem type in swig" << endl;
        MUTEX_UNLOCK
        return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
      }
      ac_type = SWIG_TypeQueryModule(module,module, "AnnotatorContext *");
      if (!ac_type) {
        cerr << MODULENAME ": could lookup AnnotatorContext type in swig" << endl;
        MUTEX_UNLOCK
        return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
      } 
      cas_type = SWIG_TypeQueryModule(module,module, "CAS *");
      if (!cas_type) {
        cerr << MODULENAME ": could lookup cas type in swig" << endl;
        MUTEX_UNLOCK
        return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
      }
      rs_type = SWIG_TypeQueryModule(module,module, 
	"ResultSpecification *");
      if (!rs_type) {
        cerr << MODULENAME ": could lookup rs type in swig" << endl;
        MUTEX_UNLOCK
        return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
      }
    }

    Tcl_Obj *args[2];
    args[0] = commands[INITIALIZE];
    args[1] = SWIG_Tcl_NewPointerObj(
       reinterpret_cast<void *>( const_cast<AnnotatorContext *>(&ac)),
       ac_type, 0);
    Tcl_IncrRefCount(args[0]);
    Tcl_IncrRefCount(args[1]);
    int rc = Tcl_EvalObjv(interp, 2, args, 0);
    Tcl_DecrRefCount(args[0]);
    Tcl_DecrRefCount(args[1]);
    if (rc != TCL_OK) {
      cerr << MODULENAME  " initialize error " << 
	Tcl_GetStringResult(interp) << endl;
      MUTEX_UNLOCK
      return UIMA_ERR_USER_ANNOTATOR_COULD_NOT_INIT;
    }
    MUTEX_UNLOCK
    return UIMA_ERR_NONE;
  }