[
https://issues.apache.org/jira/browse/XALANJ-2439?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12581515#action_12581515
]
Helge Schulz commented on XALANJ-2439:
--------------------------------------
Here is my patch:
Index: org/apache/xalan/xsltc/dom/SAXImpl.java
===================================================================
--- org/apache/xalan/xsltc/dom/SAXImpl.java (revision 640381)
+++ org/apache/xalan/xsltc/dom/SAXImpl.java (working copy)
@@ -1836,6 +1836,11 @@
initSize, m_buildIdIndex);
}
}
+
+ public void release()
+ {
+ _dtmManager.release(this, true);
+ }
/**
* %HZ% Need Javadoc
Index: org/apache/xalan/xsltc/dom/DOMAdapter.java
===================================================================
--- org/apache/xalan/xsltc/dom/DOMAdapter.java (revision 640381)
+++ org/apache/xalan/xsltc/dom/DOMAdapter.java (working copy)
@@ -463,4 +463,9 @@
public Hashtable getElementsWithIDs() {
return _dom.getElementsWithIDs();
}
+
+ public void release() {
+ _dom.release();
+ }
+
}
Index: org/apache/xalan/xsltc/dom/SimpleResultTreeImpl.java
===================================================================
--- org/apache/xalan/xsltc/dom/SimpleResultTreeImpl.java (revision
640381)
+++ org/apache/xalan/xsltc/dom/SimpleResultTreeImpl.java (working copy)
@@ -1015,4 +1015,13 @@
public void migrateTo(DTMManager manager)
{
}
+
+ public void release()
+ {
+ if (_documentID != 0) {
+ _dtmManager.release(this, true);
+ _documentID = 0;
+ }
+ }
+
}
Index: org/apache/xalan/xsltc/dom/AdaptiveResultTreeImpl.java
===================================================================
--- org/apache/xalan/xsltc/dom/AdaptiveResultTreeImpl.java (revision
640381)
+++ org/apache/xalan/xsltc/dom/AdaptiveResultTreeImpl.java (working copy)
@@ -1316,5 +1316,14 @@
super.documentRelease();
}
}
+
+ public void release()
+ {
+ if (_dom != null) {
+ _dom.release();
+ _dom = null;
+ }
+ super.release();
+ }
}
Index: org/apache/xalan/xsltc/dom/MultiDOM.java
===================================================================
--- org/apache/xalan/xsltc/dom/MultiDOM.java (revision 640381)
+++ org/apache/xalan/xsltc/dom/MultiDOM.java (working copy)
@@ -280,6 +280,58 @@
public int addDOMAdapter(DOMAdapter adapter) {
return addDOMAdapter(adapter, true);
}
+
+ private boolean isMatchingAdapterEntry(DOM entry, DOMAdapter adapter) {
+ DOM dom = adapter.getDOMImpl();
+
+ return (entry == adapter) || (
+
+ /*
+ * Method addDOMAdapter overwrites for AdaptiveResultTreeImpl
+ * objects the usual entry with an adapter to the nested
+ * DOM, so we must check this here. See last 'if' statement
+ * of addDOMAdapter.
+ */
+
+ (dom instanceof AdaptiveResultTreeImpl) &&
+ (entry instanceof DOMAdapter) &&
+ (((AdaptiveResultTreeImpl) dom).getNestedDOM()
+ == ((DOMAdapter) entry).getDOMImpl())
+ );
+ }
+
+ public void removeDOMAdapter(DOMAdapter adapter) {
+ _documents.remove(adapter.getDocumentURI(0));
+ DOM dom = adapter.getDOMImpl();
+
+ if (dom instanceof DTMDefaultBase) {
+ SuballocatedIntVector ids = ((DTMDefaultBase) dom).getDTMIDs();
+ int idsSize = ids.size();
+ for (int i = 0; i < idsSize; i++) {
+ _adapters[ids.elementAt(i) >>> DTMManager.IDENT_DTM_NODE_BITS] =
null;
+ }
+ } else {
+ int id = dom.getDocument() >>> DTMManager.IDENT_DTM_NODE_BITS;
+ if ((id > 0) &&
+ (id < _adapters.length) &&
+ isMatchingAdapterEntry(_adapters[id], adapter)) {
+ _adapters[id] = null;
+ } else {
+ boolean found = false;
+
+ for (int i = 0; i < _adapters.length; i++) {
+ if (isMatchingAdapterEntry(_adapters[id], adapter)) {
+ _adapters[i] = null;
+ found = true;
+ }
+ }
+ if (!found) {
+ System.err.println("Warning: Memory leak in"
+ + " MultiDOM.removeDOMAdapter (adapter not found).");
+ }
+ }
+ }
+ }
private int addDOMAdapter(DOMAdapter adapter, boolean indexByURI) {
// Add the DOM adapter to the array of DOMs
@@ -662,4 +714,9 @@
public Hashtable getElementsWithIDs() {
return _main.getElementsWithIDs();
}
+
+ public void release() {
+ _main.release();
+ }
+
}
Index: org/apache/xalan/xsltc/DOM.java
===================================================================
--- org/apache/xalan/xsltc/DOM.java (revision 640381)
+++ org/apache/xalan/xsltc/DOM.java (working copy)
@@ -102,4 +102,5 @@
public int getDocument();
public String getUnparsedEntityURI(String name);
public Hashtable getElementsWithIDs();
+ public void release();
}
Index: org/apache/xalan/xsltc/compiler/WithParam.java
===================================================================
--- org/apache/xalan/xsltc/compiler/WithParam.java (revision 640381)
+++ org/apache/xalan/xsltc/compiler/WithParam.java (working copy)
@@ -22,9 +22,14 @@
package org.apache.xalan.xsltc.compiler;
import org.apache.bcel.generic.ConstantPoolGen;
+import org.apache.bcel.generic.ALOAD;
+import org.apache.bcel.generic.ASTORE;
+import org.apache.bcel.generic.CHECKCAST;
+import org.apache.bcel.generic.INVOKEINTERFACE;
import org.apache.bcel.generic.INVOKEVIRTUAL;
import org.apache.bcel.generic.InstructionList;
import org.apache.bcel.generic.PUSH;
+import org.apache.bcel.generic.LocalVariableGen;
import org.apache.xalan.xsltc.compiler.util.ClassGenerator;
import org.apache.xalan.xsltc.compiler.util.ErrorMsg;
import org.apache.xalan.xsltc.compiler.util.MethodGenerator;
@@ -56,6 +61,12 @@
* Parameter's default value.
*/
private Expression _select;
+
+ /**
+ * Reference to JVM variable with temporary result tree, which
+ * must be released after template call.
+ */
+ private LocalVariableGen _local;
/**
* %OPT% This is set to true when the WithParam is used in a CallTemplate
@@ -155,7 +166,10 @@
* a 'select' attribute, or in the with-param element's body
*/
public void translateValue(ClassGenerator classGen,
- MethodGenerator methodGen) {
+ MethodGenerator methodGen) {
+ final ConstantPoolGen cpg = classGen.getConstantPool();
+ final InstructionList il = methodGen.getInstructionList();
+
// Compile expression is 'select' attribute if present
if (_select != null) {
_select.translate(classGen, methodGen);
@@ -164,11 +178,16 @@
// If not, compile result tree from parameter body if present.
else if (hasContents()) {
compileResultTree(classGen, methodGen);
+
+ // store result tree into local variable to release them later
+
+ _local = methodGen.addLocalVariable2("@" + _escapedName,
+ Type.ResultTree.toJCType(), il.getEnd());
+ il.append(DUP);
+ il.append(new ASTORE(_local.getIndex()));
}
// If neither are present then store empty string in parameter slot
else {
- final ConstantPoolGen cpg = classGen.getConstantPool();
- final InstructionList il = methodGen.getInstructionList();
il.append(new PUSH(cpg, Constants.EMPTYSTRING));
}
}
@@ -206,4 +225,30 @@
ADD_PARAMETER_SIG)));
il.append(POP); // cleanup stack
}
+
+ public void unmap(ClassGenerator classGen, MethodGenerator methodGen) {
+ if (_local != null) {
+ // System.out.println("WithParam.unmap: index=" + _local.getIndex());
+ final InstructionList il = methodGen.getInstructionList();
+
+ if (classGen.getStylesheet().callsNodeset() &&
+ classGen.getDOMClass().equals(MULTI_DOM_CLASS)) {
+ final int removeCNI = classGen.getConstantPool().addMethodref(
+ MULTI_DOM_CLASS, "removeDOMAdapter",
+ "(" + DOM_ADAPTER_SIG + ")V");
+
+ il.append(methodGen.loadDOM());
+ il.append(new
CHECKCAST(classGen.getConstantPool().addClass(MULTI_DOM_CLASS)));
+ il.append(new ALOAD(_local.getIndex()));
+ il.append(new
CHECKCAST(classGen.getConstantPool().addClass(DOM_ADAPTER_CLASS)));
+ il.append(new INVOKEVIRTUAL(removeCNI));
+ }
+ final int releaseCNI =
classGen.getConstantPool().addInterfaceMethodref(
+ DOM_IMPL_CLASS, "release", "()V");
+
+ il.append(new ALOAD(_local.getIndex()));
+ il.append(new INVOKEINTERFACE(releaseCNI, 1));
+ _local = null;
+ }
+ }
}
Index: org/apache/xalan/xsltc/compiler/SyntaxTreeNode.java
===================================================================
--- org/apache/xalan/xsltc/compiler/SyntaxTreeNode.java (revision 640381)
+++ org/apache/xalan/xsltc/compiler/SyntaxTreeNode.java (working copy)
@@ -524,7 +524,7 @@
for (int i = 0; i < n; i++) {
if( _contents.elementAt(i) instanceof VariableBase) {
final VariableBase var = (VariableBase)_contents.elementAt(i);
- var.unmapRegister(methodGen);
+ var.unmapRegister(classGen, methodGen);
}
}
}
Index: org/apache/xalan/xsltc/compiler/ApplyTemplates.java
===================================================================
--- org/apache/xalan/xsltc/compiler/ApplyTemplates.java (revision 640381)
+++ org/apache/xalan/xsltc/compiler/ApplyTemplates.java (working copy)
@@ -189,7 +189,17 @@
_functionName,
applyTemplatesSig);
il.append(new INVOKEVIRTUAL(applyTemplates));
+
+ // unmap parameters to release temporary result trees
+ final Enumeration childs = getContents().elements();
+ while (childs.hasMoreElements()) {
+ final Object child = childs.nextElement();
+ if (child instanceof WithParam) {
+ ((WithParam) child).unmap(classGen, methodGen);
+ }
+ }
+
// Pop parameter frame
if (stylesheet.hasLocalParams() || hasContents()) {
il.append(classGen.loadTranslet());
Index: org/apache/xalan/xsltc/compiler/VariableBase.java
===================================================================
--- org/apache/xalan/xsltc/compiler/VariableBase.java (revision 640381)
+++ org/apache/xalan/xsltc/compiler/VariableBase.java (working copy)
@@ -26,7 +26,10 @@
import org.apache.bcel.generic.ConstantPoolGen;
import org.apache.bcel.generic.Instruction;
import org.apache.bcel.generic.InstructionList;
+import org.apache.bcel.generic.CHECKCAST;
+import org.apache.bcel.generic.INVOKEINTERFACE;
import org.apache.bcel.generic.INVOKESPECIAL;
+import org.apache.bcel.generic.INVOKEVIRTUAL;
import org.apache.bcel.generic.LocalVariableGen;
import org.apache.bcel.generic.NEW;
import org.apache.bcel.generic.PUSH;
@@ -34,6 +37,7 @@
import org.apache.xalan.xsltc.compiler.util.ErrorMsg;
import org.apache.xalan.xsltc.compiler.util.MethodGenerator;
import org.apache.xalan.xsltc.compiler.util.NodeSetType;
+import org.apache.xalan.xsltc.compiler.util.ResultTreeType;
import org.apache.xalan.xsltc.compiler.util.Type;
import org.apache.xalan.xsltc.compiler.util.Util;
import org.apache.xml.utils.XML11Char;
@@ -96,12 +100,35 @@
* Remove the mapping of this variable to a register.
* Called when we leave the AST scope of the variable's declaration
*/
- public void unmapRegister(MethodGenerator methodGen) {
- if (_local != null) {
- _local.setEnd(methodGen.getInstructionList().getEnd());
- methodGen.removeLocalVariable(_local);
- _refs = null;
- _local = null;
+ public void unmapRegister(ClassGenerator classGen, MethodGenerator
methodGen) {
+ if (_local != null) {
+ if (_type instanceof ResultTreeType) {
+ final ConstantPoolGen cpg = classGen.getConstantPool();
+ final InstructionList il = methodGen.getInstructionList();
+
+ if (classGen.getStylesheet().callsNodeset() &&
+ classGen.getDOMClass().equals(MULTI_DOM_CLASS)) {
+ final int removeCNI = cpg.addMethodref(
+ MULTI_DOM_CLASS, "removeDOMAdapter",
+ "(" + DOM_ADAPTER_SIG + ")V");
+
+ il.append(methodGen.loadDOM());
+ il.append(new CHECKCAST(cpg.addClass(MULTI_DOM_CLASS)));
+ il.append(loadInstruction());
+ il.append(new CHECKCAST(cpg.addClass(DOM_ADAPTER_CLASS)));
+ il.append(new INVOKEVIRTUAL(removeCNI));
+ }
+ final int releaseCNI = cpg.addInterfaceMethodref(
+ DOM_IMPL_CLASS, "release", "()V");
+ il.append(loadInstruction());
+ il.append(new INVOKEINTERFACE(releaseCNI, 1));
+ }
+ if (_refs.isEmpty()) {
+ _local.setEnd(methodGen.getInstructionList().getEnd());
+ methodGen.removeLocalVariable(_local);
+ _refs = null;
+ _local = null;
+ }
}
}
Index: org/apache/xalan/xsltc/compiler/CallTemplate.java
===================================================================
--- org/apache/xalan/xsltc/compiler/CallTemplate.java (revision 640381)
+++ org/apache/xalan/xsltc/compiler/CallTemplate.java (working copy)
@@ -167,7 +167,15 @@
il.append(new INVOKEVIRTUAL(cpg.addMethodref(className,
methodName,
methodSig.toString())));
-
+
+ // unmap parameters to release temporary result trees
+
+ for (int i = 0; i < _parameters.length; i++) {
+ if(_parameters[i] instanceof WithParam) {
+ ((WithParam) _parameters[i]).unmap(classGen, methodGen);
+ }
+ }
+
// Do not need to call Translet.popParamFrame() if we are
// calling a simple named template.
if (_calleeTemplate == null && (stylesheet.hasLocalParams() ||
hasContents())) {
> [PATCH] XSLTC resource leak causes 'No more DTM IDs are available' error
> ------------------------------------------------------------------------
>
> Key: XALANJ-2439
> URL: https://issues.apache.org/jira/browse/XALANJ-2439
> Project: XalanJ2
> Issue Type: Bug
> Components: XSLTC
> Affects Versions: The Latest Development Code
> Environment: Linux and Windows XP with Sun JRE 1.5.0_15 and 1.6.0_05
> Reporter: Helge Schulz
> Priority: Minor
> Fix For: The Latest Development Code
>
> Original Estimate: 4h
> Remaining Estimate: 4h
>
> The Xalan XSLT compiler (XSLTC) has several resource leaks in handling
> result tree fragments in XSLT variables and parameters. If a variable
> or parameter declaration contains XML elements, a new DOM tree is created
> and a new internal integer id is reserved for it. The garbage collector can
> never retrieve this DOM tree, because the id registration holds a reference
> to it. This bug prevents the transformation of large input files, because
> complex templates creates many result tree fragments and exceeds often the
> absolute limit of possible DOM trees in XSLTC (2^16 = 65535). If this
> limit is reached, XSLTC throws the following exception:
> DTMException: No more DTM IDs are available
> The attached patch adds a new release method to the DOM interface and calls
> it, when the scope of a variable or parameter is leaved.
> You can test this patch with the attached JAR file. This file can be
> called with
> java -Xmx800M -jar DOMLeak-XSLT-Test-X.Y.jar
> This file contains four test style sheets with expected output files.
> This bug exists also in *all* Sun JRE 1.5 and 1.6 versions, because the
> Xalan XSLTC source code is used in the 'com.sun.org.apache.xalan.internal'
> packages. The attached test JAR file contains also a patch for the current
> Sun JRE version 1.6.0_5 and a fix JAR file to be installed into the
> '../jre/lib/endorsed' directory of the JRE installation.
> Please add the attached test files to the Xalan test suite. I have
> released them under Apache license version 2.0.
> Helge Schulz - http://OpenSHORE.org
> ----------
> Here is the output of running my test cases with several Java version:
> test:
> apply-with-all-versions:
> [apply] Buildfile: build.xml
> [apply] test-java:
> [apply] [echo] Test Sun Java 1.4.2_17 with integrated XSLT
> [apply] [java] Testing DOMLeak-1-ResultTreeInVariable.xsl... Ok.
> [apply] [java] Testing DOMLeak-2-ResultTreeInCallParameter.xsl...
> Ok.
> [apply] [java] Testing
> DOMLeak-3-ResultTreeInApplyParameter.xsl... Ok.
> [apply] [java] Testing DOMLeak-4-NodeSetAndMultiDOM.xsl... Ok.
> [apply] [echo]
> [apply] [echo] Test Sun Java 1.4.2_17 with latest Xalan (SVN
> revision 584164)
> [apply] [java] Testing DOMLeak-1-ResultTreeInVariable.xsl...
> ERROR: 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> org.apache.xml.dtm.DTMException: No more DTM IDs are available
> [apply] [java] Testing DOMLeak-2-ResultTreeInCallParameter.xsl...
> ERROR: 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> org.apache.xml.dtm.DTMException: No more DTM IDs are available
> [apply] [java] Testing
> DOMLeak-3-ResultTreeInApplyParameter.xsl... ERROR: 'No more DTM IDs are
> available'
> [apply] [java] XSLT Exception:
> org.apache.xml.dtm.DTMException: No more DTM IDs are available
> [apply] [java] Testing DOMLeak-4-NodeSetAndMultiDOM.xsl... ERROR:
> 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> org.apache.xml.dtm.DTMException: No more DTM IDs are available
> [apply] [echo]
> [apply] [echo] Test Sun Java 1.4.2_17 with fixed Xalan
> [apply] [java] Testing DOMLeak-1-ResultTreeInVariable.xsl... Ok.
> [apply] [java] Testing DOMLeak-2-ResultTreeInCallParameter.xsl...
> Ok.
> [apply] [java] Testing
> DOMLeak-3-ResultTreeInApplyParameter.xsl... Ok.
> [apply] [java] Testing DOMLeak-4-NodeSetAndMultiDOM.xsl... Ok.
> [apply] BUILD SUCCESSFUL
> [apply] Total time: 1 minute 21 seconds
> [apply] Buildfile: build.xml
> [apply] test-java:
> [apply] [echo] Test Sun Java 1.5.0_15 with integrated XSLT
> [apply] [java] Testing DOMLeak-1-ResultTreeInVariable.xsl...
> ERROR: 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> com.sun.org.apache.xml.internal.dtm.DTMException: No more DTM IDs are
> available
> [apply] [java] Testing DOMLeak-2-ResultTreeInCallParameter.xsl...
> ERROR: 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> com.sun.org.apache.xml.internal.dtm.DTMException: No more DTM IDs are
> available
> [apply] [java] Testing
> DOMLeak-3-ResultTreeInApplyParameter.xsl... ERROR: 'No more DTM IDs are
> available'
> [apply] [java] XSLT Exception:
> com.sun.org.apache.xml.internal.dtm.DTMException: No more DTM IDs are
> available
> [apply] [java] Testing DOMLeak-4-NodeSetAndMultiDOM.xsl... ERROR:
> 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> com.sun.org.apache.xml.internal.dtm.DTMException: No more DTM IDs are
> available
> [apply] [echo]
> [apply] [echo] Test Sun Java 1.5.0_15 with latest Xalan (SVN
> revision 584164)
> [apply] [java] Testing DOMLeak-1-ResultTreeInVariable.xsl...
> ERROR: 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> org.apache.xml.dtm.DTMException: No more DTM IDs are available
> [apply] [java] Testing DOMLeak-2-ResultTreeInCallParameter.xsl...
> ERROR: 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> org.apache.xml.dtm.DTMException: No more DTM IDs are available
> [apply] [java] Testing
> DOMLeak-3-ResultTreeInApplyParameter.xsl... ERROR: 'No more DTM IDs are
> available'
> [apply] [java] XSLT Exception:
> org.apache.xml.dtm.DTMException: No more DTM IDs are available
> [apply] [java] Testing DOMLeak-4-NodeSetAndMultiDOM.xsl... ERROR:
> 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> org.apache.xml.dtm.DTMException: No more DTM IDs are available
> [apply] [echo]
> [apply] [echo] Test Sun Java 1.5.0_15 with fixed Xalan
> [apply] [java] Testing DOMLeak-1-ResultTreeInVariable.xsl... Ok.
> [apply] [java] Testing DOMLeak-2-ResultTreeInCallParameter.xsl...
> Ok.
> [apply] [java] Testing
> DOMLeak-3-ResultTreeInApplyParameter.xsl... Ok.
> [apply] [java] Testing DOMLeak-4-NodeSetAndMultiDOM.xsl... Ok.
> [apply] BUILD SUCCESSFUL
> [apply] Total time: 2 minutes 13 seconds
> [apply] Buildfile: build.xml
> [apply] test-java:
> [apply] [echo] Test Sun Java 1.6.0_05 with integrated XSLT
> [apply] [java] Testing DOMLeak-1-ResultTreeInVariable.xsl...
> ERROR: 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> com.sun.org.apache.xml.internal.dtm.DTMException: No more DTM IDs are
> available
> [apply] [java] Testing DOMLeak-2-ResultTreeInCallParameter.xsl...
> ERROR: 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> com.sun.org.apache.xml.internal.dtm.DTMException: No more DTM IDs are
> available
> [apply] [java] Testing
> DOMLeak-3-ResultTreeInApplyParameter.xsl... ERROR: 'No more DTM IDs are
> available'
> [apply] [java] XSLT Exception:
> com.sun.org.apache.xml.internal.dtm.DTMException: No more DTM IDs are
> available
> [apply] [java] Testing DOMLeak-4-NodeSetAndMultiDOM.xsl... ERROR:
> 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> com.sun.org.apache.xml.internal.dtm.DTMException: No more DTM IDs are
> available
> [apply] [echo]
> [apply] [echo] Test Sun Java 1.6.0_05 with latest Xalan (SVN
> revision 584164)
> [apply] [java] Testing DOMLeak-1-ResultTreeInVariable.xsl...
> ERROR: 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> org.apache.xml.dtm.DTMException: No more DTM IDs are available
> [apply] [java] Testing DOMLeak-2-ResultTreeInCallParameter.xsl...
> ERROR: 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> org.apache.xml.dtm.DTMException: No more DTM IDs are available
> [apply] [java] Testing
> DOMLeak-3-ResultTreeInApplyParameter.xsl... ERROR: 'No more DTM IDs are
> available'
> [apply] [java] XSLT Exception:
> org.apache.xml.dtm.DTMException: No more DTM IDs are available
> [apply] [java] Testing DOMLeak-4-NodeSetAndMultiDOM.xsl... ERROR:
> 'No more DTM IDs are available'
> [apply] [java] XSLT Exception:
> org.apache.xml.dtm.DTMException: No more DTM IDs are available
> [apply] [echo]
> [apply] [echo] Test Sun Java 1.6.0_05 with fixed Xalan
> [apply] [java] Testing DOMLeak-1-ResultTreeInVariable.xsl... Ok.
> [apply] [java] Testing DOMLeak-2-ResultTreeInCallParameter.xsl...
> Ok.
> [apply] [java] Testing
> DOMLeak-3-ResultTreeInApplyParameter.xsl... Ok.
> [apply] [java] Testing DOMLeak-4-NodeSetAndMultiDOM.xsl... Ok.
> [apply] BUILD SUCCESSFUL
> [apply] Total time: 1 minute 42 seconds
> BUILD SUCCESSFUL
> Total time: 5 minutes 22 seconds
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]