You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mo...@apache.org on 2001/09/28 16:39:14 UTC
cvs commit: xml-xalan/java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java TransformerImpl.java
morten 01/09/28 07:39:14
Modified: java/src/org/apache/xalan/xsltc Translet.java
java/src/org/apache/xalan/xsltc/cmdline Transform.java
java/src/org/apache/xalan/xsltc/dom
NodeSortRecordFactory.java
java/src/org/apache/xalan/xsltc/runtime
AbstractTranslet.java
java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java
TransformerImpl.java
Log:
A fix for the problem with loading auxiliary classes for sorting when
called from TrAX API.
PR: n/a
Obtained from: n/a
Submitted by: morten@xml.apache.org
Reviewed by: morten@xml.apache.org
Revision Changes Path
1.3 +3 -1 xml-xalan/java/src/org/apache/xalan/xsltc/Translet.java
Index: Translet.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/Translet.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Translet.java 2001/07/19 13:16:17 1.2
+++ Translet.java 2001/09/28 14:39:14 1.3
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: Translet.java,v 1.2 2001/07/19 13:16:17 morten Exp $
+ * @(#)$Id: Translet.java,v 1.3 2001/09/28 14:39:14 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -78,4 +78,6 @@
public void buildKeys(DOM document, NodeIterator iterator,
TransletOutputHandler handler, int root)
throws TransletException;
+ public void addAuxiliaryClass(Class auxClass);
+ public Class getAuxiliaryClass(String className);
}
1.9 +5 -3 xml-xalan/java/src/org/apache/xalan/xsltc/cmdline/Transform.java
Index: Transform.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/cmdline/Transform.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- Transform.java 2001/09/20 16:49:10 1.8
+++ Transform.java 2001/09/28 14:39:14 1.9
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: Transform.java,v 1.8 2001/09/20 16:49:10 morten Exp $
+ * @(#)$Id: Transform.java,v 1.9 2001/09/28 14:39:14 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -145,7 +145,7 @@
// Set the DOM's DOM builder as the XMLReader's SAX2 content handler
final DOMImpl dom = new DOMImpl();
- final DOMBuilder builder = dom.getBuilder();
+ DOMBuilder builder = dom.getBuilder();
reader.setContentHandler(builder);
try {
@@ -166,7 +166,9 @@
reader.parse(_fileName);
else
reader.parse("file:"+(new File(_fileName).getAbsolutePath()));
-
+
+ builder = null;
+
// Set size of key/id indices
_translet.setIndexSize(dom.getSize());
// If there are any elements with ID attributes, build an index
1.4 +4 -3 xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeSortRecordFactory.java
Index: NodeSortRecordFactory.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/dom/NodeSortRecordFactory.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- NodeSortRecordFactory.java 2001/08/17 13:17:45 1.3
+++ NodeSortRecordFactory.java 2001/09/28 14:39:14 1.4
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: NodeSortRecordFactory.java,v 1.3 2001/08/17 13:17:45 morten Exp $
+ * @(#)$Id: NodeSortRecordFactory.java,v 1.4 2001/09/28 14:39:14 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -71,8 +71,8 @@
public class NodeSortRecordFactory {
private final DOM _dom;
- private final Class _class;
private final String _className;
+ private Class _class;
private final AbstractTranslet _translet;
@@ -88,7 +88,8 @@
try {
_dom = dom;
_className = className;
- _class = Class.forName(className);
+ _class = translet.getAuxiliaryClass(className);
+ if (_class == null) _class = Class.forName(className);
_translet = (AbstractTranslet)translet;
}
catch (ClassNotFoundException e) {
1.25 +12 -1 xml-xalan/java/src/org/apache/xalan/xsltc/runtime/AbstractTranslet.java
Index: AbstractTranslet.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/AbstractTranslet.java,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- AbstractTranslet.java 2001/09/25 20:06:33 1.24
+++ AbstractTranslet.java 2001/09/28 14:39:14 1.25
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: AbstractTranslet.java,v 1.24 2001/09/25 20:06:33 morten Exp $
+ * @(#)$Id: AbstractTranslet.java,v 1.25 2001/09/28 14:39:14 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -600,4 +600,15 @@
}
}
+ private Hashtable _auxClasses = null;
+
+ public void addAuxiliaryClass(Class auxClass) {
+ if (_auxClasses == null) _auxClasses = new Hashtable();
+ _auxClasses.put(auxClass.getName(), auxClass);
+ }
+
+ public Class getAuxiliaryClass(String className) {
+ if (_auxClasses == null) return null;
+ return((Class)_auxClasses.get(className));
+ }
}
1.6 +61 -28 xml-xalan/java/src/org/apache/xalan/xsltc/trax/TemplatesImpl.java
Index: TemplatesImpl.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/trax/TemplatesImpl.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- TemplatesImpl.java 2001/08/21 09:04:28 1.5
+++ TemplatesImpl.java 2001/09/28 14:39:14 1.6
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: TemplatesImpl.java,v 1.5 2001/08/21 09:04:28 morten Exp $
+ * @(#)$Id: TemplatesImpl.java,v 1.6 2001/09/28 14:39:14 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -64,6 +64,9 @@
package org.apache.xalan.xsltc.trax;
import java.io.Serializable;
+import java.util.Properties;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
import javax.xml.transform.*;
@@ -71,10 +74,9 @@
import org.apache.xalan.xsltc.compiler.*;
import org.apache.xalan.xsltc.runtime.*;
-import java.util.Properties;
public final class TemplatesImpl implements Templates, Serializable {
-
+
// Contains the name of the main translet class
private String _transletName = null;
@@ -84,8 +86,14 @@
// This error could occur when a compilation inside the TransformerFactory
// failed and when a template has been loaded from stable storage.
- private final static String TRANSLET_ERR_MSG =
+ private final static String NO_TRANSLET_CODE =
"This template does not contain a valid translet class definition.";
+ private final static String NO_MAIN_TRANSLET =
+ "This template does not contain a class with the name ";
+ private final static String TRANSLET_CLASS_ERR =
+ "Could not load the translet class ";
+ private final static String TRANSLET_OBJECT_ERR =
+ "Translet class loaded, but unable to create translet instance.";
// Our own private class loader - builds Class definitions from bytecodes
private class TransletClassLoader extends ClassLoader {
@@ -137,23 +145,58 @@
* Defines the translet class and auxiliary classes.
* Returns a reference to the Class object that defines the main class
*/
- private Class defineTransletClasses() {
- if (_bytecodes == null) return null;
+ private Translet defineTransletClasses()
+ throws TransformerConfigurationException {
- TransletClassLoader loader = new TransletClassLoader();
+ if (_bytecodes == null)
+ throw new TransformerConfigurationException(NO_TRANSLET_CODE);
+ TransletClassLoader loader =
+ (TransletClassLoader) AccessController.doPrivileged(
+ new PrivilegedAction() {
+ public Object run() {
+ return new TransletClassLoader();
+ }
+ }
+ );
+
try {
- Class transletClass = null;
+ int transletIndex = -1;
final int classCount = _bytecodes.length;
+ Class[] clazz = new Class[classCount];
+
for (int i = 0; i < classCount; i++) {
- Class clazz = loader.defineClass(_bytecodes[i]);
- if (clazz.getName().equals(_transletName))
- transletClass = clazz;
+ clazz[i] = loader.defineClass(_bytecodes[i]);
+ if (clazz[i].getName().equals(_transletName)) transletIndex = i;
}
- return transletClass; // Could still be 'null'
+
+ if (transletIndex < 0)
+ throw new TransformerConfigurationException(NO_MAIN_TRANSLET+
+ _transletName);
+
+ Translet translet = (Translet)clazz[transletIndex].newInstance();
+ for (int i = 0; i < classCount; i++) {
+ if (i != transletIndex)
+ translet.addAuxiliaryClass(clazz[i]);
+ }
+ return translet;
+ }
+
+ catch (ClassFormatError e) {
+ throw new TransformerConfigurationException(TRANSLET_CLASS_ERR+
+ _transletName);
+ }
+ catch (LinkageError e) {
+ throw new TransformerConfigurationException(TRANSLET_OBJECT_ERR+
+ _transletName);
+ }
+ catch (InstantiationException e) {
+ throw new TransformerConfigurationException(TRANSLET_OBJECT_ERR+
+ _transletName);
}
- catch (ClassFormatError e) {
- return null;
+ catch (IllegalAccessException e) {
+ throw new TransformerConfigurationException(TRANSLET_OBJECT_ERR+
+ _transletName);
}
}
@@ -162,7 +205,8 @@
* wrapped inside this Template. The translet instance will later
* be wrapped inside a Transformer object.
*/
- private Translet getTransletInstance() {
+ private Translet getTransletInstance()
+ throws TransformerConfigurationException {
if (_transletName == null) return null;
// First assume that the JVM already had the class definition
@@ -177,14 +221,7 @@
catch (IllegalAccessException e) { }
// Create the class definition from the bytecodes if failed
- try {
- Class transletClass = defineTransletClasses();
- if (transletClass == null) return null;
- return((Translet)transletClass.newInstance());
- }
- catch (LinkageError e) { return(null); }
- catch (InstantiationException e) { return(null); }
- catch (IllegalAccessException e) { return(null); }
+ return((Translet)defineTransletClasses());
}
/**
@@ -194,11 +231,7 @@
*/
public Transformer newTransformer()
throws TransformerConfigurationException {
- Translet translet = getTransletInstance();
- if (translet == null)
- throw new TransformerConfigurationException(TRANSLET_ERR_MSG);
- TransformerImpl transformer = new TransformerImpl(translet);
- return(transformer);
+ return(new TransformerImpl(getTransletInstance()));
}
/**
1.15 +21 -6 xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerImpl.java
Index: TransformerImpl.java
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerImpl.java,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -r1.14 -r1.15
--- TransformerImpl.java 2001/08/21 09:04:28 1.14
+++ TransformerImpl.java 2001/09/28 14:39:14 1.15
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: TransformerImpl.java,v 1.14 2001/08/21 09:04:28 morten Exp $
+ * @(#)$Id: TransformerImpl.java,v 1.15 2001/09/28 14:39:14 morten Exp $
*
* The Apache Software License, Version 1.1
*
@@ -82,6 +82,7 @@
import java.util.Enumeration;
import java.util.StringTokenizer;
+import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
@@ -276,7 +277,8 @@
// Create an internal DOM (not W3C) and get SAX2 input handler
final DOMImpl dom = new DOMImpl();
- final ContentHandler inputHandler = dom.getBuilder();
+ DOMBuilder builder = dom.getBuilder();
+ String prop = "http://xml.org/sax/properties/lexical-handler";
// Create a DTDMonitor that will trace all unparsed entity URIs
final DTDMonitor dtdMonitor = new DTDMonitor();
@@ -289,7 +291,13 @@
final InputSource input = sax.getInputSource();
final String systemId = sax.getSystemId();
dtdMonitor.handleDTD(reader);
- reader.setContentHandler(inputHandler);
+ reader.setContentHandler(builder);
+ try {
+ reader.setProperty(prop, builder);
+ }
+ catch (SAXException e) {
+ // quitely ignored
+ }
reader.parse(input);
dom.setDocumentURI(systemId);
}
@@ -301,7 +309,7 @@
final InputSource input = null;
final String systemId = domsrc.getSystemId();
dtdMonitor.handleDTD(dom2sax);
- dom2sax.setContentHandler(inputHandler);
+ dom2sax.setContentHandler(builder);
dom2sax.parse(input); // need this parameter?
dom.setDocumentURI(systemId);
}
@@ -319,8 +327,13 @@
final Reader streamReader = stream.getReader();
final String systemId = stream.getSystemId();
- reader.setContentHandler(inputHandler);
-
+ reader.setContentHandler(builder);
+ try {
+ reader.setProperty(prop, builder);
+ }
+ catch (SAXException e) {
+ // quitely ignored
+ }
InputSource input;
if (streamInput != null)
input = new InputSource(streamInput);
@@ -336,6 +349,7 @@
else {
return null;
}
+ builder = null;
// Set size of key/id indices
_translet.setIndexSize(dom.getSize());
@@ -390,6 +404,7 @@
_translet.transform(dom, handler);
}
catch (TransletException e) {
+ e.printStackTrace();
if (_errorListener != null)
postErrorToListener(e.getMessage());
throw new TransformerException(e);
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org