From: <wol...@us...> - 2006-09-28 21:00:31
|
Revision: 4436 http://svn.sourceforge.net/exist/?rev=4436&view=rev Author: wolfgang_m Date: 2006-09-28 14:00:19 -0700 (Thu, 28 Sep 2006) Log Message: ----------- Some improvements to fn:base-uri and fn:document-uri. fn:document-uri should be nearly compliant with the specs now. Modified Paths: -------------- branches/DLN/eXist-1.0/src/org/exist/memtree/ElementImpl.java branches/DLN/eXist-1.0/src/org/exist/memtree/NodeImpl.java branches/DLN/eXist-1.0/src/org/exist/xquery/functions/FunBaseURI.java branches/DLN/eXist-1.0/src/org/exist/xquery/functions/FunDocumentURI.java Modified: branches/DLN/eXist-1.0/src/org/exist/memtree/ElementImpl.java =================================================================== --- branches/DLN/eXist-1.0/src/org/exist/memtree/ElementImpl.java 2006-09-28 20:50:42 UTC (rev 4435) +++ branches/DLN/eXist-1.0/src/org/exist/memtree/ElementImpl.java 2006-09-28 21:00:19 UTC (rev 4436) @@ -22,6 +22,7 @@ */ package org.exist.memtree; +import org.exist.Namespaces; import org.exist.dom.NamedNodeMapImpl; import org.exist.dom.NodeListImpl; import org.exist.dom.QName; @@ -327,6 +328,10 @@ return getAttributeNS(namespaceURI, localName) != null; } + public String getBaseURI() { + return getAttributeNS(Namespaces.XML_NS, "base"); + } + /** ? @see org.w3c.dom.Element#getSchemaTypeInfo() */ public TypeInfo getSchemaTypeInfo() { Modified: branches/DLN/eXist-1.0/src/org/exist/memtree/NodeImpl.java =================================================================== --- branches/DLN/eXist-1.0/src/org/exist/memtree/NodeImpl.java 2006-09-28 20:50:42 UTC (rev 4435) +++ branches/DLN/eXist-1.0/src/org/exist/memtree/NodeImpl.java 2006-09-28 21:00:19 UTC (rev 4436) @@ -691,7 +691,7 @@ /** ? @see org.w3c.dom.Node#getBaseURI() */ public String getBaseURI() { - throw new RuntimeException("Can not call getBaseURI() on node type " + this.getNodeType()); + return null; } /** ? @see org.w3c.dom.Node#compareDocumentPosition(org.w3c.dom.Node) Modified: branches/DLN/eXist-1.0/src/org/exist/xquery/functions/FunBaseURI.java =================================================================== --- branches/DLN/eXist-1.0/src/org/exist/xquery/functions/FunBaseURI.java 2006-09-28 20:50:42 UTC (rev 4435) +++ branches/DLN/eXist-1.0/src/org/exist/xquery/functions/FunBaseURI.java 2006-09-28 21:00:19 UTC (rev 4436) @@ -24,6 +24,7 @@ import org.exist.dom.NodeProxy; import org.exist.dom.QName; +import org.exist.memtree.NodeImpl; import org.exist.xquery.BasicFunction; import org.exist.xquery.Cardinality; import org.exist.xquery.Dependency; @@ -33,10 +34,13 @@ import org.exist.xquery.XPathException; import org.exist.xquery.XQueryContext; import org.exist.xquery.value.AnyURIValue; +import org.exist.xquery.value.Item; import org.exist.xquery.value.NodeValue; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceType; +import org.exist.xquery.value.StringValue; import org.exist.xquery.value.Type; +import org.w3c.dom.Node; /** * @author wolf @@ -82,18 +86,38 @@ context.getProfiler().message(this, Profiler.START_SEQUENCES, "CONTEXT SEQUENCE", contextSequence); } - Sequence result; - if (args.length == 0) - result = context.getBaseURI(); - else if (args[0].isEmpty()) - result = Sequence.EMPTY_SEQUENCE; - else { - NodeValue node = (NodeValue) args[0].itemAt(0); - if (node.getImplementationType() == NodeValue.IN_MEMORY_NODE) - result = context.getBaseURI(); - else { + Sequence result = null; + NodeValue node = null; + if (args.length == 0) { + if (contextSequence.getLength() == 0) + throw new XPathException(getASTNode(), "XPDY0002: context sequence is empty and no argument specified"); + Item item = contextSequence.itemAt(0); + if (!Type.subTypeOf(item.getType(), Type.NODE)) + throw new XPathException(getASTNode(), "XPTY0004: context item is not a node"); + node = (NodeValue) item; + } else { + if (args[0].isEmpty()) + result = Sequence.EMPTY_SEQUENCE; + else + node = (NodeValue) args[0].itemAt(0); + } + if (result == null && node != null) { + if (node.getImplementationType() == NodeValue.IN_MEMORY_NODE) { + NodeImpl domNode = (NodeImpl) node.getNode(); + String base = domNode.getBaseURI(); + if (base == null) + result = Sequence.EMPTY_SEQUENCE; + else + result = new StringValue(base); + } else { NodeProxy proxy = (NodeProxy) node; - result = new AnyURIValue(proxy.getDocument().getURI()); + short type = proxy.getNodeType(); + // Only elements, document nodes and processing instructions have a base-uri + if (type == Node.ELEMENT_NODE || type == Node.DOCUMENT_NODE || + type == Node.PROCESSING_INSTRUCTION_NODE) + result = new AnyURIValue(proxy.getDocument().getURI()); + else + result = Sequence.EMPTY_SEQUENCE; } } Modified: branches/DLN/eXist-1.0/src/org/exist/xquery/functions/FunDocumentURI.java =================================================================== --- branches/DLN/eXist-1.0/src/org/exist/xquery/functions/FunDocumentURI.java 2006-09-28 20:50:42 UTC (rev 4435) +++ branches/DLN/eXist-1.0/src/org/exist/xquery/functions/FunDocumentURI.java 2006-09-28 21:00:19 UTC (rev 4436) @@ -33,6 +33,7 @@ import org.exist.xquery.XQueryContext; import org.exist.xquery.value.AnyURIValue; import org.exist.xquery.value.Item; +import org.exist.xquery.value.NodeValue; import org.exist.xquery.value.Sequence; import org.exist.xquery.value.SequenceType; import org.exist.xquery.value.Type; @@ -49,7 +50,7 @@ "was constructed, if none such URI exists returns the empty sequence. " + "If $a is the empty sequence, returns the empty sequence.", new SequenceType[] { - new SequenceType(Type.NODE, Cardinality.EXACTLY_ONE) + new SequenceType(Type.NODE, Cardinality.ZERO_OR_ONE) }, new SequenceType(Type.ANY_URI, Cardinality.ZERO_OR_ONE)); @@ -72,13 +73,20 @@ if (contextItem != null) context.getProfiler().message(this, Profiler.START_SEQUENCES, "CONTEXT ITEM", contextItem.toSequence()); } + if (contextItem != null) + contextSequence = contextItem.toSequence(); Expression arg = getArgument(0); - Sequence s = arg.eval(contextSequence, contextItem); - NodeProxy node = (NodeProxy) s.itemAt(0); - XmldbURI path = node.getDocument().getURI(); - Sequence result = new AnyURIValue(path); - + Sequence s = arg.eval(contextSequence); + Sequence result = Sequence.EMPTY_SEQUENCE; + if (!s.isEmpty()) { + NodeValue value = (NodeValue) s.itemAt(0); + if (value.getImplementationType() == NodeValue.PERSISTENT_NODE) { + NodeProxy node = (NodeProxy) value; + XmldbURI path = node.getDocument().getURI(); + result = new AnyURIValue(path); + } + } if (context.getProfiler().isEnabled()) context.getProfiler().end(this, "", result); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |