Author: cbegin
Date: Fri Apr 24 14:21:46 2009
New Revision: 768318

URL: http://svn.apache.org/viewvc?rev=768318&view=rev
Log:
Added XPathParser to replace nodelets

Added:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/GenericTokenParser.java
      - copied, changed from r767771, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/GenericTokenParser.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/PropertyParser.java
      - copied, changed from r767771, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/PropertyParser.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/XNode.java
   (contents, props changed)
      - copied, changed from r767771, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/NodeletContext.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/XPathParser.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xpath/
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xpath/GenericTokenParserTest.java
      - copied, changed from r767771, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xml/GenericTokenParserTest.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xpath/XPathParserTest.java
Removed:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/GenericTokenParser.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/PropertyParser.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xml/GenericTokenParserTest.java
Modified:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationReader.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/SqlSourceParser.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/TextSqlNode.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/NodeletContext.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/resources/nodelet_test.xml

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationReader.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationReader.java?rev=768318&r1=768317&r2=768318&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationReader.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationReader.java
 Fri Apr 24 14:21:46 2009
@@ -1,6 +1,6 @@
 package org.apache.ibatis.migration;
 
-import org.apache.ibatis.xml.PropertyParser;
+import org.apache.ibatis.xpath.PropertyParser;
 
 import java.io.*;
 import java.util.Properties;

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java?rev=768318&r1=768317&r2=768318&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java
 Fri Apr 24 14:21:46 2009
@@ -4,7 +4,7 @@
 import org.apache.ibatis.io.Resources;
 import org.apache.ibatis.jdbc.*;
 import org.apache.ibatis.migration.*;
-import org.apache.ibatis.xml.PropertyParser;
+import org.apache.ibatis.xpath.PropertyParser;
 
 import java.io.*;
 import java.math.BigDecimal;

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/SqlSourceParser.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/SqlSourceParser.java?rev=768318&r1=768317&r2=768318&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/SqlSourceParser.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/SqlSourceParser.java
 Fri Apr 24 14:21:46 2009
@@ -2,7 +2,7 @@
 
 import org.apache.ibatis.mapping.*;
 import org.apache.ibatis.type.TypeHandler;
-import org.apache.ibatis.xml.GenericTokenParser;
+import org.apache.ibatis.xpath.GenericTokenParser;
 
 import java.util.*;
 

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/TextSqlNode.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/TextSqlNode.java?rev=768318&r1=768317&r2=768318&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/TextSqlNode.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/TextSqlNode.java
 Fri Apr 24 14:21:46 2009
@@ -1,6 +1,6 @@
 package org.apache.ibatis.parser.xml.dynamic;
 
