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