# HG changeset patch # User Shoshi TAMAKI # Date 1360263021 -32400 # Node ID 8c6ff361b68a2a126987ecdccc3c984bc9ae82bc # Parent bc119c52d5cc813f9012f726a3ecd8bff85e5886 sleepy diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditor.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditor.java Fri Feb 08 02:21:00 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditor.java Fri Feb 08 03:50:21 2013 +0900 @@ -1,11 +1,11 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.ClonableNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; public interface TreeEditor { - public > Either edit(T _root,NodePath _path,NodeEditor _transformer); + public > Either edit(T _root,NodePath _path,NodeEditor _transformer); } diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ClonableAttributes.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ClonableAttributes.java Fri Feb 08 02:21:00 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,8 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableAttributes; - -public interface ClonableAttributes> extends EditableAttributes -{ - -} diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ClonableChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ClonableChildren.java Fri Feb 08 02:21:00 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableChildren; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; - -public interface ClonableChildren> extends EditableChildren -{ - public Either addNewChildAt(int _pos,T _newChild); - public Either replaceNode(int _pos,T _replacement); -} \ No newline at end of file diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ClonableNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ClonableNode.java Fri Feb 08 02:21:00 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,14 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; - -public interface ClonableNode> extends EditableNode -{ - @Override - public ClonableChildren getChildren(); - - @Override - public ClonableAttributes getAttributes(); - - public T createNewNode(); -} diff -r bc119c52d5cc -r 8c6ff361b68a 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 Fri Feb 08 02:21:00 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Fri Feb 08 03:50:21 2013 +0900 @@ -22,7 +22,7 @@ } @Override - public > Either edit(T _root,NodePath _path,NodeEditor _editor) + public > Either edit(T _root,NodePath _path,NodeEditor _editor) { DefaultEvaluator e = new DefaultEvaluator(_path); TraversableNodeWrapper wrap = new TraversableNodeWrapper(_root); @@ -38,7 +38,7 @@ return ret; } - private > Either clone(Traversal> _t,NodeEditor _editor) + private > Either clone(Traversal> _t,NodeEditor _editor) { // copying nodes from bottom to root @@ -50,19 +50,20 @@ // target Direction> targetDirection = path.head(); T target = targetDirection.getTarget().getWrapped(); - Either either = _editor.edit(target); + EditableNodeWrapper wrapper = new EditableNodeWrapper(target); + Either> either = _editor.edit(wrapper); if(either.isA()){ return DefaultEither.newA(either.a()); } - T newNode = either.b(); + T newNode = either.b().getWrap(); // top int pos = targetDirection.getPosition(); T child = newNode; for(Direction> parentDirection : path.tail()){ TraversableNodeWrapper parent = parentDirection.getTarget(); - ClonableChildren chs = parent.getWrapped().getChildren(); + TreeNodeChildren chs = parent.getWrapped().getChildren(); Either ret = chs.replaceNode(pos,child); if(ret.isA()){ diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/EditableNodeWrapper.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/EditableNodeWrapper.java Fri Feb 08 03:50:21 2013 +0900 @@ -0,0 +1,151 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; + +import java.nio.ByteBuffer; +import java.util.Iterator; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableAttributes; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableChildren; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; +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; + +public class EditableNodeWrapper> implements EditableNode> +{ + private final T wrap; + + public EditableNodeWrapper(T _wrap) + { + wrap = _wrap; + } + + @Override + public EditableAttributes> getAttributes() + { + return new EditableAttributesWrapper(wrap); + } + + @Override + public EditableChildren> getChildren() + { + return null; + } + + public T getWrap() + { + return wrap; + } + + private static class EditableAttributesWrapper> implements EditableAttributes> + { + private final TreeNodeAttributes attributes; + + public EditableAttributesWrapper(T _wrap) + { + attributes = _wrap.getAttributes(); + } + + @Override + public ByteBuffer get(String _key) + { + return attributes.get(_key); + } + + @Override + public Either> delete(String _key) + { + Either either = attributes.delete(_key); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + T newWrap = either.b(); + EditableNodeWrapper newWrapper = new EditableNodeWrapper(newWrap); + return DefaultEither.newB(newWrapper); + } + + @Override + public Either> put(String _key,ByteBuffer _value) + { + Either either = attributes.put(_key,_value); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + T newWrap = either.b(); + EditableNodeWrapper newWrapper = new EditableNodeWrapper(newWrap); + return DefaultEither.newB(newWrapper); + } + } + + public static class EditableChildrenWrapper> implements EditableChildren> + { + private final TreeNodeChildren children; + + public EditableChildrenWrapper(T _wrap) + { + children = _wrap.getChildren(); + } + + @Override + public Either at(int _pos) + { + Either either = children.at(_pos); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + + T target = either.b(); + Node newWrapper = new NodeWrapper(target); + return DefaultEither.newB(newWrapper); + } + + @Override + public int size() + { + return children.size(); + } + + @Override + public Iterator iterator() + { + IterableConverter.Converter converter = new IterableConverter.Converter(){ + @Override + public Node conv(T _b){ + return new NodeWrapper(_b); + } + }; + + + return new IterableConverter(children,converter).iterator(); + } + + @Override + public Either> addNewChildAt(int _pos) + { + Either either = children.addNewChildAt(_pos); + if(either.isA()){ + DefaultEither.newA(either.a()); + } + T newWrap = either.b(); + EditableNodeWrapper newWrapper = new EditableNodeWrapper(newWrap); + + return DefaultEither.newB(newWrapper); + } + + @Override + public Either> deleteChildAt(int _pos) + { + Either either = children.deleteChildAt(_pos); + if(either.isA()){ + DefaultEither.newA(either.a()); + } + T newWrap = either.b(); + EditableNodeWrapper newWrapper = new EditableNodeWrapper(newWrap); + + return DefaultEither.newB(newWrapper); + } + } +} diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/NodeWrapper.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/NodeWrapper.java Fri Feb 08 03:50:21 2013 +0900 @@ -0,0 +1,76 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; + +import java.util.Iterator; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; +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; + +public class NodeWrapper> implements Node +{ + private final T wrap; + + public NodeWrapper(T _wrap) + { + wrap = _wrap; + } + + @Override + public Attributes getAttributes() + { + return wrap.getAttributes(); + } + + @Override + public Children getChildren() + { + return new ChildrenWrapper(wrap); + } + + private static class ChildrenWrapper> implements Children + { + private final TreeNodeChildren children; + + public ChildrenWrapper(T _wrap) + { + children = _wrap.getChildren(); + } + + @Override + public Iterator iterator() + { + IterableConverter.Converter converter = new IterableConverter.Converter(){ + @Override + public Node conv(T _b){ + return new NodeWrapper(_b); + } + }; + + + return new IterableConverter(children,converter).iterator(); + } + + @Override + public Either at(int _pos) + { + Either either = children.at(_pos); + if(either.isA()){ + return DefaultEither.newA(either.a()); + } + T target = either.b(); + Node newWrapper = new NodeWrapper(target); + + return DefaultEither.newB(newWrapper); + } + + @Override + public int size() + { + return children.size(); + } + } +} diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TraversableNodeWrapper.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TraversableNodeWrapper.java Fri Feb 08 02:21:00 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TraversableNodeWrapper.java Fri Feb 08 03:50:21 2013 +0900 @@ -1,10 +1,8 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; import java.util.Iterator; - import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Parent; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.TraversableNode; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNode.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/TreeNode.java Fri Feb 08 03:50:21 2013 +0900 @@ -0,0 +1,15 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesContainer; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Parent; + +public interface TreeNode> extends Parent , AttributesContainer +{ + @Override + public TreeNodeChildren getChildren(); + + @Override + public TreeNodeAttributes getAttributes(); + + public T createNewNode(); +} diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeAttributes.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/TreeNodeAttributes.java Fri Feb 08 03:50:21 2013 +0900 @@ -0,0 +1,13 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; + +import java.nio.ByteBuffer; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + +public interface TreeNodeAttributes> extends Attributes +{ + public Either delete(String _key); + public Either put(String _key,ByteBuffer _value); +} diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeNodeChildren.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/TreeNodeChildren.java Fri Feb 08 03:50:21 2013 +0900 @@ -0,0 +1,15 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Parent; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; + +public interface TreeNodeChildren> extends Children +{ + public Either addNewChildAt(int _pos); + public Either deleteChildAt(int _pos); + public Either addNewChildAt(int _pos,T _newChild); + public Either replaceNode(int _pos,T _replacement); +} \ No newline at end of file diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/DefaultTreeOperationLog.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/logger/DefaultTreeOperationLog.java Fri Feb 08 03:50:21 2013 +0900 @@ -0,0 +1,46 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger; + +import java.util.Iterator; + +import fj.data.List; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DefaultTreeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; + +public class DefaultTreeOperationLog implements TreeOperationLog +{ + private final List list; + + public DefaultTreeOperationLog() + { + list = List.nil(); + } + + private DefaultTreeOperationLog(List _list) + { + list = _list; + } + + @Override + public Iterator iterator() + { + return list.iterator(); + } + + @Override + public TreeOperationLog add(NodePath _p, NodeOperation _op) + { + DefaultTreeOperation op = new DefaultTreeOperation(_p,_op); + List newList = list.snoc(op); + return new DefaultTreeOperationLog(newList); + } + + @Override + public int length() + { + return list.length(); + } + +} diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java Fri Feb 08 02:21:00 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java Fri Feb 08 03:50:21 2013 +0900 @@ -1,6 +1,8 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger; import java.util.Iterator; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.AppendChildAtOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteChildAtOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; @@ -30,19 +32,10 @@ } @Override - public Iterator> iterator() + public Iterator iterator() { EditableChildren children = wrap.getChildren(); - - IterableConverter.Converter,T> converter = new IterableConverter.Converter,T>(){ - @Override - public LoggingNode conv(T _b) { - return new LoggingNode(_b,log); - } - }; - - IterableConverter,T> iterable = new IterableConverter,T>(children,converter); - return iterable.iterator(); + return children.iterator(); } public Either> edit(NodeOperation _op) @@ -73,15 +66,15 @@ } @Override - public Either> at(int _pos) + public Either at(int _pos) { EditableChildren children = wrap.getChildren(); - Either either = children.at(_pos); + Either either = children.at(_pos); if(either.isA()){ return DefaultEither.newA(either.a()); } - T newWrap = either.b(); - return DefaultEither.newB(new LoggingNode(newWrap,log)); + Node node = either.b(); + return DefaultEither.newB(node); } } diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/TreeOperationLog.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/logger/TreeOperationLog.java Fri Feb 08 03:50:21 2013 +0900 @@ -0,0 +1,11 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.NodeOperation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.TreeOperation; + +public interface TreeOperationLog extends Iterable +{ + public TreeOperationLog add(NodePath _p,NodeOperation _op); + public int length(); +} diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteChildAtOperation.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteChildAtOperation.java Fri Feb 08 02:21:00 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteChildAtOperation.java Fri Feb 08 03:50:21 2013 +0900 @@ -21,7 +21,6 @@ return Command.DELETE_CHILD; } - @Override public > Either invoke(T _target) { diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableAttributes.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableAttributes.java Fri Feb 08 02:21:00 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableAttributes.java Fri Feb 08 03:50:21 2013 +0900 @@ -2,12 +2,10 @@ import java.nio.ByteBuffer; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Parent; -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 interface EditableAttributes> extends Attributes +public interface EditableAttributes extends Attributes { public Either delete(String _key); public Either put(String _key,ByteBuffer _value); diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableChildren.java Fri Feb 08 02:21:00 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableChildren.java Fri Feb 08 03:50:21 2013 +0900 @@ -1,12 +1,13 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Parent; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; -public interface EditableChildren> extends Children +public interface EditableChildren> extends Children { public Either addNewChildAt(int _pos); public Either deleteChildAt(int _pos); diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableNode.java Fri Feb 08 02:21:00 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableNode.java Fri Feb 08 03:50:21 2013 +0900 @@ -1,9 +1,10 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.AttributesContainer; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Parent; -public interface EditableNode> extends AttributesContainer , Parent +public interface EditableNode> extends AttributesContainer , Parent { public EditableAttributes getAttributes(); public EditableChildren getChildren(); diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/ClonableDefaultAttributes.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/ClonableDefaultAttributes.java Fri Feb 08 02:21:00 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; - -import java.nio.ByteBuffer; - -import fj.data.TreeMap; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultAttributes; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.ClonableAttributes; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultChildren; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError; -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; - -public class ClonableDefaultAttributes implements ClonableAttributes -{ - private final DefaultNode wrap; - - public ClonableDefaultAttributes(DefaultNode _wrap) - { - wrap = _wrap; - } - - @Override - public Either delete(String _key) - { - if(_key == null){ - return DefaultEither.newA(NodeEditorError.NULL_VALUE_NOT_ALLOWED); - } - - DefaultAttributes attrs = wrap.getAttributes(); - DefaultChildren children = wrap.getChildren(); - - TreeMap raw = attrs.getAttributesAsRawMap(); - if(!raw.contains(_key)){ - return DefaultEither.newA(NodeEditorError.DELETE_KEY_NOT_FOUND); - } - - TreeMap newMap = raw.delete(_key); - - DefaultNode newNode = new DefaultNode(children.getChildrenAsRawList(),newMap); - - return DefaultEither.newB(new ClonableDefaultNode(newNode)); - } - - @Override - public Either put(String _key, ByteBuffer _value) - { - if(_key == null || _value == null){ - return DefaultEither.newA(NodeEditorError.NULL_VALUE_NOT_ALLOWED); - } - - DefaultAttributes attrs = wrap.getAttributes(); - DefaultChildren children = wrap.getChildren(); - - TreeMap raw = attrs.getAttributesAsRawMap(); - TreeMap newMap = raw.set(_key,_value); - - DefaultNode newNode = new DefaultNode(children.getChildrenAsRawList(),newMap); - - return DefaultEither.newB(new ClonableDefaultNode(newNode)); - } - - @Override - public ByteBuffer get(String _key) - { - return wrap.getAttributes().get(_key); - } -} diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/ClonableDefaultChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/ClonableDefaultChildren.java Fri Feb 08 02:21:00 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,158 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; - -import java.nio.ByteBuffer; -import java.util.Iterator; -import fj.P2; -import fj.data.List; -import fj.data.TreeMap; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.ClonableChildren; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultAttributes; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultChildren; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError; -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; - -public class ClonableDefaultChildren implements ClonableChildren -{ - public static void main(String _args[]) - { - List list = List.range(0,5); - P2, List> split = list.splitAt(0); - System.out.println(split._1().length()); - System.out.println(split._2().length()); - - } - - private final DefaultNode node; - - public ClonableDefaultChildren(DefaultNode _node) - { - node = _node; - } - - private boolean boundaryCheck(int _pos) - { - int size = node.getChildren().size(); - if(size < _pos){ - return false; - } - - return true; - } - - @Override - public Either addNewChildAt(int _pos) - { - if(!boundaryCheck(_pos) || _pos < 0){ - return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - - DefaultChildren children = node.getChildren(); - DefaultAttributes attrs = node.getAttributes(); - - List raw = children.getChildrenAsRawList(); - - P2,List> split = raw.splitAt(_pos); - List newChildren = split._1().snoc(new DefaultNode()).append(split._2()); - DefaultNode newNode = new DefaultNode(newChildren,attrs.getAttributesAsRawMap()); - - return DefaultEither.newB(new ClonableDefaultNode(newNode)); - } - - @Override - public Either deleteChildAt(int _pos) - { - if(!boundaryCheck(_pos) || _pos < 0 || size() == 0){ - return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - - DefaultChildren chs = node.getChildren(); - List raw = chs.getChildrenAsRawList(); - - P2,List> split = raw.splitAt(_pos); - //List newChildren = split._1().init().append(split._2()); - List newChildren = split._1().append(split._2().tail()); - - DefaultAttributes attrs = node.getAttributes(); - TreeMap map = attrs.getAttributesAsRawMap(); - - DefaultNode newNode = new DefaultNode(newChildren,map); - - return DefaultEither.newB(new ClonableDefaultNode(newNode)); - } - - @Override - public int size() - { - return node.getChildren().size(); - } - - @Override - public Iterator iterator() - { - IterableConverter.Converter converter = new IterableConverter.Converter(){ - @Override - public ClonableDefaultNode conv(DefaultNode _b) - { - return new ClonableDefaultNode(_b); - } - }; - - List raw = node.getChildren().getChildrenAsRawList(); - return new IterableConverter(raw,converter).iterator(); - } - - @Override - public Either replaceNode(int _pos,ClonableDefaultNode _replacement) - { - int size = node.getChildren().size(); - if(!(0 <= _pos && _pos < size)){ - return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - DefaultNode replacement = _replacement.getWrapped(); - - List rawList = node.getChildren().getChildrenAsRawList(); - P2,List> split = rawList.splitAt(_pos + 1); - List init = split._1().init(); - List newInit = init.snoc(replacement); - List newList = newInit.append(split._2()); - TreeMap rawMap = node.getAttributes().getAttributesAsRawMap(); - - return DefaultEither.newB(new ClonableDefaultNode(new DefaultNode(newList,rawMap))); - } - - @Override - public Either at(int _pos) - { - List rawList = node.getChildren().getChildrenAsRawList(); - DefaultNode ch = rawList.index(_pos); - if(ch == null){ - return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - - return DefaultEither.newB(new ClonableDefaultNode(ch)); - } - - @Override - public Either addNewChildAt(int _pos,ClonableDefaultNode _newChild) - { - if(!boundaryCheck(_pos) || _pos < 0){ - return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); - } - DefaultNode newChild = _newChild.getWrapped(); - - List raw = node.getChildren().getChildrenAsRawList(); - TreeMap rawMap = node.getAttributes().getAttributesAsRawMap(); - - P2,List> split = raw.splitAt(_pos); - List newChildren = split._1().snoc(newChild).append(split._2()); - DefaultNode newNode = new DefaultNode(newChildren,rawMap); - - return DefaultEither.newB(new ClonableDefaultNode(newNode)); - } -} diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/ClonableDefaultNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/ClonableDefaultNode.java Fri Feb 08 02:21:00 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.ClonableNode; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode; - -public class ClonableDefaultNode implements ClonableNode -{ - private final DefaultNode wrap; - - public ClonableDefaultNode() - { - this(new DefaultNode()); - } - - public ClonableDefaultNode(DefaultNode _wrap) - { - wrap = _wrap; - } - - @Override - public ClonableDefaultChildren getChildren() - { - return new ClonableDefaultChildren(wrap); - } - - @Override - public ClonableDefaultAttributes getAttributes() - { - return new ClonableDefaultAttributes(wrap); - } - - @Override - public ClonableDefaultNode createNewNode() - { - return new ClonableDefaultNode(new DefaultNode()); - } - - public DefaultNode getWrapped() - { - return wrap; - } -} diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNode.java Fri Feb 08 03:50:21 2013 +0900 @@ -0,0 +1,42 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode; + +public class DefaultTreeNode implements TreeNode +{ + private final DefaultNode wrap; + + public DefaultTreeNode() + { + this(new DefaultNode()); + } + + public DefaultTreeNode(DefaultNode _wrap) + { + wrap = _wrap; + } + + @Override + public DefaultTreeNodeChildren getChildren() + { + return new DefaultTreeNodeChildren(wrap); + } + + @Override + public DefaultTreeNodeAttribute getAttributes() + { + return new DefaultTreeNodeAttribute(wrap); + } + + @Override + public DefaultTreeNode createNewNode() + { + return new DefaultTreeNode(new DefaultNode()); + } + + public DefaultNode getWrap() + { + return wrap; + } +} diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeAttribute.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeAttribute.java Fri Feb 08 03:50:21 2013 +0900 @@ -0,0 +1,68 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; + +import java.nio.ByteBuffer; +import fj.data.TreeMap; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultAttributes; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultChildren; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeAttributes; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError; +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; + +public class DefaultTreeNodeAttribute implements TreeNodeAttributes +{ + private final DefaultNode wrap; + + public DefaultTreeNodeAttribute(DefaultNode _wrap) + { + wrap = _wrap; + } + + @Override + public Either delete(String _key) + { + if(_key == null){ + return DefaultEither.newA(NodeEditorError.NULL_VALUE_NOT_ALLOWED); + } + + DefaultAttributes attrs = wrap.getAttributes(); + DefaultChildren children = wrap.getChildren(); + + TreeMap raw = attrs.getAttributesAsRawMap(); + if(!raw.contains(_key)){ + return DefaultEither.newA(NodeEditorError.DELETE_KEY_NOT_FOUND); + } + + TreeMap newMap = raw.delete(_key); + + DefaultNode newNode = new DefaultNode(children.getChildrenAsRawList(),newMap); + + return DefaultEither.newB(new DefaultTreeNode(newNode)); + } + + @Override + public Either put(String _key, ByteBuffer _value) + { + if(_key == null || _value == null){ + return DefaultEither.newA(NodeEditorError.NULL_VALUE_NOT_ALLOWED); + } + + DefaultAttributes attrs = wrap.getAttributes(); + DefaultChildren children = wrap.getChildren(); + + TreeMap raw = attrs.getAttributesAsRawMap(); + TreeMap newMap = raw.set(_key,_value); + + DefaultNode newNode = new DefaultNode(children.getChildrenAsRawList(),newMap); + + return DefaultEither.newB(new DefaultTreeNode(newNode)); + } + + @Override + public ByteBuffer get(String _key) + { + return wrap.getAttributes().get(_key); + } +} diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/DefaultTreeNodeChildren.java Fri Feb 08 03:50:21 2013 +0900 @@ -0,0 +1,155 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.transaction; + +import java.nio.ByteBuffer; +import java.util.Iterator; +import fj.P2; +import fj.data.List; +import fj.data.TreeMap; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultAttributes; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultChildren; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNodeChildren; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditorError; +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; + +public class DefaultTreeNodeChildren implements TreeNodeChildren +{ + public static void main(String _args[]) + { + List list = List.range(0,5); + P2, List> split = list.splitAt(0); + System.out.println(split._1().length()); + System.out.println(split._2().length()); + + } + + private final DefaultNode node; + + public DefaultTreeNodeChildren(DefaultNode _node) + { + node = _node; + } + + private boolean boundaryCheck(int _pos) + { + int size = node.getChildren().size(); + if(size < _pos){ + return false; + } + + return true; + } + + @Override + public Either addNewChildAt(int _pos) + { + if(!boundaryCheck(_pos) || _pos < 0){ + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + DefaultChildren children = node.getChildren(); + DefaultAttributes attrs = node.getAttributes(); + + List raw = children.getChildrenAsRawList(); + + P2,List> split = raw.splitAt(_pos); + List newChildren = split._1().snoc(new DefaultNode()).append(split._2()); + DefaultNode newNode = new DefaultNode(newChildren,attrs.getAttributesAsRawMap()); + + return DefaultEither.newB(new DefaultTreeNode(newNode)); + } + + @Override + public Either deleteChildAt(int _pos) + { + if(!boundaryCheck(_pos) || _pos < 0 || size() == 0){ + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + DefaultChildren chs = node.getChildren(); + List raw = chs.getChildrenAsRawList(); + + P2,List> split = raw.splitAt(_pos); + List newChildren = split._1().append(split._2().tail()); + + DefaultAttributes attrs = node.getAttributes(); + TreeMap map = attrs.getAttributesAsRawMap(); + + DefaultNode newNode = new DefaultNode(newChildren,map); + + return DefaultEither.newB(new DefaultTreeNode(newNode)); + } + + @Override + public int size() + { + return node.getChildren().size(); + } + + @Override + public Iterator iterator() + { + IterableConverter.Converter converter = new IterableConverter.Converter(){ + @Override + public DefaultTreeNode conv(DefaultNode _b) + { + return new DefaultTreeNode(_b); + } + }; + + List raw = node.getChildren().getChildrenAsRawList(); + return new IterableConverter(raw,converter).iterator(); + } + + @Override + public Either replaceNode(int _pos,DefaultTreeNode _replacement) + { + int size = node.getChildren().size(); + if(!(0 <= _pos && _pos < size)){ + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + DefaultNode replacement = _replacement.getWrap(); + + List rawList = node.getChildren().getChildrenAsRawList(); + P2,List> split = rawList.splitAt(_pos + 1); + List init = split._1().init(); + List newInit = init.snoc(replacement); + List newList = newInit.append(split._2()); + TreeMap rawMap = node.getAttributes().getAttributesAsRawMap(); + + return DefaultEither.newB(new DefaultTreeNode(new DefaultNode(newList,rawMap))); + } + + @Override + public Either at(int _pos) + { + List rawList = node.getChildren().getChildrenAsRawList(); + DefaultNode ch = rawList.index(_pos); + if(ch == null){ + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + + return DefaultEither.newB(new DefaultTreeNode(ch)); + } + + @Override + public Either addNewChildAt(int _pos,DefaultTreeNode _newChild) + { + if(!boundaryCheck(_pos) || _pos < 0){ + return DefaultEither.newA(NodeEditorError.INDEX_OUT_OF_BOUNDS); + } + DefaultNode newChild = _newChild.getWrap(); + + List raw = node.getChildren().getChildrenAsRawList(); + TreeMap rawMap = node.getAttributes().getAttributesAsRawMap(); + + P2,List> split = raw.splitAt(_pos); + List newChildren = split._1().snoc(newChild).append(split._2()); + DefaultNode newNode = new DefaultNode(newChildren,rawMap); + + return DefaultEither.newB(new DefaultTreeNode(newNode)); + } +} diff -r bc119c52d5cc -r 8c6ff361b68a src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java Fri Feb 08 02:21:00 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/transaction/TransactionManager.java Fri Feb 08 03:50:21 2013 +0900 @@ -2,12 +2,13 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNode; 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.OperationLog; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; public interface TransactionManager { - public Either commit(DefaultNode _newRoot,Logger _log); + public Either commit(DefaultNode _newRoot,TreeOperationLog _log); public String getUUID(); public long getRevision(); }