-import org.apache.ibatis.xml.GenericTokenParser;
+import org.apache.ibatis.xpath.GenericTokenParser;
 
 public class TextSqlNode implements SqlNode {
   private String text;

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/NodeletContext.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/NodeletContext.java?rev=768318&r1=768317&r2=768318&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/NodeletContext.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/NodeletContext.java
 Fri Apr 24 14:21:46 2009
@@ -1,6 +1,7 @@
 package org.apache.ibatis.xml;
 
 import org.w3c.dom.*;
+import org.apache.ibatis.xpath.PropertyParser;
 
 import java.util.*;
 

Copied: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/GenericTokenParser.java
 (from r767771, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/GenericTokenParser.java)
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/GenericTokenParser.java?p2=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/GenericTokenParser.java&p1=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/GenericTokenParser.java&r1=767771&r2=768318&rev=768318&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/GenericTokenParser.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/GenericTokenParser.java
 Fri Apr 24 14:21:46 2009
@@ -1,4 +1,4 @@
-package org.apache.ibatis.xml;
+package org.apache.ibatis.xpath;
 
 public class GenericTokenParser {
 

Copied: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/PropertyParser.java
 (from r767771, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/PropertyParser.java)
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/PropertyParser.java?p2=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/PropertyParser.java&p1=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/PropertyParser.java&r1=767771&r2=768318&rev=768318&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/PropertyParser.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/PropertyParser.java
 Fri Apr 24 14:21:46 2009
@@ -1,4 +1,4 @@
-package org.apache.ibatis.xml;
+package org.apache.ibatis.xpath;
 
 import java.util.Properties;
 

Copied: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/XNode.java
 (from r767771, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/NodeletContext.java)
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/XNode.java?p2=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/XNode.java&p1=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/NodeletContext.java&r1=767771&r2=768318&rev=768318&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xml/NodeletContext.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/XNode.java
 Fri Apr 24 14:21:46 2009
@@ -1,18 +1,20 @@
-package org.apache.ibatis.xml;
+package org.apache.ibatis.xpath;
 
 import org.w3c.dom.*;
 
 import java.util.*;
 
-public class NodeletContext {
+public class XNode {
 
   private Node node;
+  private String name;
   private String body;
   private Properties attributes;
   private Properties variables;
 
-  public NodeletContext(Node node, Properties variables) {
+  public XNode(Node node, Properties variables) {
     this.node = node;
+    this.name = node.getNodeName();
     this.variables = variables;
     this.attributes = parseAttributes(node);
     this.body = parseBody(node);
@@ -22,6 +24,10 @@
     return node;
   }
 
+  public String getName() {
+    return name;
+  }
+
   public String getStringBody() {
     return getStringBody(null);
   }
@@ -172,12 +178,15 @@
     }
   }
 
-  public List<NodeletContext> getChildren() {
-    List<NodeletContext> children = new ArrayList<NodeletContext>();
+  public List<XNode> getChildren() {
+    List<XNode> children = new ArrayList<XNode>();
     NodeList nodeList = node.getChildNodes();
     if (nodeList != null) {
       for (int i = 0, n = nodeList.getLength(); i < n; i++) {
-        children.add(new NodeletContext(nodeList.item(i), variables));
+        Node node = nodeList.item(i);
+        if (node.getNodeType() == Node.ELEMENT_NODE) {
+          children.add(new XNode(node, variables));
+        }
       }
     }
     return children;
@@ -185,7 +194,7 @@
 
   public Properties getChildrenAsProperties() {
     Properties properties = new Properties();
-    for (NodeletContext child : getChildren()) {
+    for (XNode child : getChildren()) {
       String name = child.getStringAttribute("name");
       String value = child.getStringAttribute("value");
       if (name != null && value != null) {
@@ -195,6 +204,39 @@
     return properties;
   }
 
+  public String toString() {
+    StringBuilder builder = new StringBuilder();
+    builder.append("<");
+    builder.append(name);
+    for (Map.Entry entry : attributes.entrySet()) {
+      builder.append(" ");
+      builder.append(entry.getKey());
+      builder.append("=\"");
+      builder.append(entry.getValue());
+      builder.append("\"");
+    }
+    List<XNode> children = getChildren();
+    if (children.size() > 0) {
+      builder.append(">\n");
+      for (XNode node : children) {
+        builder.append(node.toString());
+      }
+      builder.append("</");
+      builder.append(name);
+      builder.append(">");
+    } else if (body != null) {
+      builder.append(">");
+      builder.append(body);
+      builder.append("</");
+      builder.append(name);
+      builder.append(">");
+    } else {
+      builder.append("/>");
+    }
+    builder.append("\n");
+    return builder.toString();
+  }
+
   private Properties parseAttributes(Node n) {
     Properties attributes = new Properties();
     NamedNodeMap attributeNodes = n.getAttributes();
@@ -231,4 +273,4 @@
     return null;
   }
 
-}
+}
\ No newline at end of file

Propchange: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/XNode.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Added: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/XPathParser.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/XPathParser.java?rev=768318&view=auto
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/XPathParser.java
 (added)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/xpath/XPathParser.java
 Fri Apr 24 14:21:46 2009
@@ -0,0 +1,104 @@
+package org.apache.ibatis.xpath;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.*;
+
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathFactory;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.namespace.QName;
+import java.io.Reader;
+import java.util.Properties;
+import java.util.List;
+import java.util.ArrayList;
+
+public class XPathParser {
+
+  private Document document;
+  private boolean validation;
+  private EntityResolver entityResolver;
+  private Properties variables;
+  private XPath xpath;
+
+  public XPathParser(Reader reader, boolean validation, EntityResolver 
entityResolver, Properties variables) {
+    this.validation = validation;
+    this.entityResolver = entityResolver;
+    this.variables = variables;
+    this.document = createDocument(reader);
+    XPathFactory factory = XPathFactory.newInstance();
+    this.xpath = factory.newXPath();
+  }
+
+  public String getString(String expression) {
+    String result = (String) evaluate(expression, XPathConstants.STRING);
+    result = PropertyParser.parse(result, variables);
+    return result;
+  }
+
+  public Boolean getBoolean(String expression) {
+    return (Boolean)evaluate(expression, XPathConstants.BOOLEAN);
+  }
+
+  public Double getDouble(String expression) {
+    return (Double)evaluate(expression, XPathConstants.NUMBER);
+  }
+
+  public List<XNode> getNodes(String expression) {
+    List<XNode> xnodes = new ArrayList<XNode>();
+    NodeList nodes = (NodeList) evaluate(expression, XPathConstants.NODESET);
+    for(int i = 0; i < nodes.getLength(); i++) {
+      xnodes.add(new XNode(nodes.item(i),variables));
+    }
+    return xnodes;
+  }
+
+  public XNode getNode(String expression) {
+    Node node = (Node) evaluate(expression, XPathConstants.NODE);
+    return new XNode(node,variables);
+  }
+
+  private Object evaluate(String expression, QName returnType) {
+    try {
+      return xpath.evaluate(expression, document, returnType);
+    } catch (Exception e) {
+      throw new RuntimeException("Error evaluating XPath.  Cause: " + e, e);
+    }
+  }
+
+  private Document createDocument(Reader reader) {
+    try {
+      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+      factory.setValidating(validation);
+
+      factory.setNamespaceAware(false);
+      factory.setIgnoringComments(true);
+      factory.setIgnoringElementContentWhitespace(false);
+      factory.setCoalescing(false);
+      factory.setExpandEntityReferences(true);
+
+      DocumentBuilder builder = factory.newDocumentBuilder();
+      builder.setEntityResolver(entityResolver);
+      builder.setErrorHandler(new ErrorHandler() {
+        public void error(SAXParseException exception) throws SAXException {
+          throw exception;
+        }
+
+        public void fatalError(SAXParseException exception) throws 
SAXException {
+          throw exception;
+        }
+
+        public void warning(SAXParseException exception) throws SAXException {
+        }
+      });
+      return builder.parse(new InputSource(reader));
+    } catch (Exception e) {
+      throw new RuntimeException("Error creating document instance.  Cause: " 
+ e, e);
+    }
+  }
+
+
+}

Copied: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xpath/GenericTokenParserTest.java
 (from r767771, 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xml/GenericTokenParserTest.java)
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xpath/GenericTokenParserTest.java?p2=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xpath/GenericTokenParserTest.java&p1=ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xml/GenericTokenParserTest.java&r1=767771&r2=768318&rev=768318&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xml/GenericTokenParserTest.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xpath/GenericTokenParserTest.java
 Fri Apr 24 14:21:46 2009
@@ -1,7 +1,8 @@
-package org.apache.ibatis.xml;
+package org.apache.ibatis.xpath;
 
 import static org.junit.Assert.assertEquals;
 import org.junit.Test;
+import org.apache.ibatis.xpath.GenericTokenParser;
 
 import java.util.*;
 

Added: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xpath/XPathParserTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xpath/XPathParserTest.java?rev=768318&view=auto
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xpath/XPathParserTest.java
 (added)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/xpath/XPathParserTest.java
 Fri Apr 24 14:21:46 2009
@@ -0,0 +1,23 @@
+package org.apache.ibatis.xpath;
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.apache.ibatis.io.Resources;
+
+import java.io.Reader;
+
+public class XPathParserTest {
+
+  @Test
+  public void shouldTestXPathParserMethods() throws Exception {
+    String resource = "resources/nodelet_test.xml";
+    Reader reader = Resources.getResourceAsReader(resource);
+    XPathParser parser = new XPathParser(reader, false, null, null);
+    assertEquals(5.8d,parser.getDouble("/employee/height"));
+    assertEquals("id_var",parser.getString("/employee/@id"));
+    assertEquals(Boolean.TRUE,parser.getBoolean("/employee/active"));
+    assertEquals("<id>id_var</id>", 
parser.getNode("/employee/@id").toString().trim());
+    assertEquals(7, parser.getNodes("/employee/*").size());
+  }
+
+}

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/resources/nodelet_test.xml
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/resources/nodelet_test.xml?rev=768318&r1=768317&r2=768318&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/resources/nodelet_test.xml
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/resources/nodelet_test.xml
 Fri Apr 24 14:21:46 2009
@@ -1,4 +1,5 @@
 <employee id="${id_var}">
+  <blah something="that"/>
   <first_name>Jim</first_name>
   <last_name>Smith</last_name>
   <birth_date>
@@ -8,4 +9,5 @@
   </birth_date>
   <height units="ft">5.8</height>
   <weight units="lbs">200</weight>
+  <active>true</active>
 </employee>
\ No newline at end of file


Reply via email to