summaryrefslogtreecommitdiffstats
path: root/libjava/classpath/gnu/xml/xpath
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/classpath/gnu/xml/xpath')
-rw-r--r--libjava/classpath/gnu/xml/xpath/Expr.java45
-rw-r--r--libjava/classpath/gnu/xml/xpath/LocalNameFunction.java6
-rw-r--r--libjava/classpath/gnu/xml/xpath/NameFunction.java6
-rw-r--r--libjava/classpath/gnu/xml/xpath/NameTest.java39
-rw-r--r--libjava/classpath/gnu/xml/xpath/NamespaceTest.java26
-rw-r--r--libjava/classpath/gnu/xml/xpath/NamespaceUriFunction.java6
-rw-r--r--libjava/classpath/gnu/xml/xpath/NodeTypeTest.java20
-rw-r--r--libjava/classpath/gnu/xml/xpath/Selector.java157
-rw-r--r--libjava/classpath/gnu/xml/xpath/SubstringFunction.java21
9 files changed, 154 insertions, 172 deletions
diff --git a/libjava/classpath/gnu/xml/xpath/Expr.java b/libjava/classpath/gnu/xml/xpath/Expr.java
index b4b55dcf94e..76fd49eeff5 100644
--- a/libjava/classpath/gnu/xml/xpath/Expr.java
+++ b/libjava/classpath/gnu/xml/xpath/Expr.java
@@ -1,5 +1,5 @@
/* Expr.java --
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -233,9 +233,11 @@ public abstract class Expr
*/
public static String _local_name(Node context, Collection nodeSet)
{
- Node node = (nodeSet == null || nodeSet.size() == 0) ? context :
- firstNode(nodeSet);
- return node.getLocalName();
+ if (nodeSet == null || nodeSet.isEmpty())
+ return "";
+ Node node = firstNode(nodeSet);
+ String ret = node.getLocalName();
+ return (ret == null) ? "" : ret;
}
/**
@@ -248,9 +250,11 @@ public abstract class Expr
*/
public static String _namespace_uri(Node context, Collection nodeSet)
{
- Node node = (nodeSet == null || nodeSet.size() == 0) ? context :
- firstNode(nodeSet);
- return node.getNamespaceURI();
+ if (nodeSet == null || nodeSet.isEmpty())
+ return "";
+ Node node = firstNode(nodeSet);
+ String ret = node.getNamespaceURI();
+ return (ret == null) ? "" : ret;
}
/**
@@ -271,17 +275,18 @@ public abstract class Expr
*/
public static String _name(Node context, Collection nodeSet)
{
- Node node = (nodeSet == null || nodeSet.size() == 0) ? context :
- firstNode(nodeSet);
+ if (nodeSet == null || nodeSet.isEmpty())
+ return "";
+ Node node = firstNode(nodeSet);
+ String ret = null;
switch (node.getNodeType())
{
case Node.ATTRIBUTE_NODE:
case Node.ELEMENT_NODE:
case Node.PROCESSING_INSTRUCTION_NODE:
- return node.getNodeName();
- default:
- return "";
+ ret = node.getNodeName();
}
+ return (ret == null) ? "" : ret;
}
/**
@@ -371,7 +376,10 @@ public abstract class Expr
}
if (object instanceof Double)
{
- return ((Double) object).doubleValue() != 0.0;
+ Double value = (Double) object;
+ if (value.isNaN())
+ return false;
+ return value.doubleValue() != 0.0;
}
if (object instanceof String)
{
@@ -473,4 +481,15 @@ public abstract class Expr
}
}
+ static int intValue(Object val)
+ {
+ if (val instanceof Double)
+ {
+ Double d = (Double) val;
+ return d.isNaN() ? 0 : d.intValue();
+ }
+ else
+ return (int) Math.ceil(_number(null, val));
+ }
+
}
diff --git a/libjava/classpath/gnu/xml/xpath/LocalNameFunction.java b/libjava/classpath/gnu/xml/xpath/LocalNameFunction.java
index f8ace9cd5f9..84fb6d48288 100644
--- a/libjava/classpath/gnu/xml/xpath/LocalNameFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/LocalNameFunction.java
@@ -1,5 +1,5 @@
/* LocalNameFunction.java --
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.xml.xpath;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import javax.xml.namespace.QName;
import org.w3c.dom.Node;
@@ -70,7 +71,8 @@ final class LocalNameFunction
public Object evaluate(Node context, int pos, int len)
{
- Object val = (arg == null) ? null : arg.evaluate(context, pos, len);
+ Object val = (arg == null) ? Collections.singleton(context) :
+ arg.evaluate(context, pos, len);
return _local_name(context, (Collection) val);
}
diff --git a/libjava/classpath/gnu/xml/xpath/NameFunction.java b/libjava/classpath/gnu/xml/xpath/NameFunction.java
index dc5e612037a..ea49741fa57 100644
--- a/libjava/classpath/gnu/xml/xpath/NameFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/NameFunction.java
@@ -1,5 +1,5 @@
/* NameFunction.java --
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.xml.xpath;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import javax.xml.namespace.QName;
import org.w3c.dom.Node;
@@ -78,7 +79,8 @@ final class NameFunction
public Object evaluate(Node context, int pos, int len)
{
- Object val = (arg == null) ? null : arg.evaluate(context, pos, len);
+ Object val = (arg == null) ? Collections.singleton(context) :
+ arg.evaluate(context, pos, len);
return _name(context, (Collection) val);
}
diff --git a/libjava/classpath/gnu/xml/xpath/NameTest.java b/libjava/classpath/gnu/xml/xpath/NameTest.java
index c89ba4dd16b..1710103903d 100644
--- a/libjava/classpath/gnu/xml/xpath/NameTest.java
+++ b/libjava/classpath/gnu/xml/xpath/NameTest.java
@@ -1,5 +1,5 @@
/* NameTest.java --
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -91,29 +91,32 @@ public final class NameTest
return false;
}
if (any)
- {
- return true;
- }
+ return true;
String uri = qName.getNamespaceURI();
String nodeUri = node.getNamespaceURI();
- String nodeLocalName = node.getLocalName();
- if (nodeLocalName != null && !equal(uri, nodeUri))
- {
- return false;
- }
+ if (!equal(uri, nodeUri))
+ return false;
if (anyLocalName)
- {
- return true;
- }
+ return true;
String localName = qName.getLocalPart();
- if (nodeLocalName != null)
+ String nodeLocalName = getLocalName(node);
+ return (localName.equals(nodeLocalName));
+ }
+
+ static String getLocalName(Node node)
+ {
+ String localName = node.getLocalName();
+ if (localName == null)
{
- nodeLocalName = node.getNodeName();
+ localName = node.getNodeName();
+ int ci = localName.indexOf(':');
+ if (ci != -1)
+ localName = localName.substring(ci + 1);
}
- return (localName.equals(nodeLocalName));
+ return localName;
}
- final boolean equal(String s1, String s2)
+ static boolean equal(String s1, String s2)
{
return (((s1 == null || s1.length() == 0) &&
(s2 == null || s2.length() == 0)) ||
@@ -133,9 +136,7 @@ public final class NameTest
public String toString ()
{
if (any)
- {
- return "*";
- }
+ return "*";
return qName.toString();
}
diff --git a/libjava/classpath/gnu/xml/xpath/NamespaceTest.java b/libjava/classpath/gnu/xml/xpath/NamespaceTest.java
index 6d41166bcb9..d93b76d9de8 100644
--- a/libjava/classpath/gnu/xml/xpath/NamespaceTest.java
+++ b/libjava/classpath/gnu/xml/xpath/NamespaceTest.java
@@ -81,28 +81,22 @@ public final class NamespaceTest
if (XMLConstants.XMLNS_ATTRIBUTE_NS_URI.equals(uri) ||
XMLConstants.XMLNS_ATTRIBUTE.equals(node.getPrefix()) ||
XMLConstants.XMLNS_ATTRIBUTE.equals(node.getNodeName()))
- {
- break;
- }
+ break;
// Fall through
default:
// Only process namespace attributes
return false;
}
if (any)
- {
- return true;
- }
+ return true;
+ String uri = qName.getNamespaceURI();
+ String nodeUri = node.getNamespaceURI();
+ if (!NameTest.equal(uri, nodeUri))
+ return false;
if (anyLocalName)
- {
- return true;
- }
+ return true;
String localName = qName.getLocalPart();
- String nodeLocalName = node.getLocalName();
- if (nodeLocalName == null)
- {
- nodeLocalName = node.getNodeName();
- }
+ String nodeLocalName = NameTest.getLocalName(node);
return (localName.equals(nodeLocalName));
}
@@ -119,9 +113,7 @@ public final class NamespaceTest
public String toString ()
{
if (any)
- {
- return "*";
- }
+ return "*";
return qName.toString();
}
diff --git a/libjava/classpath/gnu/xml/xpath/NamespaceUriFunction.java b/libjava/classpath/gnu/xml/xpath/NamespaceUriFunction.java
index e67ec42065e..3ae46f7ee71 100644
--- a/libjava/classpath/gnu/xml/xpath/NamespaceUriFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/NamespaceUriFunction.java
@@ -1,5 +1,5 @@
/* NamespaceUriFunction.java --
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -38,6 +38,7 @@ exception statement from your version. */
package gnu.xml.xpath;
import java.util.Collection;
+import java.util.Collections;
import java.util.List;
import javax.xml.namespace.QName;
import org.w3c.dom.Node;
@@ -70,7 +71,8 @@ final class NamespaceUriFunction
public Object evaluate(Node context, int pos, int len)
{
- Object val = (arg == null) ? null : arg.evaluate(context, pos, len);
+ Object val = (arg == null) ? Collections.singleton(context) :
+ arg.evaluate(context, pos, len);
return _namespace_uri(context, (Collection) val);
}
diff --git a/libjava/classpath/gnu/xml/xpath/NodeTypeTest.java b/libjava/classpath/gnu/xml/xpath/NodeTypeTest.java
index 807374132e5..09e92d0d9a2 100644
--- a/libjava/classpath/gnu/xml/xpath/NodeTypeTest.java
+++ b/libjava/classpath/gnu/xml/xpath/NodeTypeTest.java
@@ -1,5 +1,5 @@
/* NodeTypeTest.java --
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -39,6 +39,7 @@ package gnu.xml.xpath;
import javax.xml.namespace.QName;
import org.w3c.dom.Node;
+import org.w3c.dom.ProcessingInstruction;
/**
* Tests whether a node is of a given type.
@@ -83,17 +84,20 @@ public final class NodeTypeTest
case Node.TEXT_NODE:
case Node.CDATA_SECTION_NODE:
case Node.COMMENT_NODE:
+ if (type > 0)
+ {
+ if (nodeType != type)
+ return false;
+ }
+ return true;
case Node.PROCESSING_INSTRUCTION_NODE:
if (type > 0)
{
if (nodeType != type)
- {
- return false;
- }
- if (data != null && !data.equals(node.getNodeValue()))
- {
- return false;
- }
+ return false;
+ if (data != null &&
+ !data.equals(((ProcessingInstruction) node).getTarget()))
+ return false;
}
return true;
default:
diff --git a/libjava/classpath/gnu/xml/xpath/Selector.java b/libjava/classpath/gnu/xml/xpath/Selector.java
index 598038064b5..93408e48b23 100644
--- a/libjava/classpath/gnu/xml/xpath/Selector.java
+++ b/libjava/classpath/gnu/xml/xpath/Selector.java
@@ -1,5 +1,5 @@
/* Selector.java --
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004,2006 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -85,11 +85,13 @@ public final class Selector
public Selector(int axis, List tests)
{
this.axis = axis;
- this.tests = new Test[tests.size()];
- tests.toArray(this.tests);
- if (axis == NAMESPACE &&
- this.tests.length > 0 &&
- this.tests[0] instanceof NameTest)
+ int len = tests.size();
+ this.tests = new Test[(len == 0) ? 1 : len];
+ if (len > 0)
+ tests.toArray(this.tests);
+ else
+ this.tests[0] = new NameTest(null, true, true);
+ if (axis == NAMESPACE && this.tests[0] instanceof NameTest)
{
NameTest nt = (NameTest) this.tests[0];
this.tests[0] = new NamespaceTest(nt.qName, nt.anyLocalName, nt.any);
@@ -111,16 +113,12 @@ public final class Selector
{
case CHILD:
if (nodeType == Node.ATTRIBUTE_NODE)
- {
- return false;
- }
+ return false;
break;
case ATTRIBUTE:
case NAMESPACE:
if (nodeType != Node.ATTRIBUTE_NODE)
- {
- return false;
- }
+ return false;
break;
case DESCENDANT_OR_SELF:
return true;
@@ -132,13 +130,13 @@ public final class Selector
{
int pos = getContextPosition(context);
int len = getContextSize(context);
+ if (len == 0)
+ System.err.println("WARNING: context size is 0");
for (int j = 0; j < tlen && len > 0; j++)
{
Test test = tests[j];
if (!test.matches(context, pos, len))
- {
- return false;
- }
+ return false;
}
}
return true;
@@ -149,9 +147,7 @@ public final class Selector
int pos = 1;
for (ctx = ctx.getPreviousSibling(); ctx != null;
ctx = ctx.getPreviousSibling())
- {
- pos++;
- }
+ pos++;
return pos;
}
@@ -159,15 +155,17 @@ public final class Selector
{
if (ctx.getNodeType() == Node.ATTRIBUTE_NODE)
{
- Node parent = ((Attr) ctx).getOwnerElement();
- return parent.getAttributes().getLength();
- }
- Node parent = ctx.getParentNode();
- if (parent != null)
- {
- return parent.getChildNodes().getLength();
+ Node owner = ((Attr) ctx).getOwnerElement();
+ return owner.getAttributes().getLength();
}
- return 1;
+ int count = 1;
+ Node sib = ctx.getPreviousSibling();
+ for (; sib != null; sib = sib.getPreviousSibling())
+ count++;
+ sib = ctx.getNextSibling();
+ for (; sib != null; sib = sib.getNextSibling())
+ count++;
+ return count;
}
public Object evaluate(Node context, int pos, int len)
@@ -175,7 +173,6 @@ public final class Selector
Set acc = new LinkedHashSet();
addCandidates(context, acc);
List candidates = new ArrayList(acc);
- //Collections.sort(candidates, documentOrderComparator);
List ret = filterCandidates(candidates, false);
return ret;
}
@@ -184,11 +181,8 @@ public final class Selector
{
Set acc = new LinkedHashSet();
for (Iterator i = ns.iterator(); i.hasNext(); )
- {
- addCandidates((Node) i.next(), acc);
- }
+ addCandidates((Node) i.next(), acc);
List candidates = new ArrayList(acc);
- //Collections.sort(candidates, documentOrderComparator);
List ret = filterCandidates(candidates, true);
return ret;
}
@@ -230,17 +224,7 @@ public final class Selector
}
}
if (test.matches(node, i + 1, len))
- {
- successful.add(node);
- }
- /*
- System.err.println("Testing "+node);
- int p = getContextPosition(node);
- int l = getContextSize(node);
- if (test.matches(node, p, l))
- {
- successful.add(node);
- }*/
+ successful.add(node);
}
candidates = successful;
len = candidates.size();
@@ -305,9 +289,7 @@ public final class Selector
{
acc.add(child);
if (recurse)
- {
- addChildNodes(child, acc, recurse);
- }
+ addChildNodes(child, acc, recurse);
child = child.getNextSibling();
}
}
@@ -320,55 +302,62 @@ public final class Selector
{
acc.add(parent);
if (recurse)
- {
- addParentNode(parent, acc, recurse);
- }
+ addParentNode(parent, acc, recurse);
}
}
void addFollowingNodes(Node context, Collection acc, boolean recurse)
{
- Node cur = context.getNextSibling();
+ if (context != null && recurse)
+ addChildNodes(context, acc, true);
+ Node cur = (context.getNodeType() == Node.ATTRIBUTE_NODE) ? null :
+ context.getNextSibling();
while (cur != null)
{
acc.add(cur);
if (recurse)
- {
- addChildNodes(cur, acc, true);
- }
+ addChildNodes(cur, acc, true);
cur = cur.getNextSibling();
}
if (recurse)
{
- context = (context.getNodeType() == Node.ATTRIBUTE_NODE) ?
- ((Attr) context).getOwnerElement() : context.getParentNode();
- if (context != null)
+ while (context != null)
{
- addFollowingNodes(context, acc, recurse);
+ context = (context.getNodeType() == Node.ATTRIBUTE_NODE) ?
+ ((Attr) context).getOwnerElement() : context.getParentNode();
+ if (context != null)
+ {
+ cur = context.getNextSibling();
+ while (cur != null)
+ {
+ acc.add(cur);
+ if (recurse)
+ addChildNodes(cur, acc, true);
+ cur = cur.getNextSibling();
+ }
+ }
}
}
}
void addPrecedingNodes(Node context, Collection acc, boolean recurse)
{
- Node cur = context.getPreviousSibling();
+ Node cur = (context.getNodeType() == Node.ATTRIBUTE_NODE) ? null :
+ context.getPreviousSibling();
while (cur != null)
{
acc.add(cur);
if (recurse)
- {
- addChildNodes(cur, acc, true);
- }
+ addChildNodes(cur, acc, true);
cur = cur.getPreviousSibling();
}
if (recurse)
{
- context = (context.getNodeType() == Node.ATTRIBUTE_NODE) ?
- ((Attr) context).getOwnerElement() : context.getParentNode();
- if (context != null)
- {
- addPrecedingNodes(context, acc, recurse);
- }
+ cur = context;
+ cur = (cur.getNodeType() == Node.ATTRIBUTE_NODE) ?
+ ((Attr) cur).getOwnerElement() : cur.getParentNode();
+ if (cur != null)
+ addPrecedingNodes(cur, acc, recurse);
}
}
@@ -399,9 +388,7 @@ public final class Selector
{
Node attr = attrs.item(i);
if (isNamespaceAttribute(attr))
- {
- acc.add(attr);
- }
+ acc.add(attr);
}
}
}
@@ -419,9 +406,7 @@ public final class Selector
int len = tests.length;
List tests2 = new ArrayList(len);
for (int i = 0; i < len; i++)
- {
- tests2.add(tests[i].clone(context));
- }
+ tests2.add(tests[i].clone(context));
return new Selector(axis, tests2);
}
@@ -430,9 +415,7 @@ public final class Selector
for (int i = 0; i < tests.length; i++)
{
if (tests[i].references(var))
- {
- return true;
- }
+ return true;
}
return false;
}
@@ -451,13 +434,9 @@ public final class Selector
case ATTRIBUTE:
if (tests.length == 0 ||
(tests[0] instanceof NameTest))
- {
- buf.append('@');
- }
+ buf.append('@');
else
- {
- buf.append("attribute::");
- }
+ buf.append("attribute::");
break;
case CHILD:
//buf.append("child::");
@@ -481,9 +460,7 @@ public final class Selector
if (tests.length == 0 ||
(tests[0] instanceof NodeTypeTest &&
((NodeTypeTest) tests[0]).type == 0))
- {
- return "..";
- }
+ return "..";
buf.append("parent::");
break;
case PRECEDING:
@@ -496,22 +473,16 @@ public final class Selector
if (tests.length == 0 ||
(tests[0] instanceof NodeTypeTest &&
((NodeTypeTest) tests[0]).type == 0))
- {
- return ".";
- }
+ return ".";
buf.append("self::");
break;
}
if (tests.length == 0)
- {
- buf.append('*');
- }
+ buf.append("[error]");
else
{
for (int i = 0; i < tests.length; i++)
- {
- buf.append(tests[i]);
- }
+ buf.append(tests[i]);
}
return buf.toString();
}
diff --git a/libjava/classpath/gnu/xml/xpath/SubstringFunction.java b/libjava/classpath/gnu/xml/xpath/SubstringFunction.java
index d65c4facb8a..e926f6c7aeb 100644
--- a/libjava/classpath/gnu/xml/xpath/SubstringFunction.java
+++ b/libjava/classpath/gnu/xml/xpath/SubstringFunction.java
@@ -78,31 +78,20 @@ final class SubstringFunction
Object val1 = arg1.evaluate(context, pos, len);
Object val2 = arg2.evaluate(context, pos, len);
String s = _string(context, val1);
- int p = (val2 instanceof Double) ?
- ((Double) val2).intValue() :
- (int) Math.round(_number(context, val2));
- p--;
+ int p = Expr.intValue(val2) - 1;
if (p < 0)
- {
- p = 0;
- }
+ p = 0;
int l = s.length() - p;
if (l <= 0)
- {
- return "";
- }
+ return "";
if (arg3 != null)
{
Object val3 = arg3.evaluate(context, pos, len);
- int v3 = (val3 instanceof Double) ?
- ((Double) val3).intValue() :
- (int) Math.round(_number(context, val3));
+ int v3 = Expr.intValue(val3);
if (v3 < l)
- {
- l = v3;
- }
+ l = v3;
}
return s.substring(p, p + l);
OpenPOWER on IntegriCloud