f911ba985a
From-SVN: r102074
869 lines
25 KiB
C
869 lines
25 KiB
C
/* xmlj_transform.c -
|
|
Copyright (C) 2003, 2004 Free Software Foundation, Inc.
|
|
|
|
This file is part of GNU Classpath.
|
|
|
|
GNU Classpath is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
GNU Classpath is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GNU Classpath; see the file COPYING. If not, write to the
|
|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
02110-1301 USA.
|
|
|
|
Linking this library statically or dynamically with other modules is
|
|
making a combined work based on this library. Thus, the terms and
|
|
conditions of the GNU General Public License cover the whole
|
|
combination.
|
|
|
|
As a special exception, the copyright holders of this library give you
|
|
permission to link this library with independent modules to produce an
|
|
executable, regardless of the license terms of these independent
|
|
modules, and to copy and distribute the resulting executable under
|
|
terms of your choice, provided that you also meet, for each linked
|
|
independent module, the terms and conditions of the license of that
|
|
module. An independent module is a module which is not derived from
|
|
or based on this library. If you modify this library, you may extend
|
|
this exception to your version of the library, but you are not
|
|
obligated to do so. If you do not wish to do so, delete this
|
|
exception statement from your version. */
|
|
|
|
#include "gnu_xml_libxmlj_transform_GnomeTransformerFactory.h"
|
|
#include "gnu_xml_libxmlj_transform_GnomeTransformer.h"
|
|
|
|
#include "xmlj_dom.h"
|
|
#include "xmlj_io.h"
|
|
#include "xmlj_error.h"
|
|
#include "xmlj_node.h"
|
|
#include "xmlj_sax.h"
|
|
#include "xmlj_util.h"
|
|
|
|
#include <math.h>
|
|
#include <stdarg.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include <libxml/xmlmemory.h>
|
|
#include <libxml/debugXML.h>
|
|
#include <libxml/xmlIO.h>
|
|
#include <libxml/xinclude.h>
|
|
#include <libxml/parser.h>
|
|
#include <libxml/catalog.h>
|
|
#include <libxslt/keys.h>
|
|
#include <libxslt/xslt.h>
|
|
#include <libxslt/xsltInternals.h>
|
|
#include <libxslt/transform.h>
|
|
#include <libxslt/xsltutils.h>
|
|
#include <libxslt/functions.h>
|
|
#include <libxslt/extensions.h>
|
|
#include <libxslt/documents.h>
|
|
|
|
/* Local function prototypes */
|
|
|
|
void
|
|
xmljDocumentFunction (xmlXPathParserContextPtr ctxt, int nargs);
|
|
|
|
xsltStylesheetPtr
|
|
xmljGetStylesheetID (JNIEnv * env, jobject transformer);
|
|
|
|
jobject
|
|
xmljGetTransformerProperties (JNIEnv *env, jobject transformer);
|
|
|
|
const xmlChar *
|
|
xmljBooleanToString (int value);
|
|
|
|
void
|
|
xmljSetOutputProperties (JNIEnv *env, jobject transformer,
|
|
xsltStylesheetPtr stylesheet);
|
|
|
|
jobjectArray
|
|
xmljGetParameterArray (JNIEnv *env, jobject transformer);
|
|
|
|
const char **
|
|
xmljGetParameters (JNIEnv *env, jobjectArray pa);
|
|
|
|
void
|
|
xmljFreeParameters (JNIEnv *env, jobjectArray pa, const char **parameters);
|
|
|
|
xmlDocPtr
|
|
xmljTransform (JNIEnv *env, jobject transformer, xmlDocPtr source);
|
|
|
|
void
|
|
xmljTransformToSAX (JNIEnv *env, jobject transformer, xmlDocPtr source,
|
|
jobject callback);
|
|
|
|
xmlDocPtr
|
|
xmljDocLoader (const xmlChar *uri, xmlDictPtr dict, int options,
|
|
void *ctxt, xsltLoadType type);
|
|
|
|
/* HACK: store stylesheet URL as context for resolving URIs in xmljDocLoader */
|
|
static jstring stylesheetURL = NULL;
|
|
|
|
/*
|
|
* --------------------------------------------------------------------------
|
|
*
|
|
* Native implementation for class
|
|
* gnu.xml.libxmlj.transform.GnomeTransformer follows.
|
|
*/
|
|
|
|
static void
|
|
xmljSetProperty (JNIEnv * env, jobject outputProperties,
|
|
jmethodID setPropertyMethodID, const char *name,
|
|
const xmlChar * value)
|
|
{
|
|
if (NULL != value)
|
|
{
|
|
jstring nameString = (*env)->NewStringUTF (env, name);
|
|
jstring valueString = (*env)->NewStringUTF (env, (const char *) value);
|
|
|
|
jobject prevValue = (*env)->CallObjectMethod (env, outputProperties,
|
|
setPropertyMethodID,
|
|
nameString, valueString);
|
|
if (NULL != prevValue)
|
|
{
|
|
(*env)->DeleteLocalRef (env, prevValue);
|
|
}
|
|
|
|
(*env)->DeleteLocalRef (env, nameString);
|
|
(*env)->DeleteLocalRef (env, valueString);
|
|
}
|
|
}
|
|
|
|
typedef struct CdataSectionScannerInfo_
|
|
{
|
|
JNIEnv *env;
|
|
jobject stringBuffer;
|
|
jmethodID appendMethodID;
|
|
int isFirst;
|
|
} CdataSectionScannerInfo;
|
|
|
|
static void
|
|
cdataSectionScanner (void *payload, void *data, xmlChar * name)
|
|
{
|
|
CdataSectionScannerInfo *info = (CdataSectionScannerInfo *) data;
|
|
JNIEnv *env = info->env;
|
|
jstring nameString = (*env)->NewStringUTF (env, (const char *) name);
|
|
jstring blankString = (*env)->NewStringUTF (env, " ");
|
|
jobject stringBuffer;
|
|
if (!info->isFirst)
|
|
{
|
|
stringBuffer
|
|
= (*env)->CallObjectMethod (env,
|
|
info->stringBuffer,
|
|
info->appendMethodID, blankString);
|
|
(*env)->DeleteLocalRef (env, stringBuffer);
|
|
}
|
|
info->isFirst = 0;
|
|
stringBuffer
|
|
= (*env)->CallObjectMethod (env,
|
|
info->stringBuffer,
|
|
info->appendMethodID, nameString);
|
|
(*env)->DeleteLocalRef (env, stringBuffer);
|
|
(*env)->DeleteLocalRef (env, blankString);
|
|
(*env)->DeleteLocalRef (env, nameString);
|
|
}
|
|
|
|
void
|
|
xmljDocumentFunction (xmlXPathParserContextPtr ctxt, int nargs)
|
|
{
|
|
xmlXPathObjectPtr obj, obj2 = NULL;
|
|
|
|
if ((nargs < 1) || (nargs > 2))
|
|
{
|
|
xsltTransformError (xsltXPathGetTransformContext (ctxt), NULL, NULL,
|
|
"document() : invalid number of args %d\n", nargs);
|
|
ctxt->error = XPATH_INVALID_ARITY;
|
|
return;
|
|
}
|
|
if (ctxt->value == NULL)
|
|
{
|
|
xsltTransformError (xsltXPathGetTransformContext (ctxt), NULL, NULL,
|
|
"document() : invalid arg value\n");
|
|
ctxt->error = XPATH_INVALID_TYPE;
|
|
return;
|
|
}
|
|
|
|
if (nargs == 2)
|
|
{
|
|
if (ctxt->value->type != XPATH_NODESET)
|
|
{
|
|
xsltTransformError (xsltXPathGetTransformContext (ctxt), NULL, NULL,
|
|
"document() : invalid arg expecting a nodeset\n");
|
|
ctxt->error = XPATH_INVALID_TYPE;
|
|
return;
|
|
}
|
|
|
|
obj2 = valuePop (ctxt);
|
|
}
|
|
|
|
if (ctxt->value->type == XPATH_NODESET)
|
|
{
|
|
int i;
|
|
xmlXPathObjectPtr newobj, ret;
|
|
|
|
obj = valuePop (ctxt);
|
|
ret = xmlXPathNewNodeSet (NULL);
|
|
|
|
if (obj->nodesetval)
|
|
{
|
|
for (i = 0; i < obj->nodesetval->nodeNr; i++)
|
|
{
|
|
valuePush (ctxt,
|
|
xmlXPathNewNodeSet (obj->nodesetval->nodeTab[i]));
|
|
xmlXPathStringFunction (ctxt, 1);
|
|
if (nargs == 2)
|
|
{
|
|
valuePush (ctxt, xmlXPathObjectCopy (obj2));
|
|
}
|
|
else
|
|
{
|
|
valuePush (ctxt,
|
|
xmlXPathNewNodeSet (obj->nodesetval->
|
|
nodeTab[i]));
|
|
}
|
|
xsltDocumentFunction (ctxt, 2);
|
|
newobj = valuePop (ctxt);
|
|
ret->nodesetval = xmlXPathNodeSetMerge (ret->nodesetval,
|
|
newobj->nodesetval);
|
|
xmlXPathFreeObject (newobj);
|
|
}
|
|
}
|
|
|
|
xmlXPathFreeObject (obj);
|
|
if (obj2 != NULL)
|
|
{
|
|
xmlXPathFreeObject (obj2);
|
|
}
|
|
valuePush (ctxt, ret);
|
|
return;
|
|
}
|
|
/*
|
|
* Make sure it's converted to a string
|
|
*/
|
|
xmlXPathStringFunction (ctxt, 1);
|
|
if (ctxt->value->type != XPATH_STRING)
|
|
{
|
|
xsltTransformError (xsltXPathGetTransformContext (ctxt), NULL, NULL,
|
|
"document() : invalid arg expecting a string\n");
|
|
ctxt->error = XPATH_INVALID_TYPE;
|
|
if (obj2 != NULL)
|
|
xmlXPathFreeObject (obj2);
|
|
return;
|
|
}
|
|
obj = valuePop (ctxt);
|
|
if (obj->stringval == NULL)
|
|
{
|
|
valuePush (ctxt, xmlXPathNewNodeSet (NULL));
|
|
}
|
|
else
|
|
{
|
|
|
|
xsltTransformContextPtr tctxt;
|
|
|
|
tctxt = xsltXPathGetTransformContext (ctxt);
|
|
|
|
{
|
|
SAXParseContext *saxContext =
|
|
(SAXParseContext *) tctxt->style->_private;
|
|
|
|
xmlDocPtr tree = xmljResolveURIAndOpen (saxContext,
|
|
(const char*)obj->stringval,
|
|
NULL);
|
|
|
|
xsltNewDocument (tctxt, tree); /* FIXME - free at a later point */
|
|
|
|
valuePush (ctxt, xmlXPathNewNodeSet ((xmlNodePtr) tree));
|
|
}
|
|
}
|
|
xmlXPathFreeObject (obj);
|
|
if (obj2 != NULL) {
|
|
xmlXPathFreeObject (obj2);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Returns the stylesheet pointer for the given GnomeTransformer.
|
|
*/
|
|
xsltStylesheetPtr
|
|
xmljGetStylesheetID (JNIEnv * env, jobject transformer)
|
|
{
|
|
jclass cls;
|
|
jfieldID field;
|
|
jobject id;
|
|
xsltStylesheetPtr stylesheet;
|
|
|
|
if (transformer == NULL)
|
|
{
|
|
xmljThrowException (env, "javax/xml/transform/TransformerException",
|
|
"Transformer is null");
|
|
return NULL;
|
|
}
|
|
cls = (*env)->GetObjectClass (env, transformer);
|
|
if (cls == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
field = (*env)->GetFieldID (env, cls, "stylesheet", "Ljava/lang/Object;");
|
|
if (field == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
id = (*env)->GetObjectField (env, transformer, field);
|
|
stylesheet = (xsltStylesheetPtr) xmljAsPointer (env, id);
|
|
if (stylesheet == NULL)
|
|
{
|
|
xmljThrowException (env, "javax/xml/transform/TransformerException",
|
|
"Stylesheet is null");
|
|
return NULL;
|
|
}
|
|
return stylesheet;
|
|
}
|
|
|
|
jobject
|
|
xmljGetTransformerProperties (JNIEnv *env, jobject transformer)
|
|
{
|
|
jclass cls;
|
|
jfieldID field;
|
|
|
|
cls = (*env)->GetObjectClass (env, transformer);
|
|
if (cls == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
field = (*env)->GetFieldID (env, cls, "outputProperties",
|
|
"Ljava/util/Properties;");
|
|
if (field == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
return (*env)->GetObjectField (env, transformer, field);
|
|
}
|
|
|
|
const xmlChar *
|
|
xmljBooleanToString (int value)
|
|
{
|
|
return value ? BAD_CAST "yes" : BAD_CAST "no";
|
|
}
|
|
|
|
/*
|
|
* Sets the output properties for the given transformer,
|
|
* based on its stylesheet.
|
|
*/
|
|
void
|
|
xmljSetOutputProperties (JNIEnv *env, jobject transformer,
|
|
xsltStylesheetPtr stylesheet)
|
|
{
|
|
jobject outputProperties;
|
|
jclass propertiesClass;
|
|
jmethodID setPropertyMethod;
|
|
|
|
outputProperties = xmljGetTransformerProperties (env, transformer);
|
|
if (outputProperties == NULL)
|
|
{
|
|
return;
|
|
}
|
|
propertiesClass = (*env)->FindClass (env, "java/util/Properties");
|
|
if (propertiesClass == NULL)
|
|
{
|
|
return;
|
|
}
|
|
setPropertyMethod =
|
|
(*env)->GetMethodID (env, propertiesClass, "setProperty",
|
|
"(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object;");
|
|
if (setPropertyMethod == NULL)
|
|
{
|
|
return;
|
|
}
|
|
|
|
xmljSetProperty (env, outputProperties, setPropertyMethod,
|
|
"encoding", stylesheet->encoding);
|
|
|
|
xmljSetProperty (env, outputProperties, setPropertyMethod,
|
|
"media-type", stylesheet->mediaType);
|
|
|
|
xmljSetProperty (env, outputProperties, setPropertyMethod,
|
|
"doctype-public", stylesheet->doctypePublic);
|
|
|
|
xmljSetProperty (env, outputProperties, setPropertyMethod,
|
|
"doctype-system", stylesheet->doctypeSystem);
|
|
|
|
xmljSetProperty (env, outputProperties, setPropertyMethod,
|
|
"indent", xmljBooleanToString (stylesheet->indent));
|
|
|
|
xmljSetProperty (env, outputProperties, setPropertyMethod,
|
|
"method", stylesheet->method);
|
|
|
|
xmljSetProperty (env, outputProperties, setPropertyMethod,
|
|
"standalone", xmljBooleanToString (stylesheet->standalone));
|
|
|
|
xmljSetProperty (env, outputProperties, setPropertyMethod,
|
|
"version", stylesheet->version);
|
|
|
|
xmljSetProperty (env, outputProperties, setPropertyMethod,
|
|
"omit-xml-declaration",
|
|
xmljBooleanToString (stylesheet->omitXmlDeclaration));
|
|
|
|
{
|
|
CdataSectionScannerInfo info;
|
|
jclass stringBufferClass
|
|
=
|
|
(*env)->FindClass (env,
|
|
"java/lang/StringBuffer");
|
|
jmethodID stringBufferConstructorID =
|
|
(*env)->GetMethodID (env, stringBufferClass,
|
|
"<init>", "()V");
|
|
jmethodID toStringMethodID =
|
|
(*env)->GetMethodID (env, stringBufferClass,
|
|
"toString",
|
|
"()Ljava/lang/String;");
|
|
info.env = env;
|
|
info.isFirst = 1;
|
|
info.stringBuffer
|
|
= (*env)->AllocObject (env, stringBufferClass);
|
|
(*env)->CallVoidMethod (env, info.stringBuffer,
|
|
stringBufferConstructorID);
|
|
info.appendMethodID =
|
|
(*env)->GetMethodID (env, stringBufferClass,
|
|
"append",
|
|
"(Ljava/lang/String;)Ljava/lang/StringBuffer;");
|
|
|
|
xmlHashScan (stylesheet->cdataSection,
|
|
cdataSectionScanner, &info);
|
|
|
|
{
|
|
jstring result = (jstring)
|
|
(*env)->CallObjectMethod (env,
|
|
info.stringBuffer,
|
|
toStringMethodID);
|
|
|
|
jstring nameString =
|
|
(*env)->NewStringUTF (env,
|
|
"cdata-section-elements");
|
|
|
|
jobject prevValue
|
|
=
|
|
(*env)->CallObjectMethod (env,
|
|
outputProperties,
|
|
setPropertyMethod,
|
|
nameString, result);
|
|
if (NULL != prevValue)
|
|
{
|
|
(*env)->DeleteLocalRef (env, prevValue);
|
|
}
|
|
(*env)->DeleteLocalRef (env, nameString);
|
|
}
|
|
|
|
(*env)->DeleteLocalRef (env, info.stringBuffer);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Returns the parameter array for the given GnomeTransformer.
|
|
*/
|
|
jobjectArray
|
|
xmljGetParameterArray (JNIEnv *env, jobject transformer)
|
|
{
|
|
jclass cls;
|
|
jmethodID method;
|
|
|
|
cls = (*env)->GetObjectClass (env, transformer);
|
|
if (cls == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
method = (*env)->GetMethodID (env, cls, "getParameterArray",
|
|
"()[Ljava/lang/String;");
|
|
if (method == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
return (jobjectArray) (*env)->CallObjectMethod (env, transformer, method);
|
|
}
|
|
|
|
/* Convert parameter array to xmlChar ** */
|
|
const char **
|
|
xmljGetParameters (JNIEnv *env, jobjectArray pa)
|
|
{
|
|
int i, len;
|
|
const char **parameters;
|
|
|
|
len = (*env)->GetArrayLength (env, pa);
|
|
parameters = (const char **) malloc ((len + 2) * sizeof (const char *));
|
|
if (parameters == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
jstring string = (jstring) (*env)->GetObjectArrayElement (env, pa, i);
|
|
|
|
if (string != NULL)
|
|
{
|
|
parameters[i] = (*env)->GetStringUTFChars (env, string, NULL);
|
|
}
|
|
else
|
|
{
|
|
parameters[i] = NULL;
|
|
}
|
|
}
|
|
|
|
parameters[len] = 0;
|
|
parameters[len + 1] = 0;
|
|
return parameters;
|
|
}
|
|
|
|
/* Release parameter strings */
|
|
void
|
|
xmljFreeParameters (JNIEnv *env, jobjectArray pa, const char **parameters)
|
|
{
|
|
int i, len;
|
|
|
|
len = (*env)->GetArrayLength (env, pa);
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
jstring string = (jstring) (*env)->GetObjectArrayElement (env, pa, i);
|
|
if (string != NULL)
|
|
{
|
|
(*env)->ReleaseStringUTFChars (env, string, parameters[i]);
|
|
}
|
|
}
|
|
|
|
free (parameters);
|
|
}
|
|
|
|
xmlDocPtr
|
|
xmljTransform (JNIEnv *env, jobject transformer, xmlDocPtr source)
|
|
{
|
|
xsltStylesheetPtr stylesheet;
|
|
xmlDocPtr result;
|
|
jobjectArray pa;
|
|
const char **parameters;
|
|
|
|
stylesheet = xmljGetStylesheetID (env, transformer);
|
|
pa = xmljGetParameterArray (env, transformer);
|
|
parameters = xmljGetParameters (env, pa);
|
|
if (parameters == NULL)
|
|
{
|
|
xmljThrowException (env, "javax/xml/transform/TransformerException",
|
|
"Couldn't allocate memory for parameters");
|
|
return NULL;
|
|
}
|
|
result = xsltApplyStylesheet (stylesheet, source, parameters);
|
|
xmljFreeParameters (env, pa, parameters);
|
|
if (result == NULL)
|
|
{
|
|
xmljThrowException (env, "javax/xml/transform/TransformerException",
|
|
"XSLT transformation failed");
|
|
}
|
|
return result;
|
|
}
|
|
|
|
void
|
|
xmljTransformToSAX (JNIEnv *env, jobject transformer, xmlDocPtr source,
|
|
jobject callback)
|
|
{
|
|
xsltStylesheetPtr stylesheet;
|
|
int ret;
|
|
jobjectArray pa;
|
|
const char **parameters;
|
|
xmlSAXHandlerPtr sax;
|
|
|
|
stylesheet = xmljGetStylesheetID (env, transformer);
|
|
pa = xmljGetParameterArray (env, transformer);
|
|
parameters = xmljGetParameters (env, pa);
|
|
if (parameters == NULL)
|
|
{
|
|
xmljThrowException (env, "javax/xml/transform/TransformerException",
|
|
"Couldn't allocate memory for parameters");
|
|
return;
|
|
}
|
|
sax = NULL; /* TODO link up sax and callback */
|
|
ret = xsltRunStylesheet (stylesheet, source, parameters, NULL, sax, NULL);
|
|
xmljFreeParameters (env, pa, parameters);
|
|
if (ret == -1)
|
|
{
|
|
xmljThrowException (env, "javax/xml/transform/TransformerException",
|
|
"XSLT transformation failed");
|
|
}
|
|
}
|
|
|
|
xmlDocPtr
|
|
xmljDocLoader (const xmlChar *uri, xmlDictPtr dict, int options,
|
|
void *ctxt, xsltLoadType type)
|
|
{
|
|
JNIEnv *env;
|
|
jclass xmljClass;
|
|
jclass inputStreamClass;
|
|
jmethodID getInputStream;
|
|
jmethodID getDetectBuffer;
|
|
jstring systemId;
|
|
jobject inputStream;
|
|
jbyteArray detectBuffer;
|
|
|
|
fflush(stdout);
|
|
env = xmljGetJNIEnv ();
|
|
if (!env)
|
|
{
|
|
return NULL;
|
|
}
|
|
xmljClass = (*env)->FindClass (env, "gnu/xml/libxmlj/util/XMLJ");
|
|
if (!xmljClass)
|
|
{
|
|
return NULL;
|
|
}
|
|
getInputStream =
|
|
(*env)->GetStaticMethodID (env, xmljClass, "xmljGetInputStream",
|
|
"(Ljava/lang/String;Ljava/lang/String;)Lgnu/xml/libxmlj/util/NamedInputStream;");
|
|
if (!getInputStream)
|
|
{
|
|
return NULL;
|
|
}
|
|
systemId = xmljNewString (env, uri);
|
|
inputStream = (*env)->CallStaticObjectMethod (env, xmljClass, getInputStream,
|
|
stylesheetURL, systemId);
|
|
if (!inputStream)
|
|
{
|
|
return NULL;
|
|
}
|
|
inputStreamClass = (*env)->GetObjectClass (env, inputStream);
|
|
if (!inputStreamClass)
|
|
{
|
|
return NULL;
|
|
}
|
|
getDetectBuffer = (*env)->GetMethodID (env, inputStreamClass,
|
|
"getDetectBuffer", "()[B");
|
|
if (!getDetectBuffer)
|
|
{
|
|
return NULL;
|
|
}
|
|
detectBuffer = (*env)->CallObjectMethod (env, inputStream, getDetectBuffer);
|
|
if (!detectBuffer)
|
|
{
|
|
return NULL;
|
|
}
|
|
return xmljParseDocument (env, NULL, inputStream, detectBuffer,
|
|
NULL, systemId, stylesheetURL,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 2);
|
|
}
|
|
|
|
/* GnomeTransformer.newStylesheet */
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_transform_GnomeTransformer_newStylesheet (JNIEnv *env,
|
|
jobject self)
|
|
{
|
|
xsltStylesheetPtr stylesheet;
|
|
jobject ret;
|
|
|
|
stylesheetURL = NULL;
|
|
xsltSetLoaderFunc (xmljDocLoader);
|
|
stylesheet = xsltNewStylesheet ();
|
|
xmljSetOutputProperties (env, self, stylesheet);
|
|
ret = xmljAsField (env, stylesheet);
|
|
if (ret == NULL)
|
|
{
|
|
xmljThrowException (env,
|
|
"javax/xml/transform/TransformerConfigurationException",
|
|
"Can't create Java object for stylesheet");
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/* GnomeTransformer.newStylesheetFromStream */
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_transform_GnomeTransformer_newStylesheetFromStream
|
|
(JNIEnv *env, jobject self, jobject in, jbyteArray detectBuffer,
|
|
jstring publicId, jstring systemId, jstring base,
|
|
jboolean entityResolver, jboolean errorHandler)
|
|
{
|
|
xmlDocPtr doc;
|
|
xsltStylesheetPtr stylesheet;
|
|
jobject ret;
|
|
|
|
doc = xmljParseDocument (env, self, in, detectBuffer, publicId, systemId,
|
|
base, 0, 0, 0, 0, 0,
|
|
entityResolver, errorHandler, 0, 0, 2);
|
|
if (doc == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
stylesheetURL = systemId;
|
|
xsltSetLoaderFunc (xmljDocLoader);
|
|
stylesheet = xsltParseStylesheetDoc (doc);
|
|
if (stylesheet == NULL)
|
|
{
|
|
xmljThrowException (env,
|
|
"javax/xml/transform/TransformerConfigurationException",
|
|
"Error parsing XSLT stylesheet");
|
|
return NULL;
|
|
}
|
|
xmljSetOutputProperties (env, self, stylesheet);
|
|
ret = xmljAsField (env, stylesheet);
|
|
if (ret == NULL)
|
|
{
|
|
xmljThrowException (env,
|
|
"javax/xml/transform/TransformerConfigurationException",
|
|
"Can't create Java object for stylesheet");
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/* GnomeTransformer.newStylesheetFromDoc */
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_transform_GnomeTransformer_newStylesheetFromDoc
|
|
(JNIEnv *env, jobject self, jobject in)
|
|
{
|
|
xmlDocPtr doc;
|
|
xsltStylesheetPtr stylesheet;
|
|
jobject ret;
|
|
|
|
doc = (xmlDocPtr) xmljGetNodeID (env, in);
|
|
if (doc == NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
stylesheetURL = xmljNewString (env, doc->URL);
|
|
xsltSetLoaderFunc (xmljDocLoader);
|
|
stylesheet = xsltParseStylesheetDoc (doc);
|
|
if (stylesheet == NULL)
|
|
{
|
|
xmljThrowException (env,
|
|
"javax/xml/transform/TransformerConfigurationException",
|
|
"Error parsing XSLT stylesheet");
|
|
}
|
|
xmljSetOutputProperties (env, self, stylesheet);
|
|
ret = xmljAsField (env, stylesheet);
|
|
if (ret == NULL)
|
|
{
|
|
xmljThrowException (env,
|
|
"javax/xml/transform/TransformerConfigurationException",
|
|
"Can't create Java object for stylesheet");
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
/* GnomeTransformer.transformStreamToStream */
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_transform_GnomeTransformer_transformStreamToStream
|
|
(JNIEnv *env, jobject self, jobject in, jbyteArray detectBuffer,
|
|
jstring publicId, jstring systemId, jstring base,
|
|
jboolean entityResolver, jboolean errorHandler, jobject out)
|
|
{
|
|
xmlDocPtr source;
|
|
xmlDocPtr result;
|
|
|
|
source = xmljParseDocument (env, self, in, detectBuffer, publicId, systemId,
|
|
base, 0, 0, 0, 0, 0,
|
|
entityResolver, errorHandler, 0, 0, 2);
|
|
result = xmljTransform (env, self, source);
|
|
xmljSaveFileToJavaOutputStream (env, out, result,
|
|
(const char*) result->encoding);
|
|
xmlFreeDoc (result);
|
|
}
|
|
|
|
/* GnomeTransformer.transformStreamToDoc */
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_transform_GnomeTransformer_transformStreamToDoc
|
|
(JNIEnv *env, jobject self, jobject in, jbyteArray detectBuffer,
|
|
jstring publicId, jstring systemId, jstring base,
|
|
jboolean entityResolver, jboolean errorHandler)
|
|
{
|
|
xmlDocPtr source;
|
|
xmlDocPtr result;
|
|
|
|
source = xmljParseDocument (env, self, in, detectBuffer, publicId, systemId,
|
|
base, 0, 0, 0, 0, 0,
|
|
entityResolver, errorHandler, 0, 0, 2);
|
|
result = xmljTransform (env, self, source);
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) result);
|
|
}
|
|
|
|
/* GnomeTransformer.transformStreamToSAX */
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_transform_GnomeTransformer_transformStreamToSAX
|
|
(JNIEnv *env, jobject self, jobject in, jbyteArray detectBuffer,
|
|
jstring publicId, jstring systemId, jstring base,
|
|
jboolean entityResolver, jboolean errorHandler, jobject callback)
|
|
{
|
|
xmlDocPtr source;
|
|
|
|
source = xmljParseDocument (env, self, in, detectBuffer, publicId, systemId,
|
|
base, 0, 0, 0, 0, 0,
|
|
entityResolver, errorHandler, 0, 0, 2);
|
|
xmljTransformToSAX (env, self, source, callback);
|
|
}
|
|
|
|
/* GnomeTransformer.transformDocToStream */
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_transform_GnomeTransformer_transformDocToStream
|
|
(JNIEnv *env, jobject self, jobject doc, jobject out)
|
|
{
|
|
xmlDocPtr source;
|
|
xmlDocPtr result;
|
|
|
|
source = (xmlDocPtr) xmljGetNodeID (env, doc);
|
|
result = xmljTransform (env, self, source);
|
|
xmljSaveFileToJavaOutputStream (env, out, result,
|
|
(const char*) result->encoding);
|
|
xmlFreeDoc (result);
|
|
}
|
|
|
|
/* GnomeTransformer.transformDocToDoc */
|
|
JNIEXPORT jobject JNICALL
|
|
Java_gnu_xml_libxmlj_transform_GnomeTransformer_transformDocToDoc
|
|
(JNIEnv *env, jobject self, jobject doc)
|
|
{
|
|
xmlDocPtr source;
|
|
xmlDocPtr result;
|
|
|
|
source = (xmlDocPtr) xmljGetNodeID (env, doc);
|
|
result = xmljTransform (env, self, source);
|
|
return xmljGetNodeInstance (env, (xmlNodePtr) result);
|
|
}
|
|
|
|
/* GnomeTransformer.transformDocToSAX */
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_transform_GnomeTransformer_transformDocToSAX
|
|
(JNIEnv *env, jobject self, jobject doc, jobject callback)
|
|
{
|
|
xmlDocPtr source;
|
|
|
|
source = (xmlDocPtr) xmljGetNodeID (env, doc);
|
|
xmljTransformToSAX (env, self, source, callback);
|
|
}
|
|
|
|
/* GnomeTransformer.free */
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_transform_GnomeTransformer_free (JNIEnv *env,
|
|
jobject self)
|
|
{
|
|
xsltStylesheetPtr stylesheet;
|
|
|
|
stylesheet = xmljGetStylesheetID (env, self);
|
|
xsltFreeStylesheet (stylesheet);
|
|
}
|
|
|
|
/*
|
|
* --------------------------------------------------------------------------
|
|
* Native implementation for class
|
|
* gnu.xml.libxmlj.transform.GnomeTransformerFactory follows.
|
|
*/
|
|
|
|
/* GnomeTransformerFactory.freeLibxsltGlobal */
|
|
JNIEXPORT void JNICALL
|
|
Java_gnu_xml_libxmlj_transform_GnomeTransformerFactory_freeLibxsltGlobal (
|
|
JNIEnv *env __attribute__((__unused__)),
|
|
jclass clazz __attribute__((__unused__)))
|
|
{
|
|
xsltCleanupGlobals ();
|
|
xmlCleanupParser ();
|
|
}
|
|
|