OSDN Git Service

The tree visitor interface was changed
authorleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Tue, 26 Aug 2008 05:20:11 +0000 (05:20 +0000)
committerleo <leo@ae02f08e-27ec-0310-ae8c-8ba02fe2eafd>
Tue, 26 Aug 2008 05:20:11 +0000 (05:20 +0000)
git-svn-id: http://www.xerial.org/svn/project/XerialJ/trunk/xerial-core@2446 ae02f08e-27ec-0310-ae8c-8ba02fe2eafd

pom.xml
src/main/java/org/xerial/util/bean/ANTLRWalker.java
src/main/java/org/xerial/util/bean/BeanUtil.java
src/main/java/org/xerial/util/bean/JSONStreamWalker.java
src/main/java/org/xerial/util/bean/MapWalker.java
src/main/java/org/xerial/util/bean/TreeWalker.java
src/main/java/org/xerial/util/bean/XMLWalker.java
src/main/java/org/xerial/util/bean/impl/BeanUtilImpl.java
src/test/java/org/xerial/util/bean/JSONStreamWalkerTest.java
src/test/java/org/xerial/util/bean/MapWalkerTest.java

diff --git a/pom.xml b/pom.xml
index 26bb6eb..4747cbc 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -9,7 +9,7 @@
   <groupId>org.xerial</groupId>
   <artifactId>xerial-core</artifactId>
   <name>Xerial Core</name>
-  <version>0.8.5</version>
+  <version>0.8.6</version>
   <description>Xerial Core: standard utilities for XerialJ project</description>
 
   <build>
index 79ae0ed..a49ad14 100644 (file)
@@ -43,28 +43,27 @@ public class ANTLRWalker extends TreeWalker
 
     private boolean skipDescendants = false;
 
-    public ANTLRWalker(final String[] parserTokenNames, TreeVisitor visitor, Tree parseTree)
+    public ANTLRWalker(final String[] parserTokenNames, Tree parseTree)
     {
-        super(visitor);
         this.parserTokenNames = parserTokenNames;
         this.currentNode = parseTree;
     }
 
-    public void walk() throws XerialException
+    public void walk(TreeVisitor visitor) throws XerialException
     {
-        getTreeVisitor().init(this);
-        walk(currentNode);
-        getTreeVisitor().finish(this);
+        visitor.init(this);
+        walk(currentNode, visitor);
+        visitor.finish(this);
     }
 
-    public void walk(Tree t) throws XerialException
+    public void walk(Tree t, TreeVisitor visitor) throws XerialException
     {
         currentNode = t;
         int tokenType = t.getType();
         String nodeName = parserTokenNames[tokenType];
 
         // invoke visitor
-        getTreeVisitor().visitNode(nodeName, this);
+        visitor.visitNode(nodeName, this);
 
         // visit child nodes
         if (!skipDescendants)
@@ -72,13 +71,13 @@ public class ANTLRWalker extends TreeWalker
             for (int i = 0; i < t.getChildCount(); i++)
             {
                 Tree child = t.getChild(i);
-                walk(child);
+                walk(child, visitor);
             }
             skipDescendants = false;
         }
 
         // leave the current node
-        getTreeVisitor().leaveNode(nodeName, t.getText(), this);
+        visitor.leaveNode(nodeName, t.getText(), this);
     }
 
     public void skipDescendants()
index b83aa20..cac5e7c 100644 (file)
@@ -1191,8 +1191,8 @@ public class BeanUtil
             BeanBindingProcess bindingProcess = new BeanBindingProcess(new BeanStreamReader<T>(beanHandler),\r
                     new BindRuleGeneratorForBeanStream<T>(beanClass));\r
 \r
