Project

Profile

Help

RE: JET RUNTIME HAS DETECTED UNRECOVERABLE ERROR: system ... » SaxonProcessor.cpp

Raik Müller, 2020-04-16 09:33

 
#ifndef __linux__
#ifndef __APPLE__
//#include "stdafx.h"
#include <Tchar.h>
#endif
#endif


//#include "stdafx.h"
#include "SaxonProcessor.h"
#include "XdmValue.h"
#include "XdmItem.h"
#include "XdmNode.h"
#include "XdmAtomicValue.h"

//#define DEBUG
#ifdef DEBUG
#include <signal.h>
#endif
#include <stdio.h>


//jobject cpp;
const char * failure;
sxnc_environment * SaxonProcessor::sxn_environ = 0;
int SaxonProcessor::refCount = 0;
int SaxonProcessor::jvmCreatedCPP=0;

bool SaxonProcessor::exceptionOccurred(){
bool found = SaxonProcessor::sxn_environ->env->ExceptionCheck();
if(!found){
if( exception != NULL){
bool result = exception->count() > 1;
return result;
} else {return false;}
} else {
return found;
}
}

const char* SaxonProcessor::checkException(jobject cpp) {
const char * message = NULL;
if(exception == NULL) {
message = checkForException(sxn_environ, cpp);
} else {
message = exception->getErrorMessages();
}
return message;
}

void SaxonProcessor::checkAndCreateException(jclass cppClass){
exception = NULL;
if(exceptionOccurred()) {
if(exception != NULL) {
delete exception;
}
exception = checkForExceptionCPP(SaxonProcessor::sxn_environ->env, cppClass, NULL);
#ifdef DEBUG
SaxonProcessor::sxn_environ->env->ExceptionDescribe();
#endif
exceptionClear(false);
}
}

void SaxonProcessor::exceptionClear(bool clearCPPException){
SaxonProcessor::sxn_environ->env->ExceptionClear();
if(exception != NULL && clearCPPException) {
delete exception;
}
}

SaxonApiException * SaxonProcessor::getException(){
return exception;
}

SaxonProcessor::SaxonProcessor() {
licensei = false;
SaxonProcessor(licensei);
}



