# HG changeset patch # User one # Date 1384485839 -32400 # Node ID 75cf01a430a69da220d11e2d7abe1e4da3b90825 # Parent e95faa202b4f1e0153310b15bcfeca9eafd59fee Added LocalTreeEditor diff -r e95faa202b4f -r 75cf01a430a6 src/alice/jungle/operations/NetworkTreeOperationLog.java --- a/src/alice/jungle/operations/NetworkTreeOperationLog.java Mon Nov 11 19:35:22 2013 +0900 +++ b/src/alice/jungle/operations/NetworkTreeOperationLog.java Fri Nov 15 12:23:59 2013 +0900 @@ -1,5 +1,6 @@ package alice.jungle.operations; +import java.util.Date; import java.util.Iterator; import java.util.LinkedList; @@ -17,18 +18,26 @@ public int size; String uuid; String treeName; + long timestamp; public NetworkTreeOperationLog() { list = new LinkedList(); size = 0; treeName = ""; + timestamp = new Date().getTime(); } public NetworkTreeOperationLog(String _uuid, String _treeName, Iterable _list) { + this(_uuid, _treeName, _list, new Date().getTime()); + } + + public NetworkTreeOperationLog(String _uuid, String _treeName, Iterable _list, long _timestamp) + { uuid = _uuid; treeName = _treeName; list = new LinkedList(); + timestamp = _timestamp; for(TreeOperation op: _list) { NetworkTreeOperation nOp = new NetworkTreeOperation(op); list.add(nOp); @@ -38,13 +47,7 @@ public NetworkTreeOperationLog(Iterable _list) { - list = new LinkedList(); - for(TreeOperation op: _list) { - NetworkTreeOperation nOp = new NetworkTreeOperation(op); - list.add(nOp); - } - size = list.size(); - treeName = ""; + this("", "", _list); } @@ -88,5 +91,13 @@ public String getTreeName() { return treeName; } + + public long getTimeStamp() { + return timestamp; + } + + public void setTimeStamp(long _timestamp) { + timestamp = _timestamp; + } } diff -r e95faa202b4f -r 75cf01a430a6 src/alice/jungle/transaction/LocalTreeEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/alice/jungle/transaction/LocalTreeEditor.java Fri Nov 15 12:23:59 2013 +0900 @@ -0,0 +1,48 @@ +package alice.jungle.transaction; + +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.TreeContext; + +/** Edit tree without exporting logs. **/ +public class LocalTreeEditor> implements JungleTree { + private final AtomicReservableReference> repository; + private final String uuid; + private final String treeName; + private final ChangeListWriter writer; + private final TreeEditor editor; + + public LocalTreeEditor(String _treeName, TreeContext _tc,String _uuid,ChangeListWriter _writer,TreeEditor _editor) + { + treeName = _treeName; + repository = new AtomicReservableReference>(_tc); + uuid = _uuid; + writer = _writer; + editor = _editor; + } + + @Override + public JungleTreeEditor getTreeEditor() + { + TreeContext tc = repository.get(); + NetworkTransactionManager txManager = new NetworkTransactionManager(treeName, writer,tc,repository,uuid); + T root = tc.getTreeNode(); + return NetworkDefaultJungleTreeEditor.NewLocalJungleTreeEditor(treeName,root,txManager, editor); + } + + @Override + public Node getRootNode() + { + TreeContext tc = repository.get(); + ChangeSet cs = tc.getChangeSet(); + return cs.getRoot(); + } + + +} diff -r e95faa202b4f -r 75cf01a430a6 src/alice/jungle/transaction/NetworkDefaultJungleTree.java --- a/src/alice/jungle/transaction/NetworkDefaultJungleTree.java Mon Nov 11 19:35:22 2013 +0900 +++ b/src/alice/jungle/transaction/NetworkDefaultJungleTree.java Fri Nov 15 12:23:59 2013 +0900 @@ -34,7 +34,7 @@ T root = tc.getTreeNode(); return new NetworkDefaultJungleTreeEditor(treeName, root,txManager,editor); } - + @Override public Node getRootNode() { diff -r e95faa202b4f -r 75cf01a430a6 src/alice/jungle/transaction/NetworkDefaultJungleTreeEditor.java --- a/src/alice/jungle/transaction/NetworkDefaultJungleTreeEditor.java Mon Nov 11 19:35:22 2013 +0900 +++ b/src/alice/jungle/transaction/NetworkDefaultJungleTreeEditor.java Fri Nov 15 12:23:59 2013 +0900 @@ -1,8 +1,10 @@ package alice.jungle.transaction; +import java.io.IOException; import java.nio.ByteBuffer; +import alice.jungle.datasegment.store.container.DefaultTreeOperationLogContainer; 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.store.NodePath; @@ -22,9 +24,11 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TransactionManager; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; + import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; +import jungle.app.bbs.codesegment.HashLogUpdateCodeSegment; public class NetworkDefaultJungleTreeEditor> implements JungleTreeEditor { @@ -33,6 +37,7 @@ private final TreeEditor editor; private final String treeName; private final TreeOperationLog log; + private boolean exportLog; public NetworkDefaultJungleTreeEditor(String _treeName, T _root,TransactionManager _txManager,TreeEditor _editor) { @@ -46,6 +51,13 @@ txManager = _txManager; editor = _editor; log = _log; + exportLog = true; + } + + public static > NetworkDefaultJungleTreeEditor NewLocalJungleTreeEditor(String _treeName, T1 _root,TransactionManager _txManager,TreeEditor _editor) { + NetworkDefaultJungleTreeEditor treeEditor = new NetworkDefaultJungleTreeEditor(_treeName, _root,_txManager,_editor,new DefaultTreeOperationLog()); + treeEditor.exportLog = false; + return treeEditor; } private Either _edit(final NodePath _path,NodeEditor _e) @@ -71,6 +83,15 @@ TreeOperationLog newTreeOpLog = log.append(treeOperationLog); JungleTreeEditor newEditor = new NetworkDefaultJungleTreeEditor(treeName, newNode,txManager,editor,newTreeOpLog); + if(exportLog) { + try { + putTreeOperationLog(newTreeOpLog); + } catch (IOException e) { + return DefaultEither.newA(either.a()); + } + } + + return DefaultEither.newB(newEditor); } @@ -147,4 +168,31 @@ public TreeOperationLog getTreeOperationLog() { return log; } + + public void putTreeOperationLog(Iterable newLog) throws IOException { + String uuid = getID(); + String treeName = getTreeName(); + String updaterName = getID(); + String revision = getRevision(); + putDataSegment(uuid, treeName, updaterName, newLog, revision); + } + + public void putDataSegment(String _uuid, String _treeName, String _updaterName, Iterable newLog, String nextRevision) throws IOException { + DefaultTreeOperationLogContainer container = new DefaultTreeOperationLogContainer(); + container.setTreeName(_treeName); + container.setUUID(_uuid); + container.setUpdaterName(_updaterName); + container.setRevision(nextRevision); + container.unconvert(newLog); + HashLogUpdateCodeSegment cs = new HashLogUpdateCodeSegment(); + cs.ods.put("log", container); + cs.ods.put("logString", container.getHashLogString()); + /* If this node is not Root node, push log to parent node's DS */ + if(!_updaterName.equals("node0")) { + cs.ods.put("parent", "childLog", container); + } + } + + + } diff -r e95faa202b4f -r 75cf01a430a6 src/jungle/app/bbs/JungleManager.java --- a/src/jungle/app/bbs/JungleManager.java Mon Nov 11 19:35:22 2013 +0900 +++ b/src/jungle/app/bbs/JungleManager.java Fri Nov 15 12:23:59 2013 +0900 @@ -5,6 +5,7 @@ import java.util.Iterator; import alice.jungle.datasegment.store.container.DefaultTreeOperationLogContainer; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle; 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; @@ -12,10 +13,12 @@ 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.DefaultNodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultTreeOperationLog; 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.traverser.DefaultTraverser; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; @@ -25,7 +28,7 @@ private static int NOT_CHANGE_POSITION = 0; private JungleManager() { - + jungle = new DefaultJungle(null,"hogehoge",new DefaultTreeEditor(new DefaultTraverser())); } public static void setJungle(Jungle _j) { @@ -88,12 +91,13 @@ e.printStackTrace(); } String treeName = container.getTreeName(); - if (JungleManager.getJungle().getTreeByName(treeName) == null) { - if(null == JungleManager.getJungle().createNewTree(treeName)){ + Jungle jungle = JungleManager.getJungle(); + if (jungle.getTreeByName(treeName) == null) { + if(null == jungle.createNewTree(treeName)){ throw new IllegalStateException(); } } - JungleTree tree = JungleManager.getJungle().getTreeByName(treeName); + JungleTree tree = jungle.getTreeByName(treeName); JungleTreeEditor editor = tree.getTreeEditor(); int pos = calculatePosition(tree.getRootNode(), container.getTimeStamp()); Either either = JungleManager.edit(editor, log, pos); diff -r e95faa202b4f -r 75cf01a430a6 src/jungle/app/bbs/NetworkJungleBulletinBoard.java --- a/src/jungle/app/bbs/NetworkJungleBulletinBoard.java Mon Nov 11 19:35:22 2013 +0900 +++ b/src/jungle/app/bbs/NetworkJungleBulletinBoard.java Fri Nov 15 12:23:59 2013 +0900 @@ -1,14 +1,11 @@ package jungle.app.bbs; -import java.io.IOException; import java.nio.ByteBuffer; import java.util.Date; import java.util.concurrent.atomic.AtomicInteger; 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; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor; @@ -16,16 +13,13 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; -import jungle.app.bbs.codesegment.HashLogUpdateCodeSegment; public class NetworkJungleBulletinBoard implements BulletinBoard { @@ -79,12 +73,7 @@ throw new IllegalStateException(); } final long timestamp = new Date().getTime(); - /* Put DataSegment */ - try { - putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor,timestamp); - } catch (IOException e1) { - e1.printStackTrace(); - } + tree = jungle.getTreeByName(_name); editor = tree.getTreeEditor(); @@ -111,12 +100,6 @@ } editor = either.b(); editor.success(); - /* Put DataSegment */ - try { - putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor, timestamp); - } catch (IOException e1) { - e1.printStackTrace(); - } } @@ -157,12 +140,7 @@ } editor = either.b(); either = editor.success(); - try { - NetworkDefaultJungleTreeEditor netEditor = (NetworkDefaultJungleTreeEditor) editor; - putTreeOperationLog(netEditor, timestamp); - } catch (IOException e1) { - e1.printStackTrace(); - } + }while(either.isA()); /* Put DataSegment */ } @@ -193,11 +171,6 @@ } editor = either.b(); either = editor.success(); - try { - putTreeOperationLog((NetworkDefaultJungleTreeEditor)editor, timestamp); - } catch (IOException e1) { - e1.printStackTrace(); - } if(!either.isA()) { return; } @@ -225,31 +198,6 @@ return new IterableConverter(chs,converter); } - private void putTreeOperationLog(NetworkDefaultJungleTreeEditor editor, long timestamp) throws IOException { - String uuid = editor.getID(); - String treeName = editor.getTreeName(); - String updaterName = editor.getID(); - String revision = editor.getRevision(); - Iterable log = editor.getTreeOperationLog(); - putDataSegment(uuid, treeName, updaterName, log, revision, timestamp); - } - - private void putDataSegment(String _uuid, String _treeName, String _updaterName, Iterable _log, String nextRevision,long timestamp) throws IOException { - DefaultTreeOperationLogContainer container = new DefaultTreeOperationLogContainer(); - container.setTreeName(_treeName); - container.setUUID(_uuid); - container.setUpdaterName(_updaterName); - container.setRevision(nextRevision); - container.unconvert(_log); - container.setTimeStamp(timestamp); - HashLogUpdateCodeSegment cs = new HashLogUpdateCodeSegment(); - cs.ods.put("log", container); - cs.ods.put("logString", container.getHashLogString()); - /* If this node is not Root node, push log to parent node's DS */ - if(!_updaterName.equals("node0")) { - cs.ods.put("parent", "childLog", container); - } - } private static class BoardMessageImpl implements BoardMessage