-            JSONStreamWalker walker = new JSONStreamWalker(bindingProcess, jsonReader);\r
-            walker.walk();\r
+            JSONStreamWalker walker = new JSONStreamWalker(jsonReader);\r
+            walker.walk(bindingProcess);\r
         }\r
         catch (XerialException e)\r
         {\r
@@ -1208,8 +1208,8 @@ public class BeanUtil
             BeanBindingProcess bindingProcess = new BeanBindingProcess(new BeanStreamReader<T>(beanHandler),\r
                     new BindRuleGeneratorForBeanStream<T>(beanClass, targetNodeName));\r
 \r
-            JSONStreamWalker walker = new JSONStreamWalker(bindingProcess, jsonReader);\r
-            walker.walk();\r
+            JSONStreamWalker walker = new JSONStreamWalker(jsonReader);\r
+            walker.walk(bindingProcess);\r
         }\r
         catch (XerialException e)\r
         {\r
index a2c1d2b..fdaa361 100644 (file)
@@ -49,20 +49,19 @@ public class JSONStreamWalker extends TreeWalker
     private boolean skipDescendants = false;\r
     private int skipLevel = Integer.MAX_VALUE;\r
 \r
-    public JSONStreamWalker(TreeVisitor visitor, Reader jsonStream) throws IOException\r
+    public JSONStreamWalker(Reader jsonStream) throws IOException\r
     {\r
-        super(visitor);\r
         jsonPullParser = new JSONPullParser(jsonStream);\r
     }\r
 \r
-    public void walk() throws XerialException\r
+    public void walk(TreeVisitor visitor) throws XerialException\r
     {\r
-        getTreeVisitor().init(this);\r
-        walk_internal();\r
-        getTreeVisitor().finish(this);\r
+        visitor.init(this);\r
+        walk_internal(visitor);\r
+        visitor.finish(this);\r
     }\r
 \r
-    public void walk_internal() throws XerialException\r
+    public void walk_internal(TreeVisitor visitor) throws XerialException\r
     {\r
         JSONEvent event;\r
         while ((event = jsonPullParser.next()) != JSONEvent.EndJSON)\r
@@ -75,7 +74,7 @@ public class JSONStreamWalker extends TreeWalker
                 if (!skipDescendants)\r
                 {\r
                     String key = jsonPullParser.getKeyName();\r
-                    getTreeVisitor().visitNode(key, this);\r
+                    visitor.visitNode(key, this);\r
                 }\r
                 break;\r
             }\r
@@ -89,7 +88,7 @@ public class JSONStreamWalker extends TreeWalker
                         break;\r
                 }\r
                 String key = jsonPullParser.getKeyName();\r
-                getTreeVisitor().leaveNode(key, null, this);\r
+                visitor.leaveNode(key, null, this);\r
                 break;\r
             }\r
             case String:\r
@@ -102,10 +101,10 @@ public class JSONStreamWalker extends TreeWalker
 \r
                 String key = jsonPullParser.getKeyName();\r
                 String value = jsonPullParser.getText();\r
-                getTreeVisitor().visitNode(key, this);\r
+                visitor.visitNode(key, this);\r
                 if (skipDescendants)\r
                     skipDescendants = false;\r
-                getTreeVisitor().leaveNode(key, value, this);\r
+                visitor.leaveNode(key, value, this);\r
                 break;\r
             }\r
             case Null:\r
@@ -114,10 +113,10 @@ public class JSONStreamWalker extends TreeWalker
                     break;\r
 \r
                 String key = jsonPullParser.getKeyName();\r
-                getTreeVisitor().visitNode(key, this);\r
+                visitor.visitNode(key, this);\r
                 if (skipDescendants)\r
                     skipDescendants = false;\r
-                getTreeVisitor().leaveNode(key, null, this);\r
+                visitor.leaveNode(key, null, this);\r
                 break;\r
             }\r
             case StartArray:\r
