# 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(); + + } + +}