// Xslt30Processor.cpp : Defines the exported functions for the DLL application. // #include "Xslt30Processor.h" #include "XdmValue.h" #include "XdmItem.h" #include "XdmNode.h" #include "XdmAtomicValue.h" #ifdef DEBUG #include //used for testing only #endif Xslt30Processor::Xslt30Processor() { SaxonProcessor *p = new SaxonProcessor(false); Xslt30Processor(p, ""); } Xslt30Processor::Xslt30Processor(SaxonProcessor * p, std::string curr) { proc = p; /* * Look for class. */ cppClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/option/cpp/Xslt30Processor"); cppXT = createSaxonProcessor2(SaxonProcessor::sxn_environ->env, cppClass, "(Lnet/sf/saxon/s9api/Processor;)V", proc->proc); #ifdef DEBUG jmethodID debugMID = SaxonProcessor::sxn_environ->env->GetStaticMethodID(cppClass, "setDebugMode", "(Z)V"); SaxonProcessor::sxn_environ->env->CallStaticVoidMethod(cppClass, debugMID, (jboolean)true); #endif nodeCreated = false; tunnel = false; proc->exception = NULL; selection = NULL; selectionV=NULL; outputfile1 = ""; if(!(proc->cwd.empty()) && curr.empty()){ cwdXT = proc->cwd; } else if(!curr.empty()){ cwdXT = curr; } } Xslt30Processor::~Xslt30Processor(){ clearProperties(); clearParameters(); if(selectionV != NULL) { selectionV->decrementRefCount(); if(selectionV->getRefCount() == 0) { delete selectionV; } } } bool Xslt30Processor::exceptionOccurred() { return proc->exceptionOccurred(); } const char * Xslt30Processor::getErrorCode(int i) { if(proc->exception == NULL) {return NULL;} return proc->exception->getErrorCode(i); } void Xslt30Processor::setGlobalContextItem(XdmItem * value){ if(value != NULL){ value->incrementRefCount(); parameters["node"] = value; } } void Xslt30Processor::setGlobalContextFromFile(const char * ifile) { if(ifile != NULL) { setProperty("s", ifile); } } void Xslt30Processor::setInitialMatchSelection(XdmValue * _selection){ if(_selection != NULL) { _selection->incrementRefCount(); selectionV = _selection; selection = _selection->getUnderlyingValue(); } } void Xslt30Processor::setInitialMatchSelectionAsFile(const char * filename){ if(filename != NULL) { selection = SaxonProcessor::sxn_environ->env->NewStringUTF(filename); } } void Xslt30Processor::setOutputFile(const char * ofile) { outputfile1 = std::string(ofile); setProperty("o", ofile); } void Xslt30Processor::setParameter(const char* name, XdmValue * value, bool _static) { if(value != NULL && name != NULL){ value->incrementRefCount(); if (_static) { parameters["sparam:"+std::string(name)] = value; } else { parameters["param:"+std::string(name)] = value; } } } void Xslt30Processor::setInitialTemplateParameters(std::map _itparameters, bool _tunnel){ for(std::map::iterator itr = _itparameters.begin(); itr != _itparameters.end(); itr++){ parameters["itparam:"+std::string(itr->first)] = itr->second; } tunnel = _tunnel; if(tunnel) { setProperty("tunnel", "true"); } } XdmValue* Xslt30Processor::getParameter(const char* name) { std::map::iterator it; it = parameters.find("param:"+std::string(name)); if (it != parameters.end()) return it->second; else { it = parameters.find("sparam:"+std::string(name)); if (it != parameters.end()) return it->second; } return NULL; } bool Xslt30Processor::removeParameter(const char* name) { return (bool)(parameters.erase("param:"+std::string(name))); } void Xslt30Processor::setJustInTimeCompilation(bool jit){ static jmethodID jitmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "setJustInTimeCompilation", "(Z)V"); if (!jitmID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, jitmID, jit); proc->checkAndCreateException(cppClass); } } void Xslt30Processor::setResultAsRawValue(bool option) { if(option) { setProperty("outvalue", "yes"); } } void Xslt30Processor::setProperty(const char* name, const char* value) { if(name != NULL) { properties.insert(std::pair(std::string(name), std::string((value == NULL ? "" : value)))); } } const char* Xslt30Processor::getProperty(const char* name) { std::map::iterator it; it = properties.find(std::string(name)); if (it != properties.end()) return it->second.c_str(); return NULL; } void Xslt30Processor::clearParameters(bool delValues) { if(delValues){ for(std::map::iterator itr = parameters.begin(); itr != parameters.end(); itr++){ XdmValue * value = itr->second; value->decrementRefCount(); #ifdef DEBUG std::cout<<"clearParameter() - XdmValue refCount="<getRefCount()<getRefCount() < 1){ delete value; } } SaxonProcessor::sxn_environ->env->DeleteLocalRef(selection); selection = NULL; } else { for(std::map::iterator itr = parameters.begin(); itr != parameters.end(); itr++){ XdmValue * value = itr->second; value->decrementRefCount(); } selection = NULL; } parameters.clear(); } void Xslt30Processor::clearProperties() { properties.clear(); } std::map& Xslt30Processor::getParameters(){ std::map& ptr = parameters; return ptr; } std::map& Xslt30Processor::getProperties(){ std::map &ptr = properties; return ptr; } void Xslt30Processor::exceptionClear(){ if(proc->exception != NULL) { delete proc->exception; proc->exception = NULL; SaxonProcessor::sxn_environ->env->ExceptionClear(); } } void Xslt30Processor::setcwd(const char* dir){ if (dir!= NULL) { cwdXT = std::string(dir); } } const char* Xslt30Processor::checkException() { /*if(proc->exception == NULL) { proc->exception = proc->checkForException(environi, cpp); } return proc->exception;*/ return proc->checkException(cppXT); } int Xslt30Processor::exceptionCount(){ if(proc->exception != NULL){ return proc->exception->count(); } return 0; } void Xslt30Processor::compileFromXdmNodeAndSave(XdmNode * node, const char* filename) { static jmethodID cAndSNodemID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "compileFromXdmNodeAndSave", "(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/String;)V"); if (!cAndSNodemID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, cAndSNodemID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), node->getUnderlyingValue(), SaxonProcessor::sxn_environ->env->NewStringUTF(filename)); proc->checkAndCreateException(cppClass); } } void Xslt30Processor::compileFromStringAndSave(const char* stylesheetStr, const char* filename){ static jmethodID cAndSStringmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "compileFromStringAndSave", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); if (!cAndSStringmID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, cAndSStringmID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), SaxonProcessor::sxn_environ->env->NewStringUTF(stylesheetStr), SaxonProcessor::sxn_environ->env->NewStringUTF(filename)); proc->checkAndCreateException(cppClass); } } void Xslt30Processor::compileFromFileAndSave(const char* xslFilename, const char* filename){ static jmethodID cAndFStringmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "compileFromFileAndSave", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); if (!cAndFStringmID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, cAndFStringmID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), SaxonProcessor::sxn_environ->env->NewStringUTF(xslFilename),SaxonProcessor::sxn_environ->env->NewStringUTF(filename)); proc->checkAndCreateException(cppClass); } } void Xslt30Processor::compileFromString(const char* stylesheetStr) { static jmethodID cStringmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "createStylesheetFromString", "(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;)Lnet/sf/saxon/s9api/XsltExecutable;"); if (!cStringmID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, cStringmID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), SaxonProcessor::sxn_environ->env->NewStringUTF(stylesheetStr), comboArrays.stringArray, comboArrays.objectArray)); if (!stylesheetObject) { proc->checkAndCreateException(cppClass); } if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } } } void Xslt30Processor::compileFromXdmNode(XdmNode * node) { static jmethodID cNodemID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass,"createStylesheetFromXdmNode", "(Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/String;[Ljava/lang/Object;)Lnet/sf/saxon/s9api/XsltExecutable;"); if (!cNodemID) { std::cerr << "Error: "<< getDllname() << ".createStylesheetFromXdmNode" << " not found\n" << std::endl; } else { releaseStylesheet(); JParameters comboArrays; comboArrays = SaxonProcessor::createParameterJArray(parameters, properties); stylesheetObject = (jobject)( SaxonProcessor::sxn_environ->env->CallObjectMethod(cppXT, cNodemID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), node->getUnderlyingValue(), comboArrays.stringArray, comboArrays.objectArray)); if (!stylesheetObject) { proc->checkAndCreateException(cppClass); //cout << "Error in compileFromXdmNode" << endl; } if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } } } void Xslt30Processor::compileFromAssociatedFile(const char* source) { static jmethodID cFilemID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "createStylesheetFromAssoicatedFile", "(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;)Lnet/sf/saxon/s9api/XsltExecutable;"); if (!cFilemID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, cFilemID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), SaxonProcessor::sxn_environ->env->NewStringUTF(source), comboArrays.stringArray, comboArrays.objectArray)); if (!stylesheetObject) { proc->checkAndCreateException(cppClass); } if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } //SaxonProcessor::sxn_environ->env->NewGlobalRef(stylesheetObject); } } void Xslt30Processor::compileFromFile(const char* stylesheet) { static jmethodID cFilemID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "createStylesheetFromFile", "(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;)Lnet/sf/saxon/s9api/XsltExecutable;"); if (!cFilemID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, cFilemID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), SaxonProcessor::sxn_environ->env->NewStringUTF(stylesheet), comboArrays.stringArray, comboArrays.objectArray)); if (!stylesheetObject) { proc->checkAndCreateException(cppClass); } if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } //SaxonProcessor::sxn_environ->env->NewGlobalRef(stylesheetObject); } } void Xslt30Processor::releaseStylesheet() { stylesheetObject = NULL; } void Xslt30Processor::applyTemplatesReturningFile(const char * stylesheetfile, const char* output_filename){ if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return; } if(selection == NULL) { std::cerr<< "Error: The initial match selection has not been set. Please set it using setInitialMatchSelection or setInitialMatchSelectionFile."<getResourcesDirectory()); static jmethodID atmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "applyTemplatesReturningFile", "(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;)V"); if (!atmID) { std::cerr << "Error: "<< getDllname() << "applyTemplatesAsFile" << " not found\n" << std::endl; } else { JParameters comboArrays; comboArrays = SaxonProcessor::createParameterJArray(parameters, properties); SaxonProcessor::sxn_environ->env->CallObjectMethod(cppXT, atmID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()),selection, (stylesheetfile != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF( stylesheetfile) : NULL), (output_filename != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF( output_filename) : NULL), comboArrays.stringArray, comboArrays.objectArray); if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } proc->checkAndCreateException(cppClass); } return; } const char* Xslt30Processor::applyTemplatesReturningString(const char * stylesheetfile){ if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return NULL; } if(selection == NULL) { std::cerr<< "Error: The initial match selection has not been set. Please set it using setInitialMatchSelection or setInitialMatchSelectionFile."<getResourcesDirectory()); jmethodID atsmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "applyTemplatesReturningString", "(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"); if (!atsmID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, atsmID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), selection, (stylesheetfile!= NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(stylesheetfile) : NULL ), comboArrays.stringArray, comboArrays.objectArray)); if(obj) { result = (jstring)obj; } if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } if (result) { const char * str = SaxonProcessor::sxn_environ->env->GetStringUTFChars(result, NULL); SaxonProcessor::sxn_environ->env->DeleteLocalRef(obj); return str; } else { proc->checkAndCreateException(cppClass); } } return NULL; } XdmValue * Xslt30Processor::applyTemplatesReturningValue(const char * stylesheetfile){ if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return NULL; } if(selection == NULL) { std::cerr<< "Error: The initial match selection has not been set. Please set it using setInitialMatchSelection or setInitialMatchSelectionFile."<getResourcesDirectory()); jmethodID atsmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "applyTemplatesReturningValue", "(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;)Lnet/sf/saxon/s9api/XdmValue;"); if (!atsmID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, atsmID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), selection, ( stylesheetfile != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(stylesheetfile) : NULL), comboArrays.stringArray, comboArrays.objectArray)); /*if(obj) { result = (jobject)obj; }*/ if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } if (result) { jclass atomicValueClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmAtomicValue"); jclass nodeClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmNode"); jclass functionItemClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmFunctionItem"); XdmValue * value = NULL; XdmItem * xdmItem = NULL; if(SaxonProcessor::sxn_environ->env->IsInstanceOf(result, atomicValueClass) == JNI_TRUE) { xdmItem = new XdmAtomicValue(result); xdmItem->setProcessor(proc); SaxonProcessor::sxn_environ->env->DeleteLocalRef(result); return xdmItem; } else if(SaxonProcessor::sxn_environ->env->IsInstanceOf(result, nodeClass) == JNI_TRUE) { xdmItem = new XdmNode(result); xdmItem->setProcessor(proc); SaxonProcessor::sxn_environ->env->DeleteLocalRef(result); return xdmItem; } else if (SaxonProcessor::sxn_environ->env->IsInstanceOf(result, functionItemClass) == JNI_TRUE) { std::cerr<<"Error: applyTemplateToValue: FunctionItem found. Currently not be handled"<setProcessor(proc); for(int z=0;zsize();z++) { value->itemAt(z)->setProcessor(proc); } SaxonProcessor::sxn_environ->env->DeleteLocalRef(result); return value; } } else { proc->checkAndCreateException(cppClass); } } return NULL; } void Xslt30Processor::callFunctionReturningFile(const char * stylesheetfile, const char* functionName, XdmValue ** arguments, int argument_length, const char* outfile){ if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return; } if(stylesheetfile == NULL && !stylesheetObject){ return; } setProperty("resources", proc->getResourcesDirectory()); static jmethodID afmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "callFunctionReturningFile", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;[Ljava/lang/String;[Ljava/lang/Object;)V"); if (!afmID) { std::cerr << "Error: "<< getDllname() << "callFunctionReturningFile" << " not found\n" << std::endl; return; } else { JParameters comboArrays; comboArrays = SaxonProcessor::createParameterJArray(parameters, properties); jobjectArray argumentJArray = SaxonProcessor::createJArray(arguments, argument_length); SaxonProcessor::sxn_environ->env->CallObjectMethod(cppXT, afmID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), (stylesheetfile != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF( stylesheetfile) : NULL), (functionName != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(functionName) : NULL), argumentJArray, (outfile != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(outfile) : NULL), comboArrays.stringArray, comboArrays.objectArray); if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } proc->checkAndCreateException(cppClass); } return; } const char * Xslt30Processor::callFunctionReturningString(const char * stylesheet, const char* functionName, XdmValue ** arguments, int argument_length){ if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return NULL; } if(stylesheet == NULL && !stylesheetObject){ std::cerr<< "Error: No stylesheet found. Please compile stylesheet before calling callFunctionReturningString or check exceptions"<getResourcesDirectory()); jmethodID afsmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "callFunctionReturningString", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;[Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"); if (!afsmID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, afsmID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), (stylesheet != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(stylesheet) : NULL ), (functionName != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(functionName) : NULL), argumentJArray, comboArrays.stringArray, comboArrays.objectArray)); if(obj) { result = (jstring)obj; } if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } if (result) { const char * str = SaxonProcessor::sxn_environ->env->GetStringUTFChars(result, NULL); SaxonProcessor::sxn_environ->env->DeleteLocalRef(obj); return str; } else { proc->checkAndCreateException(cppClass); } } return NULL; } XdmValue * Xslt30Processor::callFunctionReturningValue(const char * stylesheet, const char* functionName, XdmValue ** arguments, int argument_length){ if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return NULL; } if(stylesheet == NULL && !stylesheetObject){ std::cerr<< "Error: No stylesheet found. Please compile stylesheet before calling callFunctionReturningValue or check exceptions"<getResourcesDirectory()); jmethodID cfvmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "callFunctionReturningValue", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;[Ljava/lang/String;[Ljava/lang/Object;)Lnet/sf/saxon/s9api/XdmValue;"); if (!cfvmID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, cfvmID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), (stylesheet != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(stylesheet) : NULL ), (functionName != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(functionName) : NULL), argumentJArray, comboArrays.stringArray, comboArrays.objectArray)); if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } if(argumentJArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(argumentJArray); } if (result) { jclass atomicValueClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmAtomicValue"); jclass nodeClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmNode"); jclass functionItemClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmFunctionItem"); XdmValue * value = NULL; XdmItem * xdmItem = NULL; if(SaxonProcessor::sxn_environ->env->IsInstanceOf(result, atomicValueClass) == JNI_TRUE) { xdmItem = new XdmAtomicValue(result); xdmItem->setProcessor(proc); SaxonProcessor::sxn_environ->env->DeleteLocalRef(result); return xdmItem; } else if(SaxonProcessor::sxn_environ->env->IsInstanceOf(result, nodeClass) == JNI_TRUE) { xdmItem = new XdmNode(result); xdmItem->setProcessor(proc); SaxonProcessor::sxn_environ->env->DeleteLocalRef(result); return xdmItem; } else if (SaxonProcessor::sxn_environ->env->IsInstanceOf(result, functionItemClass) == JNI_TRUE) { return NULL; } else { value = new XdmValue(result, true); value->setProcessor(proc); for(int z=0;zsize();z++) { value->itemAt(z)->setProcessor(proc); } SaxonProcessor::sxn_environ->env->DeleteLocalRef(result); return value; } value = new XdmValue(); value->setProcessor(proc); xdmItem->setProcessor(proc); value->addXdmItem(xdmItem); SaxonProcessor::sxn_environ->env->DeleteLocalRef(result); return value; } else { proc->checkAndCreateException(cppClass); } } return NULL; } void Xslt30Processor::addPackages(const char ** fileNames, int length){ if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return; } if(length<1){ return; } jmethodID apmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "addPackages", "([Ljava/lang/String;)V"); if (!apmID) { std::cerr << "Error: "<env, "java/lang/String"); stringArray = SaxonProcessor::sxn_environ->env->NewObjectArray((jint) length, stringClass, 0); for (int i=0; ienv->SetObjectArrayElement(stringArray, i, SaxonProcessor::sxn_environ->env->NewStringUTF(fileNames[i])); } SaxonProcessor::sxn_environ->env->CallObjectMethod(cppXT, apmID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), stringArray); proc->checkAndCreateException(cppClass); } return; } void Xslt30Processor::clearPackages(){ if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return; } jmethodID cpmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "clearPackages", "()V"); if (!cpmID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, cpmID); proc->checkAndCreateException(cppClass); } return; } void Xslt30Processor::callTemplateReturningFile(const char * stylesheetfile, const char* templateName, const char* outfile){ if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return; } if(stylesheetfile == NULL && !stylesheetObject){ std::cerr<< "Error: No stylesheet found. Please compile stylesheet before calling callFunctionReturningFile or check exceptions"<getResourcesDirectory()); static jmethodID ctmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "callTemplateReturningFile", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;)V"); if (!ctmID) { std::cerr << "Error: "<< getDllname() << "callTemplateReturningFile" << " not found\n" << std::endl; } else { JParameters comboArrays; comboArrays = SaxonProcessor::createParameterJArray(parameters, properties); SaxonProcessor::sxn_environ->env->CallObjectMethod(cppXT, ctmID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), (stylesheetfile != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF( stylesheetfile) : NULL), (templateName != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(templateName) : NULL), (outfile != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(outfile) : NULL), comboArrays.stringArray, comboArrays.objectArray); if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } proc->checkAndCreateException(cppClass); } return; } const char* Xslt30Processor::callTemplateReturningString(const char * stylesheet, const char* templateName){ if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return NULL; } if(stylesheet == NULL && !stylesheetObject){ std::cerr<< "Error: No stylesheet found. Please compile stylesheet before calling callTemplateReturningString or check exceptions"<getResourcesDirectory()); jmethodID ctsmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "callTemplateReturningString", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"); if (!ctsmID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, ctsmID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), (stylesheet != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(stylesheet) : NULL ), (templateName != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(templateName) : NULL), comboArrays.stringArray, comboArrays.objectArray)); if(obj) { result = (jstring)obj; } if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } if (result) { const char * str = SaxonProcessor::sxn_environ->env->GetStringUTFChars(result, NULL); SaxonProcessor::sxn_environ->env->DeleteLocalRef(obj); return str; } else { proc->checkAndCreateException(cppClass); } } return NULL; } XdmValue* Xslt30Processor::callTemplateReturningValue(const char * stylesheet, const char* templateName){ if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return NULL; } if(stylesheet == NULL && !stylesheetObject){ std::cerr<< "Error: No stylesheet found. Please compile stylesheet before calling callTemplateReturningValue or check exceptions"<getResourcesDirectory()); jmethodID ctsmID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "callTemplateReturningValue", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;)Lnet/sf/saxon/s9api/XdmValue;"); if (!ctsmID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, ctsmID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), (stylesheet != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(stylesheet) : NULL ), (templateName != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(templateName) : NULL), comboArrays.stringArray, comboArrays.objectArray)); if(obj) { result = (jstring)obj; } if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } if (result) { jclass atomicValueClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmAtomicValue"); jclass nodeClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmNode"); jclass functionItemClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmFunctionItem"); XdmValue * value = NULL; XdmItem * xdmItem = NULL; if(SaxonProcessor::sxn_environ->env->IsInstanceOf(result, atomicValueClass) == JNI_TRUE) { xdmItem = new XdmAtomicValue(result); xdmItem->setProcessor(proc); SaxonProcessor::sxn_environ->env->DeleteLocalRef(result); return xdmItem; } else if(SaxonProcessor::sxn_environ->env->IsInstanceOf(result, nodeClass) == JNI_TRUE) { xdmItem = new XdmNode(result); xdmItem->setProcessor(proc); SaxonProcessor::sxn_environ->env->DeleteLocalRef(result); return xdmItem; } else if (SaxonProcessor::sxn_environ->env->IsInstanceOf(result, functionItemClass) == JNI_TRUE) { std::cerr<<"Error: callTemplateReturningValue: FunctionItem found. Currently not be handled"<setProcessor(proc); for(int z=0;zsize();z++) { value->itemAt(z)->setProcessor(proc); } SaxonProcessor::sxn_environ->env->DeleteLocalRef(result); return value; } value = new XdmValue(); value->setProcessor(proc); xdmItem->setProcessor(proc); value->addXdmItem(xdmItem); SaxonProcessor::sxn_environ->env->DeleteLocalRef(result); return value; } else { proc->checkAndCreateException(cppClass); } } return NULL; } XdmValue * Xslt30Processor::transformFileToValue(const char* sourcefile, const char* stylesheetfile) { if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return NULL; } if(sourcefile == NULL && stylesheetfile == NULL && !stylesheetObject){ return NULL; } setProperty("resources", proc->getResourcesDirectory()); static jmethodID mID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "transformToValue", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;)Lnet/sf/saxon/s9api/XdmValue;"); if (!mID) { std::cerr << "Error: "<< getDllname() << ".transformtoValue" << " not found\n" << std::endl; } else { JParameters comboArrays; comboArrays = SaxonProcessor::createParameterJArray(parameters, properties); jobject result = (jobject)( SaxonProcessor::sxn_environ->env->CallObjectMethod(cppXT, mID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), (sourcefile != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(sourcefile) : NULL), (stylesheetfile != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF( stylesheetfile) : NULL), comboArrays.stringArray, comboArrays.objectArray)); if (comboArrays.stringArray != NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } if (result) { jclass atomicValueClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmAtomicValue"); jclass nodeClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmNode"); jclass functionItemClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmFunctionItem"); XdmValue * value = NULL; XdmItem * xdmItem = NULL; if(SaxonProcessor::sxn_environ->env->IsInstanceOf(result, atomicValueClass) == JNI_TRUE) { xdmItem = new XdmAtomicValue(result); } else if(SaxonProcessor::sxn_environ->env->IsInstanceOf(result, nodeClass) == JNI_TRUE) { xdmItem = new XdmNode(result); } else if (SaxonProcessor::sxn_environ->env->IsInstanceOf(result, functionItemClass) == JNI_TRUE) { std::cerr<<"Error: TransformFileToValue: FunctionItem found. Currently not be handled"<setProcessor(proc); for(int z=0;zsize();z++) { value->itemAt(z)->setProcessor(proc); } return value; } value = new XdmValue(); value->setProcessor(proc); xdmItem->setProcessor(proc); value->addXdmItem(xdmItem); SaxonProcessor::sxn_environ->env->DeleteLocalRef(result); return value; }else { proc->checkAndCreateException(cppClass); } } return NULL; } void Xslt30Processor::transformFileToFile(const char* source, const char* stylesheet, const char* outputfile) { if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return; } if(!stylesheetObject && stylesheet==NULL){ std::cerr<< "Error: stylesheet has not been set or created using the compile methods."<getResourcesDirectory()); jmethodID mID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "transformToFile", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;)V"); if (!mID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, mID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), (source != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF( source) : NULL), SaxonProcessor::sxn_environ->env->NewStringUTF(stylesheet), (outputfile != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(outputfile) :NULL), comboArrays.stringArray, comboArrays.objectArray); if (comboArrays.stringArray!= NULL) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(comboArrays.objectArray); } } proc->checkAndCreateException(cppClass); } XdmValue * Xslt30Processor::getXslMessages(){ jmethodID mID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "getXslMessages", "()[Lnet/sf/saxon/s9api/XdmValue;"); if (!mID) { std::cerr << "Error: "<env->CallObjectMethod(cppXT, mID)); int sizex = SaxonProcessor::sxn_environ->env->GetArrayLength(results); if (sizex>0) { XdmValue * value = new XdmValue(); for (int p=0; p < sizex; ++p) { jobject resulti = SaxonProcessor::sxn_environ->env->GetObjectArrayElement(results, p); value->addUnderlyingValue(resulti); } SaxonProcessor::sxn_environ->env->DeleteLocalRef(results); return value; } proc->checkAndCreateException(cppClass); } return NULL; } const char * Xslt30Processor::transformFileToString(const char* source, const char* stylesheet) { if(exceptionOccurred()) { //Possible error detected in the compile phase. Processor not in a clean state. //Require clearing exception. return NULL; } if(source == NULL && stylesheet == NULL && !stylesheetObject){ std::cerr<< "Error: No stylesheet found. Please compile stylesheet before calling transformFileToString or check exceptions"<getResourcesDirectory()); jmethodID mID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(cppClass, "transformToString", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;"); if (!mID) { std::cerr << "Error: "<env, "java/lang/Object"); jclass stringClass = lookForClass(SaxonProcessor::sxn_environ->env, "java/lang/String"); int size = parameters.size() + properties.size(); #ifdef DEBUG std::cerr<<"Properties size: "< 0) { objectArray = SaxonProcessor::sxn_environ->env->NewObjectArray((jint) size, objectClass, 0); stringArray = SaxonProcessor::sxn_environ->env->NewObjectArray((jint) size, stringClass, 0); int i = 0; for (std::map::iterator iter = parameters.begin(); iter != parameters.end(); ++iter, i++) { #ifdef DEBUG std::cerr<<"map 1"<first"<<(iter->first).c_str()<env->SetObjectArrayElement(stringArray, i, SaxonProcessor::sxn_environ->env->NewStringUTF( (iter->first).c_str())); #ifdef DEBUG std::string s1 = typeid(iter->second).name(); std::cerr<<"Type of itr:"<second)->getUnderlyingValue(); if(xx == NULL) { std::cerr<<"value failed"<second)->getUnderlyingValue() == NULL) { std::cerr<<"(iter->second)->getUnderlyingValue() is NULL"<env->SetObjectArrayElement(objectArray, i, (iter->second)->getUnderlyingValue()); } for (std::map::iterator iter = properties.begin(); iter != properties.end(); ++iter, i++) { SaxonProcessor::sxn_environ->env->SetObjectArrayElement(stringArray, i, SaxonProcessor::sxn_environ->env->NewStringUTF( (iter->first).c_str())); SaxonProcessor::sxn_environ->env->SetObjectArrayElement(objectArray, i, SaxonProcessor::sxn_environ->env->NewStringUTF( (iter->second).c_str())); } } jstring result = NULL; jobject obj = ( SaxonProcessor::sxn_environ->env->CallObjectMethod(cppXT, mID, SaxonProcessor::sxn_environ->env->NewStringUTF(cwdXT.c_str()), (source != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF( source) : NULL), (stylesheet != NULL ? SaxonProcessor::sxn_environ->env->NewStringUTF(stylesheet) : NULL), stringArray, objectArray)); if(obj) { result = (jstring)obj; } if (size > 0) { SaxonProcessor::sxn_environ->env->DeleteLocalRef(stringArray); SaxonProcessor::sxn_environ->env->DeleteLocalRef(objectArray); } if (result) { const char * str = SaxonProcessor::sxn_environ->env->GetStringUTFChars(result, NULL); SaxonProcessor::sxn_environ->env->DeleteLocalRef(obj); return str; } else { proc->checkAndCreateException(cppClass); } } return NULL; } const char * Xslt30Processor::transformToString(XdmNode * source){ if(!stylesheetObject){ std::cerr<< "Error: No stylesheet found. Please compile stylesheet before calling transformToString or check exceptions"<incrementRefCount(); parameters["node"] = source; } return transformFileToString(NULL, NULL); } XdmValue * Xslt30Processor::transformToValue(XdmNode * source){ if(!stylesheetObject){ std::cerr<< "Error: No stylesheet found. Please compile stylesheet before calling transformToValue or check exceptions"<incrementRefCount(); parameters["node"] = source; } return transformFileToValue(NULL, NULL); } void Xslt30Processor::transformToFile(XdmNode * source){ if(!stylesheetObject){ std::cerr<< "Error: No stylesheet found. Please compile stylesheet before calling transformToFile or check exceptions"<incrementRefCount(); parameters["node"] = source; } transformFileToFile(NULL, NULL, NULL); } const char * Xslt30Processor::getErrorMessage(int i ){ if(proc->exception == NULL) {return NULL;} return proc->exception->getErrorMessage(i); }