mkwan 2003/05/20 07:37:13
Modified: java/src/org/apache/xalan/xsltc/trax TemplatesImpl.java
TransformerFactoryImpl.java
Log:
Fix a multithread safety issue in the use-classpath option. The old code
reuses a Translet object for all newTransformer() calls, which is not the
right thing to do. We should pass in a Class array and let TemplateImpl
create a new Translet instance for each newTransformer() call.
Revision Changes Path
1.27 +9 -18
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.26
retrieving revision 1.27
diff -u -r1.26 -r1.27
--- TemplatesImpl.java 3 Feb 2003 19:31:12 -0000 1.26
+++ TemplatesImpl.java 20 May 2003 14:37:13 -0000 1.27
@@ -102,11 +102,6 @@
private byte[][] _bytecodes = null;
/**
- * The Translet instance from which the template is created.
- */
- private Translet _translet = null;
-
- /**
* Contains the translet class definition(s). These are created when
* this Templates is created or when it is read back from disk.
*/
@@ -167,14 +162,15 @@
}
/**
- * Create an XSLTC template object from a Translet instance.
+ * Create an XSLTC template object from the translet class definition(s).
*/
- protected TemplatesImpl(Translet translet, String transletName,
+ protected TemplatesImpl(Class[] transletClasses, String transletName,
Properties outputProperties, int indentNumber,
TransformerFactoryImpl tfactory)
{
- _translet = translet;
+ _class = transletClasses;
_name = transletName;
+ _transletIndex = 0;
_outputProperties = outputProperties;
_indentNumber = indentNumber;
_tfactory = tfactory;
@@ -331,7 +327,7 @@
// The translet needs to keep a reference to all its auxiliary
// class to prevent the GC from collecting them
Translet translet = (Translet) _class[_transletIndex].newInstance();
- final int classCount = _bytecodes.length;
+ final int classCount = _class.length;
for (int i = 0; i < classCount; i++) {
if (i != _transletIndex) {
translet.addAuxiliaryClass(_class[i]);
@@ -358,14 +354,9 @@
throws TransformerConfigurationException
{
TransformerImpl transformer;
- if (_translet != null) {
- transformer = new TransformerImpl(_translet, _outputProperties,
- _indentNumber, _tfactory);
- }
- else {
- transformer = new TransformerImpl(getTransletInstance(),
_outputProperties,
- _indentNumber, _tfactory);
- }
+
+ transformer = new TransformerImpl(getTransletInstance(),
_outputProperties,
+ _indentNumber, _tfactory);
if (_uriResolver != null) {
transformer.setURIResolver(_uriResolver);
1.62 +2 -3
xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerFactoryImpl.java
Index: TransformerFactoryImpl.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/trax/TransformerFactoryImpl.java,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -r1.61 -r1.62
--- TransformerFactoryImpl.java 2 Apr 2003 18:23:14 -0000 1.61
+++ TransformerFactoryImpl.java 20 May 2003 14:37:13 -0000 1.62
@@ -602,10 +602,9 @@
try {
final Class clazz = loadTranslet(transletName);
- final Translet translet = (Translet)clazz.newInstance();
resetTransientAttributes();
- return new TemplatesImpl(translet, transletName, null,
_indentNumber, this);
+ return new TemplatesImpl(new Class[]{clazz}, transletName,
null, _indentNumber, this);
}
catch (ClassNotFoundException cnfe) {
ErrorMsg err = new ErrorMsg(ErrorMsg.CLASS_NOT_FOUND_ERR,
transletName);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]