index 706bf10..8b4ba57 100644 (file)
@@ -40,10 +40,8 @@ public class MapWalker extends TreeWalker
 {\r
     private final Map map;\r
 \r
-    public MapWalker(TreeVisitor visitor, Map map)\r
+    public MapWalker(Map map)\r
     {\r
-        super(visitor);\r
-\r
         if (map == null)\r
             throw new NullPointerException("map cannot be null");\r
         this.map = map;\r
@@ -98,23 +96,23 @@ public class MapWalker extends TreeWalker
     private Object currentKey;\r
 \r
     @Override\r
-    public void walk() throws XerialException\r
+    public void walk(TreeVisitor visitor) throws XerialException\r
     {\r
-        getTreeVisitor().init(this);\r
+        visitor.init(this);\r
         // visit the imaginary root node\r
-        getTreeVisitor().visitNode("_root", this);\r
+        visitor.visitNode("_root", this);\r
 \r
         for (Object key : map.keySet())\r
         {\r
             currentKey = key;\r
             String nodeName = key.toString();\r
             Object value = map.get(key);\r
-            getTreeVisitor().visitNode(nodeName, this);\r
-            getTreeVisitor().leaveNode(nodeName, value != null ? value.toString() : null, this);\r
+            visitor.visitNode(nodeName, this);\r
+            visitor.leaveNode(nodeName, value != null ? value.toString() : null, this);\r
         }\r
         // leave the imaginary root node\r
-        getTreeVisitor().leaveNode("_root", null, this);\r
-        getTreeVisitor().finish(this);\r
+        visitor.leaveNode("_root", null, this);\r
+        visitor.finish(this);\r
     }\r
 \r
 }\r
index b448526..2e97eb1 100644 (file)
@@ -26,45 +26,40 @@ package org.xerial.util.bean;
 
 import org.xerial.core.XerialException;
 
-
 /**
  * An depth-first walker interface of tree structured data
  * 
  * @author leo
- *
+ * 
  */
 public abstract class TreeWalker
 {
-    private final TreeVisitor visitor;
-    
-    protected TreeWalker(TreeVisitor visitor)
-    {
-        if(visitor == null)
-            throw new NullPointerException("visitor cannot be null");
-        this.visitor = visitor;
-    }
-    
-    public TreeVisitor getTreeVisitor() 
-    {
-        return visitor;
-    }
-    
+    protected TreeWalker()
+    {}
+
     /**
-     * Start walking 
+     * Start walking
+     * 
+     * @param visitor
+     *            A {@link TreeVisitor} that handles tree visit events
+     * @throws XerialException
      */
-    public abstract void walk() throws XerialException;
-    
+    public abstract void walk(TreeVisitor visitor) throws XerialException;
+
     /**
      * Skip the descendants of the current node
      */
     public abstract void skipDescendants();
-    
+
     /**
-     * Gets the entire subtree beginning from the current node, and 
-     * skips the descendants. 
-     * @return {@link TreeNode} representation of the tree structured data beginning from the current node
-     * @throws BeanException TODO
+     * Gets the entire subtree beginning from the current node, and skips the
+     * descendants.
+     * 
+     * @return {@link TreeNode} representation of the tree structured data
+     *         beginning from the current node
+     * @throws BeanException
+     *             TODO
      */
     public abstract TreeNode getSubTree() throws BeanException;
-    
+
 }
index 5dde29e..1bad250 100644 (file)
@@ -68,10 +68,8 @@ public class XMLWalker extends TreeWalker
         private boolean skipDescendants = false;
         private int skipLevel = Integer.MAX_VALUE;
 
-        public XMLStreamWalker(TreeVisitor visitor, Reader reader) throws XMLException
+        public XMLStreamWalker(Reader reader) throws XMLException
         {
-            super(visitor);
-
             if (reader == null)
                 throw new XMLException("XML reader is null");
 
@@ -79,11 +77,11 @@ public class XMLWalker extends TreeWalker
         }
 
         @Override
-        public void walk() throws XerialException
+        public void walk(TreeVisitor visitor) throws XerialException
         {
             try
             {
-                parse();
+                parse(visitor);
             }
             catch (IOException e)
             {
@@ -91,7 +89,7 @@ public class XMLWalker extends TreeWalker
             }
         }
 
-        public void parse() throws XerialException, IOException
+        public void parse(TreeVisitor visitor) throws XerialException, IOException
         {
             int state;
             try
@@ -107,19 +105,19 @@ public class XMLWalker extends TreeWalker
                         {
                             textStack.addLast(new StringBuilder());
                             String tagName = pullParser.getName();
-                            getTreeVisitor().visitNode(tagName, this);
+                            visitor.visitNode(tagName, this);
                             // read attributes
                             for (int i = 0; i < pullParser.getAttributeCount(); i++)
                             {
                                 String attributeName = pullParser.getAttributeName(i);
                                 String attributeValue = pullParser.getAttributeValue(i);
-                                getTreeVisitor().visitNode(attributeName, this);
+                                visitor.visitNode(attributeName, this);
                                 if (skipDescendants)
                                 {
                                     // attributes has no more descendants
                                     skipDescendants = false;
                                 }
-                                getTreeVisitor().leaveNode(attributeName, attributeValue, this);
+                                visitor.leaveNode(attributeName, attributeValue, this);
                             }
 
                         }
@@ -135,7 +133,7 @@ public class XMLWalker extends TreeWalker
                                 break;
                         }
                         String text = textStack.getLast().toString();
-                        getTreeVisitor().leaveNode(pullParser.getName(), text.trim(), this);
+                        visitor.leaveNode(pullParser.getName(), text.trim(), this);
                         textStack.removeLast();
                     }
                         break;
