tmiller 2002/07/25 04:45:58
Modified: java/src/org/apache/xalan/xsltc/runtime BasisLibrary.java
java/src/org/apache/xalan/xsltc/trax DOM2SAX.java
Log:
bug fix 10837, support of ext java functions
Revision Changes Path
1.44 +152 -5
xml-xalan/java/src/org/apache/xalan/xsltc/runtime/BasisLibrary.java
Index: BasisLibrary.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/runtime/BasisLibrary.java,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -r1.43 -r1.44
--- BasisLibrary.java 15 Jul 2002 17:21:01 -0000 1.43
+++ BasisLibrary.java 25 Jul 2002 11:45:57 -0000 1.44
@@ -85,6 +85,16 @@
import org.apache.xalan.xsltc.dom.AbsoluteIterator;
import org.apache.xalan.xsltc.dom.SingletonIterator;
+import org.apache.xalan.xsltc.dom.DOMImpl;
+import org.apache.xalan.xsltc.dom.DOMBuilder;
+import org.apache.xalan.xsltc.dom.StepIterator;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.DOMException;
+import org.w3c.dom.Document;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.DocumentBuilder;
+import org.apache.xalan.xsltc.trax.DOM2SAX;
+
/**
* Standard XSLT functions. All standard functions expect the current node
* and the DOM as their last two arguments.
@@ -454,10 +464,20 @@
/**
* Implements the nodeset() extension function.
*/
- public static NodeIterator nodesetF(DOM rtf) {
- final DOMAdapter adapter = (DOMAdapter) rtf;
- return new SingletonIterator(
- DOM.ROOTNODE | adapter.getMultiDOMMask(), true);
+ public static NodeIterator nodesetF(Object obj) {
+ if (obj instanceof DOM) {
+ final DOMAdapter adapter = (DOMAdapter) obj;
+ return new SingletonIterator(
+ DOM.ROOTNODE | adapter.getMultiDOMMask(), true);
+ }
+ else if (obj instanceof NodeIterator) {
+ return (NodeIterator) obj;
+ }
+ else {
+ final String className = obj.getClass().getName();
+ runTimeError(DATA_CONVERSION_ERR, "node-set", className);
+ return null;
+ }
}
//-- Begin utility functions
@@ -942,6 +962,133 @@
runTimeError(DATA_CONVERSION_ERR, "reference", className);
return null;
}
+ }
+
+ /**
+ * Utility function used to convert a w3c NodeList into a internal
+ * DOM iterator.
+ */
+ public static NodeIterator nodeList2Iterator(org.w3c.dom.NodeList
nodeList,
+ Translet translet, DOM dom)
+ {
+ int size = nodeList.getLength();
+
+ // w3c NodeList -> w3c DOM
+ DocumentBuilderFactory dfac = DocumentBuilderFactory.newInstance();
+ DocumentBuilder docbldr = null;
+ try {
+ docbldr = dfac.newDocumentBuilder();
+ } catch (javax.xml.parsers.ParserConfigurationException e) {
+ runTimeError(RUN_TIME_INTERNAL_ERR, e.getMessage());
+ return null;
+
+ }
+ // create new w3c DOM
+ Document doc = docbldr.newDocument();
+ org.w3c.dom.Node topElementNode =
+ doc.appendChild(doc.createElementNS("", "__top__"));
+
+ // copy Nodes from NodeList into new w3c DOM
+ for (int i=0; i<size; i++){
+ org.w3c.dom.Node curr = nodeList.item(i);
+ int nodeType = curr.getNodeType();
+ if (nodeType == org.w3c.dom.Node.DOCUMENT_NODE) {
+ // ignore the root node of node list
+ continue;
+ }
+ String value = null;
+ try {
+ value = curr.getNodeValue();
+ } catch (DOMException ex) {
+ runTimeError(RUN_TIME_INTERNAL_ERR, ex.getMessage());
+ return null;
+ }
+ String namespaceURI = curr.getNamespaceURI();
+ String nodeName = curr.getNodeName();
+ org.w3c.dom.Node newNode = null;
+ switch (nodeType){
+ case org.w3c.dom.Node.ATTRIBUTE_NODE:
+ newNode = doc.createAttributeNS(namespaceURI,
+ nodeName);
+ break;
+ case org.w3c.dom.Node.CDATA_SECTION_NODE:
+ newNode = doc.createCDATASection(value);
+ break;
+ case org.w3c.dom.Node.COMMENT_NODE:
+ newNode = doc.createComment(value);
+ break;
+ case org.w3c.dom.Node.DOCUMENT_FRAGMENT_NODE:
+ newNode = doc.createDocumentFragment();
+ break;
+ case org.w3c.dom.Node.DOCUMENT_TYPE_NODE:
+ // nothing ?
+ break;
+ case org.w3c.dom.Node.ELEMENT_NODE:
+ newNode = doc.createElementNS(namespaceURI, nodeName);
+ break;
+ case org.w3c.dom.Node.ENTITY_NODE:
+ // nothing ?
+ break;
+ case org.w3c.dom.Node.ENTITY_REFERENCE_NODE:
+ newNode = doc.createEntityReference(nodeName);
+ break;
+ case org.w3c.dom.Node.NOTATION_NODE:
+ // nothing ?
+ break;
+ case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
+ newNode = doc.createProcessingInstruction(nodeName,
+ value);
+ break;
+ case org.w3c.dom.Node.TEXT_NODE:
+ newNode = doc.createTextNode(value);
+ break;
+ }
+ try {
+ topElementNode.appendChild(newNode);
+ } catch (DOMException e) {
+ runTimeError(RUN_TIME_INTERNAL_ERR, e.getMessage());
+ return null;
+ }
+ }
+ // w3c DOM -> DOM2SAX -> DOMBuilder -> DOMImpl
+ DOMImpl idom = new DOMImpl();
+ final DOM2SAX dom2sax = new DOM2SAX(doc);
+ final DOMBuilder domBuilder = idom.getBuilder();
+ dom2sax.setContentHandler(domBuilder);
+ try {
+ dom2sax.parse();
+ }
+ catch (java.io.IOException e){
+ runTimeError(RUN_TIME_INTERNAL_ERR, e.getMessage());
+ return null;
+ }
+ catch (org.xml.sax.SAXException e){
+ runTimeError(RUN_TIME_INTERNAL_ERR, e.getMessage());
+ return null;
+ }
+
+
+ if (dom instanceof MultiDOM) {
+ final MultiDOM multiDOM = (MultiDOM) dom;
+
+ // Create DOMAdapter and register with MultiDOM
+ DOMAdapter domAdapter = new DOMAdapter(idom,
+ translet.getNamesArray(),
+ translet.getNamespaceArray());
+ multiDOM.addDOMAdapter(domAdapter);
+
+ NodeIterator iter1 = multiDOM.getAxisIterator(Axis.CHILD);
+ NodeIterator iter2 = multiDOM.getAxisIterator(Axis.CHILD);
+ NodeIterator iter = new AbsoluteIterator(
+ new StepIterator(iter1, iter2));
+
+ iter.setStartNode(DOM.ROOTNODE | domAdapter.getMultiDOMMask());
+ return iter;
+ }
+ else {
+ runTimeError(RUN_TIME_INTERNAL_ERR, "nodeList2Iterator()");
+ return null;
+ }
}
/**
1.16 +8 -2
xml-xalan/java/src/org/apache/xalan/xsltc/trax/DOM2SAX.java
Index: DOM2SAX.java
===================================================================
RCS file:
/home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/trax/DOM2SAX.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- DOM2SAX.java 20 Jun 2002 19:23:00 -0000 1.15
+++ DOM2SAX.java 25 Jul 2002 11:45:57 -0000 1.16
@@ -89,7 +89,7 @@
import org.w3c.dom.Entity;
import org.w3c.dom.Notation;
-class DOM2SAX implements XMLReader, Locator {
+public class DOM2SAX implements XMLReader, Locator {
private final static String EMPTYSTRING = "";
private static final String XMLNS_PREFIX = "xmlns";
@@ -184,6 +184,12 @@
public void parse(InputSource unused) throws IOException, SAXException {
parse(_dom);
+ }
+
+ public void parse() throws IOException, SAXException {
+ if (_dom != null) {
+ parse(_dom);
+ }
}
/**
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]