# HG changeset patch # User Shoshi TAMAKI # Date 1357827762 -32400 # Node ID 3ef2a66a8c5ddf9388f402ce5ba265ea70804052 # Parent 9fd57b7c6adb9e2f2ee00d1b34b4f1b11b250350 commit diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditResult.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditResult.java Mon Jan 07 23:22:36 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; - -public interface TreeEditResult -{ - public TreeEditor getNewEditor(); - public TreeEditResultStatus getStatus(); -} diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditResultStatus.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditResultStatus.java Mon Jan 07 23:22:36 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; - -public enum TreeEditResultStatus -{ - NODEPATH_NOTFOUND; -} diff -r 9fd57b7c6adb -r 3ef2a66a8c5d 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 Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditor.java Thu Jan 10 23:22:42 2013 +0900 @@ -1,19 +1,18 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; import java.nio.ByteBuffer; - 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 TraversableTree getTree(); - public TreeEditResult appendChild(NodePath _path,int _pos); - public TreeEditResult deleteChild(NodePath _path,int _pos); - - public TreeEditResult putAttribute(NodePath _path,String _key,ByteBuffer _value); - public TreeEditResult deleteAttribute(NodePath _path,String _key); - - public TreeEditResult edit(NodePath _path,NodeEditor _transformer); + public Either appendChild(NodePath _path,int _pos); + public Either deleteChild(NodePath _path,int _pos); + public Either putAttribute(NodePath _path,String _key,ByteBuffer _value); + public Either deleteAttribute(NodePath _path,String _key); + public Either edit(NodePath _path,NodeEditor _transformer); public boolean success(); } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditorError.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/TreeEditorError.java Thu Jan 10 23:22:42 2013 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError; + +public class TreeEditorError +{ + public static final Error NODEPATH_NOTFOUND = new DefaultError(); +} diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultAttributes.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultAttributes.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultAttributes.java Thu Jan 10 23:22:42 2013 +0900 @@ -7,6 +7,8 @@ import fj.data.TreeMap; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Attributes; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableAttributes; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableNode; public class DefaultAttributes implements Attributes { @@ -39,4 +41,5 @@ Option result = attrs.get(_key); return result.isSome() ? result.some() : null; } + } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChildren.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChildren.java Thu Jan 10 23:22:42 2013 +0900 @@ -17,10 +17,6 @@ private final List children; private static final List EMPTY = List.nil(); - public enum Error{ - INVALID_POSITION; - } - public DefaultChildren() { this(EMPTY); @@ -82,7 +78,7 @@ } @Override - public EditableNode addNewChildAt(int _pos) + public Either addNewChildAt(int _pos) { return null; diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultNode.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultNode.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultNode.java Thu Jan 10 23:22:42 2013 +0900 @@ -1,21 +1,32 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; +import java.nio.ByteBuffer; +import java.util.Iterator; + +import fj.Ord; +import fj.data.List; +import fj.data.Option; +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.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.Either; public class DefaultNode implements EditableNode { - public final DefaultAttributes attrs; - public final DefaultChildren children; + public List children; + public TreeMap attrs; + + private static final List NIL_LIST = List.nil(); + private static final TreeMap NIL_MAP = TreeMap.empty(Ord.stringOrd); public DefaultNode() { - this(new DefaultChildren(),new DefaultAttributes()); + this(NIL_LIST,NIL_MAP); } - public DefaultNode(DefaultChildren _children,DefaultAttributes _attrs) + public DefaultNode(List _children,TreeMap _attrs) { attrs = _attrs; children = _children; @@ -24,12 +35,12 @@ @Override public EditableChildren getChildren() { - return children; + return new DefaultChildren(children,attrs); } @Override public EditableAttributes getAttributes() { - return attrs; + return new DefaultAttributes(children,attrs); } } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTraversableTree.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTraversableTree.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTraversableTree.java Thu Jan 10 23:22:42 2013 +0900 @@ -3,8 +3,8 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Tree; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TraversableTree; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traversal; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.TraverseEvaluator; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.TraverseResult; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traverser; public class DefaultTraversableTree implements TraversableTree @@ -25,7 +25,7 @@ } @Override - public Iterable traverse(TraverseEvaluator _e) + public Iterable traverse(TraverseEvaluator _e) { return traverser.traverse(tree,_e); } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditResult.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditResult.java Mon Jan 07 23:22:36 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditResult; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditResultStatus; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditor; - -public class DefaultTreeEditResult implements TreeEditResult -{ - private final TreeEditor editor; - private final TreeEditResultStatus status; - - public DefaultTreeEditResult(TreeEditor _editor,TreeEditResultStatus _status) - { - editor = _editor; - status = _status; - } - - @Override - public TreeEditor getNewEditor() - { - return editor; - } - - @Override - public TreeEditResultStatus getStatus() - { - return status; - } -} diff -r 9fd57b7c6adb -r 3ef2a66a8c5d 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 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java Thu Jan 10 23:22:42 2013 +0900 @@ -8,9 +8,8 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeList; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TraversableTree; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditResult; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TreeEditResultStatus; 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.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; @@ -18,8 +17,12 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.SetAttribute; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverseEvaluator; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traversal; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.TraverseResult; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traverser; +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 DefaultTreeEditor implements TreeEditor { @@ -39,26 +42,26 @@ } @Override - public TreeEditResult appendChild(NodePath _path,int _pos) + public Either appendChild(NodePath _path,int _pos) { return edit(_path,new AppendChildAt(_pos)); } @Override - public TreeEditResult deleteChild(NodePath _path,int _pos) + public Either deleteChild(NodePath _path,int _pos) { return edit(_path,new DeleteChildAt(_pos)); } @Override - public TreeEditResult putAttribute(NodePath _path, String _key,ByteBuffer _value) + public Either putAttribute(NodePath _path, String _key,ByteBuffer _value) { return edit(_path,new SetAttribute(_key,_value)); } @Override - public TreeEditResult deleteAttribute(NodePath _path, String _key) + public Either deleteAttribute(NodePath _path, String _key) { return edit(_path,new DeleteAttribute(_key)); } @@ -70,23 +73,23 @@ } @Override - public TreeEditResult edit(NodePath _path, NodeEditor _editor) + public Either edit(NodePath _path, NodeEditor _editor) { Tree t = tip.getTree(); Traverser traverser = new DefaultTraverser(); DefaultTraverseEvaluator te = new DefaultTraverseEvaluator(_path); - Iterable result = traverser.traverse(t,te); - Iterator itr = result.iterator(); + Iterable result = traverser.traverse(t,te); + Iterator itr = result.iterator(); if(itr.hasNext()){ - TraverseResult r = itr.next(); + Traversal r = itr.next(); cloneAndApplyToNodeEditorFromRoot(r,_editor); } - return new DefaultTreeEditResult(null,TreeEditResultStatus.NODEPATH_NOTFOUND); + return DefaultEither.newA(TreeEditorError.NODEPATH_NOTFOUND); } - public void cloneAndApplyToNodeEditorFromRoot(TraverseResult _r,NodeEditor _editor) + public void cloneAndApplyToNodeEditorFromRoot(Traversal _r,NodeEditor _editor) { LinkedList path = new LinkedList(); @@ -97,6 +100,4 @@ } - - } \ No newline at end of file diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingAttributes.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingAttributes.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingAttributes.java Thu Jan 10 23:22:42 2013 +0900 @@ -7,6 +7,8 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.SetAttributeOperation; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.EditableAttributes; 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; public class LoggingAttributes implements EditableAttributes { @@ -26,8 +28,14 @@ } @Override - public EditableNode delete(final String _key) + public Either delete(final String _key) { + + Either either = wrap.delete(_key); + if(either.isA()){ + return either; + } + Operation opDelete = new DeleteAttributeOperation(){ @Override public String getKey(){ @@ -36,14 +44,20 @@ }; Logger newLog = log.add(opDelete); - EditableNode newWrap = wrap.delete(_key); + EditableNode newWrap = either.b(); + EditableNode newLoggingNode = new LoggingNode(newWrap,newLog); - return new LoggingNode(newWrap,newLog); + return DefaultEither.newB(newLoggingNode); } @Override - public EditableNode put(final String _key,final ByteBuffer _value) + public Either put(final String _key,final ByteBuffer _value) { + Either either = wrap.put(_key,_value); + if(either.isA()){ + return either; + } + Operation opPut = new SetAttributeOperation(){ @Override public String getKey(){ @@ -57,8 +71,8 @@ }; Logger newLog = log.add(opPut); - EditableNode newWrap = wrap.put(_key,_value); + EditableNode newLoggingNode = new LoggingNode(either.b(),newLog); - return new LoggingNode(newWrap,newLog); + return DefaultEither.newB(newLoggingNode); } } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d 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 Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/logger/LoggingChildren.java Thu Jan 10 23:22:42 2013 +0900 @@ -8,6 +8,8 @@ import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation; 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.IterableWrapper; public class LoggingChildren implements EditableChildren @@ -35,8 +37,13 @@ } @Override - public EditableNode addNewChildAt(final int _pos) + public Either addNewChildAt(final int _pos) { + Either either = wrap.addNewChildAt(_pos); + if(either.isA()){ + return either; + } + Operation opAddChild = new AppendChildAtOperation(){ @Override public int position(){ @@ -45,14 +52,20 @@ }; Logger newLog = log.add(opAddChild); - EditableNode newWrap = wrap.addNewChildAt(_pos); + EditableNode newWrap = either.b(); + EditableNode newLoggingNode = new LoggingNode(newWrap,newLog); - return new LoggingNode(newWrap,newLog); + return DefaultEither.newB(newLoggingNode); } @Override - public EditableNode deleteChildAt(final int _pos) + public Either deleteChildAt(final int _pos) { + Either either = wrap.deleteChildAt(_pos); + if(either.isA()){ + return either; + } + Operation opDeleteChild = new DeleteChildAtOperation(){ @Override public int position(){ @@ -61,8 +74,8 @@ }; Logger newLog = log.add(opDeleteChild); - EditableNode newWrap = wrap.deleteChildAt(_pos); + EditableNode newLoggingNode = new LoggingNode(either.b(),newLog); - return new LoggingNode(newWrap,newLog); + return DefaultEither.newB(newLoggingNode); } } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d 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 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/AppendChildAt.java Thu Jan 10 23:22:42 2013 +0900 @@ -1,5 +1,8 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; + public class AppendChildAt implements NodeEditor { private final int pos; @@ -10,9 +13,14 @@ } @Override - public NodeEditResult edit(EditableNode _e) + public Either edit(EditableNode _e) { - EditableNode node = _e.getChildren().addNewChildAt(pos); - return new DefaultNodeEditResult(NodeEditResultStatus.SUCCESS,node); + Either either = _e.getChildren().addNewChildAt(pos); + if(either.isA()){ + // error + + } + + return DefaultEither.newB(either.b()); } } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableChildren.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableChildren.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableChildren.java Thu Jan 10 23:22:42 2013 +0900 @@ -5,6 +5,7 @@ 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.Operation; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; public class DefaultEditableChildren implements EditableChildren { @@ -30,7 +31,7 @@ } @Override - public EditableNode addNewChildAt(final int _pos) + public Either addNewChildAt(final int _pos) { AppendChildAtOperation op = new AppendChildAtOperation(){ @Override @@ -43,7 +44,7 @@ } @Override - public EditableNode deleteChildAt(int _pos) + public Either deleteChildAt(int _pos) { return null; } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteAttribute.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteAttribute.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteAttribute.java Thu Jan 10 23:22:42 2013 +0900 @@ -1,5 +1,7 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; + public class DeleteAttribute implements NodeEditor { private final String key; @@ -10,9 +12,8 @@ } @Override - public NodeEditResult edit(EditableNode _e) + public Either edit(EditableNode _e) { - EditableNode node = _e.getAttributes().delete(key); - return new DefaultNodeEditResult(NodeEditResultStatus.SUCCESS,node); + return _e.getAttributes().delete(key); } } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteChildAt.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteChildAt.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DeleteChildAt.java Thu Jan 10 23:22:42 2013 +0900 @@ -1,5 +1,7 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; + public class DeleteChildAt implements NodeEditor { private final int pos; @@ -10,9 +12,8 @@ } @Override - public NodeEditResult edit(EditableNode _e) + public Either edit(EditableNode _e) { - EditableNode node = _e.getChildren().deleteChildAt(pos); - return new DefaultNodeEditResult(NodeEditResultStatus.SUCCESS,node); + return _e.getChildren().deleteChildAt(pos); } } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d 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 Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableAttributes.java Thu Jan 10 23:22:42 2013 +0900 @@ -3,9 +3,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.util.Either; public interface EditableAttributes extends Attributes { - public EditableNode delete(String _key); - public EditableNode put(String _key,ByteBuffer _value); + public Either delete(String _key); + public Either put(String _key,ByteBuffer _value); } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d 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 Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditableChildren.java Thu Jan 10 23:22:42 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.Children; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; public interface EditableChildren extends Children { - public EditableNode addNewChildAt(int _pos); - public EditableNode deleteChildAt(int _pos); + public Either addNewChildAt(int _pos); + public Either deleteChildAt(int _pos); } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditResultStatus.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditResultStatus.java Mon Jan 07 23:22:36 2013 +0900 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,6 +0,0 @@ -package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; - -public enum NodeEditResultStatus -{ - SUCCESS,FAIL; -} diff -r 9fd57b7c6adb -r 3ef2a66a8c5d 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 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditor.java Thu Jan 10 23:22:42 2013 +0900 @@ -1,6 +1,8 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; + public interface NodeEditor { - public NodeEditResult edit(EditableNode _e); + public Either edit(EditableNode _e); } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditorError.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/NodeEditorError.java Thu Jan 10 23:22:42 2013 +0900 @@ -0,0 +1,9 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultError; + +public class NodeEditorError +{ + public static final Error INDEX_OUT_OF_BOUNDS = new DefaultError(); +} diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/SetAttribute.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/SetAttribute.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/SetAttribute.java Thu Jan 10 23:22:42 2013 +0900 @@ -2,6 +2,8 @@ import java.nio.ByteBuffer; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either; + public class SetAttribute implements NodeEditor { private final String key; @@ -14,9 +16,9 @@ } @Override - public NodeEditResult edit(EditableNode _e) + public Either edit(EditableNode _e) { EditableAttributes attrs = _e.getAttributes(); - return new DefaultNodeEditResult(NodeEditResultStatus.SUCCESS,attrs.put(key,value)); + return attrs.put(key,value); } } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraversal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraversal.java Thu Jan 10 23:22:42 2013 +0900 @@ -0,0 +1,22 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; + +import java.util.Iterator; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; + +public class DefaultTraversal implements Traversal +{ + + @Override + public Iterator iterator() + { + return null; + } + + @Override + public Node destination() + { + return null; + } + +} diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/DefaultTraverser.java Thu Jan 10 23:22:42 2013 +0900 @@ -1,30 +1,51 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; import java.util.Iterator; - import fj.P; import fj.P2; import fj.data.List; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Tree; -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableWrapper; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter; +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter.Converter; public class DefaultTraverser implements Traverser { @Override - public Iterable traverse(Tree _tree, TraverseEvaluator _evaluator) + public Iterable traverse(Tree _tree, TraverseEvaluator _evaluator) { Node root = _tree.getRoot(); List current = List.nil(); TraverseEvaluator evaluator = _evaluator; - List totalResult = _traverse(current,root,evaluator); + List> totalResult = _traverse(current,root,evaluator); - return new IterableWrapper(totalResult); + Converter> converter = new IterableConverter.Converter>(){ + @Override + public Traversal conv(final List _b) + { + Traversal t = new Traversal(){ + @Override + public Iterator iterator(){ + return _b.iterator(); + } + + @Override + public Node destination() { + return _b.last(); + } + + }; + + return t; + } + }; + + return new IterableConverter>(totalResult,converter); } - private List _traverse(List _path,Node _current,TraverseEvaluator _evaluator) + private List> _traverse(List _path,Node _current,TraverseEvaluator _evaluator) { List currentPath = _path.snoc(_current); @@ -46,36 +67,18 @@ } } - List totalResult = List.nil(); + List> totalResult = List.nil(); for(P2 next : accepted){ Node node = next._1(); TraverseEvaluator evaluator = next._2().evaluator(); - List result = _traverse(currentPath,node,evaluator); - totalResult = totalResult.append(result); + List> result = _traverse(currentPath,node,evaluator); + + + for(List list : result){ + totalResult = totalResult.snoc(list.cons(_current)); + } } return totalResult; } - - public static class TraverseResultImpl implements TraverseResult - { - private final List result; - - public TraverseResultImpl(List _result) - { - result = _result; - } - - @Override - public Iterator iterator() - { - return result.iterator(); - } - - @Override - public Node destination() - { - return result.last(); - } - } } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traversable.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traversable.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traversable.java Thu Jan 10 23:22:42 2013 +0900 @@ -2,5 +2,5 @@ public interface Traversable { - public Iterable traverse(TraverseEvaluator _e); + public Iterable traverse(TraverseEvaluator _e); } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traversal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traversal.java Thu Jan 10 23:22:42 2013 +0900 @@ -0,0 +1,8 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; + +import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; + +public interface Traversal extends Iterable +{ + public Node destination(); +} diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/TraverseEvaluator.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/TraverseEvaluator.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/TraverseEvaluator.java Thu Jan 10 23:22:42 2013 +0900 @@ -1,7 +1,5 @@ package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser; -import java.util.Iterator; - import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; public interface TraverseEvaluator diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/TraverseResult.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/TraverseResult.java Mon Jan 07 23:22:36 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.traverser; - -import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Node; - -public interface TraverseResult extends Iterable -{ - public Node destination(); -} diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traverser.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traverser.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/traverser/Traverser.java Thu Jan 10 23:22:42 2013 +0900 @@ -4,5 +4,5 @@ public interface Traverser { - public Iterable traverse(Tree _tree,TraverseEvaluator _evaluator); + public Iterable traverse(Tree _tree,TraverseEvaluator _evaluator); } diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/DefaultEither.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/DefaultEither.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/DefaultEither.java Thu Jan 10 23:22:42 2013 +0900 @@ -5,10 +5,20 @@ private final A theA; private final B theB; - public DefaultEither(A _theA) + private DefaultEither(A _theA,B _theB) { theA = _theA; - theB = null; + theB = _theB; + } + + public static final DefaultEither newA(A _theA) + { + return new DefaultEither(_theA,null); + } + + public static final DefaultEither newB(B _theB) + { + return new DefaultEither(null,_theB); } @Override diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/DefaultError.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/DefaultError.java Thu Jan 10 23:22:42 2013 +0900 @@ -0,0 +1,5 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; + +public class DefaultError implements Error +{ +} diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/Error.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/Error.java Thu Jan 10 23:22:42 2013 +0900 @@ -0,0 +1,5 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; + +public interface Error { + +} diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/IterableConverter.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/IterableConverter.java Thu Jan 10 23:22:42 2013 +0900 @@ -0,0 +1,56 @@ +package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util; + +import java.util.Iterator; + +public class IterableConverter implements Iterable +{ + private final Iterable iterable; + private final Converter converter; + + public IterableConverter(Iterable _iterable,Converter _converter) + { + iterable = _iterable; + converter = _converter; + } + + @Override + public Iterator iterator() + { + return new IteratorConverter(iterable.iterator(),converter); + } + + private static final class IteratorConverter implements Iterator + { + private final Iterator iterator; + private final Converter converter; + + public IteratorConverter(Iterator _iterator,Converter _converter) + { + iterator = _iterator; + converter = _converter; + } + + @Override + public boolean hasNext() + { + return iterator.hasNext(); + } + + @Override + public A next() + { + return converter.conv(iterator.next()); + } + + @Override + public void remove() + { + iterator.remove(); + } + } + + public static interface Converter + { + public A conv(B _b); + } +} diff -r 9fd57b7c6adb -r 3ef2a66a8c5d src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/IterableWrapper.java --- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/IterableWrapper.java Mon Jan 07 23:22:36 2013 +0900 +++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/util/IterableWrapper.java Thu Jan 10 23:22:42 2013 +0900 @@ -10,7 +10,7 @@ { iterable = _iterable; } - + @Override public Iterator iterator() {