changeset 86:bcaf28f8244d

Added PersistentChageList and PersistentJournalTest
author one
date Tue, 29 Oct 2013 16:52:12 +0900
parents e641f559559c
children f142dd4abc74
files pom.xml src/alice/jungle/operations/NetworkTreeOperationLog.java src/alice/jungle/persistence/PersistentChangeList.java src/alice/jungle/persistence/PersistentChangeListReader.java src/alice/jungle/persistence/PersistentChangeListWriter.java src/alice/jungle/persistence/PersistentJournal.java src/test/alice/jungle/PersistenJournalTest.java
diffstat 7 files changed, 195 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/pom.xml	Mon Oct 28 17:21:56 2013 +0900
+++ b/pom.xml	Tue Oct 29 16:52:12 2013 +0900
@@ -61,7 +61,20 @@
   		<artifactId>functionaljava</artifactId>
   		<version>3.1</version>
   	</dependency>
+  	
+<!--
+  	 <dependency>
+      <groupId>org.msgpack</groupId>
+      <artifactId>msgpack</artifactId>
+      <version>0.6.8</version>
+  	</dependency>
 
+  	 <dependency>
+      <groupId>alice</groupId>
+      <artifactId>alice</artifactId>
+      <version>0.1</version>
+  	</dependency>
+  -->  	
   	<dependency>
   		<groupId>jungle</groupId>
   		<artifactId>jungle-core</artifactId>
