changeset 0:faedeec97605

read Jungle xml
author tatsuki
date Fri, 24 Oct 2014 07:29:40 +0900
parents
children b036c87f1e5c
files src/main/java/ac/jp/u_ryukyu/cr/ie/tatsuki/xmlReader/ReadXmlHandler.java src/main/java/ac/jp/u_ryukyu/cr/ie/tatsuki/xmlReader/SaxSample.java src/test/java/jp/ac/u_ryukyu/cr/ie/tatsuki/xmlReadTest/SaxTest.java src/test/java/jp/ac/u_ryukyu/cr/ie/tatsuki/xmlReadTest/TestHandler.java
diffstat 4 files changed, 388 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/ac/jp/u_ryukyu/cr/ie/tatsuki/xmlReader/ReadXmlHandler.java	Fri Oct 24 07:29:40 2014 +0900
@@ -0,0 +1,128 @@
+package ac.jp.u_ryukyu.cr.ie.tatsuki.xmlReader;
+
+import java.nio.ByteBuffer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
+
+import org.xml.sax.*;
+import org.xml.sax.helpers.*;
+
+import fj.test.reflect.Name;
+
+class ReadXmlHandler extends DefaultHandler {
+	private JungleTree tree;
+	private JungleTreeEditor editor;
+	private NodePath path;
+	
+	public ReadXmlHandler(JungleTree tree){
+		this.tree = tree;
+		this.editor = tree.getTreeEditor();
+		this.path = new DefaultNodePath().add(-1);
+	}
+	
+	@Override
+	public void startElement(String uri, String localName,String qName, Attributes attributes) {
+		Pair<Integer, NodePath> nodePair = path.last();
+		path = nodePair.right();
+		int num = nodePair.left() + 1;
+		
+		Either<Error, JungleTreeEditor> either = editor.addNewChildAt(path, num);
+		if (either.isA()) {
+			//error
+		}
+		this.editor = either.b();
+		
+		path = path.add(num);
+		System.out.println(path.toString());
+
+		
+		if (uri != "") {
+			System.out.println("namespaceURI= " + uri);
+		}
+
+		if (localName != "") {
+			System.out.println("localName= " + localName);
+		}
+
+		if (qName != "") {
+			System.out.println("qName= " + qName);
+			Either<Error, JungleTreeEditor> newEither = editor.putAttribute(path, "element", ByteBuffer.wrap(qName.getBytes()));
+			if (newEither.isA()) {
+				//error				
+			}
+			this.editor = newEither.b();
+		}
+
+		if (attributes.getLength() != 0) {
+			for (int count = 0 ;attributes.getLength() > count; count++) {
+				System.out.println(attributes.getLocalName(count) + " = " + attributes.getValue(count));
+				Either<Error, JungleTreeEditor> newEither = editor.putAttribute(path,attributes.getLocalName(count) , ByteBuffer.wrap(attributes.getValue(count).getBytes()));
+				if (newEither.isA()) {
+					//error
+				}
+				this.editor = newEither.b();
+			}
+		}
+		path = path.add(-1);
+	}
+
+	@Override
+	public void characters(char[] ch, int start, int length) {
+			String str = new String(ch, start, length);
+			Pattern pattern = Pattern.compile("\n");
+			Matcher macher = pattern.matcher(str);
+			
+			if (!macher.find()) {
+				Pair<Integer, NodePath> nodePair = path.last();
+				NodePath onePath = nodePair.right();
+				System.out.println(str);
+				Either<Error, JungleTreeEditor> newEither = editor.putAttribute(onePath, "text", ByteBuffer.wrap(str.getBytes()));
+				if (newEither.isA()) {
+					//error
+				}
+				this.editor = newEither.b();
+		}
+	}
+
+	@Override
+	public void endElement(String namespaceURI, String localName, String qName) {
+		path = path.tail();
+		if (namespaceURI != "") {
+			System.out.println("namespaceURI= " + namespaceURI);
+		}
+		if (localName != "") {
+			System.out.println("localName= " + localName);
+		}
+
+		if (qName != "") {
+			System.out.println("qName= " + qName);
+		}
+	}
+
+	@Override
+	public void startDocument() {
+		System.out.println("start");
+	}
+
+	@Override
+	public void endDocument() {
+		Either<Error, JungleTreeEditor> either = editor.success();
+		if (either.isA()) {
+			//error
+		}
+		System.out.println("end");
+	}
+
+	public JungleTree getTree(){
+		return tree;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/ac/jp/u_ryukyu/cr/ie/tatsuki/xmlReader/SaxSample.java	Fri Oct 24 07:29:40 2014 +0900
@@ -0,0 +1,31 @@
+package ac.jp.u_ryukyu.cr.ie.tatsuki.xmlReader;
+
+import java.io.*;
+
+import javax.xml.parsers.*;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
+
+class SaxSample {
+	public static void main(String args[]) {
+		try {
+			/*
+			 * パーサのFactoryを作成 名前からしてFactoryパターンで,Singletonだと思う.
+			 */
+			SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
+			/* パーサを取得 */
+			SAXParser saxParser = saxParserFactory.newSAXParser();
+			Jungle jungle = new DefaultJungle(null, "hoge",new DefaultTreeEditor(new DefaultTraverser()));
+			JungleTree tree = jungle.createNewTree("XMLTEST");
+			/* イベントハンドラを作成 */
+			ReadXmlHandler readXmlHandler = new ReadXmlHandler(tree);
+			saxParser.parse(new FileInputStream("/Users/e115731/workspace/aaa/xml/Person.xml"), readXmlHandler);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/jp/ac/u_ryukyu/cr/ie/tatsuki/xmlReadTest/SaxTest.java	Fri Oct 24 07:29:40 2014 +0900
@@ -0,0 +1,104 @@
+package jp.ac.u_ryukyu.cr.ie.tatsuki.xmlReadTest;
+
+import java.io.*;
+import java.nio.ByteBuffer;
+import java.util.Iterator;
+
+import javax.xml.parsers.*;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
+import junit.framework.Assert;
+
+class SaxTest {
+	public static void main(String args[]) {
+		try {
+			/*
+			 * パーサのFactoryを作成 名前からしてFactoryパターンで,Singletonだと思う.
+			 */
+			SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
+			/* パーサを取得 */
+			SAXParser saxParser = saxParserFactory.newSAXParser();
+			Jungle jungle = new DefaultJungle(null, "hoge",new DefaultTreeEditor(new DefaultTraverser()));
+			JungleTree tree = jungle.createNewTree("XMLTEST");
+			/* イベントハンドラを作成 */
+			TestHandler testHandler = new TestHandler(tree);
+
+			/* イベントハンドラに入力データとイベントハンドラを渡す */
+			saxParser.parse(new FileInputStream("/Users/e115731/workspace/aaa/xml/sample.xml"), testHandler);
+			JungleTree newTree = testHandler.getTree();
+			InterfaceTraverser ifTraverser = newTree.getTraverser();
+
+			Iterator<Pair<TreeNode, NodePath>> searchNode = ifTraverser.find((
+					TreeNode node) -> {
+				ByteBuffer attribute = node.getAttributes().get("element");
+				if (attribute != null) {
+					byte[] byteAttribute = attribute.array();
+					String str = new String(byteAttribute);
+					System.out.println("attribute = " + str);
+					return str.equals("Person");
+				}
+				return false;
+			}, "element", "Person");
+			Pair<TreeNode, NodePath> nodePair = searchNode.next();
+			Assert.assertEquals(nodePair.left().getAttributes().getString("element"),"Person");
+			Assert.assertEquals(nodePair.right().toString(), "<-1,0>");
+
+			
+			searchNode = ifTraverser.find((TreeNode node) -> {
+				ByteBuffer attribute = node.getAttributes().get("element");
+				if (attribute != null) {
+					byte[] byteAttribute = attribute.array();
+					String str = new String(byteAttribute);
+					System.out.println("attribute = " + str);
+					return str.equals("name");
+				}
+				return false;
+			}, "element", "name");
+			
+			nodePair = searchNode.next();
+			Assert.assertEquals(nodePair.left().getAttributes().getString("text"),"tatsuki");
+			Assert.assertEquals(nodePair.right().toString(), "<-1,0,0>");
+			
+			searchNode = ifTraverser.find((TreeNode node) -> {
+				ByteBuffer attribute = node.getAttributes().get("text");
+				if (attribute != null) {
+					byte[] byteAttribute = attribute.array();
+					String str = new String(byteAttribute);
+					System.out.println("attribute = " + str);
+					return str.equals("tatsuki");
+				}
+				return false;
+			}, "text", "tatsuki");
+			
+			nodePair = searchNode.next();
+			Assert.assertEquals(nodePair.left().getAttributes().getString("id"),"10");
+			Assert.assertEquals(nodePair.right().toString(), "<-1,0,0>");
+
+			searchNode = ifTraverser.find((TreeNode node) -> {
+				ByteBuffer attribute = node.getAttributes().get("id");
+				if (attribute != null) {
+					byte[] byteAttribute = attribute.array();
+					String str = new String(byteAttribute);
+					System.out.println("attribute = " + str);
+					return str.equals("10");
+				}
+				return false;
+			}, "id", "10");
+			
+			nodePair = searchNode.next();
+			Assert.assertEquals(nodePair.left().getAttributes().getString("id"),"10");
+			Assert.assertEquals(nodePair.right().toString(), "<-1,0,0>");
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/jp/ac/u_ryukyu/cr/ie/tatsuki/xmlReadTest/TestHandler.java	Fri Oct 24 07:29:40 2014 +0900
@@ -0,0 +1,125 @@
+package jp.ac.u_ryukyu.cr.ie.tatsuki.xmlReadTest;
+
+import java.nio.ByteBuffer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
+
+import org.xml.sax.*;
+import org.xml.sax.helpers.*;
+
+class TestHandler extends DefaultHandler {
+	private JungleTree tree;
+	private JungleTreeEditor editor;
+	private NodePath path;
+	
+	public TestHandler(JungleTree tree){
+		this.tree = tree;
+		this.editor = tree.getTreeEditor();
+		this.path = new DefaultNodePath().add(-1);
+	}
+	
+	@Override
+	public void startElement(String uri, String localName,String qName, Attributes attributes) {
+		Pair<Integer, NodePath> nodePair = path.last();
+		path = nodePair.right();
+		int num = nodePair.left() + 1;
+		
+		Either<Error, JungleTreeEditor> either = editor.addNewChildAt(path, num);
+		if (either.isA()) {
+			//error
+		}
+		this.editor = either.b();
+		
+		path = path.add(num);
+		System.out.println(path.toString());
+
+		
+		if (uri != "") {
+			System.out.println("namespaceURI= " + uri);
+		}
+
+		if (localName != "") {
+			System.out.println("localName= " + localName);
+		}
+
+		if (qName != "") {
+			System.out.println("qName= " + qName);
+			Either<Error, JungleTreeEditor> newEither = editor.putAttribute(path, "element", ByteBuffer.wrap(qName.getBytes()));
+			if (newEither.isA()) {
+				//error				
+			}
+			this.editor = newEither.b();
+		}
+
+		if (attributes.getLength() != 0) {
+			for (int count = 0 ;attributes.getLength() > count; count++) {
+				System.out.println(attributes.getLocalName(count) + " = " + attributes.getValue(count));
+				Either<Error, JungleTreeEditor> newEither = editor.putAttribute(path,attributes.getLocalName(count) , ByteBuffer.wrap(attributes.getValue(count).getBytes()));
+				if (newEither.isA()) {
+					//error
+				}
+				this.editor = newEither.b();
+			}
+		}
+		path = path.add(-1);
+	}
+
+	@Override
+	public void characters(char[] ch, int start, int length) {
+			String str = new String(ch, start, length);
+			Pattern pattern = Pattern.compile("\n");
+			Matcher macher = pattern.matcher(str);
+			
+			if (!macher.find()) {
+				Pair<Integer, NodePath> nodePair = path.last();
+				NodePath onePath = nodePair.right();
+				Either<Error, JungleTreeEditor> newEither = editor.putAttribute(onePath, "text", ByteBuffer.wrap(str.getBytes()));
+				if (newEither.isA()) {
+					//error
+				}
+				this.editor = newEither.b();
+		}
+	}
+
+	@Override
+	public void endElement(String namespaceURI, String localName, String qName) {
+		path = path.tail();
+		if (namespaceURI != "") {
+			System.out.println("namespaceURI= " + namespaceURI);
+		}
+		if (localName != "") {
+			System.out.println("localName= " + localName);
+		}
+
+		if (qName != "") {
+			System.out.println("qName= " + qName);
+		}
+	}
+
+	@Override
+	public void startDocument() {
+		System.out.println("start");
+	}
+
+	@Override
+	public void endDocument() {
+		Either<Error, JungleTreeEditor> either = editor.success();
+		if (either.isA()) {
+			//error
+		}
+		System.out.println("end");
+	}
+
+	public JungleTree getTree(){
+		return tree;
+	}
+
+}
\ No newline at end of file