# HG changeset patch # User Shoshi TAMAKI # Date 1358184282 -32400 # Node ID 53090dc21231178d85d512fe3ea6209c69538a72 # Parent f4be99977be2070531c11f9d7d0ca09e1edd75d9 added Commitment diff -r f4be99977be2 -r 53090dc21231 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ChangeSetRepository.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ChangeSetRepository.java Tue Jan 15 02:24:42 2013 +0900 @@ -0,0 +1,20 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; + +import java.util.concurrent.atomic.AtomicReference; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.util.Commitment; + +public class ChangeSetRepository +{ + private final AtomicReference> tip; + + public ChangeSetRepository() + { + tip = new AtomicReference>(); + } + + public Commitment.Publisher preCommit(DefaultChangeSet _changeSet) + { + + } +} diff -r f4be99977be2 -r 53090dc21231 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultModifiedTreeEditor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultModifiedTreeEditor.java Tue Jan 15 02:24:42 2013 +0900 @@ -0,0 +1,23 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; + +import fj.data.List; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListWriter; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.Logger; + +public class DefaultModifiedTreeEditor extends DefaultTreeEditor +{ + private final List logs; + + public DefaultModifiedTreeEditor(List _logs,DefaultChangeSet _tip,ChangeListWriter _writer, TraverserProvider _tProvider) + { + super(_tip,_writer,_tProvider); + logs = _logs; + } + + @Override + public boolean success() + { + // commit to presistent provider + return false; + } +} diff -r f4be99977be2 -r 53090dc21231 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Mon Jan 14 21:16:04 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Tue Jan 15 02:24:42 2013 +0900 @@ -9,6 +9,8 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TraversableTree; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditorError; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.Logger; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode; 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; @@ -92,6 +94,8 @@ private Either clone(Traversal _t,NodeEditor _editor) { + // copying nodes from bottom to root + List> path = List.nil(); for(Direction direction : _t){ path = path.cons(direction); @@ -99,8 +103,35 @@ // target Direction targetDirection = path.head(); - DefaultNode + LoggingNode loggingNode = (LoggingNode)_editor.edit(new LoggingNode(targetDirection.getTarget())); + Logger logger = loggingNode.getLogger(); + DefaultNode newNode = (DefaultNode)loggingNode.getWrapper(); - return null; + // top + int pos = targetDirection.getPosition(); + DefaultNode child = newNode; + for(Direction parentDirection : path.tail()){ + DefaultNode parent = parentDirection.getTarget(); + DefaultChildren chs = parent.getChildren(); + Either either = chs.replaceNode(child,pos); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + DefaultNode newParent = either.b(); + child = newParent; + pos = parentDirection.getPosition(); + } + + DefaultNode newRoot = child; + TreeEditor newEditor = new DefaultModifiedTreeEditor(logger); + return DefaultEither.newB(newEditor); + } + + protected Either newEditor(Logger _logger,DefaultNode _newRoot) + { + List logs = List.list(_logger); + TreeEditor newEditor = new DefaultModifiedTreeEditor(logs, + return DefaultEither.newB(_theB); } } \ No newline at end of file diff -r f4be99977be2 -r 53090dc21231 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java Mon Jan 14 21:16:04 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingNode.java Tue Jan 15 02:24:42 2013 +0900 @@ -36,4 +36,9 @@ { return log; } + + public EditableNode getWrapper() + { + return wrap; + } } diff -r f4be99977be2 -r 53090dc21231 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/util/Commitment.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/util/Commitment.java Tue Jan 15 02:24:42 2013 +0900 @@ -0,0 +1,94 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.util; + +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair; + +public final class Commitment +{ + private Commitment() + { + // + } + + public static Pair,Value> newInstance(T _draft,T _sub) + { + ValueWrapper fail = new ValueWrapper(_sub); + ValueWrapper init = new ValueWrapper(_sub); + ValueWrapper draft = new ValueWrapper(_draft); + AtomicReference> value = new AtomicReference>(init); + + Publisher p = new Publisher(value,draft,fail); + Value v = new Value(value,fail); + + return new Pair,Value>(p,v); + } + + public static class Publisher + { + private final AtomicReference> value; + private final ValueWrapper draft; + private final AtomicBoolean flag; + private final ValueWrapper fail; + + Publisher(AtomicReference> _value,ValueWrapper _draft,ValueWrapper _fail) + { + value = _value; + draft = _draft; + flag = new AtomicBoolean(false); + fail = _fail; + } + + public void commit() + { + if(flag.compareAndSet(true,false)){ + value.set(draft); + } + } + + public void fail() + { + if(flag.compareAndSet(true,false)){ + value.set(fail); + } + } + } + + public static class Value + { + private final AtomicReference> value; + private final ValueWrapper fail; + + Value(AtomicReference> _value,ValueWrapper _fail) + { + value = _value; + fail = _fail; + } + + public T get() + { + return value.get().get(); + } + + public boolean isFail() + { + return (value.get() == fail); + } + } + + private static class ValueWrapper + { + private final T object; + + public ValueWrapper(T _object) + { + object = _object; + } + + public T get() + { + return object; + } + } +} diff -r f4be99977be2 -r 53090dc21231 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/AppendChildAt.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/AppendChildAt.java Mon Jan 14 21:16:04 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/AppendChildAt.java Tue Jan 15 02:24:42 2013 +0900 @@ -4,7 +4,7 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -public class AppendChildAt implements NodeEditor +public class AppendChildAt implements NodeEditor { private final int pos; @@ -14,9 +14,9 @@ } @Override - public Either edit(T _e) + public Either edit(EditableNode _e) { - Either either = _e.getChildren().addNewChildAt(pos); + Either either = _e.getChildren().addNewChildAt(pos); if(either.isA()){ // error return either; diff -r f4be99977be2 -r 53090dc21231 src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditor.java Mon Jan 14 21:16:04 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditor.java Tue Jan 15 02:24:42 2013 +0900 @@ -3,7 +3,7 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; -public interface NodeEditor +public interface NodeEditor { - public Either edit(T _e); + public Either edit(EditableNode _e); }