From: Wolfgang M. M. <wol...@us...> - 2004-09-12 09:26:03
|
Update of /cvsroot/exist/eXist-1.0/src/org/exist/memtree In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv21081/src/org/exist/memtree Modified Files: NodeImpl.java DocumentImpl.java Added Files: DocumentBuilderReceiver.java Removed Files: Receiver.java Log Message: * Added support for XQuery pragmas to set serialization and watchdog settings. * org.exist.storage.serializers.Serializer now passes all output to an instance of the Receiver interface instead of a SAX ContentHandler. Receiver resembles SAX, but has methods that are closer to eXist's internal storage. For example, it directly accepts a QName in startElement to avoid unnecessary string allocations. * Fixed various performance leaks in cross-document joins. Index: NodeImpl.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/memtree/NodeImpl.java,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** NodeImpl.java 1 Sep 2004 17:41:30 -0000 1.19 --- NodeImpl.java 12 Sep 2004 09:25:19 -0000 1.20 *************** *** 31,34 **** --- 31,35 ---- import org.exist.util.serializer.DOMStreamer; import org.exist.util.serializer.DOMStreamerPool; + import org.exist.util.serializer.Receiver; import org.exist.xquery.Cardinality; import org.exist.xquery.XPathException; *************** *** 541,549 **** } ! public void copyTo(DBBroker broker, Receiver receiver) throws SAXException { ! // toSAX(broker, receiver); document.copyTo(this, receiver); } /* (non-Javadoc) * @see org.exist.xquery.value.Item#conversionPreference(java.lang.Class) --- 542,553 ---- } ! public void copyTo(DBBroker broker, DocumentBuilderReceiver receiver) throws SAXException { document.copyTo(this, receiver); } + public void streamTo(Serializer serializer, Receiver receiver) throws SAXException { + document.streamTo(serializer, this, receiver); + } + /* (non-Javadoc) * @see org.exist.xquery.value.Item#conversionPreference(java.lang.Class) *************** *** 599,601 **** --- 603,620 ---- public void setSelfAsContext() { } + + /* (non-Javadoc) + * @see org.exist.xquery.value.Sequence#isCached() + */ + public boolean isCached() { + // always return false + return false; + } + + /* (non-Javadoc) + * @see org.exist.xquery.value.Sequence#setIsCached(boolean) + */ + public void setIsCached(boolean cached) { + // ignore + } } --- NEW FILE: DocumentBuilderReceiver.java --- /* * eXist Open Source Native XML Database * Copyright (C) 2001-03 Wolfgang M. Meier * wol...@ex... * http://exist.sourceforge.net * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * $Id: DocumentBuilderReceiver.java,v 1.1 2004/09/12 09:25:19 wolfgang_m Exp $ */ package org.exist.memtree; import org.exist.dom.NodeProxy; import org.exist.dom.QName; import org.exist.util.serializer.AttrList; import org.exist.util.serializer.Receiver; import org.exist.xquery.XQueryContext; import org.w3c.dom.Document; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.ext.LexicalHandler; /** * Builds an in-memory DOM tree from SAX {@link org.exist.util.serializer.Receiver} * events. * * @author Wolfgang <wol...@ex...> */ public class DocumentBuilderReceiver implements ContentHandler, LexicalHandler, Receiver { private MemTreeBuilder builder = null; public DocumentBuilderReceiver() { super(); } public DocumentBuilderReceiver(MemTreeBuilder builder) { super(); this.builder = builder; } public Document getDocument() { return builder.getDocument(); } public XQueryContext getContext() { return builder.getContext(); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator) */ public void setDocumentLocator(Locator arg0) { } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startDocument() */ public void startDocument() throws SAXException { if(builder == null) { builder = new MemTreeBuilder(); builder.startDocument(); } } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#endDocument() */ public void endDocument() throws SAXException { builder.endDocument(); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String) */ public void startPrefixMapping(String arg0, String arg1) throws SAXException { } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String) */ public void endPrefixMapping(String arg0) throws SAXException { } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) */ public void startElement( String namespaceURI, String localName, String qName, Attributes attrs) throws SAXException { builder.startElement(namespaceURI, localName, qName, attrs); } public void startElement(QName qname, AttrList attribs) { builder.startElement(qname, null); if(attribs != null) { for(int i = 0; i < attribs.getLength(); i++) { builder.addAttribute(attribs.getQName(i), attribs.getValue(i)); } } } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String) */ public void endElement(String arg0, String arg1, String arg2) throws SAXException { builder.endElement(); } public void endElement(QName qname) throws SAXException { builder.endElement(); } public void addReferenceNode(NodeProxy proxy) throws SAXException { builder.addReferenceNode(proxy); } public void addNamespaceNode(QName qname) throws SAXException { builder.namespaceNode(qname); } public void characters(CharSequence seq) throws SAXException { builder.characters(seq); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#characters(char[], int, int) */ public void characters(char[] ch, int start, int len) throws SAXException { builder.characters(ch, start, len); } public void attribute(QName qname, String value) throws SAXException { builder.addAttribute(qname, value); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int) */ public void ignorableWhitespace(char[] arg0, int arg1, int arg2) throws SAXException { } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String) */ public void processingInstruction(String target, String data) throws SAXException { builder.processingInstruction(target, data); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String) */ public void skippedEntity(String arg0) throws SAXException { } /* (non-Javadoc) * @see org.xml.sax.ext.LexicalHandler#endCDATA() */ public void endCDATA() throws SAXException { // TODO ignored } /* (non-Javadoc) * @see org.xml.sax.ext.LexicalHandler#endDTD() */ public void endDTD() throws SAXException { } /* (non-Javadoc) * @see org.xml.sax.ext.LexicalHandler#startCDATA() */ public void startCDATA() throws SAXException { // TODO Ignored } /* (non-Javadoc) * @see org.xml.sax.ext.LexicalHandler#comment(char[], int, int) */ public void comment(char[] ch, int start, int length) throws SAXException { builder.comment(ch, start, length); } /* (non-Javadoc) * @see org.xml.sax.ext.LexicalHandler#endEntity(java.lang.String) */ public void endEntity(String name) throws SAXException { } /* (non-Javadoc) * @see org.xml.sax.ext.LexicalHandler#startEntity(java.lang.String) */ public void startEntity(String name) throws SAXException { } /* (non-Javadoc) * @see org.xml.sax.ext.LexicalHandler#startDTD(java.lang.String, java.lang.String, java.lang.String) */ public void startDTD(String name, String publicId, String systemId) throws SAXException { } } Index: DocumentImpl.java =================================================================== RCS file: /cvsroot/exist/eXist-1.0/src/org/exist/memtree/DocumentImpl.java,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** DocumentImpl.java 7 Aug 2004 16:28:02 -0000 1.12 --- DocumentImpl.java 12 Sep 2004 09:25:19 -0000 1.13 *************** *** 25,29 **** --- 25,32 ---- import org.exist.dom.NodeProxy; import org.exist.dom.QName; + import org.exist.storage.serializers.Serializer; import org.exist.util.hashtable.NamePool; + import org.exist.util.serializer.AttrList; + import org.exist.util.serializer.Receiver; import org.exist.xquery.XQueryContext; import org.w3c.dom.Attr; *************** *** 103,107 **** protected int nextRef = 0; ! private final static int NODE_SIZE = 128; private final static int ATTR_SIZE = 64; --- 106,110 ---- protected int nextRef = 0; ! private final static int NODE_SIZE = 128; private final static int ATTR_SIZE = 64; *************** *** 547,557 **** * @param receiver */ ! public void copyTo(NodeImpl node, Receiver receiver) throws SAXException { NodeImpl top = node; while (node != null) { ! startNode(node, receiver); NodeImpl nextNode = (NodeImpl) node.getFirstChild(); while (nextNode == null) { ! endNode(node, receiver); if (top != null && top.nodeNumber == node.nodeNumber) break; nextNode = (NodeImpl) node.getNextSibling(); --- 550,560 ---- * @param receiver */ ! public void copyTo(NodeImpl node, DocumentBuilderReceiver receiver) throws SAXException { NodeImpl top = node; while (node != null) { ! copyStartNode(node, receiver); NodeImpl nextNode = (NodeImpl) node.getFirstChild(); while (nextNode == null) { ! copyEndNode(node, receiver); if (top != null && top.nodeNumber == node.nodeNumber) break; nextNode = (NodeImpl) node.getNextSibling(); *************** *** 559,563 **** node = (NodeImpl) node.getParentNode(); if (node == null || (top != null && top.nodeNumber == node.nodeNumber)) { ! endNode(node, receiver); nextNode = null; break; --- 562,566 ---- node = (NodeImpl) node.getParentNode(); if (node == null || (top != null && top.nodeNumber == node.nodeNumber)) { ! copyEndNode(node, receiver); nextNode = null; break; *************** *** 569,573 **** } ! private void startNode(NodeImpl node, Receiver receiver) throws SAXException { int nr = node.nodeNumber; --- 572,576 ---- } ! private void copyStartNode(NodeImpl node, DocumentBuilderReceiver receiver) throws SAXException { int nr = node.nodeNumber; *************** *** 576,580 **** QName nodeName = (QName) document.namePool .get(document.nodeName[nr]); ! receiver.startElement(nodeName); int attr = document.alpha[nr]; if (-1 < attr) { --- 579,583 ---- QName nodeName = (QName) document.namePool .get(document.nodeName[nr]); ! receiver.startElement(nodeName, null); int attr = document.alpha[nr]; if (-1 < attr) { *************** *** 626,632 **** } ! private void endNode(NodeImpl node, Receiver receiver) throws SAXException { if(node.getNodeType() == Node.ELEMENT_NODE) receiver.endElement(node.getQName()); } } \ No newline at end of file --- 629,707 ---- } ! private void copyEndNode(NodeImpl node, DocumentBuilderReceiver receiver) throws SAXException { if(node.getNodeType() == Node.ELEMENT_NODE) receiver.endElement(node.getQName()); } + + public void streamTo(Serializer serializer, NodeImpl node, Receiver receiver) throws SAXException { + NodeImpl top = node; + while (node != null) { + startNode(serializer, node, receiver); + NodeImpl nextNode = (NodeImpl) node.getFirstChild(); + while (nextNode == null) { + endNode(node, receiver); + if (top != null && top.nodeNumber == node.nodeNumber) break; + nextNode = (NodeImpl) node.getNextSibling(); + if (nextNode == null) { + node = (NodeImpl) node.getParentNode(); + if (node == null || (top != null && top.nodeNumber == node.nodeNumber)) { + endNode(node, receiver); + nextNode = null; + break; + } + } + } + node = nextNode; + } + } + + private void startNode(Serializer serializer, NodeImpl node, Receiver receiver) + throws SAXException { + int nr = node.nodeNumber; + switch (node.getNodeType()) { + case Node.ELEMENT_NODE: + QName nodeName = (QName) document.namePool + .get(document.nodeName[nr]); + AttrList attribs = null; + int attr = document.alpha[nr]; + if (-1 < attr) { + attribs = new AttrList(); + while (attr < document.nextAttr + && document.attrParent[attr] == nr) { + QName attrQName = (QName) document.namePool + .get(document.attrName[attr]); + attribs.addAttribute(attrQName, attrValue[attr]); + ++attr; + } + } + receiver.startElement(nodeName, attribs); + break; + case Node.TEXT_NODE: + receiver.characters(new String(document.characters, document.alpha[nr], + document.alphaLen[nr])); + break; + case Node.ATTRIBUTE_NODE: + QName attrQName = (QName) document.namePool.get(document.attrName[nr]); + receiver.attribute(attrQName, attrValue[nr]); + break; + case Node.COMMENT_NODE: + receiver.comment(document.characters, document.alpha[nr], + document.alphaLen[nr]); + break; + case Node.PROCESSING_INSTRUCTION_NODE: + QName qn = (QName) document.namePool.get(document.nodeName[nr]); + String data = new String(document.characters, + document.alpha[nr], document.alphaLen[nr]); + receiver.processingInstruction(qn.getLocalName(), data); + break; + case NodeImpl.REFERENCE_NODE: + serializer.toReceiver(document.references[document.alpha[nr]]); + break; + } + } + + private void endNode(NodeImpl node, Receiver receiver) throws SAXException { + if(node.getNodeType() == Node.ELEMENT_NODE) + receiver.endElement(node.getQName()); + } } \ No newline at end of file --- Receiver.java DELETED --- |