SaxonApiException * SaxonProcessor::checkForExceptionCPP(JNIEnv* env, jclass callingClass, jobject callingObject){

if(exception != NULL) {
delete exception;
}
if (env->ExceptionCheck()) {
std::string result1 = "";
std::string errorCode = "";
jthrowable exc = env->ExceptionOccurred();

#ifdef DEBUG
env->ExceptionDescribe();
#endif
jclass exccls(env->GetObjectClass(exc));
jclass clscls(env->FindClass("java/lang/Class"));

jmethodID getName(env->GetMethodID(clscls, "getName", "()Ljava/lang/String;"));
jstring name(static_cast<jstring>(env->CallObjectMethod(exccls, getName)));
char const* utfName(env->GetStringUTFChars(name, 0));
result1 = (std::string(utfName));
//env->ReleaseStringUTFChars(name, utfName);

jmethodID getMessage(env->GetMethodID(exccls, "getMessage", "()Ljava/lang/String;"));
if(getMessage) {

jstring message(static_cast<jstring>(env->CallObjectMethod(exc, getMessage)));
char const* utfMessage = NULL;
if(!message) {
utfMessage = "";
return NULL;
} else {
utfMessage = (env->GetStringUTFChars(message, 0));
}
if(utfMessage != NULL) {
result1 = (result1 + " : ") + utfMessage;
}

//env->ReleaseStringUTFChars(message,utfMessage);
if(callingObject != NULL && result1.compare(0,36, "net.sf.saxon.option.cpp.SaxonCException", 36) == 0){
jmethodID getErrorCodeID(env->GetMethodID(callingClass, "getExceptions", "()[Lnet/sf/saxon/option/cpp/SaxonCException;"));
jclass saxonExceptionClass(env->FindClass("net/sf/saxon/option/cpp/SaxonCException"));
if(getErrorCodeID){
jobjectArray saxonExceptionObject((jobjectArray)(env->CallObjectMethod(callingObject, getErrorCodeID)));
if(saxonExceptionObject) {
jmethodID lineNumID = env->GetMethodID(saxonExceptionClass, "getLinenumber", "()I");
jmethodID ecID = env->GetMethodID(saxonExceptionClass, "getErrorCode", "()Ljava/lang/String;");
jmethodID emID = env->GetMethodID(saxonExceptionClass, "getErrorMessage", "()Ljava/lang/String;");
jmethodID typeID = env->GetMethodID(saxonExceptionClass, "isTypeError", "()Z");
jmethodID staticID = env->GetMethodID(saxonExceptionClass, "isStaticError", "()Z");
jmethodID globalID = env->GetMethodID(saxonExceptionClass, "isGlobalError", "()Z");


int exLength = (int)env->GetArrayLength(saxonExceptionObject);
SaxonApiException * saxonExceptions = new SaxonApiException();
for(int i=0; i<exLength;i++){
jobject exObj = env->GetObjectArrayElement(saxonExceptionObject, i);

jstring errCode = (jstring)(env->CallObjectMethod(exObj, ecID));
jstring errMessage = (jstring)(env->CallObjectMethod(exObj, emID));
jboolean isType = (env->CallBooleanMethod(exObj, typeID));
jboolean isStatic = (env->CallBooleanMethod(exObj, staticID));
jboolean isGlobal = (env->CallBooleanMethod(exObj, globalID));
saxonExceptions->add((errCode ? env->GetStringUTFChars(errCode,0) : NULL ) ,(errMessage ? env->GetStringUTFChars(errMessage,0) : NULL),(int)(env->CallIntMethod(exObj, lineNumID)), (bool)isType, (bool)isStatic, (bool)isGlobal);
//env->ExceptionDescribe();
}
//env->ExceptionDescribe();
env->ExceptionClear();
return saxonExceptions;
}
}
}
}
SaxonApiException * saxonExceptions = new SaxonApiException(NULL, result1.c_str());
//env->ExceptionDescribe();
env->ExceptionClear();
return saxonExceptions;
}
return NULL;

}



SaxonProcessor::SaxonProcessor(bool l){

cwd="";
licensei = l;
versionStr = NULL;
SaxonProcessor::refCount++;
exception = NULL;

if(SaxonProcessor::jvmCreatedCPP == 0){
SaxonProcessor::jvmCreatedCPP=1;
SaxonProcessor::sxn_environ= new sxnc_environment;//(sxnc_environment *)malloc(sizeof(sxnc_environment));


/*
* First of all, load required component.
* By the time of JET initialization, all components should be loaded.
*/

SaxonProcessor::sxn_environ->myDllHandle = loadDefaultDll ();

/*
* Initialize JET run-time.
* The handle of loaded component is used to retrieve Invocation API.
*/
initDefaultJavaRT (SaxonProcessor::sxn_environ);
} else {
#ifdef DEBUG
std::cerr<<"SaxonProc constructor: jvm exists! jvmCreatedCPP="<<jvmCreatedCPP<<std::endl;
#endif

}


versionClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/Version");
procClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/Processor");
saxonCAPIClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/option/cpp/SaxonCAPI");

proc = createSaxonProcessor (SaxonProcessor::sxn_environ->env, procClass, "(Z)V", NULL, licensei);
if(!proc) {
std::cout<<"proc is NULL in SaxonProcessor constructor"<<std::endl;
}

xdmAtomicClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmAtomicValue");
#ifdef DEBUG
jmethodID debugMID = SaxonProcessor::sxn_environ->env->GetStaticMethodID(saxonCAPIClass, "setDebugMode", "(Z)V");
SaxonProcessor::sxn_environ->env->CallStaticVoidMethod(saxonCAPIClass, debugMID, (jboolean)true);
#endif
}

