changeset 19:703f0be5368a

added attribute cache
author Shoshi TAMAKI
date Thu, 20 Dec 2012 18:09:17 +0900
parents 8d4cbd5a6525
children d5a7bed83b0a
files src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Children.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChangeList.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChangeSet.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChildren.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ModifiedTreeEditorImpl.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeRepository.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/AppendChildAt.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/AppendChildAtOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteAttribute.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteAttributeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteChildAt.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteChildAtOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/SetAttribute.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/SetAttributeOperation.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableAttributes.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableChildren.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableNode.java src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditCache.java
diffstat 19 files changed, 280 insertions(+), 156 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Children.java	Thu Dec 20 17:18:47 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/core/Children.java	Thu Dec 20 18:09:17 2012 +0900
@@ -2,4 +2,5 @@
 
 public interface Children extends Iterable<Node>
 {
+	public int size();
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChangeList.java	Thu Dec 20 18:09:17 2012 +0900
@@ -0,0 +1,55 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl;
+
+import fj.data.List;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Tree;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeList;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation;
+
+public class DefaultChangeList implements ChangeList
+{
+	private final ChangeList prev;
+	private final String uuid;
+	private final long revision;
+	
+	private final List<Operation> operations;
+	private final Tree tree;
+	
+	public DefaultChangeList(Tree _tree,List<Operation> _operations,String _uuid,long _revision,ChangeList _prev)
+	{
+		tree = _tree;
+		operations = _operations;
+		uuid = _uuid;
+		revision = _revision;
+		prev = _prev;
+	}
+
+	@Override
+	public ChangeList prev()
+	{
+		return prev;
+	}
+
+	@Override
+	public String uuid()
+	{
+		return uuid;
+	}
+
+	@Override
+	public long revision()
+	{
+		return revision;
+	}
+
+	@Override
+	public Iterable<Operation> getOperations()
+	{
+		return operations;
+	}
+
+	@Override
+	public Tree getTree()
+	{
+		return tree;
+	}
+}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChangeSet.java	Thu Dec 20 17:18:47 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl;
-
-import fj.data.List;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Tree;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.TraversableTree;
-
-public class DefaultChangeSet implements ChangeSet
-{
-	private final ChangeSet prev;
-	private final String uuid;
-	private final long revision;
-	
-	private final List<Command> commands;
-	private final Tree tree;
-	
-	public DefaultChangeSet(Tree _tree,List<Command> _commands,String _uuid,long _revision,ChangeSet _prev)
-	{
-		tree = _tree;
-		commands = _commands;
-		uuid = _uuid;
-		revision = _revision;
-		prev = _prev;
-	}
-
-	@Override
-	public ChangeSet prev()
-	{
-		return prev;
-	}
-
-	@Override
-	public String uuid()
-	{
-		return uuid;
-	}
-
-	@Override
-	public long revision()
-	{
-		return revision;
-	}
-
-	@Override
-	public Iterable<Command> getCommands()
-	{
-		return commands;
-	}
-
-	@Override
-	public Tree getTree()
-	{
-		return tree;
-	}
-}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChildren.java	Thu Dec 20 17:18:47 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultChildren.java	Thu Dec 20 18:09:17 2012 +0900
@@ -24,6 +24,12 @@
 		children = _children;
 	}
 	
