# HG changeset patch # User one # Date 1382694269 -32400 # Node ID b3ccefdf2b43e73c4f9cc2a266bf72c507a7d54e # Parent 60d28fedcbf210cdbde5974fea1cfede39b44f24 Added PersistentExample diff -r 60d28fedcbf2 -r b3ccefdf2b43 src/alice/jungle/core/NetworkDefaultJungle.java --- a/src/alice/jungle/core/NetworkDefaultJungle.java Wed Oct 16 20:53:44 2013 +0900 +++ b/src/alice/jungle/core/NetworkDefaultJungle.java Fri Oct 25 18:44:29 2013 +0900 @@ -27,7 +27,7 @@ public NetworkDefaultJungle(Journal _journal,String _uuid,TreeEditor _editor, String _serverName) { - journal = new AliceJournal(); + journal = _journal; trees = new ConcurrentHashMap(); uuid = _uuid; editor = _editor; diff -r 60d28fedcbf2 -r b3ccefdf2b43 src/alice/jungle/operations/NetworkNodeOperation.java --- a/src/alice/jungle/operations/NetworkNodeOperation.java Wed Oct 16 20:53:44 2013 +0900 +++ b/src/alice/jungle/operations/NetworkNodeOperation.java Fri Oct 25 18:44:29 2013 +0900 @@ -23,6 +23,11 @@ public ByteBuffer value; public int commandType; + public final static int NUM_PUT_ATTRIBUTE = 1; + public final static int NUM_APPEND_CHILD = 2; + public final static int NUM_DELETE_CHILD = 3; + public final static int NUM_DELETE_ATTRIBUTE = 4; + public NetworkNodeOperation() { pos = -2; key = null; @@ -40,13 +45,13 @@ public static int getCommandType(Command c) { switch(c) { case PUT_ATTRIBUTE: - return 1; + return NUM_PUT_ATTRIBUTE; case APPEND_CHILD: - return 2; + return NUM_APPEND_CHILD; case DELETE_CHILD: - return 3; + return NUM_DELETE_CHILD; case DELETE_ATTRIBUTE: - return 4; + return NUM_DELETE_ATTRIBUTE; default: break; } @@ -55,13 +60,13 @@ public static Command getCommand(int num) { switch(num) { - case 1: + case NUM_PUT_ATTRIBUTE: return Command.PUT_ATTRIBUTE; - case 2: - return Command.APPEND_CHILD; - case 3: + case NUM_APPEND_CHILD: + return Command.APPEND_CHILD; + case NUM_DELETE_CHILD: return Command.DELETE_CHILD; - case 4: + case NUM_DELETE_ATTRIBUTE: return Command.DELETE_ATTRIBUTE; default: break; diff -r 60d28fedcbf2 -r b3ccefdf2b43 src/alice/jungle/operations/NetworkNodePath.java --- a/src/alice/jungle/operations/NetworkNodePath.java Wed Oct 16 20:53:44 2013 +0900 +++ b/src/alice/jungle/operations/NetworkNodePath.java Fri Oct 25 18:44:29 2013 +0900 @@ -15,6 +15,7 @@ public NetworkNodePath() { path = new LinkedList(); + path.add(-1); } public NetworkNodePath(NodePath _p) { diff -r 60d28fedcbf2 -r b3ccefdf2b43 src/alice/jungle/operations/NetworkTreeOperationLog.java --- a/src/alice/jungle/operations/NetworkTreeOperationLog.java Wed Oct 16 20:53:44 2013 +0900 +++ b/src/alice/jungle/operations/NetworkTreeOperationLog.java Fri Oct 25 18:44:29 2013 +0900 @@ -13,17 +13,27 @@ @Message public class NetworkTreeOperationLog implements TreeOperationLog { - public LinkedList list; + public LinkedList list; public int size; public NetworkTreeOperationLog() { - list = new LinkedList(); + list = new LinkedList(); size = 0; } - + + public NetworkTreeOperationLog(Iterable _list) + { + list = new LinkedList(); + for(TreeOperation op: _list) { + NetworkTreeOperation nOp = new NetworkTreeOperation(op); + list.add(nOp); + } + size = list.size(); + } + public NetworkTreeOperationLog(Iterable _list, int _size) { - list = new LinkedList(); + list = new LinkedList(); for(TreeOperation op: _list) { NetworkTreeOperation nOp = new NetworkTreeOperation(op); list.add(nOp); @@ -33,7 +43,11 @@ @Override public Iterator iterator() { - return list.iterator(); + LinkedList opList = new LinkedList(); + for(NetworkTreeOperation op : list) { + opList.add(op); + } + return opList.iterator(); } @Override @@ -41,7 +55,7 @@ { NetworkTreeOperation op = new NetworkTreeOperation(_p, _op); list.add(op); - return new NetworkTreeOperationLog(list, size+1); + return this; } @Override @@ -51,7 +65,7 @@ NetworkTreeOperation op = new NetworkTreeOperation(o); list.add(op); } - return new NetworkTreeOperationLog(list, size+_log.length()); + return this; } @Override diff -r 60d28fedcbf2 -r b3ccefdf2b43 src/alice/jungle/persistence/NetworkJournal.java --- a/src/alice/jungle/persistence/NetworkJournal.java Wed Oct 16 20:53:44 2013 +0900 +++ b/src/alice/jungle/persistence/NetworkJournal.java Fri Oct 25 18:44:29 2013 +0900 @@ -1,15 +1,43 @@ package alice.jungle.persistence; +import java.io.EOFException; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +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.persistent.ChangeListWriter; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Journal; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; public class NetworkJournal implements Journal { private static final NetworkChangeListWriter WRITER = new NetworkChangeListWriter(); private static final NetworkChangeListReader READER = new NetworkChangeListReader(); + private static MessagePack msgpack = new MessagePack(); + private static OutputStream out = null; + private static InputStream in = null; + + public NetworkJournal() { + + } + + public NetworkJournal(File file) throws FileNotFoundException { + out = new FileOutputStream(file, true); + in = new FileInputStream(file); + } + @Override public ChangeListReader getReader() { return READER; @@ -19,20 +47,51 @@ return WRITER; } + public void close() throws IOException { + out.close(); + in.close(); + } + + public void setOutputStream(OutputStream _out) { + out = _out; + } + + public OutputStream getOutputStream() { + return out; + } + + public void setInputStream(InputStream _in) { + in = _in; + } + + public InputStream getInputStream() { + return in; + } + private static class NetworkChangeListWriter implements ChangeListWriter { @Override public Result write(ChangeList _operations) { - + NetworkTreeOperationLog log = new NetworkTreeOperationLog(_operations); + try { + msgpack.write(out, log); + out.flush(); + } catch (IOException e) { + return null; + } return Result.SUCCESS; } -e } - + public MessagePack getMessagePack() { + return msgpack; + } + private static class NetworkChangeListReader implements ChangeListReader { + + @Override public ChangeListReader newReader() { @@ -40,8 +99,22 @@ } @Override - public ChangeList read() + public ChangeList read() { + try { + final NetworkTreeOperationLog readLog = msgpack.read(in, NetworkTreeOperationLog.class); + ChangeList cl = new ChangeList() { + @Override + public Iterator iterator() { + return readLog.iterator(); + } + }; + return cl; + } catch (EOFException e){ +// e.printStackTrace(); + } catch (IOException e) { +// e.printStackTrace(); + } return null; } diff -r 60d28fedcbf2 -r b3ccefdf2b43 src/jungle/app/bbs/NetworkJungleBulletinBoard.java --- a/src/jungle/app/bbs/NetworkJungleBulletinBoard.java Wed Oct 16 20:53:44 2013 +0900 +++ b/src/jungle/app/bbs/NetworkJungleBulletinBoard.java Fri Oct 25 18:44:29 2013 +0900 @@ -7,6 +7,7 @@ import alice.jungle.core.NetworkDefaultJungle; import alice.jungle.datasegment.store.container.DefaultTreeOperationLogContainer; +import alice.jungle.persistence.AliceJournal; import alice.jungle.transaction.NetworkDefaultJungleTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree; @@ -32,7 +33,7 @@ public NetworkJungleBulletinBoard(String _serverName) { - jungle = new NetworkDefaultJungle(null,"hoge",new DefaultTreeEditor(new DefaultTraverser()), _serverName); + jungle = new NetworkDefaultJungle(new AliceJournal(),"hoge",new DefaultTreeEditor(new DefaultTraverser()), _serverName); jungle.createNewTree("boards"); JungleManager.setJungle(jungle); } diff -r 60d28fedcbf2 -r b3ccefdf2b43 src/test/alice/jungle/PersistentExample.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/test/alice/jungle/PersistentExample.java Fri Oct 25 18:44:29 2013 +0900 @@ -0,0 +1,92 @@ +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.ChangeList; +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.core.NetworkDefaultJungle; +import alice.jungle.operations.NetworkNodePath; +import alice.jungle.persistence.NetworkJournal; + +/* + * Hello World + */ + +public class PersistentExample { + + public static void main(String[] args) throws IOException { + NetworkJournal journal = new NetworkJournal( + new File("./log/commit.log")); + Jungle jungle = new NetworkDefaultJungle(journal, "uuid", + new DefaultTreeEditor(new DefaultTraverser()), "node00"); + 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(); + + NetworkJournal journal2 = new NetworkJournal(new File("./log/commit.log")); + ChangeListReader reader = journal2.getReader(); + ChangeList chList = reader.read(); + for (; chList != null; chList = reader.read()) { + 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)); + } + } + + } + +}