SaxonProcessor::SaxonProcessor(const char * configFile){
cwd="";
versionStr = NULL;
SaxonProcessor::refCount++;
exception = NULL;

if(SaxonProcessor::jvmCreatedCPP == 0){
SaxonProcessor::jvmCreatedCPP=1;
//SaxonProcessor::sxn_environ= new sxnc_environment;
SaxonProcessor::sxn_environ= (sxnc_environment *)malloc(sizeof(sxnc_environment));

/*
* First of all, load required component.
* By the time of JET initialization, all components should be loaded.
*/

SaxonProcessor::sxn_environ->myDllHandle = loadDefaultDll ();

/*
* Initialize JET run-time.
* The handle of loaded component is used to retrieve Invocation API.
*/
initDefaultJavaRT (SaxonProcessor::sxn_environ);
}

versionClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/Version");

procClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/Processor");
saxonCAPIClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/option/cpp/SaxonCAPI");

static jmethodID mIDcreateProc = (jmethodID)SaxonProcessor::sxn_environ->env->GetStaticMethodID(saxonCAPIClass,"createSaxonProcessor",
"(Ljava/lang/String;)Lnet/sf/saxon/s9api/Processor;");
if (!mIDcreateProc) {
std::cerr << "Error: SaxonDll." << "getPrimitiveTypeName"
<< " not found\n" << std::endl;
return ;
}
proc = SaxonProcessor::sxn_environ->env->CallStaticObjectMethod(saxonCAPIClass, mIDcreateProc,SaxonProcessor::sxn_environ->env->NewStringUTF(configFile));

if(!proc) {
checkAndCreateException(saxonCAPIClass);
std::cerr << "Error: "<<getDllname() << ". processor is NULL in constructor(configFile)"<< std::endl;
return ;
}

licensei = true;
#ifdef DEBUG

std::cerr<<"SaxonProc constructor(configFile)"<<std::endl;
#endif
xdmAtomicClass = lookForClass(SaxonProcessor::sxn_environ->env, "net/sf/saxon/s9api/XdmAtomicValue");
}

SaxonProcessor::~SaxonProcessor(){
clearConfigurationProperties();
if(versionStr != NULL) {
delete versionStr;
}
SaxonProcessor::refCount--; //This might be redundant due to the bug fix 2670
}


bool SaxonProcessor::isSchemaAwareProcessor(){
if(!licensei) {
return false;
} else {
static jmethodID MID_schema = (jmethodID)SaxonProcessor::sxn_environ->env->GetMethodID(procClass, "isSchemaAware", "()Z");
if (!MID_schema) {
std::cerr<<"\nError: Saxonc "<<"SaxonProcessor.isSchemaAware()"<<" not found"<<std::endl;
return false;
}

licensei = (jboolean)(SaxonProcessor::sxn_environ->env->CallBooleanMethod(proc, MID_schema));
return licensei;

}

}

void SaxonProcessor::applyConfigurationProperties(){
if(configProperties.size()>0) {
int size = configProperties.size();
jclass stringClass = lookForClass(SaxonProcessor::sxn_environ->env, "java/lang/String");
jobjectArray stringArray1 = SaxonProcessor::sxn_environ->env->NewObjectArray( (jint)size, stringClass, 0 );
jobjectArray stringArray2 = SaxonProcessor::sxn_environ->env->NewObjectArray( (jint)size, stringClass, 0 );
static jmethodID mIDappConfig = NULL;
if(mIDappConfig == NULL) {
mIDappConfig = (jmethodID) SaxonProcessor::sxn_environ->env->GetStaticMethodID(saxonCAPIClass,"applyToConfiguration",
"(Lnet/sf/saxon/s9api/Processor;[Ljava/lang/String;[Ljava/lang/String;)V");
if (!mIDappConfig) {
std::cerr << "Error: SaxonDll." << "applyToConfiguration"
<< " not found\n" << std::endl;
return;
}
}
int i=0;
std::map<std::string, std::string >::iterator iter =configProperties.begin();
for(iter=configProperties.begin(); iter!=configProperties.end(); ++iter, i++) {
SaxonProcessor::sxn_environ->env->SetObjectArrayElement( stringArray1, i, SaxonProcessor::sxn_environ->env->NewStringUTF( (iter->first).c_str() ));
SaxonProcessor::sxn_environ->env->SetObjectArrayElement( stringArray2, i, SaxonProcessor::sxn_environ->env->NewStringUTF((iter->second).c_str()) );
}
SaxonProcessor::sxn_environ->env->CallStaticObjectMethod(saxonCAPIClass, mIDappConfig,proc, stringArray1,stringArray2);
if (exceptionOccurred()) {
checkAndCreateException(saxonCAPIClass);
exceptionClear(false);
}
SaxonProcessor::sxn_environ->env->DeleteLocalRef(stringArray1);
SaxonProcessor::sxn_environ->env->DeleteLocalRef(stringArray2);

}
}


