# HG changeset patch # User one # Date 1382948516 -32400 # Node ID e641f559559cfabafbe399d9a98ae682f0885f48 # Parent 82d1d3dac7bc8b42f5f46c4c2ec9d9b87aa08239 Added some files for persistent diff -r 82d1d3dac7bc -r e641f559559c src/alice/jungle/persistence/JungleUpdater.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/alice/jungle/persistence/JungleUpdater.java Mon Oct 28 17:21:56 2013 +0900 @@ -0,0 +1,58 @@ +package alice.jungle.persistence; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; +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.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + +public class JungleUpdater { + + public JungleUpdater() { + + } + + public static Either edit(JungleTreeEditor _editor ,TreeOperationLog _log) { + JungleTreeEditor editor = _editor; + Either either = null; + for (TreeOperation op : _log) { + either = _edit(editor, op); + if(either.isA()) { + return either; + } + editor = either.b(); + } + return either; + } + + private static Either _edit(JungleTreeEditor editor, + TreeOperation op) { + DefaultNodePath path = new DefaultNodePath(); + NodeOperation nodeOp = op.getNodeOperation(); + int pos = nodeOp.getPosition(); + Command c = nodeOp.getCommand(); + String key = ""; + switch (c) { + case PUT_ATTRIBUTE: + key = nodeOp.getKey(); + ByteBuffer value = nodeOp.getValue(); + return editor.putAttribute(path, key, value); + case DELETE_ATTRIBUTE: + key = nodeOp.getKey(); + return editor.deleteAttribute(path, key); + case APPEND_CHILD: + return editor.addNewChildAt(path, pos); + case DELETE_CHILD: + return editor.deleteChildAt(path, 0); + } + return null; + } + + + +} diff -r 82d1d3dac7bc -r e641f559559c src/alice/jungle/persistence/NetworkJournal.java --- a/src/alice/jungle/persistence/NetworkJournal.java Sun Oct 27 20:05:53 2013 +0900 +++ b/src/alice/jungle/persistence/NetworkJournal.java Mon Oct 28 17:21:56 2013 +0900 @@ -19,7 +19,6 @@ 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.ChangeSet; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; public class NetworkJournal implements Journal { @@ -53,6 +52,14 @@ in.close(); } + public void setOutputFile(File file) throws FileNotFoundException { + out = new FileOutputStream(file); + } + + public void setInputFile(File file) throws FileNotFoundException { + in = new FileInputStream(file); + } + public void setOutputStream(OutputStream _out) { out = _out; } @@ -83,19 +90,6 @@ } return Result.SUCCESS; } - - public Result write(ChangeSet cs) - { - NetworkTreeOperationLog log = new NetworkTreeOperationLog(cs.uuid(),cs.getChangeList()); - try { - msgpack.write(out, log); - out.flush(); - } catch (IOException e) { - return null; - } - return Result.SUCCESS; - } - } public static MessagePack getMessagePack() { @@ -104,8 +98,6 @@ private static class NetworkChangeListReader implements ChangeListReader { - - @Override public ChangeListReader newReader() { diff -r 82d1d3dac7bc -r e641f559559c src/alice/jungle/persistence/PersistentChangeListReader.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/alice/jungle/persistence/PersistentChangeListReader.java Mon Oct 28 17:21:56 2013 +0900 @@ -0,0 +1,53 @@ +package alice.jungle.persistence; + +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 { + + private static InputStream in; + MessagePack msgpack = NetworkJournal.getMessagePack(); + + public PersistentChangeListReader() { + in = null; + } + + public PersistentChangeListReader(InputStream _in) { + in = _in; + } + + @Override + public ChangeListReader newReader() + { + return new PersistentChangeListReader(); + } + + @Override + 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){ + + } catch (IOException e) { + } + return null; + } + +} diff -r 82d1d3dac7bc -r e641f559559c src/alice/jungle/persistence/PersistentChangeListWriter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/alice/jungle/persistence/PersistentChangeListWriter.java Mon Oct 28 17:21:56 2013 +0900 @@ -0,0 +1,48 @@ +package alice.jungle.persistence; + +import java.io.IOException; +import java.io.OutputStream; + +import org.msgpack.MessagePack; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.Result; +import alice.jungle.operations.NetworkTreeOperationLog; + +public class PersistentChangeListWriter implements ChangeListWriter { + + MessagePack msgpack = NetworkJournal.getMessagePack(); + OutputStream out; + + public PersistentChangeListWriter(OutputStream _out) { + out = _out; + } + + @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; + } + + public Result write(PersistentChangeSet cs) + { + NetworkTreeOperationLog log = new NetworkTreeOperationLog(cs.uuid(),cs.getChangeList()); + try { + msgpack.write(out, cs.getTreeName()); + msgpack.write(out, log); + out.flush(); + } catch (IOException e) { + return null; + } + return Result.SUCCESS; + } + +} diff -r 82d1d3dac7bc -r e641f559559c src/alice/jungle/persistence/PersistentChangeSet.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/alice/jungle/persistence/PersistentChangeSet.java Mon Oct 28 17:21:56 2013 +0900 @@ -0,0 +1,67 @@ +package alice.jungle.persistence; + +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.store.ChangeSet; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; + +public class PersistentChangeSet implements ChangeSet +{ + private final Node root; + private final ChangeSet previous; + private final ChangeList changeList; + private final String uuid; + private final long revision; + private final String treeName; + + public PersistentChangeSet(Node _node,ChangeSet _prev,ChangeList _log,String _uuid,long _revision, String _treeName) + { + root = _node; + previous = _prev; + changeList = _log; + uuid = _uuid; + revision = _revision; + treeName = _treeName; + } + + @Override + public Node getRoot() + { + return root; + } + + @Override + public ChangeSet prev() + { + return previous; + } + + @Override + public ChangeList getChangeList() + { + return changeList; + } + + @Override + public String uuid() + { + return uuid; + } + + @Override + public long revision() + { + return revision; + } + + @Override + public Iterable getOperations() + { + return changeList; + } + + public String getTreeName() { + return treeName; + } + +} diff -r 82d1d3dac7bc -r e641f559559c src/alice/jungle/persistence/PersistentJournal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/alice/jungle/persistence/PersistentJournal.java Mon Oct 28 17:21:56 2013 +0900 @@ -0,0 +1,68 @@ +package alice.jungle.persistence; + +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 org.msgpack.MessagePack; + +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; + +public class PersistentJournal implements Journal { + + private static PersistentChangeListWriter WRITER; + private static PersistentChangeListReader READER; + private static MessagePack msgpack; + private static OutputStream out; + private static InputStream in; + + public PersistentJournal(File file) throws FileNotFoundException { + out = new FileOutputStream(file, true); + in = new FileInputStream(file); + WRITER = new PersistentChangeListWriter(out); + READER = new PersistentChangeListReader(in); + msgpack = new MessagePack(); + } + + @Override + public ChangeListReader getReader() { + return READER; + } + + @Override + public ChangeListWriter getWriter() { + 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; + } + + public static MessagePack getMessagePack() { + return msgpack; + } + +} diff -r 82d1d3dac7bc -r e641f559559c src/alice/jungle/persistence/PersistentJungle.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/alice/jungle/persistence/PersistentJungle.java Mon Oct 28 17:21:56 2013 +0900 @@ -0,0 +1,57 @@ +package alice.jungle.persistence; + +import java.util.Iterator; +import java.util.concurrent.ConcurrentHashMap; + +import fj.data.List; + +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.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; + +public class PersistentJungle implements Jungle { + private PersistentJournal journal; + private ConcurrentHashMap trees; + private String uuid; + private TreeEditor editor; + + public PersistentJungle(PersistentJournal _journal,String _uuid,TreeEditor _editor) + { + journal = _journal; + trees = new ConcurrentHashMap(); + uuid = _uuid; + editor = _editor; + } + + @Override + public JungleTree getTreeByName(String _name) + { + return trees.get(_name); + } + + @Override + public JungleTree createNewTree(String _name) + { + ChangeList list = new ChangeList(){ + @Override + public Iterator iterator() { + List nil = List.nil(); + return nil.iterator(); + } + }; + DefaultTreeNode root = new DefaultTreeNode(); + ChangeSet set = new PersistentChangeSet(root.getAsNode(),null,list,uuid,0, _name); + DefaultTreeContext tc = new DefaultTreeContext(root,set); + JungleTree newTree = new PersistentJungleTree(_name, tc,uuid, (PersistentChangeListWriter)journal.getWriter(),editor); + if(trees.putIfAbsent(_name,newTree) != null){ + return null; + } + return newTree; + } + +} diff -r 82d1d3dac7bc -r e641f559559c src/alice/jungle/persistence/PersistentJungleTree.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/alice/jungle/persistence/PersistentJungleTree.java Mon Oct 28 17:21:56 2013 +0900 @@ -0,0 +1,48 @@ +package alice.jungle.persistence; + +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.ChangeListWriter; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultJungleTreeEditor; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; + +public class PersistentJungleTree > implements JungleTree { + private final AtomicReservableReference> repository; + private final String uuid; + private final String treeName; + private final PersistentChangeListWriter writer; + private final TreeEditor editor; + + public PersistentJungleTree(String _treeName, TreeContext _tc,String _uuid,PersistentChangeListWriter _writer,TreeEditor _editor) + { + treeName = _treeName; + repository = new AtomicReservableReference>(_tc); + uuid = _uuid; + writer = _writer; + editor = _editor; + } + + @Override + public JungleTreeEditor getTreeEditor() + { + TreeContext tc = repository.get(); + PersistentTransactionManager txManager = new PersistentTransactionManager(treeName, writer,tc,repository,uuid); + T root = tc.getTreeNode(); + return new DefaultJungleTreeEditor(root,txManager,editor); + } + + @Override + public Node getRootNode() + { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return cs.getRoot(); + } + + +} diff -r 82d1d3dac7bc -r e641f559559c src/alice/jungle/persistence/PersistentTransactionManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/alice/jungle/persistence/PersistentTransactionManager.java Mon Oct 28 17:21:56 2013 +0900 @@ -0,0 +1,85 @@ +package alice.jungle.persistence; + +import java.util.Iterator; + +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.Result; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.TreeOperationLog; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.AtomicReservableReference.Reservation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + +public class PersistentTransactionManager> implements TransactionManager { + private final AtomicReservableReference> repository; + private final TreeContext tip; + private final PersistentChangeListWriter writer; + private final String uuid; + private final String treeName; + + public PersistentTransactionManager(String _treeName, PersistentChangeListWriter _writer,TreeContext _tip, + AtomicReservableReference> _repository,String _uuid) + { + repository = _repository; + tip = _tip; + writer = _writer; + uuid = _uuid; + treeName = _treeName; + } + + @Override + public Either> commit(T _newRoot,final TreeOperationLog _log) { + ChangeSet cs = tip.getChangeSet(); + long currentRevision = cs.revision(); + long nextRevision = currentRevision + 1; + + ChangeList list = new ChangeList() { + @Override + public Iterator iterator(){ + return _log.iterator(); + } + }; + + Node root = _newRoot.getAsNode(); + PersistentChangeSet newCs = new PersistentChangeSet(root, cs, list, uuid, nextRevision, treeName); + DefaultTreeContext newContext = new DefaultTreeContext(_newRoot,newCs); + + @SuppressWarnings("rawtypes") + Reservation reservation = repository.makeReservation(tip, newContext); + if(reservation == null) { + return DefaultEither.newA((Error)new DefaultError()); + } +// Result r = writer.write(list); + Result r = writer.write(newCs); + if(r != Result.SUCCESS) { + return DefaultEither.newA((Error)new DefaultError()); + } + reservation.confirm(); + TransactionManager txManager = new PersistentTransactionManager(treeName, writer, newContext, repository, uuid); + return DefaultEither.newB(txManager); + } + + @Override + public long getRevision() + { + ChangeSet cs = tip.getChangeSet(); + return cs.revision(); + } + + @Override + public String getUUID() { + return uuid; + } + + + +}