<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>
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)
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()
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
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
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
if (!skipDescendants)\r
{\r
String key = jsonPullParser.getKeyName();\r
- getTreeVisitor().visitNode(key, this);\r
+ visitor.visitNode(key, this);\r
}\r
break;\r
}\r
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
\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
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
{\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
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
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;
-
+
}
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");
}
@Override
- public void walk() throws XerialException
+ public void walk(TreeVisitor visitor) throws XerialException
{
try
{
- parse();
+ parse(visitor);
}
catch (IOException e)
{
}
}
- public void parse() throws XerialException, IOException
+ public void parse(TreeVisitor visitor) throws XerialException, IOException
{
int state;
try
{
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);
}
}
break;
}
String text = textStack.getLast().toString();
- getTreeVisitor().leaveNode(pullParser.getName(), text.trim(), this);
+ visitor.leaveNode(pullParser.getName(), text.trim(), this);
textStack.removeLast();
}
break;
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();
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
Node childNode = nodeList.item(i);
if (childNode.getNodeType() == Node.ELEMENT_NODE)
{
- parse((Element) childNode);
+ parse((Element) childNode, visitor);
}
}
skipDesendants = false;
// leave the current element
String text = DOMUtil.getText(element);
- getTreeVisitor().leaveNode(tagName, text.trim(), this);
+ visitor.leaveNode(tagName, text.trim(), this);
}
public void skipDescendants()
* @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);
}
/**
* @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
}
@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);
}
}
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;
/**
*/
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);
}
}
@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());
}
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
}\r
\r
}\r
- }, prop);\r
-\r
- walker.walk();\r
+ });\r
\r
assertTrue(prop.containsKey("C"));\r
assertEquals("finished", prop.getProperty("C"));\r