--- a/src/alice/jungle/operations/NetworkTreeOperationLog.java	Mon Oct 28 17:21:56 2013 +0900
+++ b/src/alice/jungle/operations/NetworkTreeOperationLog.java	Tue Oct 29 16:52:12 2013 +0900
@@ -15,6 +15,7 @@
 {
 	public LinkedList<NetworkTreeOperation> list;
 	public int size;
+	String uuid;
 	String treeName;
 	
 	public NetworkTreeOperationLog() {
@@ -23,8 +24,9 @@
 		treeName = "";
 	}
 
-	public NetworkTreeOperationLog(String _treeName, Iterable<TreeOperation> _list)
+	public NetworkTreeOperationLog(String _uuid, String _treeName, Iterable<TreeOperation> _list)
 	{
+		uuid = _uuid;
 		treeName = _treeName;
 		list = new LinkedList<NetworkTreeOperation>();
 		for(TreeOperation op: _list) {
@@ -79,6 +81,10 @@
 		return size;
 	}
 	
+	public String getUUID() {
+		return uuid;
+	}
+	
 	public String getTreeName() {
 		return treeName;
 	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/alice/jungle/persistence/PersistentChangeList.java	Tue Oct 29 16:52:12 2013 +0900
@@ -0,0 +1,46 @@
+package alice.jungle.persistence;
+
+import java.util.Iterator;
+
+import alice.jungle.operations.NetworkTreeOperationLog;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
+
+public class PersistentChangeList implements ChangeList {
+
+	public NetworkTreeOperationLog log;
+	public String treeName;
+	public String uuid;
+
+	public PersistentChangeList(NetworkTreeOperationLog _log) {
+		log = _log;
+		treeName = _log.getTreeName();
+		uuid = _log.getUUID();
+	}
+	
+	public PersistentChangeList(PersistentChangeSet cs) {
+		treeName = cs.getTreeName();
+		uuid = cs.uuid();
+		log = new NetworkTreeOperationLog(cs.getChangeList());
+	}
+	
+	@Override
+	public Iterator<TreeOperation> iterator() {
+		return log.iterator();
+	}
+
+	public NetworkTreeOperationLog getTreeOperationLog() {
+		return log;
+	}
+	
+	public String getTreeName() {
+		return treeName;
+	}
+	
+	public String getUUID() {
+		return uuid;
+	}
+
+	
+}
--- a/src/alice/jungle/persistence/PersistentChangeListReader.java	Mon Oct 28 17:21:56 2013 +0900
+++ b/src/alice/jungle/persistence/PersistentChangeListReader.java	Tue Oct 29 16:52:12 2013 +0900
@@ -3,14 +3,12 @@
 import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.Iterator;
 
 import org.msgpack.MessagePack;
 
 import alice.jungle.operations.NetworkTreeOperationLog;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListReader;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
 
 public class PersistentChangeListReader  implements ChangeListReader {
 	
@@ -36,12 +34,7 @@
 	{
 		try {
 			final NetworkTreeOperationLog readLog = msgpack.read(in, NetworkTreeOperationLog.class);
-			ChangeList cl = new ChangeList() {
-				@Override
-				public Iterator<TreeOperation> iterator() {
-					return readLog.iterator();
-				}
-			};
+			PersistentChangeList cl = new PersistentChangeList(readLog); 
 			return cl;
 		} catch (EOFException e){
 
@@ -49,5 +42,4 @@
 		}
 		return null;
 	}
-
 }
--- a/src/alice/jungle/persistence/PersistentChangeListWriter.java	Mon Oct 28 17:21:56 2013 +0900
+++ b/src/alice/jungle/persistence/PersistentChangeListWriter.java	Tue Oct 29 16:52:12 2013 +0900
@@ -34,9 +34,8 @@
 
 	public Result write(PersistentChangeSet cs)
 	{
-		NetworkTreeOperationLog log = new NetworkTreeOperationLog(cs.uuid(),cs.getChangeList());
+		NetworkTreeOperationLog log = new NetworkTreeOperationLog(cs.uuid(), cs.getTreeName(),cs.getChangeList());
 		try {
-			msgpack.write(out, cs.getTreeName());
 			msgpack.write(out, log);
 			out.flush();
 		} catch (IOException e) {
--- a/src/alice/jungle/persistence/PersistentJournal.java	Mon Oct 28 17:21:56 2013 +0900
+++ b/src/alice/jungle/persistence/PersistentJournal.java	Tue Oct 29 16:52:12 2013 +0900
@@ -19,8 +19,12 @@
 	private static PersistentChangeListWriter WRITER;
 	private static PersistentChangeListReader READER;
 	private static MessagePack msgpack;
-	private static OutputStream out;
-	private static InputStream in;
+	private static OutputStream out = null;
+	private static InputStream in = null;
+	
+	public PersistentJournal() {
+		msgpack = new MessagePack();
+	}
 	
 	public PersistentJournal(File file) throws FileNotFoundException {
 		out = new FileOutputStream(file, true);
@@ -40,6 +44,16 @@
 		return WRITER;
 	}
 	
+	public void setOutputFile(File file) throws FileNotFoundException {
+		out = new FileOutputStream(file);
+		WRITER = new PersistentChangeListWriter(out);
+	}
+	
+	public void setInputFile(File file) throws FileNotFoundException {
+		in = new FileInputStream(file);
+		READER = new PersistentChangeListReader(in);
+	}
+	
 	public void close() throws IOException {
 		out.close();
 		in.close();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/alice/jungle/PersistenJournalTest.java	Tue Oct 29 16:52:12 2013 +0900
@@ -0,0 +1,111 @@
+package test.alice.jungle;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+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.JungleTreeEditor;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListReader;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
+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.operations.NodeOperation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
+import alice.jungle.operations.NetworkNodePath;
+import alice.jungle.persistence.JungleUpdater;
+import alice.jungle.persistence.PersistentChangeList;
+import alice.jungle.persistence.PersistentJournal;
+import alice.jungle.persistence.PersistentJungle;
+
+public class PersistenJournalTest {
+
+	public static void main(String[] args) throws IOException {
+		PersistentJournal journal = new PersistentJournal(
+				new File("./log/commit.log"));
+		Jungle jungle = new PersistentJungle(journal, "uuid",new DefaultTreeEditor(new DefaultTraverser()));
+		jungle.createNewTree("hoge");
+		JungleTree tree = jungle.getTreeByName("hoge");
+		JungleTreeEditor editor = tree.getTreeEditor();
+		NetworkNodePath path = new NetworkNodePath();
+		String key = "key";
+		ByteBuffer value = ByteBuffer.wrap("value".getBytes());
+		int pos = 0;
+		Either<Error, JungleTreeEditor> either = editor.addNewChildAt(path, pos);
+		if(either.isA()){
+			System.out.println("Failed addNewChildAt");
+			System.exit(0);
+		}
+		editor = either.b();
+		either = editor.putAttribute(path, key,	value);
+
+		JungleTreeEditor e = either.b();
+		e.success();
+		journal.close();
+
+		PersistentJournal journal2 = new PersistentJournal();
+		journal2.setInputFile(new File("./log/commit.log"));
+		journal2.setOutputFile(new File("./log/commit2.log"));
+		Jungle jungle2 = new PersistentJungle(journal, "uuid2", new DefaultTreeEditor(new DefaultTraverser()));
+		ChangeListReader reader = journal2.getReader();
+		PersistentChangeList chList = (PersistentChangeList) reader.read();
+		for (; chList != null; chList = (PersistentChangeList) reader.read()) {
+			String treeName = chList.getTreeName();
+			JungleTree tree2 = jungle2.getTreeByName(treeName);
+			if(tree2 == null) {
+				tree2 = jungle2.createNewTree(treeName);
+			}
+			JungleTreeEditor editor2 = tree2.getTreeEditor();
+			Either<Error, JungleTreeEditor> either2 = JungleUpdater.edit(editor2, chList.getTreeOperationLog());
+			if (either2.isA()) {
+				System.err.println("JungleUpdater Error");
+				System.exit(0);
+			}
+			editor2 = either2.b();
+			editor2.success();
+			
+			for (TreeOperation op : chList) {
+				NodePath p = op.getNodePath();
+				NodeOperation nodeOp = op.getNodeOperation();
+				Command c = nodeOp.getCommand();
+				String str = "";
+				switch (c) {
+				case PUT_ATTRIBUTE:
+					String opKey = nodeOp.getKey();
+					ByteBuffer opValue = nodeOp.getValue();
+					if (value.limit() < 100) {
+						str = String.format("key:%s,value:%s", opKey,
+								new String(opValue.array()));
+					} else {
+						str = String.format("key:%s,value:%d", opKey,
+								opValue.limit());
+					}
+					break;
+				case DELETE_ATTRIBUTE:
+					str = String.format("key:%s", nodeOp.getKey());
+					break;
+				case APPEND_CHILD:
+					str = String.format("pos:%d", nodeOp.getPosition());
+					break;
+				case DELETE_CHILD:
+					str = String.format("pos:%d", nodeOp.getPosition());
+					break;
+				}
+				System.out.println(String.format("[%s:%s:%s]", c, p, str));
+			}
+			System.out.println();
+		}
+		JungleTree tree2 = jungle2.getTreeByName("hoge");
+		Node node = tree2.getRootNode();
+		System.out.println("Children size : "+node.getChildren().size());
+		
+		journal2.close();
+
+	}
+	
+}