@@ -191,24 +189,23 @@ public class XMLWalker extends TreeWalker
         private boolean skipDesendants = false;
         private Element currentElement = null;
 
-        public XMLDOMWalker(TreeVisitor visitor, Element element)
+        public XMLDOMWalker(Element element)
         {
-            super(visitor);
             this.currentElement = element;
         }
 
         @Override
-        public void walk() throws XerialException
+        public void walk(TreeVisitor visitor) throws XerialException
         {
-            parse(currentElement);
+            parse(currentElement, visitor);
         }
 
-        public void parse(Element element) throws XerialException
+        public void parse(Element element, TreeVisitor visitor) throws XerialException
         {
             currentElement = element;
             String tagName = element.getNodeName();
             // invoke visitor
-            getTreeVisitor().visitNode(tagName, this);
+            visitor.visitNode(tagName, this);
 
             // visit attribute nodes
             NamedNodeMap attributeMap = element.getAttributes();
@@ -218,8 +215,8 @@ public class XMLWalker extends TreeWalker
                 String attributeName = attributeNode.getNodeName();
                 String attributeValue = attributeNode.getNodeValue();
 
-                getTreeVisitor().visitNode(attributeName, this);
-                getTreeVisitor().leaveNode(attributeName, attributeValue, this);
+                visitor.visitNode(attributeName, this);
+                visitor.leaveNode(attributeName, attributeValue, this);
             }
 
             // visit child nodes
@@ -231,7 +228,7 @@ public class XMLWalker extends TreeWalker
                     Node childNode = nodeList.item(i);
                     if (childNode.getNodeType() == Node.ELEMENT_NODE)
                     {
-                        parse((Element) childNode);
+                        parse((Element) childNode, visitor);
                     }
                 }
                 skipDesendants = false;
@@ -239,7 +236,7 @@ public class XMLWalker extends TreeWalker
 
             // leave the current element
             String text = DOMUtil.getText(element);
-            getTreeVisitor().leaveNode(tagName, text.trim(), this);
+            visitor.leaveNode(tagName, text.trim(), this);
         }
 
         public void skipDescendants()
@@ -266,10 +263,9 @@ public class XMLWalker extends TreeWalker
      * @throws XMLException
      *             thrown when some error has found in the XML reader
      */
-    public XMLWalker(TreeVisitor visitor, Reader xmlDataReader) throws XMLException
+    public XMLWalker(Reader xmlDataReader) throws XMLException
     {
-        super(visitor);
-        impl = new XMLStreamWalker(visitor, xmlDataReader);
+        impl = new XMLStreamWalker(xmlDataReader);
     }
 
     /**
@@ -278,10 +274,9 @@ public class XMLWalker extends TreeWalker
      * @param visitor
      * @param element
      */
-    public XMLWalker(TreeVisitor visitor, Element element)
+    public XMLWalker(Element element)
     {
-        super(visitor);
-        impl = new XMLDOMWalker(visitor, element);
+        impl = new XMLDOMWalker(element);
     }
 
     @Override