+	@Override
+	public int size()
+	{
+		return children.length();
+	}
+	
 	public DefaultChildren add(DefaultNode _newNode)
 	{
 		return new DefaultChildren(children.snoc(_newNode));
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java	Thu Dec 20 17:18:47 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/DefaultTreeEditor.java	Thu Dec 20 18:09:17 2012 +0900
@@ -2,10 +2,9 @@
 
 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.core.Tree;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.ChangeSet;
+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;
@@ -24,12 +23,12 @@
 public class DefaultTreeEditor implements TreeEditor
 {
 	private final TreeRepository repo;
-	private final ChangeSet tip;
+	private final ChangeList tip;
 	
 	public DefaultTreeEditor(TreeRepository _repo)
 	{
 		repo = _repo;
-		tip = _repo.getCurrentChangeSet();
+		tip = _repo.getCurrentChangeList();
 	}
 
 	@Override
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ModifiedTreeEditorImpl.java	Thu Dec 20 17:18:47 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/ModifiedTreeEditorImpl.java	Thu Dec 20 18:09:17 2012 +0900
@@ -3,12 +3,10 @@
 import java.nio.ByteBuffer;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Tree;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Result;
 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.trasnformer.NodeTransformer;
 
-class ModifiedTreeEditorImpl implements TreeEditor
+class ModifiedTreeEditor implements TreeEditor
 {
 
 	@Override
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeRepository.java	Thu Dec 20 17:18:47 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/impl/TreeRepository.java	Thu Dec 20 18:09:17 2012 +0900
@@ -1,33 +1,32 @@
 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.Command;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Constants;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation;
 
 import fj.data.List;
 
 public class TreeRepository
 {
-	private final AtomicReference<DefaultChangeSet> changeSet;
+	private final AtomicReference<DefaultChangeList> changeList;
 	
 	public TreeRepository()
 	{
-		List<Command> emptyCommands = List.nil();
+		List<Operation> emptyCommands = List.nil();
 		
-		changeSet = new AtomicReference<DefaultChangeSet>(
-				new DefaultChangeSet(DefaultTree.EMPTY,emptyCommands,
+		changeList = new AtomicReference<DefaultChangeList>(
+				new DefaultChangeList(DefaultTree.EMPTY,emptyCommands,
 						Constants.DEFAULT_OWNER,Constants.DEFAULT_REVISION_START_NUMBER,null)
 			);
 	}
 	
-	public DefaultChangeSet getCurrentChangeSet()
+	public DefaultChangeList getCurrentChangeList()
 	{
-		return changeSet.get();
+		return changeList.get();
 	}
 	
-	public boolean commitChangeSet(DefaultChangeSet _newChangeSet,DefaultChangeSet _currentChangeSet)
+	public boolean commitChangeList(DefaultChangeList _newChangeList,DefaultChangeList _currentChangeList)
 	{
-		return changeSet.compareAndSet(_currentChangeSet,_newChangeSet);
+		return changeList.compareAndSet(_currentChangeList,_newChangeList);
 	}
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/AppendChildAt.java	Thu Dec 20 17:18:47 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations;
-
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
-
-public abstract class AppendChildAt implements Operation
-{
-	public Command getCommand()
-	{
-		return Command.APPEND_CHILD;
-	}
-	
-	public abstract int position();
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/AppendChildAtOperation.java	Thu Dec 20 18:09:17 2012 +0900
@@ -0,0 +1,13 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
+
+public abstract class AppendChildAtOperation implements Operation
+{
+	public Command getCommand()
+	{
+		return Command.APPEND_CHILD;
+	}
+	
+	public abstract int position();
+}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteAttribute.java	Thu Dec 20 17:18:47 2012 +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.operations;
-
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
-
-public abstract class DeleteAttribute implements Operation
-{
-	@Override
-	public Command getCommand()
-	{
-		return Command.DELETE_ATTRIBUTE;
-	}
-	
-	public abstract String getKey();
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteAttributeOperation.java	Thu Dec 20 18:09:17 2012 +0900
@@ -0,0 +1,14 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
+
+public abstract class DeleteAttributeOperation implements Operation
+{
+	@Override
+	public Command getCommand()
+	{
+		return Command.DELETE_ATTRIBUTE;
+	}
+	
+	public abstract String getKey();
+}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteChildAt.java	Thu Dec 20 17:18:47 2012 +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.operations;
-
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
-
-public abstract class DeleteChildAt implements Operation
-{
-	@Override
-	public Command getCommand()
-	{
-		return Command.DELETE_CHILD;
-	}
-	
-	public abstract int position();
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/DeleteChildAtOperation.java	Thu Dec 20 18:09:17 2012 +0900
@@ -0,0 +1,14 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations;
+
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
+
+public abstract class DeleteChildAtOperation implements Operation
+{
+	@Override
+	public Command getCommand()
+	{
+		return Command.DELETE_CHILD;
+	}
+	
+	public abstract int position();
+}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/SetAttribute.java	Thu Dec 20 17:18:47 2012 +0900
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations;
-
-import java.nio.ByteBuffer;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
-
-public abstract class SetAttribute implements Operation
-{
-	@Override
-	public Command getCommand()
-	{
-		return Command.SET_ATTRIBUTE;
-	}
-	
-	public abstract String getKey();
-	public abstract ByteBuffer getValue();
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/operations/SetAttributeOperation.java	Thu Dec 20 18:09:17 2012 +0900
@@ -0,0 +1,16 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations;
+
+import java.nio.ByteBuffer;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
+
+public abstract class SetAttributeOperation implements Operation
+{
+	@Override
+	public Command getCommand()
+	{
+		return Command.SET_ATTRIBUTE;
+	}
+	
+	public abstract String getKey();
+	public abstract ByteBuffer getValue();
+}
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableAttributes.java	Thu Dec 20 17:18:47 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableAttributes.java	Thu Dec 20 18:09:17 2012 +0900
@@ -3,31 +3,66 @@
 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.Node;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteAttributeOperation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.SetAttributeOperation;
 
 public class DefaultEditableAttributes implements EditableAttributes
 {
+	private Node target;
 	private Attributes attrs;
+	private EditCache cache;
 	
-	public DefaultEditableAttributes(Attributes _attrs,EditCache _cache)
+	public DefaultEditableAttributes(Node _target,EditCache _cache)
 	{
-		attrs = _attrs;
+		target = _target;
+		attrs = _target.getAttributes();
+		cache = _cache;
 	}
 
 	@Override
 	public ByteBuffer get(String _key)
 	{
-		return null;
+		Operation op = cache.getAttribute(_key);
+		
+		if(op == null){
+			return attrs.get(_key);
+		}
+		
+		Command c = op.getCommand();
+		
+		if(c == Command.SET_ATTRIBUTE){
+			SetAttributeOperation saop = (SetAttributeOperation)op;
+			String key = saop.getKey();
+			if(key.equals(_key)){
+				return saop.getValue();
+			}
+			throw new IllegalStateException("fail key.equals(_key)");
+		}else if(c == Command.DELETE_ATTRIBUTE){
+			DeleteAttributeOperation daop = (DeleteAttributeOperation)op;
+			String key = daop.getKey();
+			if(key.equals(_key)){
+				return null;
+			}
+			throw new IllegalStateException("fail key.equals(_key)");
+		}
+		
+		throw new IllegalStateException("fail unknown command" + c);
 	}
 
 	@Override
 	public EditableNode delete(String _key)
 	{
-		return null;
+		EditCache newCache = cache.deleteAttribute(_key);
+		return new DefaultEditableNode(target,newCache);
 	}
 
 	@Override
 	public EditableNode put(String _key, ByteBuffer _value)
 	{
-		return null;
+		EditCache newCache = cache.setAttribute(_key,_value);
+		return new DefaultEditableNode(target,newCache);
 	}
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableChildren.java	Thu Dec 20 18:09:17 2012 +0900
@@ -0,0 +1,46 @@
+package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer;
+
+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.Operation;
+
+public class DefaultEditableChildren implements EditableChildren
+{
+	private final Node target;
+	private final EditCache cache;
+	
+	public DefaultEditableChildren(Node _target,EditCache _cache)
+	{
+		target = _target;
+		cache = _cache;
+	}
+
+	@Override
+	public int size()
+	{
+		return 0;
+	}
+
+	@Override
+	public Iterator<Node> iterator()
+	{
+		return null;
+	}
+
+	@Override
+	public EditableNode addNewChildAt(int _pos)
+	{
+		AppendChildAtOperation op = new AppendChildAtOperaiton(){
+			
+		};
+		
+		return null;
+	}
+
+	@Override
+	public EditableNode deleteChildAt(int _pos)
+	{
+		return null;
+	}
+}
\ No newline at end of file
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableNode.java	Thu Dec 20 17:18:47 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/DefaultEditableNode.java	Thu Dec 20 18:09:17 2012 +0900
@@ -4,19 +4,29 @@
 
 public class DefaultEditableNode implements EditableNode
 {
+	private final Node target;
+	private final EditCache cache;
+	
 	public DefaultEditableNode(Node _target)
 	{
+		this(_target,new EditCache());
+	}
+	
+	public DefaultEditableNode(Node _target,EditCache _cache)
+	{
+		target = _target;
+		cache = _cache;
 	}
 	
 	@Override
 	public EditableAttributes getAttributes()
 	{
-		return null;
+		return new DefaultEditableAttributes(target,cache);
 	}
 
 	@Override
 	public EditableChildren getChildren()
 	{
-		return null;
+		return new DefaultEditableChildren(target,cache);
 	}
 }
--- a/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditCache.java	Thu Dec 20 17:18:47 2012 +0900
+++ b/src/main/java/jp/ac/u_ryukyu/ie/cr/shoshi/jungle/store/trasnformer/EditCache.java	Thu Dec 20 18:09:17 2012 +0900
@@ -1,15 +1,15 @@
 package jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer;
 
 import java.nio.ByteBuffer;
-
 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.Children;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.Command;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.AppendChildAtOperation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteAttributeOperation;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.DeleteChildAtOperation;
 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Operation;
-import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.Parameter;
+import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.SetAttributeOperation;
 
 public class EditCache
 {
@@ -33,35 +33,66 @@
 	
 	public EditCache setAttribute(final String _key,final ByteBuffer _value)
 	{
-		Operation op = new Operation(){
+		SetAttributeOperation op = new SetAttributeOperation(){
 			@Override
-			public Command getCommand(){
-				return Command.PUT_ATTRIBUTE;
+			public String getKey(){
+				return _key;
+			}
+			@Override
+			public ByteBuffer getValue(){
+				return _value;
 			}
-
+		};
+		
+		TreeMap<String,Operation> newAttrCache = attrCache.set(_key,op);
+		List<Operation> newOperations = operations.snoc(op);
+		
+		return new EditCache(newOperations,newAttrCache,childrenCache);
+	}
+	
+	public EditCache deleteAttribute(final String _key)
+	{
+		DeleteAttributeOperation op = new DeleteAttributeOperation(){
 			@Override
-			public <T> T getParameter(Parameter<T> _param){
-				if(_param == jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.SetAttribute.KEY){
-					return _key;
-				}
-				return ;
+			public String getKey(){
+				return _key;
 			}
 		};
-	}
-	
-	public EditCache deleteAttribute(String _key)
-	{
 		
+		TreeMap<String,Operation> newAttrCache = attrCache.set(_key,op);
+		List<Operation> newOperations = operations.snoc(op);
+		
+		return new EditCache(newOperations,newAttrCache,childrenCache);
 	}
 	
-	public EditCache appendChildAt(int _pos)
+	public EditCache appendChildAt(final int _pos)
 	{
+		AppendChildAtOperation op = new AppendChildAtOperation(){
+			@Override
+			public int position(){
+				return _pos;
+			}
+		};
 		
+		List<Operation> newOperations = operations.snoc(op);
+		List<Operation> newChildrenCache = childrenCache.snoc(op);
+		
+		return new EditCache(newOperations,attrCache,newChildrenCache);
 	}
 	
-	public EditCache deleteChildAt(int _pos)
+	public EditCache deleteChildAt(final int _pos)
 	{
+		DeleteChildAtOperation op = new DeleteChildAtOperation(){
+			@Override
+			public int position(){
+				return _pos;
+			}
+		};
 		
+		List<Operation> newOperations = operations.snoc(op);
+		List<Operation> newChildrenCache = childrenCache.snoc(op);
+		
+		return new EditCache(newOperations,attrCache,newChildrenCache);
 	}
 	
 	public Operation getAttribute(String _key)