# HG changeset patch # User tatsuki # Date 1426835922 -32400 # Node ID 89c15aa2bc6de31aac1d917469167ef76b3a5558 # Parent 3202a2a427b17e6ebce21b266f689a63134283cf change transaction diff -r 3202a2a427b1 -r 89c15aa2bc6d .idea/uiDesigner.xml --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.idea/uiDesigner.xml Fri Mar 20 16:18:42 2015 +0900 @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff -r 3202a2a427b1 -r 89c15aa2bc6d .settings/org.eclipse.jdt.core.prefs --- a/.settings/org.eclipse.jdt.core.prefs Tue Jan 20 09:30:59 2015 +0900 +++ b/.settings/org.eclipse.jdt.core.prefs Fri Mar 20 16:18:42 2015 +0900 @@ -1,5 +1,5 @@ # -#Thu Jan 15 09:34:36 JST 2015 +#Wed Mar 11 12:29:02 JST 2015 org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve @@ -8,8 +8,8 @@ org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.debug.lineNumber=generate -eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/core/NetworkDefaultJungle.java --- a/src/main/java/alice/jungle/core/NetworkDefaultJungle.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/alice/jungle/core/NetworkDefaultJungle.java Fri Mar 20 16:18:42 2015 +0900 @@ -8,15 +8,14 @@ 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.persistent.Journal; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext; 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.store.operations.TreeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeContext; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultTreeNode; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; +import fj.Ord; import fj.data.List; import fj.data.TreeMap; @@ -58,10 +57,9 @@ } }; TreeNode root = new DefaultTreeNode(); - TreeMap>> indexList = new Index().getIndex(); + TreeMap>> indexList = TreeMap.empty(Ord.stringOrd); TreeMap parentIndex = new ParentIndex().getParentIndex(); - ChangeSet set = new DefaultChangeSet(root, null, list, uuid, name, 0, indexList, parentIndex); - DefaultTreeContext tc = new DefaultTreeContext(root, set); + TreeContext tc = new DefaultTreeContext(root, null, list, uuid, name, 0, indexList, parentIndex); JungleTree newTree = new NetworkDefaultJungleTree(name, tc, uuid, journal.getWriter(), editor); if (trees.putIfAbsent(name, newTree) != null) { return null; diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/operations/NetworkDeleteAttributeOperation.java --- a/src/main/java/alice/jungle/operations/NetworkDeleteAttributeOperation.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/alice/jungle/operations/NetworkDeleteAttributeOperation.java Fri Mar 20 16:18:42 2015 +0900 @@ -7,7 +7,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/operations/NetworkDeleteChildAtOperation.java --- a/src/main/java/alice/jungle/operations/NetworkDeleteChildAtOperation.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/alice/jungle/operations/NetworkDeleteChildAtOperation.java Fri Mar 20 16:18:42 2015 +0900 @@ -7,7 +7,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/operations/NetworkNodeOperation.java --- a/src/main/java/alice/jungle/operations/NetworkNodeOperation.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/alice/jungle/operations/NetworkNodeOperation.java Fri Mar 20 16:18:42 2015 +0900 @@ -5,10 +5,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.AppendChildAt; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteAttribute; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.DeleteChildAt; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/operations/NetworkPutAttributeOperation.java --- a/src/main/java/alice/jungle/operations/NetworkPutAttributeOperation.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/alice/jungle/operations/NetworkPutAttributeOperation.java Fri Mar 20 16:18:42 2015 +0900 @@ -7,7 +7,6 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.PutAttribute; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; @Message diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/persistent/PersistentChangeList.java --- a/src/main/java/alice/jungle/persistent/PersistentChangeList.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/alice/jungle/persistent/PersistentChangeList.java Fri Mar 20 16:18:42 2015 +0900 @@ -4,7 +4,7 @@ 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.ChangeSet; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext; 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; @@ -26,7 +26,7 @@ uuid = _log.getUUID(); } - public PersistentChangeList(ChangeSet cs) { + public PersistentChangeList(TreeContext cs) { treeName = cs.getTreeName(); uuid = cs.uuid(); log = new NetworkTreeOperationLog(cs.getChangeList()); diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/persistent/PersistentChangeSet.java --- a/src/main/java/alice/jungle/persistent/PersistentChangeSet.java Tue Jan 20 09:30:59 2015 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -package alice.jungle.persistent; - -import fj.data.TreeMap; -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.impl.TreeNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; - -public class PersistentChangeSet implements ChangeSet { - private final TreeNode root; - private final ChangeSet previous; - private final ChangeList changeList; - private final String uuid; - private final long revision; - private final String treeName; - private final TreeMap>> indexList; - private final TreeMap parentIndex; - - public PersistentChangeSet(TreeNode _node, ChangeSet _prev, ChangeList _log, String _uuid, String _treeName, - long _revision, TreeMap>> indexList, - TreeMap parentIndex) { - root = _node; - previous = _prev; - changeList = _log; - uuid = _uuid; - revision = _revision; - treeName = _treeName; - this.indexList = indexList; - this.parentIndex = parentIndex; - } - - @Override - public TreeNode 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; - } - - @Override - public Index getIndex() { - return new Index(indexList); - } - - @Override - public ParentIndex getParentIndex() { - return new ParentIndex(parentIndex); - } - -} diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/persistent/PersistentJungle.java --- a/src/main/java/alice/jungle/persistent/PersistentJungle.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/alice/jungle/persistent/PersistentJungle.java Fri Mar 20 16:18:42 2015 +0900 @@ -3,18 +3,17 @@ import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; +import fj.Ord; import fj.data.List; import fj.data.TreeMap; 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.TreeContext; 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.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; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; public class PersistentJungle implements Jungle { @@ -55,10 +54,9 @@ } }; TreeNode root = new DefaultTreeNode(); - TreeMap>> indexList = new Index().getIndex(); + TreeMap>> indexList = TreeMap.empty(Ord.stringOrd); TreeMap parentIndex = new ParentIndex().getParentIndex(); - ChangeSet set = new PersistentChangeSet(root, null, list, uuid, name, 0, indexList, parentIndex); - DefaultTreeContext tc = new DefaultTreeContext(root, set); + TreeContext tc = new PersistentTreeContext(root, null, list, uuid, name, 0, indexList, parentIndex); JungleTree newTree = new PersistentJungleTree(name, tc, uuid, journal.getWriter(), editor); if (trees.putIfAbsent(name, newTree) != null) { return null; diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/persistent/PersistentJungleTree.java --- a/src/main/java/alice/jungle/persistent/PersistentJungleTree.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/alice/jungle/persistent/PersistentJungleTree.java Fri Mar 20 16:18:42 2015 +0900 @@ -1,30 +1,26 @@ package alice.jungle.persistent; -import fj.data.List; import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungleTree; 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.persistent.ChangeListWriter; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext; 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.DefaultTreeContext; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; 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.GetOldTreeError; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; +import java.util.concurrent.atomic.AtomicReference; + public class PersistentJungleTree implements JungleTree { - private final AtomicReservableReference repository; + private final AtomicReference repository; private final String uuid; private final String treeName; private final ChangeListWriter writer; @@ -33,7 +29,7 @@ public PersistentJungleTree(String _treeName, TreeContext _tc,String _uuid, ChangeListWriter _writer,TreeEditor _editor) { treeName = _treeName; - repository = new AtomicReservableReference(_tc); + repository = new AtomicReference(_tc); uuid = _uuid; writer = _writer; editor = _editor; @@ -44,7 +40,7 @@ { TreeContext tc = repository.get(); PersistentTransactionManager txManager = new PersistentTransactionManager(treeName, writer,tc,repository,uuid); - TreeNode root = tc.getTreeNode(); + TreeNode root = tc.getRoot(); return new DefaultJungleTreeEditor(root,txManager,editor); } @@ -52,8 +48,7 @@ public TreeNode getRootNode() { TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.getRoot(); + return tc.getRoot(); } @Override @@ -64,64 +59,56 @@ @Override public long revision() { TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.revision(); + return tc.revision(); } - @Override - public Either getOldTree(long revision) { - TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); + @Override + public Either getOldTree(long revision) { + TreeContext tc = repository.get(); - for (; cs.revision() != revision;) { - cs = cs.prev(); - if (cs == null) - return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND); - } + for (; tc.revision() != revision;) { + tc = tc.prev(); + if (tc == null) + return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND); + } - TreeNode root = cs.getRoot(); - TreeContext oldTc = new DefaultTreeContext(root, cs); - String oldTreeUuid = uuid + revision; - JungleTree oldTree = new DefaultJungleTree(oldTc, oldTreeUuid, writer, editor); - return DefaultEither.newB(oldTree); - } + String oldTreeUuid = uuid + revision; + JungleTree oldTree = new DefaultJungleTree(tc, oldTreeUuid, writer, editor); + return DefaultEither.newB(oldTree); + } @Override public ParentIndex getParentIndex() { TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.getParentIndex(); + return tc.getParentIndex(); } @Override - public Index getIndex() { + public TreeMap>> getIndex() { TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.getIndex(); + return tc.getIndex(); } @Override public InterfaceTraverser getTraverser(boolean useIndex) { - AtomicReservableReference.Reservation reservation = repository.getReservation(); - IndexManager indexManager = new IndexManager(reservation); - Index index = getIndex(); + TreeMap>> index = getIndex(); ParentIndex parentIndex = getParentIndex(); - return new InterfaceTraverser(getRootNode(), index, parentIndex, indexManager, useIndex); + return new InterfaceTraverser(getRootNode(), index, parentIndex, useIndex); } - @Override - public Either getNodeOfPath(NodePath path) { - TreeNode node = repository.get().getTreeNode(); - for (int num : path) { - if (num == -1) - continue; - Either either = node.getChildren().at(num); - if (either.isA()) - return either; - node = either.b(); + @Override + public Either getNodeOfPath(NodePath path) { + TreeNode node = repository.get().getRoot(); + for (int num : path) { + if (num == -1) + continue; + Either either = node.getChildren().at(num); + if (either.isA()) + return either; + node = either.b(); + } + return DefaultEither.newB(node); } - return DefaultEither.newB(node); - } } diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/persistent/PersistentTransactionManager.java --- a/src/main/java/alice/jungle/persistent/PersistentTransactionManager.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/alice/jungle/persistent/PersistentTransactionManager.java Fri Mar 20 16:18:42 2015 +0900 @@ -1,34 +1,30 @@ package alice.jungle.persistent; +import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; -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.TreeContext; 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.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.traverser.InterfaceTraverser; 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; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; +import java.util.concurrent.atomic.AtomicReference; + public class PersistentTransactionManager implements TransactionManager { - private final AtomicReservableReference repository; + private final AtomicReference repository; private final TreeContext tip; private final ChangeListWriter writer; private final String uuid; private final String treeName; public PersistentTransactionManager(String _treeName, ChangeListWriter _writer,TreeContext _tip, - AtomicReservableReference _repository,String _uuid) + AtomicReference _repository,String _uuid) { repository = _repository; tip = _tip; @@ -39,38 +35,29 @@ @Override public Either commit(TreeNode _newRoot,final TreeOperationLog _log) { - ChangeSet cs = tip.getChangeSet(); - long currentRevision = cs.revision(); + long currentRevision = tip.revision(); long nextRevision = currentRevision + 1; - - PersistentChangeList list = new PersistentChangeList(uuid, treeName, _log); - IndexManager indexManager = new IndexManager(repository.getReservation()); - InterfaceTraverser traverser = new InterfaceTraverser(_newRoot, indexManager, false); + + PersistentChangeList list = new PersistentChangeList(uuid, treeName, _log); + InterfaceTraverser traverser = new InterfaceTraverser(_newRoot,false); traverser.createIndex(); - Index index = traverser.getIndex(); + TreeMap>> index = traverser.getIndex(); ParentIndex parentIndex = traverser.getParentIndex(); - PersistentChangeSet newCs = new PersistentChangeSet(_newRoot, cs, list, uuid, treeName, nextRevision, index.getIndex(), parentIndex.getParentIndex()); - 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); - 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); + PersistentTreeContext newContext = new PersistentTreeContext(_newRoot, tip, list, uuid, treeName, nextRevision, index, parentIndex.getParentIndex()); + + if (repository.compareAndSet(newContext.prev(),newContext)) { + TransactionManager txManager = new PersistentTransactionManager(treeName, writer, newContext, repository, uuid); + return DefaultEither.newB(txManager); + } + + return DefaultEither.newA((Error) new DefaultError()); + } @Override public long getRevision() { - ChangeSet cs = tip.getChangeSet(); - return cs.revision(); + return tip.revision(); } @Override diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/persistent/PersistentTreeContext.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/alice/jungle/persistent/PersistentTreeContext.java Fri Mar 20 16:18:42 2015 +0900 @@ -0,0 +1,87 @@ +package alice.jungle.persistent; + +import fj.Ord; +import fj.data.TreeMap; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; +import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; + +public class PersistentTreeContext implements TreeContext { + private final TreeNode root; + private final TreeContext previous; + private final ChangeList changeList; + private final String uuid; + private final long revision; + private final String treeName; + private TreeMap>> indexList; + private TreeMap parentIndex; + + public PersistentTreeContext(TreeNode _node, TreeContext _prev, ChangeList _log, String _uuid, String _treeName, + long _revision, TreeMap>> indexList, + TreeMap parentIndex) { + root = _node; + previous = _prev; + changeList = _log; + uuid = _uuid; + revision = _revision; + treeName = _treeName; + this.indexList = indexList; + this.parentIndex = parentIndex; + } + + @Override + public TreeNode getRoot() { + return root; + } + + @Override + public TreeContext 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; + } + @Override + public TreeMap>> getIndex() { + return indexList; + } + + @Override + public ParentIndex getParentIndex() { + return new ParentIndex(parentIndex); + } + + @Override + public void setIndex(TreeMap>> indexList) { + this.indexList = indexList; + } + + @Override + public void setParentIndex(ParentIndex parentIndex) { + this.parentIndex = parentIndex.getParentIndex(); + } + +} diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/transaction/NetworkDefaultJungleTree.java --- a/src/main/java/alice/jungle/transaction/NetworkDefaultJungleTree.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/alice/jungle/transaction/NetworkDefaultJungleTree.java Fri Mar 20 16:18:42 2015 +0900 @@ -1,37 +1,36 @@ package alice.jungle.transaction; +import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungleTree; 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.persistent.ChangeListWriter; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext; 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.DefaultTreeContext; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.TreeContext; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser; 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.GetOldTreeError; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; +import java.util.concurrent.atomic.AtomicReference; + public class NetworkDefaultJungleTree implements JungleTree { - private final AtomicReservableReference repository; + private final AtomicReference repository; private final String uuid; private final String treeName; private final ChangeListWriter writer; private final TreeEditor editor; - + public NetworkDefaultJungleTree(String _treeName, TreeContext _tc,String _uuid,ChangeListWriter _writer,TreeEditor _editor) { treeName = _treeName; - repository = new AtomicReservableReference(_tc); + repository = new AtomicReference(_tc); uuid = _uuid; writer = _writer; editor = _editor; @@ -42,7 +41,7 @@ { TreeContext tc = repository.get(); NetworkTransactionManager txManager = new NetworkTransactionManager(treeName, writer,tc,repository,uuid); - TreeNode root = tc.getTreeNode(); + TreeNode root = tc.getRoot(); return new NetworkDefaultJungleTreeEditor(treeName, root,txManager,editor); } @@ -51,7 +50,7 @@ { TreeContext tc = repository.get(); NetworkTransactionManager txManager = new NetworkTransactionManager(treeName, writer,tc,repository,uuid); - TreeNode root = tc.getTreeNode(); + TreeNode root = tc.getRoot(); return NetworkDefaultJungleTreeEditor.NewLocalJungleTreeEditor(treeName,root,txManager, editor); } @@ -59,64 +58,55 @@ public TreeNode getRootNode() { TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.getRoot(); + return tc.getRoot(); } @Override public long revision() { TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.revision(); + return tc.revision(); } - @Override - public Either getOldTree(long revision) { - TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); + @Override + public Either getOldTree(long revision) { + TreeContext tc = repository.get(); - for (; cs.revision() != revision;) { - cs = cs.prev(); - if (cs == null) - return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND); - } + for (; tc.revision() != revision;) { + tc = tc.prev(); + if (tc == null) + return DefaultEither.newA(GetOldTreeError.OLD_TREE_NOT_FOUND); + } - TreeNode root = cs.getRoot(); - TreeContext oldTc = new DefaultTreeContext(root, cs); - String oldTreeUuid = uuid + revision; - JungleTree oldTree = new DefaultJungleTree(oldTc, oldTreeUuid, writer, editor); - return DefaultEither.newB(oldTree); - } + String oldTreeUuid = uuid + revision; + JungleTree oldTree = new DefaultJungleTree(tc, oldTreeUuid, writer, editor); + return DefaultEither.newB(oldTree); + } @Override public ParentIndex getParentIndex() { TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.getParentIndex(); + return tc.getParentIndex(); } @Override - public Index getIndex() { + public TreeMap>> getIndex() { TreeContext tc = repository.get(); - ChangeSet cs = tc.getChangeSet(); - return cs.getIndex(); + return tc.getIndex(); } @Override public InterfaceTraverser getTraverser(boolean useIndex) { - AtomicReservableReference.Reservation reservation = repository.getReservation(); - IndexManager indexManager = new IndexManager(reservation); - Index index = getIndex(); + TreeMap>> index = getIndex(); ParentIndex parentIndex = getParentIndex(); - return new InterfaceTraverser(getRootNode(), index, parentIndex, indexManager, useIndex); + return new InterfaceTraverser(getRootNode(), index, parentIndex, useIndex); } @Override public Either getNodeOfPath(NodePath path) { - TreeNode node = repository.get().getTreeNode(); + TreeNode node = repository.get().getRoot(); for (int num : path) { if (num == -1) continue; diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/transaction/NetworkDefaultJungleTreeEditor.java --- a/src/main/java/alice/jungle/transaction/NetworkDefaultJungleTreeEditor.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/alice/jungle/transaction/NetworkDefaultJungleTreeEditor.java Fri Mar 20 16:18:42 2015 +0900 @@ -182,4 +182,10 @@ CodeSegment cs = new LogPutCodeSegment(netLog); cs.execute(); } + + @Override + public Either replaceNewRootNode() { + // TODO Auto-generated method stub + return null; + } } diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/alice/jungle/transaction/NetworkTransactionManager.java --- a/src/main/java/alice/jungle/transaction/NetworkTransactionManager.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/alice/jungle/transaction/NetworkTransactionManager.java Fri Mar 20 16:18:42 2015 +0900 @@ -1,39 +1,34 @@ package alice.jungle.transaction; import java.util.Iterator; +import java.util.concurrent.atomic.AtomicReference; +import fj.data.TreeMap; 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 jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeContext; 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.AtomicReservableReference.Reservation; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction.DefaultChangeSet; 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.traverser.InterfaceTraverser; 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; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.Index; -import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.IndexManager; import jp.ac.u_ryukyu.ie.cr.tatsuki.jungle.store.index.ParentIndex; public class NetworkTransactionManager implements TransactionManager { - - private final AtomicReservableReference repository; + private final AtomicReference repository; private final TreeContext tip; private final ChangeListWriter writer; private final String uuid; private final String treeName; public NetworkTransactionManager(String _treeName, ChangeListWriter _writer, TreeContext _tip, - AtomicReservableReference _repository, String _uuid) { + AtomicReference _repository, String _uuid) { repository = _repository; tip = _tip; writer = _writer; @@ -42,9 +37,8 @@ } @Override - public Either commit(TreeNode _newRoot, final TreeOperationLog _log) { - ChangeSet cs = tip.getChangeSet(); - long currentRevision = cs.revision(); + public Either commit(TreeNode newRoot, final TreeOperationLog _log) { + long currentRevision = tip.revision(); long nextRevision = currentRevision + 1; ChangeList list = new ChangeList() { @@ -64,33 +58,25 @@ } }; - IndexManager indexManager = new IndexManager(repository.getReservation()); - InterfaceTraverser traverser = new InterfaceTraverser(_newRoot, indexManager, true); - traverser.createIndex(); - Index index = traverser.getIndex(); - ParentIndex parentIndex = traverser.getParentIndex(); - DefaultChangeSet newCs = new DefaultChangeSet(_newRoot, cs, list, uuid, treeName, nextRevision, index.getIndex(), parentIndex.getParentIndex()); + InterfaceTraverser traverser = new InterfaceTraverser(newRoot, true); + traverser.createIndex(); + TreeMap>> index = traverser.getIndex(); + ParentIndex parentIndex = traverser.getParentIndex(); + TreeContext newTreeContext = new DefaultTreeContext(newRoot , tip, list, uuid, treeName, nextRevision,index,parentIndex.getParentIndex()); - DefaultTreeContext newContext = new DefaultTreeContext(_newRoot, newCs); - @SuppressWarnings("rawtypes") - Reservation reservation = repository.makeReservation(tip, newContext); - if (reservation == null) { + if (repository.compareAndSet(newTreeContext.prev(),newTreeContext)) { + TransactionManager txManager = new NetworkTransactionManager(treeName, writer, newTreeContext, repository, uuid); + return DefaultEither.newB(txManager); + } + return DefaultEither.newA((Error) new DefaultError()); - } - Result r = writer.write(list); - if (r != Result.SUCCESS) { - return DefaultEither.newA((Error) new DefaultError()); - } - reservation.confirm(); - TransactionManager txManager = new NetworkTransactionManager(treeName, writer, newContext, repository, uuid); - return DefaultEither.newB(txManager); + } @Override public long getRevision() { - ChangeSet cs = tip.getChangeSet(); - return cs.revision(); + return tip.revision(); } @Override diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/app/bbs/DistributeApp.java --- a/src/main/java/app/bbs/DistributeApp.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/app/bbs/DistributeApp.java Fri Mar 20 16:18:42 2015 +0900 @@ -7,7 +7,7 @@ public class DistributeApp { public static void main(String[] args) throws Exception { RemoteConfig conf = new RemoteConfig(args); - System.out.println(System.getProperty("java.version")); + System.out.println("test"); if (conf.getManagerHostName() == null) { // String localHostName ="localhost"; // HostMessage host = new HostMessage(localHostName, conf.localPort); diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/app/bbs/ShowMessageWithTimeStampServlet.java --- a/src/main/java/app/bbs/ShowMessageWithTimeStampServlet.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/app/bbs/ShowMessageWithTimeStampServlet.java Fri Mar 20 16:18:42 2015 +0900 @@ -9,9 +9,7 @@ import org.eclipse.jetty.util.thread.ThreadPool; import fj.data.List; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs.BoardMessage; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs.GetAttributeImp; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath; public class ShowMessageWithTimeStampServlet extends HttpServlet { /** @@ -20,15 +18,13 @@ private static final long serialVersionUID = 1L; private final NetworkBulletinBoard bbs; private final String createBoardMessagePath; - private final String editMessagePath; private static final String PARAM_BOARD_NAME = "bname"; public ShowMessageWithTimeStampServlet(NetworkBulletinBoard _bbs, - String _createBoardMessagePath, String _editMessagePath,ThreadPool thp) { + String _createBoardMessagePath, ThreadPool thp) { bbs = _bbs; createBoardMessagePath = _createBoardMessagePath; - editMessagePath = _editMessagePath; } public void doGet(HttpServletRequest _req, HttpServletResponse _res) { diff -r 3202a2a427b1 -r 89c15aa2bc6d src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java --- a/src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java Tue Jan 20 09:30:59 2015 +0900 +++ b/src/main/java/app/bbs/codesegment/StartBBSCodeSegment.java Fri Mar 20 16:18:42 2015 +0900 @@ -82,7 +82,7 @@ Servlet editBoardMessage = new EditMessageServlet(cassaBBS); Servlet index = new ShowBoardsServlet(cassaBBS,createBoardPath,showBoardMessagePath); // Servlet board = new ShowBoardMessageServlet(cassaBBS,createBoardMessagePath,editMessagePath); - Servlet board = new ShowMessageWithTimeStampServlet(cassaBBS,createBoardMessagePath,editMessagePath,thp); + Servlet board = new ShowMessageWithTimeStampServlet(cassaBBS,createBoardMessagePath,thp); ServletHandler context = new ServletHandler(); context.addServletWithMapping(new ServletHolder(createBoardMessage),createBoardMessagePath);