jobjectArray SaxonProcessor::createJArray(XdmValue ** values, int length){
jobjectArray valueArray = NULL;

jclass xdmValueClass = lookForClass(SaxonProcessor::sxn_environ->env,
"net/sf/saxon/s9api/XdmValue");


valueArray = SaxonProcessor::sxn_environ->env->NewObjectArray((jint) length,
xdmValueClass, 0);

for (int i=0; i<length; i++) {
#ifdef DEBUG
std::string s1 = typeid(values[i]).name();
std::cerr<<"In createJArray\nType of itr:"<<s1<<std::endl;


jobject xx = values[i]->getUnderlyingValue();

if(xx == NULL) {
std::cerr<<"value failed"<<std::endl;
} else {

std::cerr<<"Type of value:"<<(typeid(xx).name())<<std::endl;
}
if(values[i]->getUnderlyingValue() == NULL) {
std::cerr<<"value["<<i<<"]->getUnderlyingValue() is NULL"<<std::endl;
}
#endif
SaxonProcessor::sxn_environ->env->SetObjectArrayElement(valueArray, i,values[i]->getUnderlyingValue());
}
return valueArray;

}


JParameters SaxonProcessor::createParameterJArray(std::map<std::string,XdmValue*> parameters, std::map<std::string,std::string> properties){
JParameters comboArrays;
comboArrays.stringArray = NULL;
comboArrays.objectArray = NULL;
jclass objectClass = lookForClass(SaxonProcessor::sxn_environ->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: "<<properties.size()<<std::endl;
std::cerr<<"Parameter size: "<<parameters.size()<<std::endl;
#endif
if (size > 0) {

comboArrays.objectArray = SaxonProcessor::sxn_environ->env->NewObjectArray((jint) size,
objectClass, 0);
comboArrays.stringArray = SaxonProcessor::sxn_environ->env->NewObjectArray((jint) size,
stringClass, 0);
int i = 0;
for (std::map<std::string, XdmValue*>::iterator iter =
parameters.begin(); iter != parameters.end(); ++iter, i++) {

#ifdef DEBUG
std::cerr<<"map 1"<<std::endl;
std::cerr<<"iter->first"<<(iter->first).c_str()<<std::endl;
#endif
SaxonProcessor::sxn_environ->env->SetObjectArrayElement(comboArrays.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:"<<s1<<std::endl;

if((iter->second) == NULL) {std::cerr<<"iter->second is null"<<std::endl;
} else {
std::cerr<<"getting underlying value"<<std::endl;
jobject xx = (iter->second)->getUnderlyingValue();

if(xx == NULL) {
std::cerr<<"value failed"<<std::endl;
} else {

std::cerr<<"Type of value:"<<(typeid(xx).name())<<std::endl;
}
if((iter->second)->getUnderlyingValue() == NULL) {
std::cerr<<"(iter->second)->getUnderlyingValue() is NULL"<<std::endl;
}}
#endif

SaxonProcessor::sxn_environ->env->SetObjectArrayElement(comboArrays.objectArray, i,
(iter->second)->getUnderlyingValue());

}

for (std::map<std::string, std::string>::iterator iter =
properties.begin(); iter != properties.end(); ++iter, i++) {
SaxonProcessor::sxn_environ->env->SetObjectArrayElement(comboArrays.stringArray, i,
SaxonProcessor::sxn_environ->env->NewStringUTF(
(iter->first).c_str()));
SaxonProcessor::sxn_environ->env->SetObjectArrayElement(comboArrays.objectArray, i,
SaxonProcessor::sxn_environ->env->NewStringUTF(
(iter->second).c_str()));
}

return comboArrays;

} else {
return comboArrays;
}
}


SaxonProcessor& SaxonProcessor::operator=( const SaxonProcessor& other ){
versionClass = other.versionClass;
procClass = other.procClass;
saxonCAPIClass = other.saxonCAPIClass;
cwd = other.cwd;
proc = other.proc;
//SaxonProcessor::sxn_environ= other.environ;
parameters = other.parameters;
configProperties = other.configProperties;
licensei = other.licensei;
exception = other.exception;
return *this;
}

XsltProcessor * SaxonProcessor::newXsltProcessor(){
applyConfigurationProperties();
return (new XsltProcessor(this, cwd));
}

Xslt30Processor * SaxonProcessor::newXslt30Processor(){
applyConfigurationProperties();
return (new Xslt30Processor(this, cwd));
}

XQueryProcessor * SaxonProcessor::newXQueryProcessor(){
applyConfigurationProperties();
return (new XQueryProcessor(this,cwd));
}

XPathProcessor * SaxonProcessor::newXPathProcessor(){
applyConfigurationProperties();
return (new XPathProcessor(this, cwd));
}

SchemaValidator * SaxonProcessor::newSchemaValidator(){
if(licensei) {
applyConfigurationProperties();
return (new SchemaValidator(this, cwd));
} else {
std::cerr<<"\nError: Processor is not licensed for schema processing!"<<std::endl;
return NULL;
}
}



const char * SaxonProcessor::version() {
if(versionStr == NULL) {
static jmethodID MID_version = (jmethodID)SaxonProcessor::sxn_environ->env->GetStaticMethodID(saxonCAPIClass, "getProductVersion", "(Lnet/sf/saxon/s9api/Processor;)Ljava/lang/String;");
if (!MID_version) {
std::cerr<<"\nError: MyClassInDll "<<"SaxonCAPI.getProductVersion()"<<" not found"<<std::endl;
return NULL;
}

jstring jstr = (jstring)(SaxonProcessor::sxn_environ->env->CallStaticObjectMethod(saxonCAPIClass, MID_version, proc));
const char * tempVersionStr = SaxonProcessor::sxn_environ->env->GetStringUTFChars(jstr, NULL);
int verLen = strlen(tempVersionStr)+22+strlen(CVERSION)+1;
versionStr =new char [verLen];
snprintf(versionStr, verLen, "Saxon/C %s %s %s", CVERSION, "running with", tempVersionStr);
delete tempVersionStr;

}
return versionStr;
}

void SaxonProcessor::setcwd(const char* dir){
cwd = std::string(dir);
}

const char* SaxonProcessor::getcwd(){
return cwd.c_str();
}

void SaxonProcessor::setResourcesDirectory(const char* dir){
//memset(&resources_dir[0], 0, sizeof(resources_dir));
#if defined(__linux__) || defined (__APPLE__)
strncat(_getResourceDirectory(), dir, strlen(dir));
#else
int destSize = strlen(dir) + strlen(dir);
strncat_s(_getResourceDirectory(), destSize,dir, strlen(dir));

#endif
}


void SaxonProcessor::setCatalog(const char* catalogFile, bool isTracing){
jclass xmlResolverClass = lookForClass(SaxonProcessor::sxn_environ->env, "Lnet/sf/saxon/trans/XmlCatalogResolver;");
static jmethodID catalogMID = SaxonProcessor::sxn_environ->env->GetStaticMethodID(xmlResolverClass, "setCatalog", "(Ljava/lang/String;Lnet/sf/saxon/Configuration;Z)V");

if (!catalogMID) {
std::cerr<<"\nError: Saxonc."<<"setCatalog()"<<" not found"<<std::endl;
return;
}
if(catalogFile == NULL) {

return;
}
static jmethodID configMID = SaxonProcessor::sxn_environ->env->GetMethodID(procClass, "getUnderlyingConfiguration", "()Lnet/sf/saxon/Configuration;");

if (!configMID) {
std::cerr<<"\nError: Saxonc."<<"getUnderlyingConfiguration()"<<" not found"<<std::endl;
return;
}


if(!proc) {
std::cout<<"proc is NULL in SaxonProcessorsetCatalog"<<std::endl;
return;
}

jobject configObj = SaxonProcessor::sxn_environ->env->CallObjectMethod(proc, configMID);

if(!configObj) {
std::cout<<"proc is NULL in SaxonProcessor setcatalog - config obj"<<std::endl;
return;
}
SaxonProcessor::sxn_environ->env->CallStaticVoidMethod(xmlResolverClass, catalogMID, SaxonProcessor::sxn_environ->env->NewStringUTF(catalogFile), configObj ,(jboolean)isTracing);
#ifdef DEBUG
SaxonProcessor::sxn_environ->env->ExceptionDescribe();
#endif
}

const char * SaxonProcessor::getResourcesDirectory(){
return _getResourceDirectory();
}


XdmNode * SaxonProcessor::parseXmlFromString(const char* source){

jmethodID mID = (jmethodID)SaxonProcessor::sxn_environ->env->GetStaticMethodID(saxonCAPIClass, "parseXmlString", "(Lnet/sf/saxon/s9api/Processor;Lnet/sf/saxon/s9api/SchemaValidator;Ljava/lang/String;)Lnet/sf/saxon/s9api/XdmNode;");
if (!mID) {
std::cerr<<"\nError: Saxonc."<<"parseXmlString()"<<" not found"<<std::endl;
return NULL;
}
//TODO SchemaValidator

jobject xdmNodei = SaxonProcessor::sxn_environ->env->CallStaticObjectMethod(saxonCAPIClass, mID, proc, NULL, SaxonProcessor::sxn_environ->env->NewStringUTF(source));
if(xdmNodei) {
XdmNode * value = new XdmNode(xdmNodei);
value->setProcessor(this);
return value;
} else if (exceptionOccurred()) {
checkAndCreateException(saxonCAPIClass);
exceptionClear(false);
}

#ifdef DEBUG
SaxonProcessor::sxn_environ->env->ExceptionDescribe();
#endif

return NULL;
}

int SaxonProcessor::getNodeKind(jobject obj){
jclass xdmNodeClass = lookForClass(SaxonProcessor::sxn_environ->env, "Lnet/sf/saxon/s9api/XdmNode;");
static jmethodID nodeKindMID = (jmethodID) SaxonProcessor::sxn_environ->env->GetMethodID(xdmNodeClass,"getNodeKind", "()Lnet/sf/saxon/s9api/XdmNodeKind;");
if (!nodeKindMID) {
std::cerr << "Error: MyClassInDll." << "getNodeKind" << " not found\n"
<< std::endl;
return 0;
}

jobject nodeKindObj = (SaxonProcessor::sxn_environ->env->CallObjectMethod(obj, nodeKindMID));
if(!nodeKindObj) {

return 0;
}
jclass xdmUtilsClass = lookForClass(SaxonProcessor::sxn_environ->env, "Lnet/sf/saxon/option/cpp/XdmUtils;");

jmethodID mID2 = (jmethodID) SaxonProcessor::sxn_environ->env->GetStaticMethodID(xdmUtilsClass,"convertNodeKindType", "(Lnet/sf/saxon/s9api/XdmNodeKind;)I");

if (!mID2) {
std::cerr << "Error: MyClassInDll." << "convertNodeKindType" << " not found\n"
<< std::endl;
return 0;
}
if(!nodeKindObj){
return 0;
}
int nodeKind = (int)(SaxonProcessor::sxn_environ->env->CallStaticIntMethod(xdmUtilsClass, mID2, nodeKindObj));
return nodeKind;
}



XdmNode * SaxonProcessor::parseXmlFromFile(const char* source){

jmethodID mID = (jmethodID)SaxonProcessor::sxn_environ->env->GetStaticMethodID(saxonCAPIClass, "parseXmlFile", "(Lnet/sf/saxon/s9api/Processor;Ljava/lang/String;Lnet/sf/saxon/s9api/SchemaValidator;Ljava/lang/String;)Lnet/sf/saxon/s9api/XdmNode;");
if (!mID) {
std::cerr<<"\nError: Saxonc.Dll "<<"parseXmlFile()"<<" not found"<<std::endl;
return NULL;
}
//TODO SchemaValidator
jobject xdmNodei = SaxonProcessor::sxn_environ->env->CallStaticObjectMethod(saxonCAPIClass, mID, proc, SaxonProcessor::sxn_environ->env->NewStringUTF(cwd.c_str()), NULL, SaxonProcessor::sxn_environ->env->NewStringUTF(source));
if(exceptionOccurred()) {
checkAndCreateException(saxonCAPIClass);
exceptionClear(false);

} else {

XdmNode * value = new XdmNode(xdmNodei);
value->setProcessor(this);
return value;
}
return NULL;
}

XdmNode * SaxonProcessor::parseXmlFromUri(const char* source){

jmethodID mID = (jmethodID)SaxonProcessor::sxn_environ->env->GetStaticMethodID(saxonCAPIClass, "parseXmlFile", "(Lnet/sf/saxon/s9api/Processor;Ljava/lang/String;Ljava/lang/String;)Lnet/sf/saxon/s9api/XdmNode;");
if (!mID) {
std::cerr<<"\nError: Saxonc.Dll "<<"parseXmlFromUri()"<<" not found"<<std::endl;
return NULL;
}
jobject xdmNodei = SaxonProcessor::sxn_environ->env->CallStaticObjectMethod(saxonCAPIClass, mID, proc, SaxonProcessor::sxn_environ->env->NewStringUTF(""), SaxonProcessor::sxn_environ->env->NewStringUTF(source));
if(exceptionOccurred()) {
checkAndCreateException(saxonCAPIClass);
} else {
XdmNode * value = new XdmNode(xdmNodei);
value->setProcessor(this);
return value;
}
return NULL;
}


/**
* Set a configuration property.
*
* @param name of the property
* @param value of the property
*/
void SaxonProcessor::setConfigurationProperty(const char * name, const char * value){
if(name != NULL){
configProperties.insert(std::pair<std::string, std::string>(std::string(name), std::string((value == NULL ? "" : value))));
}
}

void SaxonProcessor::clearConfigurationProperties(){
configProperties.clear();
}



void SaxonProcessor::release(){
if(SaxonProcessor::jvmCreatedCPP!=0) {
SaxonProcessor::jvmCreatedCPP =0;
//std::cerr<<"SaxonProc: JVM finalized calling !"<<std::endl;
finalizeJavaRT (SaxonProcessor::sxn_environ->jvm);

//delete SaxonProcessor::sxn_environ;
/*clearParameters();
clearProperties();*/
} else {
#ifdef DEBUG
std::cerr<<"SaxonProc: JVM finalize not called!"<<std::endl;
#endif
}
}




/* ========= Factory method for Xdm ======== */

XdmAtomicValue * SaxonProcessor::makeStringValue(const char * str){
jobject obj = getJavaStringValue(SaxonProcessor::sxn_environ, str);
jmethodID mID_atomic = (jmethodID)(SaxonProcessor::sxn_environ->env->GetMethodID (xdmAtomicClass, "<init>", "(Ljava/lang/String;)V"));
jobject obj2 = (jobject)(SaxonProcessor::sxn_environ->env->NewObject(xdmAtomicClass, mID_atomic, obj));
XdmAtomicValue * value = new XdmAtomicValue(obj2, "xs:string");
value->setProcessor(this);
return value;
}

XdmAtomicValue * SaxonProcessor::makeStringValue(std::string str){
jobject obj = getJavaStringValue(SaxonProcessor::sxn_environ, str.c_str());
jmethodID mID_atomic = (jmethodID)(SaxonProcessor::sxn_environ->env->GetMethodID (xdmAtomicClass, "<init>", "(Ljava/lang/String;)V"));
jobject obj2 = (jobject)(SaxonProcessor::sxn_environ->env->NewObject(xdmAtomicClass, mID_atomic, obj));
XdmAtomicValue * value = new XdmAtomicValue(obj2, "xs:string");
value->setProcessor(this);
return value;
}

XdmAtomicValue * SaxonProcessor::makeIntegerValue(int i){
//jobject obj = integerValue(*SaxonProcessor::sxn_environ, i);
jmethodID mID_atomic = (jmethodID)(SaxonProcessor::sxn_environ->env->GetMethodID (xdmAtomicClass, "<init>", "(J)V"));


jobject obj = (jobject)(SaxonProcessor::sxn_environ->env->NewObject(xdmAtomicClass, mID_atomic, (jlong)i));
XdmAtomicValue * value = new XdmAtomicValue(obj, "Q{http://www.w3.org/2001/XMLSchema}integer");
value->setProcessor(this);
return value;
}

XdmAtomicValue * SaxonProcessor::makeDoubleValue(double d){
//jobject obj = doubleValue(*SaxonProcessor::sxn_environ, d);
jmethodID mID_atomic = (jmethodID)(SaxonProcessor::sxn_environ->env->GetMethodID (xdmAtomicClass, "<init>", "(D)V"));
jobject obj = (jobject)(SaxonProcessor::sxn_environ->env->NewObject(xdmAtomicClass, mID_atomic, (jdouble)d));
XdmAtomicValue * value = new XdmAtomicValue(obj, "Q{http://www.w3.org/2001/XMLSchema}double");
value->setProcessor(this);
return value;
}

XdmAtomicValue * SaxonProcessor::makeFloatValue(float d){
//jobject obj = doubleValue(*SaxonProcessor::sxn_environ, d);
jmethodID mID_atomic = (jmethodID)(SaxonProcessor::sxn_environ->env->GetMethodID (xdmAtomicClass, "<init>", "(F)V"));
jobject obj = (jobject)(SaxonProcessor::sxn_environ->env->NewObject(xdmAtomicClass, mID_atomic, (jfloat)d));
XdmAtomicValue * value = new XdmAtomicValue(obj, "Q{http://www.w3.org/2001/XMLSchema}float");
value->setProcessor(this);
return value;
}

XdmAtomicValue * SaxonProcessor::makeLongValue(long l){
//jobject obj = longValue(*SaxonProcessor::sxn_environ, l);
jmethodID mID_atomic = (jmethodID)(SaxonProcessor::sxn_environ->env->GetMethodID (xdmAtomicClass, "<init>", "(J)V"));
jobject obj = (jobject)(SaxonProcessor::sxn_environ->env->NewObject(xdmAtomicClass, mID_atomic, (jlong)l));
XdmAtomicValue * value = new XdmAtomicValue(obj, "Q{http://www.w3.org/2001/XMLSchema}long");
value->setProcessor(this);
return value;
}

XdmAtomicValue * SaxonProcessor::makeBooleanValue(bool b){
//jobject obj = booleanValue(*SaxonProcessor::sxn_environ, b);
jmethodID mID_atomic = (jmethodID)(SaxonProcessor::sxn_environ->env->GetMethodID (xdmAtomicClass, "<init>", "(Z)V"));
jobject obj = (jobject)(SaxonProcessor::sxn_environ->env->NewObject(xdmAtomicClass, mID_atomic, (jboolean)b));
XdmAtomicValue * value = new XdmAtomicValue(obj, "Q{http://www.w3.org/2001/XMLSchema}boolean");
value->setProcessor(this);
return value;
}

XdmAtomicValue * SaxonProcessor::makeQNameValue(const char* str){
jobject val = xdmValueAsObj(SaxonProcessor::sxn_environ, "QName", str);
XdmAtomicValue * value = new XdmAtomicValue(val, "QName");
value->setProcessor(this);
return value;
}

XdmAtomicValue * SaxonProcessor::makeAtomicValue(const char * typei, const char * strValue){
jobject obj = xdmValueAsObj(SaxonProcessor::sxn_environ, typei, strValue);
XdmAtomicValue * value = new XdmAtomicValue(obj, typei);
value->setProcessor(this);
return value;
}

const char * SaxonProcessor::getStringValue(XdmItem * item){
const char *result = stringValue(SaxonProcessor::sxn_environ, item->getUnderlyingValue());
#ifdef DEBUG
if(result == NULL) {
std::cout<<"getStringValue of XdmItem is NULL"<<std::endl;
} else {
std::cout<<"getStringValue of XdmItem is OK"<<std::endl;
}
#endif

return result;

}
    (1-1/1)