# HG changeset patch
# User one
# Date 1383033132 -32400
# Node ID bcaf28f8244da254632eeacfd3debf722d82bc82
# Parent e641f559559cfabafbe399d9a98ae682f0885f48
Added PersistentChageList and PersistentJournalTest
diff -r e641f559559c -r bcaf28f8244d pom.xml
--- 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 @@
functionaljava
3.1
+
+
jungle
jungle-core
diff -r e641f559559c -r bcaf28f8244d src/alice/jungle/operations/NetworkTreeOperationLog.java
--- 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 list;
public int size;
+ String uuid;
String treeName;
public NetworkTreeOperationLog() {
@@ -23,8 +24,9 @@
treeName = "";
}
- public NetworkTreeOperationLog(String _treeName, Iterable _list)
+ public NetworkTreeOperationLog(String _uuid, String _treeName, Iterable _list)
{
+ uuid = _uuid;
treeName = _treeName;
list = new LinkedList();
for(TreeOperation op: _list) {
@@ -79,6 +81,10 @@
return size;
}
+ public String getUUID() {
+ return uuid;
+ }
+
public String getTreeName() {
return treeName;
}
diff -r e641f559559c -r bcaf28f8244d src/alice/jungle/persistence/PersistentChangeList.java
--- /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 iterator() {
+ return log.iterator();
+ }
+
+ public NetworkTreeOperationLog getTreeOperationLog() {
+ return log;
+ }
+
+ public String getTreeName() {
+ return treeName;
+ }
+
+ public String getUUID() {
+ return uuid;
+ }
+
+
+}
diff -r e641f559559c -r bcaf28f8244d src/alice/jungle/persistence/PersistentChangeListReader.java
--- 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 iterator() {
- return readLog.iterator();
- }
- };
+ PersistentChangeList cl = new PersistentChangeList(readLog);
return cl;
} catch (EOFException e){
@@ -49,5 +42,4 @@
}
return null;
}
-
}
diff -r e641f559559c -r bcaf28f8244d src/alice/jungle/persistence/PersistentChangeListWriter.java
--- 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) {
diff -r e641f559559c -r bcaf28f8244d src/alice/jungle/persistence/PersistentJournal.java
--- 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();
diff -r e641f559559c -r bcaf28f8244d src/test/alice/jungle/PersistenJournalTest.java
--- /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 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 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();
+
+ }
+
+}