@@ -297,11 +292,11 @@ public class XMLWalker extends TreeWalker
     }
 
     @Override
-    public void walk() throws XerialException
+    public void walk(TreeVisitor visitor) throws XerialException
     {
-        getTreeVisitor().init(impl);
-        impl.walk();
-        getTreeVisitor().finish(impl);
+        visitor.init(impl);
+        impl.walk(visitor);
+        visitor.finish(impl);
     }
 
 }
index eb162f2..5c30610 100644 (file)
@@ -34,6 +34,7 @@ import org.xerial.core.XerialException;
 import org.xerial.util.bean.ANTLRWalker;
 import org.xerial.util.bean.JSONStreamWalker;
 import org.xerial.util.bean.MapWalker;
+import org.xerial.util.bean.TreeWalker;
 import org.xerial.util.bean.XMLWalker;
 
 /**
@@ -44,89 +45,103 @@ import org.xerial.util.bean.XMLWalker;
  */
 public class BeanUtilImpl
 {
+    /**
+     * Create a bean of the specified type from the tree walker input
+     * 
+     * @param <E>
+     * @param treeWalker
+     * @param beanType
+     * @return bean
+     * @throws XerialException
+     */
+
+    /**
+     * Create a bean object using a given tree walker
+     * 
+     * @param <E>
+     * @param treeWalker
+     * @param beanType
+     * @return
+     * @throws XerialException
+     */
+    protected static <E> E createTypedBean(TreeWalker treeWalker, Class<E> beanType) throws XerialException
+    {
+        return beanType.cast(createBean(treeWalker, new BeanBindingProcess(beanType)));
+    }
+
+    /**
+     * Create a bean object using a given tree walker
+     * 
+     * @param treeWalker
+     * @param bean
+     * @return
+     * @throws XerialException
+     */
+    protected static Object createBean(TreeWalker treeWalker, Object bean) throws XerialException
+    {
+        return createBean(treeWalker, new BeanBindingProcess(bean));
+    }
+
+    protected static Object createBean(TreeWalker treeWalker, BeanBindingProcess beanBindingVisitor)
+            throws XerialException
+    {
+        treeWalker.walk(beanBindingVisitor);
+        return beanBindingVisitor.getResultBean();
+    }
+
     // XML Stream
     public static <E> E createBeanFromXML(Class<E> beanType, Reader xmlReader) throws XerialException
     {
-        BeanBindingProcess bindingProcess = new BeanBindingProcess(beanType);
-        XMLWalker walker = new XMLWalker(bindingProcess, xmlReader);
-        walker.walk();
-        return (E) bindingProcess.getResultBean();
+        return createTypedBean(new XMLWalker(xmlReader), beanType);
     }
 
     public static Object populateBeanWithXML(Object bean, Reader xmlReader) throws XerialException
     {
-        BeanBindingProcess bindingProcess = new BeanBindingProcess(bean);
-        XMLWalker walker = new XMLWalker(bindingProcess, xmlReader);
-        walker.walk();
-        return bean;
+        return createBean(new XMLWalker(xmlReader), bean);
     }
 
     // XML DOM
     public static <E> E createBeanFromXML(Class<E> beanType, Element xmlElement) throws XerialException
     {
-        BeanBindingProcess bindingProcess = new BeanBindingProcess(beanType);
-        XMLWalker walker = new XMLWalker(bindingProcess, xmlElement);
-        walker.walk();
-        return (E) bindingProcess.getResultBean();
+        return createTypedBean(new XMLWalker(xmlElement), beanType);
     }
 
     public static Object populateBeanWithXML(Object bean, Element xmlElement) throws XerialException
     {
-        BeanBindingProcess bindingProcess = new BeanBindingProcess(bean);
-        XMLWalker walker = new XMLWalker(bindingProcess, xmlElement);
-        walker.walk();
-        return bean;
+        return createBean(new XMLWalker(xmlElement), new BeanBindingProcess(bean));
     }
 
     // ANTLR ParseTree
     public static <E> E createBeanFromParseTree(Class<E> beanType, Tree parseTree, final String[] parserTokenNames)
             throws XerialException
     {
-        BeanBindingProcess bindingProcess = new BeanBindingProcess(beanType);
-        ANTLRWalker walker = new ANTLRWalker(parserTokenNames, bindingProcess, parseTree);
-        walker.walk(parseTree);
-        return (E) bindingProcess.getResultBean();
+        return createTypedBean(new ANTLRWalker(parserTokenNames, parseTree), beanType);
     }
 
     public static Object populateBeanWithParseTree(Object bean, Tree parseTree, final String[] parserTokenNames)
             throws XerialException
     {
-        BeanBindingProcess bindingProcess = new BeanBindingProcess(bean);
-        ANTLRWalker walker = new ANTLRWalker(parserTokenNames, bindingProcess, parseTree);
-        walker.walk(parseTree);
-        return bean;
+        return createBean(new ANTLRWalker(parserTokenNames, parseTree), bean);
     }
 
     public static <E> E createBeanFromJSON(Class<E> beanType, Reader jsonReader) throws IOException, XerialException
     {
-        BeanBindingProcess bindingProcess = new BeanBindingProcess(beanType);
-        JSONStreamWalker walker = new JSONStreamWalker(bindingProcess, jsonReader);
-        walker.walk();
-        return (E) bindingProcess.getResultBean();
+        return createTypedBean(new JSONStreamWalker(jsonReader), beanType);
     }
 
     public static Object populateBeanWithJSON(Object bean, Reader jsonReader) throws IOException, XerialException
     {
-        BeanBindingProcess bindingProcess = new BeanBindingProcess(bean);
-        JSONStreamWalker walker = new JSONStreamWalker(bindingProcess, jsonReader);
-        walker.walk();
-        return bean;
+        return createBean(new JSONStreamWalker(jsonReader), bean);
     }
 
-    public static <E> E createBeanFromMap(Class<E> beanType, Map map) throws XerialException
+    public static <E> E createBeanFromMap(Class<E> beanType, Map< ? , ? > map) throws XerialException
     {
-        BeanBindingProcess bindingProces = new BeanBindingProcess(beanType);
-        MapWalker walker = new MapWalker(bindingProces, map);
-        walker.walk();
-        return (E) bindingProces.getResultBean();
+        return createTypedBean(new MapWalker(map), beanType);
     }
 
-    public static Object populateBeanWithMap(Object bean, Map map) throws XerialException
+    public static Object populateBeanWithMap(Object bean, Map< ? , ? > map) throws XerialException
     {
-        BeanBindingProcess bindingProces = new BeanBindingProcess(bean);
-        MapWalker walker = new MapWalker(bindingProces, map);
-        walker.walk();
-        return bean;
+        return createBean(new MapWalker(map), bean);
     }
 
 }
