santiagopg 2003/02/21 09:28:51
Modified: java/src/org/apache/xalan/xsltc/compiler Constants.java
Message.java
Log:
New implementation of xsl:message that does not use RTFs. Using RTFs
is both slow and problematic since the number of RTFs that can be
created is limited in XSLTC.
The new implementation uses a StreamXMLOutput and a StringWriter to
output the template body as a string (in some cases, NS declarations
will be included and this behavior differs from the old implementation).
Additionally, the new implementation optimizes the case where the
message is empty and where the message is just a literal string.
The bug was reported by Mark Brunkhart ([EMAIL PROTECTED]).
Revision Changes Path
1.31 +130 -122
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Constants.java
Index: Constants.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Constants.java,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -r1.30 -r1.31
--- Constants.java 27 Jan 2003 18:44:36 -0000 1.30
+++ Constants.java 21 Feb 2003 17:28:51 -0000 1.31
@@ -92,10 +92,10 @@
public static final String TRANSLET_INTF
= "org.apache.xalan.xsltc.Translet";
- public static final String TRANSLET_INTF_SIG
+ public static final String TRANSLET_INTF_SIG
= "Lorg/apache/xalan/xsltc/Translet;";
-
- public static final String ATTRIBUTES_SIG
+
+ public static final String ATTRIBUTES_SIG
= "Lorg/apache/xalan/xsltc/runtime/Attributes;";
public static final String NODE_ITERATOR_SIG
= "Lorg/apache/xalan/xsltc/NodeIterator;";
@@ -114,70 +114,74 @@
public static final String MULTI_DOM_SIG
= "Lorg/apache/xalan/xsltc/dom/MultiDOM;";
- public static final String STRING
+ public static final String STRING
= "java.lang.String";
- public static final int ACC_PUBLIC
+ public static final int ACC_PUBLIC
= org.apache.bcel.Constants.ACC_PUBLIC;
- public static final int ACC_SUPER
+ public static final int ACC_SUPER
= org.apache.bcel.Constants.ACC_SUPER;
- public static final int ACC_FINAL
+ public static final int ACC_FINAL
= org.apache.bcel.Constants.ACC_FINAL;
- public static final int ACC_PRIVATE
+ public static final int ACC_PRIVATE
= org.apache.bcel.Constants.ACC_PRIVATE;
- public static final int ACC_PROTECTED
+ public static final int ACC_PROTECTED
= org.apache.bcel.Constants.ACC_PROTECTED;
public static final int ACC_STATIC
= org.apache.bcel.Constants.ACC_STATIC;
- public static final String STRING_SIG
+ public static final String STRING_SIG
= "Ljava/lang/String;";
- public static final String STRING_BUFFER_SIG
+ public static final String STRING_BUFFER_SIG
= "Ljava/lang/StringBuffer;";
- public static final String OBJECT_SIG
+ public static final String OBJECT_SIG
= "Ljava/lang/Object;";
- public static final String DOUBLE_SIG
+ public static final String DOUBLE_SIG
= "Ljava/lang/Double;";
- public static final String INTEGER_SIG
+ public static final String INTEGER_SIG
= "Ljava/lang/Integer;";
public static final String COLLATOR_CLASS
= "java/text/Collator";
public static final String COLLATOR_SIG
= "Ljava/text/Collator;";
- public static final String NODE
+ public static final String NODE
= "int";
- public static final String NODE_ITERATOR
+ public static final String NODE_ITERATOR
= "org.apache.xalan.xsltc.NodeIterator";
public static final String NODE_ITERATOR_BASE
= "org.apache.xalan.xsltc.dom.NodeIteratorBase";
- public static final String SORT_ITERATOR
+ public static final String SORT_ITERATOR
= "org.apache.xalan.xsltc.dom.SortingIterator";
- public static final String SORT_ITERATOR_SIG
+ public static final String SORT_ITERATOR_SIG
= "Lorg.apache.xalan.xsltc.dom.SortingIterator;";
- public static final String FORWARD_POSITION_ITERATOR
+ public static final String FORWARD_POSITION_ITERATOR
= "org.apache.xalan.xsltc.dom.ForwardPositionIterator";
- public static final String NODE_SORT_RECORD
+ public static final String NODE_SORT_RECORD
= "org.apache.xalan.xsltc.dom.NodeSortRecord";
public static final String NODE_SORT_FACTORY
= "org/apache/xalan/xsltc/dom/NodeSortRecordFactory";
- public static final String NODE_SORT_RECORD_SIG
+ public static final String NODE_SORT_RECORD_SIG
= "Lorg/apache/xalan/xsltc/dom/NodeSortRecord;";
public static final String NODE_SORT_FACTORY_SIG
= "Lorg/apache/xalan/xsltc/dom/NodeSortRecordFactory;";
- public static final String LOCALE_SIG
+ public static final String LOCALE_SIG
= "Ljava/util/Locale;";
public static final String STRING_VALUE_HANDLER
= "org.apache.xalan.xsltc.runtime.StringValueHandler";
- public static final String STRING_VALUE_HANDLER_SIG
+ public static final String STRING_VALUE_HANDLER_SIG
= "Lorg/apache/xalan/xsltc/runtime/StringValueHandler;";
public static final String OUTPUT_HANDLER
= "org/apache/xalan/xsltc/TransletOutputHandler";
public static final String OUTPUT_HANDLER_SIG
= "Lorg/apache/xalan/xsltc/TransletOutputHandler;";
- public static final String FILTER_INTERFACE
+ public static final String OUTPUT_BASE
+ = "org/apache/xalan/xsltc/runtime/output/OutputBase";
+ public static final String STREAM_XML_OUTPUT
+ = "org/apache/xalan/xsltc/runtime/output/StreamXMLOutput";
+ public static final String FILTER_INTERFACE
= "org.apache.xalan.xsltc.dom.Filter";
- public static final String FILTER_INTERFACE_SIG
+ public static final String FILTER_INTERFACE_SIG
= "Lorg/apache/xalan/xsltc/dom/Filter;";
public static final String UNION_ITERATOR_CLASS
= "org.apache.xalan.xsltc.dom.UnionIterator";
@@ -193,65 +197,65 @@
= "org.apache.xalan.xsltc.dom.CurrentNodeListIterator";
public static final String CURRENT_NODE_LIST_FILTER
= "org.apache.xalan.xsltc.dom.CurrentNodeListFilter";
- public static final String CURRENT_NODE_LIST_ITERATOR_SIG
+ public static final String CURRENT_NODE_LIST_ITERATOR_SIG
= "Lorg/apache/xalan/xsltc/dom/CurrentNodeListIterator;";
public static final String CURRENT_NODE_LIST_FILTER_SIG
= "Lorg/apache/xalan/xsltc/dom/CurrentNodeListFilter;";
- public static final String FILTER_STEP_ITERATOR
+ public static final String FILTER_STEP_ITERATOR
= "org.apache.xalan.xsltc.dom.FilteredStepIterator";
- public static final String FILTER_ITERATOR
+ public static final String FILTER_ITERATOR
= "org.apache.xalan.xsltc.dom.FilterIterator";
- public static final String SINGLETON_ITERATOR
+ public static final String SINGLETON_ITERATOR
= "org.apache.xalan.xsltc.dom.SingletonIterator";
- public static final String MATCHING_ITERATOR
+ public static final String MATCHING_ITERATOR
= "org.apache.xalan.xsltc.dom.MatchingIterator";
- public static final String NODE_SIG
+ public static final String NODE_SIG
= "I";
- public static final String GET_PARENT
+ public static final String GET_PARENT
= "getParent";
- public static final String GET_PARENT_SIG
+ public static final String GET_PARENT_SIG
= "(" + NODE_SIG + ")" + NODE_SIG;
- public static final String NEXT_SIG
+ public static final String NEXT_SIG
= "()" + NODE_SIG;
- public static final String NEXT
+ public static final String NEXT
= "next";
- public static final String MAKE_NODE
+ public static final String MAKE_NODE
= "makeNode";
- public static final String MAKE_NODE_LIST
+ public static final String MAKE_NODE_LIST
= "makeNodeList";
- public static final String STRING_TO_REAL
+ public static final String STRING_TO_REAL
= "stringToReal";
- public static final String STRING_TO_REAL_SIG
+ public static final String STRING_TO_REAL_SIG
= "(" + STRING_SIG + ")D";
- public static final String STRING_TO_INT
+ public static final String STRING_TO_INT
= "stringToInt";
- public static final String STRING_TO_INT_SIG
+ public static final String STRING_TO_INT_SIG
= "(" + STRING_SIG + ")I";
- public static final String XSLT_PACKAGE
+ public static final String XSLT_PACKAGE
= "org.apache.xalan.xsltc";
- public static final String COMPILER_PACKAGE
+ public static final String COMPILER_PACKAGE
= XSLT_PACKAGE + ".compiler";
- public static final String RUNTIME_PACKAGE
+ public static final String RUNTIME_PACKAGE
= XSLT_PACKAGE + ".runtime";
- public static final String TRANSLET_CLASS
+ public static final String TRANSLET_CLASS
= RUNTIME_PACKAGE + ".AbstractTranslet";
- public static final String TRANSLET_SIG
+ public static final String TRANSLET_SIG
= "Lorg/apache/xalan/xsltc/runtime/AbstractTranslet;";
- public static final String UNION_ITERATOR_SIG
+ public static final String UNION_ITERATOR_SIG
= "Lorg/apache/xalan/xsltc/dom/UnionIterator;";
- public static final String TRANSLET_OUTPUT_BASE_SIG
+ public static final String TRANSLET_OUTPUT_BASE_SIG
= "Lorg/apache/xalan/xsltc/TransletOutputBase;";
- public static final String TRANSLET_OUTPUT_SIG
+ public static final String TRANSLET_OUTPUT_SIG
= "Lorg/apache/xalan/xsltc/TransletOutputHandler;";
- public static final String MAKE_NODE_SIG
+ public static final String MAKE_NODE_SIG
= "(I)Lorg/w3c/dom/Node;";
- public static final String MAKE_NODE_SIG2
+ public static final String MAKE_NODE_SIG2
= "(" + NODE_ITERATOR_SIG + ")Lorg/w3c/dom/Node;";
- public static final String MAKE_NODE_LIST_SIG
+ public static final String MAKE_NODE_LIST_SIG
= "(I)Lorg/w3c/dom/NodeList;";
- public static final String MAKE_NODE_LIST_SIG2
+ public static final String MAKE_NODE_LIST_SIG2
= "(" + NODE_ITERATOR_SIG + ")Lorg/w3c/dom/NodeList;";
public static final String LOAD_DOCUMENT_CLASS
@@ -266,94 +270,98 @@
= "org.apache.xalan.xsltc.DOM";
public static final String DOM_IMPL
= "org.apache.xalan.xsltc.dom.DOMImpl";
- public static final String STRING_CLASS
+ public static final String STRING_CLASS
= "java.lang.String";
- public static final String OBJECT_CLASS
+ public static final String OBJECT_CLASS
= "java.lang.Object";
- public static final String BOOLEAN_CLASS
+ public static final String BOOLEAN_CLASS
= "java.lang.Boolean";
public static final String STRING_BUFFER_CLASS
= "java.lang.StringBuffer";
+ public static final String STRING_WRITER
+ = "java.io.StringWriter";
+ public static final String WRITER_SIG
+ = "Ljava/io/Writer;";
- public static final String TRANSLET_OUTPUT_BASE
+ public static final String TRANSLET_OUTPUT_BASE
= "org.apache.xalan.xsltc.TransletOutputBase";
// output interface
public static final String TRANSLET_OUTPUT_INTERFACE
= "org.apache.xalan.xsltc.TransletOutputHandler";
- public static final String BASIS_LIBRARY_CLASS
+ public static final String BASIS_LIBRARY_CLASS
= "org.apache.xalan.xsltc.runtime.BasisLibrary";
- public static final String ATTRIBUTE_LIST_IMPL_CLASS
+ public static final String ATTRIBUTE_LIST_IMPL_CLASS
= "org.apache.xalan.xsltc.runtime.AttributeListImpl";
- public static final String DOUBLE_CLASS
+ public static final String DOUBLE_CLASS
= "java.lang.Double";
- public static final String INTEGER_CLASS
+ public static final String INTEGER_CLASS
= "java.lang.Integer";
- public static final String RUNTIME_NODE_CLASS
+ public static final String RUNTIME_NODE_CLASS
= "org.apache.xalan.xsltc.runtime.Node";
- public static final String MATH_CLASS
+ public static final String MATH_CLASS
= "java.lang.Math";
- public static final String BOOLEAN_VALUE
+ public static final String BOOLEAN_VALUE
= "booleanValue";
- public static final String BOOLEAN_VALUE_SIG
+ public static final String BOOLEAN_VALUE_SIG
= "()Z";
- public static final String INT_VALUE
+ public static final String INT_VALUE
= "intValue";
- public static final String INT_VALUE_SIG
+ public static final String INT_VALUE_SIG
= "()I";
- public static final String DOUBLE_VALUE
+ public static final String DOUBLE_VALUE
= "doubleValue";
- public static final String DOUBLE_VALUE_SIG
+ public static final String DOUBLE_VALUE_SIG
= "()D";
- public static final String NODE_PNAME
+ public static final String NODE_PNAME
= "node";
- public static final String TRANSLET_OUTPUT_PNAME
+ public static final String TRANSLET_OUTPUT_PNAME
= "handler";
- public static final String ITERATOR_PNAME
+ public static final String ITERATOR_PNAME
= "iterator";
- public static final String DOCUMENT_PNAME
+ public static final String DOCUMENT_PNAME
= "document";
- public static final String TRANSLET_PNAME
+ public static final String TRANSLET_PNAME
= "translet";
- public static final String GET_NODE_NAME
+ public static final String GET_NODE_NAME
= "getNodeName";
- public static final String CHARACTERSW
+ public static final String CHARACTERSW
= "characters";
- public static final String GET_CHILDREN
+ public static final String GET_CHILDREN
= "getChildren";
- public static final String GET_TYPED_CHILDREN
+ public static final String GET_TYPED_CHILDREN
= "getTypedChildren";
- public static final String CHARACTERS
+ public static final String CHARACTERS
= "characters";
- public static final String APPLY_TEMPLATES
+ public static final String APPLY_TEMPLATES
= "applyTemplates";
- public static final String GET_NODE_TYPE
+ public static final String GET_NODE_TYPE
= "getNodeType";
- public static final String GET_NODE_VALUE
+ public static final String GET_NODE_VALUE
= "getNodeValue";
- public static final String GET_ELEMENT_VALUE
+ public static final String GET_ELEMENT_VALUE
= "getElementValue";
- public static final String GET_ATTRIBUTE_VALUE
+ public static final String GET_ATTRIBUTE_VALUE
= "getAttributeValue";
- public static final String HAS_ATTRIBUTE
+ public static final String HAS_ATTRIBUTE
= "hasAttribute";
- public static final String ADD_ITERATOR
+ public static final String ADD_ITERATOR
= "addIterator";
- public static final String SET_START_NODE
+ public static final String SET_START_NODE
= "setStartNode";
- public static final String RESET
+ public static final String RESET
= "reset";
public static final String ATTR_SET_SIG
= "(" + TRANSLET_OUTPUT_SIG + NODE_ITERATOR_SIG + ")V";
- public static final String GET_NODE_NAME_SIG
+ public static final String GET_NODE_NAME_SIG
= "(" + NODE_SIG + ")" + STRING_SIG;
- public static final String CHARACTERSW_SIG
+ public static final String CHARACTERSW_SIG
= "(" + STRING_SIG + TRANSLET_OUTPUT_SIG + ")V";
- public static final String CHARACTERS_SIG
+ public static final String CHARACTERS_SIG
= "(" + NODE_SIG + TRANSLET_OUTPUT_SIG + ")V";
public static final String GET_CHILDREN_SIG
= "(" + NODE_SIG +")" + NODE_ITERATOR_SIG;
@@ -383,70 +391,70 @@
public static final String DOM_FIELD
= "_dom";
- public static final String FORMAT_SYMBOLS_FIELD
+ public static final String FORMAT_SYMBOLS_FIELD
= "format_symbols";
- public static final String ITERATOR_FIELD_SIG
+ public static final String ITERATOR_FIELD_SIG
= NODE_ITERATOR_SIG;
- public static final String NODE_FIELD
+ public static final String NODE_FIELD
= "node";
- public static final String NODE_FIELD_SIG
+ public static final String NODE_FIELD_SIG
= "I";
-
- public static final String EMPTYATTR_FIELD
+
+ public static final String EMPTYATTR_FIELD
= "EmptyAttributes";
- public static final String ATTRIBUTE_LIST_FIELD
+ public static final String ATTRIBUTE_LIST_FIELD
= "attributeList";
- public static final String CLEAR_ATTRIBUTES
+ public static final String CLEAR_ATTRIBUTES
= "clear";
- public static final String ADD_ATTRIBUTE
+ public static final String ADD_ATTRIBUTE
= "addAttribute";
- public static final String ATTRIBUTE_LIST_IMPL_SIG
+ public static final String ATTRIBUTE_LIST_IMPL_SIG
= "Lorg/apache/xalan/xsltc/runtime/AttributeListImpl;";
- public static final String CLEAR_ATTRIBUTES_SIG
+ public static final String CLEAR_ATTRIBUTES_SIG
= "()" + ATTRIBUTE_LIST_IMPL_SIG;
- public static final String ADD_ATTRIBUTE_SIG
+ public static final String ADD_ATTRIBUTE_SIG
= "(" + STRING_SIG + STRING_SIG + ")" + ATTRIBUTE_LIST_IMPL_SIG;
-
- public static final String ADD_ITERATOR_SIG
+
+ public static final String ADD_ITERATOR_SIG
= "(" + NODE_ITERATOR_SIG +")" + UNION_ITERATOR_SIG;
public static final String ORDER_ITERATOR
= "orderNodes";
public static final String ORDER_ITERATOR_SIG
= "("+NODE_ITERATOR_SIG+"I)"+NODE_ITERATOR_SIG;
-
- public static final String SET_START_NODE_SIG
+
+ public static final String SET_START_NODE_SIG
= "(" + NODE_SIG + ")" + NODE_ITERATOR_SIG;
- public static final String NODE_COUNTER
+ public static final String NODE_COUNTER
= "org.apache.xalan.xsltc.dom.NodeCounter";
- public static final String NODE_COUNTER_SIG
+ public static final String NODE_COUNTER_SIG
= "Lorg/apache/xalan/xsltc/dom/NodeCounter;";
- public static final String DEFAULT_NODE_COUNTER
+ public static final String DEFAULT_NODE_COUNTER
= "org.apache.xalan.xsltc.dom.DefaultNodeCounter";
- public static final String DEFAULT_NODE_COUNTER_SIG
+ public static final String DEFAULT_NODE_COUNTER_SIG
= "Lorg/apache/xalan/xsltc/dom/DefaultNodeCounter;";
- public static final String TRANSLET_FIELD
+ public static final String TRANSLET_FIELD
= "translet";
- public static final String TRANSLET_FIELD_SIG
+ public static final String TRANSLET_FIELD_SIG
= TRANSLET_SIG;
- public static final String RESET_SIG
+ public static final String RESET_SIG
= "()" + NODE_ITERATOR_SIG;
- public static final String GET_PARAMETER
+ public static final String GET_PARAMETER
= "getParameter";
- public static final String ADD_PARAMETER
+ public static final String ADD_PARAMETER
= "addParameter";
public static final String PUSH_PARAM_FRAME
= "pushParamFrame";
- public static final String PUSH_PARAM_FRAME_SIG
+ public static final String PUSH_PARAM_FRAME_SIG
= "()V";
- public static final String POP_PARAM_FRAME
+ public static final String POP_PARAM_FRAME
= "popParamFrame";
- public static final String POP_PARAM_FRAME_SIG
+ public static final String POP_PARAM_FRAME_SIG
= "()V";
- public static final String GET_PARAMETER_SIG
+ public static final String GET_PARAMETER_SIG
= "(" + STRING_SIG + ")" + OBJECT_SIG;
public static final String ADD_PARAMETER_SIG
= "(" + STRING_SIG + OBJECT_SIG + "Z)" + OBJECT_SIG;
@@ -470,7 +478,7 @@
public static final String XMLNS_PREFIX = "xmlns";
public static final String XMLNS_STRING = "xmlns:";
- public static final String XMLNS_URI
+ public static final String XMLNS_URI
= "http://www.w3.org/2000/xmlns/";
public static final String XSLT_URI
= "http://www.w3.org/1999/XSL/Transform";
1.9 +67 -10
xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Message.java
Index: Message.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/Message.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- Message.java 30 Jan 2003 18:46:01 -0000 1.8
+++ Message.java 21 Feb 2003 17:28:51 -0000 1.9
@@ -78,7 +78,7 @@
final class Message extends Instruction {
private boolean _terminate = false;
-
+
public void parseContents(Parser parser) {
String termstr = getAttribute("terminate");
if (termstr != null) {
@@ -99,13 +99,70 @@
// Load the translet (for call to displayMessage() function)
il.append(classGen.loadTranslet());
- // Get the contents of the message
- compileResultTree(classGen, methodGen);
- // Convert the
- final int toStr = cpg.addInterfaceMethodref(DOM_INTF,
- "getTreeString",
- "()"+STRING_SIG);
- il.append(new INVOKEINTERFACE(toStr, 1));
+ switch (elementCount()) {
+ case 0:
+ il.append(new PUSH(cpg, ""));
+ break;
+ case 1:
+ SyntaxTreeNode child = (SyntaxTreeNode) elementAt(0);
+ if (child instanceof Text) {
+ il.append(new PUSH(cpg, ((Text) child).getText()));
+ break;
+ }
+ // falls through
+ default:
+ // Push current output handler onto the stack
+ il.append(methodGen.loadHandler());
+
+ // Replace the current output handler by a StreamXMLOutput
+ il.append(new NEW(cpg.addClass(STREAM_XML_OUTPUT)));
+ il.append(methodGen.storeHandler());
+
+ // Push a reference to a StringWriter
+ il.append(new NEW(cpg.addClass(STRING_WRITER)));
+ il.append(DUP);
+ il.append(DUP);
+ il.append(new INVOKESPECIAL(
+ cpg.addMethodref(STRING_WRITER, "<init>", "()V")));
+
+ // Load StreamXMLOutput
+ il.append(methodGen.loadHandler());
+ il.append(SWAP);
+ il.append(new PUSH(cpg, "UTF-8")); // other encodings?
+ il.append(new INVOKESPECIAL(
+ cpg.addMethodref(STREAM_XML_OUTPUT, "<init>",
+ "(" + WRITER_SIG + STRING_SIG + ")V")));
+
+ // Invoke output.omitHeader(true)
+ il.append(methodGen.loadHandler());
+ il.append(ICONST_1);
+ il.append(new INVOKEVIRTUAL(
+ cpg.addMethodref(OUTPUT_BASE, "omitHeader",
+ "(Z)V")));
+
+ il.append(methodGen.loadHandler());
+ il.append(new INVOKEVIRTUAL(
+ cpg.addMethodref(OUTPUT_BASE, "startDocument",
+ "()V")));
+
+ // Inline translation of contents
+ translateContents(classGen, methodGen);
+
+ il.append(methodGen.loadHandler());
+ il.append(new INVOKEVIRTUAL(
+ cpg.addMethodref(OUTPUT_BASE, "endDocument",
+ "()V")));
+
+ // Call toString() on StringWriter
+ il.append(new INVOKEVIRTUAL(
+ cpg.addMethodref(STRING_WRITER, "toString",
+ "()" + STRING_SIG)));
+
+ // Restore old output handler
+ il.append(SWAP);
+ il.append(methodGen.storeHandler());
+ break;
+ }
// Send the resulting string to the message handling method
il.append(new INVOKEVIRTUAL(cpg.addMethodref(TRANSLET_CLASS,
@@ -127,5 +184,5 @@
il.append(ATHROW);
}
}
-
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]