diff WebServiceToolWorkflow/lib/SAWADLParser/src/edu/uga/cs/lsdis/meteors/wadls/util/xml/XPathUtils.java @ 0:d5cd409b8a18 default tip

Migrated tool version 1.0.0 from old tool shed archive to new tool shed repository
author ganjoo
date Tue, 07 Jun 2011 18:00:50 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebServiceToolWorkflow/lib/SAWADLParser/src/edu/uga/cs/lsdis/meteors/wadls/util/xml/XPathUtils.java	Tue Jun 07 18:00:50 2011 -0400
@@ -0,0 +1,197 @@
+/*
+ * (c) Copyright IBM Corp 2001, 2005 
+ */
+
+package edu.uga.cs.lsdis.meteors.wadls.util.xml;
+
+import java.util.Vector;
+import org.w3c.dom.*;
+
+/**
+ * A <code>XPathUtils</code> ...
+ *
+ * @author Matthew J. Duftler (duftler@us.ibm.com)
+ * @author Sanjiva Weerawarana (sanjiva@watson.ibm.com)
+ */
+public class XPathUtils
+{
+  private static Node getPreviousTypedNode(Node node, short nodeType)
+  {
+    node = node.getPreviousSibling();
+
+    while (node != null && node.getNodeType() != nodeType)
+    {
+      node = node.getPreviousSibling();
+    }
+
+    return node;
+  }
+
+  private static Node getNextTypedNode(Node node, short nodeType)
+  {
+    node = node.getNextSibling();
+
+    while (node != null && node.getNodeType() != nodeType)
+    {
+      node = node.getNextSibling();
+    }
+
+    return node;
+  }
+
+  private static String getValue(Node node, short nodeType)
+  {
+    switch (nodeType)
+    {
+      case Node.ELEMENT_NODE :
+        return ((Element)node).getTagName();
+
+      case Node.TEXT_NODE :
+        return ((Text)node).getData();
+
+      case Node.PROCESSING_INSTRUCTION_NODE :
+        return ((ProcessingInstruction)node).getData();
+
+      default :
+        return "";
+    }
+  }
+
+  private static short getNodeType(Node node)
+  {
+    return (node != null ? node.getNodeType() : -1);
+  }
+
+  private static String getXPathFromVector(Vector path)
+  {
+    StringBuffer strBuf = new StringBuffer();
+    int          length = path.size();
+
+    for (int i = 0; i < length; i++)
+    {
+      Node   tempNode    = (Node)path.elementAt(i);
+      short  nodeType    = getNodeType(tempNode);
+      String targetValue = getValue(tempNode, nodeType);
+      int    position    = 1;
+
+      tempNode = getPreviousTypedNode(tempNode, nodeType);
+
+      while (tempNode != null)
+      {
+        if (nodeType == Node.ELEMENT_NODE)
+        {
+          if (getValue(tempNode, nodeType).equals(targetValue))
+          {
+            position++;
+          }
+        }
+        else
+        {
+          position++;
+        }
+
+        tempNode = getPreviousTypedNode(tempNode, nodeType);
+      }
+
+      boolean hasMatchingSiblings = (position > 1);
+
+      if (!hasMatchingSiblings)
+      {
+        tempNode = (Node)path.elementAt(i);
+        tempNode = getNextTypedNode(tempNode, nodeType);
+
+        while (!hasMatchingSiblings && tempNode != null)
+        {
+          if (nodeType == Node.ELEMENT_NODE)
+          {
+            if (getValue(tempNode, nodeType).equals(targetValue))
+            {
+              hasMatchingSiblings = true;
+            }
+            else
+            {
+              tempNode = getNextTypedNode(tempNode, nodeType);
+            }
+          }
+          else
+          {
+            hasMatchingSiblings = true;
+          }
+        }
+      }
+
+      String step;
+
+      switch (nodeType)
+      {
+        case Node.TEXT_NODE :
+          step = "text()";
+          break;
+        case Node.PROCESSING_INSTRUCTION_NODE :
+          step = "processing-instruction()";
+          break;
+        default :
+          step = targetValue;
+          break;
+      }
+
+      if (step != null && step.length() > 0)
+      {
+        strBuf.append('/' + step);
+      }
+
+      if (hasMatchingSiblings)
+      {
+        strBuf.append("[" + position + "]");
+      }
+    }
+
+    return strBuf.toString();
+  }
+
+  private static Vector getVectorPathFromNode(Node node)
+  {
+    Vector path = new Vector();
+
+    while (node != null)
+    {
+      path.insertElementAt(node, 0);
+      node = node.getParentNode();
+    }
+
+    return path;
+  }
+
+  /**
+   * Generates an XPath expression that will return only the given node as its
+   * result. This method only works for element, text, document and PI nodes.
+   *
+   * @param node the node to generate an XPath expression for. This node must
+   * be an element node, a text node, a document node, or a processing
+   * instruction node.
+   * @return an XPath expression that will return only the given node as its
+   * result.
+   * @exception IllegalArgumentException if the given node is not an element,
+   * text, document or PI node.
+   */
+  public static String getXPathExprFromNode(Node node)
+                                                throws IllegalArgumentException
+  {
+    short nodeType = getNodeType(node);
+
+    switch (nodeType)
+    {
+      case Node.ELEMENT_NODE :
+      case Node.TEXT_NODE :
+      case Node.PROCESSING_INSTRUCTION_NODE :
+        return getXPathFromVector(getVectorPathFromNode(node));
+
+      case Node.DOCUMENT_NODE :
+        return "/";
+
+      default :
+        throw new IllegalArgumentException("Only works for element, text, " +
+                                           "document, and PI nodes.");
+    }
+  }
+}
\ No newline at end of file