index 307c63b..5601503 100644 (file)
@@ -83,10 +83,10 @@ public class JSONStreamWalkerTest
     @Test
     public void walk() throws IOException, XerialException
     {
-        JSONStreamWalker walker = new JSONStreamWalker(new MyVisitor(), getSampleData());
+        JSONStreamWalker walker = new JSONStreamWalker(getSampleData());
 
         stopWatch.reset();
-        walker.walk();
+        walker.walk(new MyVisitor());
         _logger.debug("walk time: " + stopWatch.getElapsedTime());
     }
 
index ba317bd..d96269a 100644 (file)
@@ -52,7 +52,8 @@ public class MapWalkerTest
         prop.put("A", "hello");\r
         prop.put("B", "world");\r
 \r
-        MapWalker walker = new MapWalker(new TreeVisitor() {\r
+        MapWalker walker = new MapWalker(prop);\r
+        walker.walk(new TreeVisitor() {\r
 \r
             boolean visitA = false;\r
             boolean visitB = false;\r
@@ -100,9 +101,7 @@ public class MapWalkerTest
                 }\r
 \r
             }\r
-        }, prop);\r
-\r
-        walker.walk();\r
+        });\r
 \r
         assertTrue(prop.containsKey("C"));\r
         assertEquals("finished", prop.getProperty("C"));\r