changeset 13:c8601b0fa8a3

added Predicate and PredicateList
author shoshi
date Wed, 11 May 2011 22:08:20 +0900
parents fbbb7e414346
children 8bf59f161b23
files CHANGELOG src/treecms/api/Node.java src/treecms/api/NodeData.java src/treecms/memory/OnMemoryMonotonicTreeNode.java src/treecms/memory/OnMemoryNode.java src/treecms/tree/util/Predicate.java src/treecms/tree/util/PredicatedList.java
diffstat 7 files changed, 238 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/CHANGELOG	Wed May 11 03:34:01 2011 +0900
+++ b/CHANGELOG	Wed May 11 22:08:20 2011 +0900
@@ -24,12 +24,28 @@
 	Cassandra 0.6.x
 
 	
-TODO
+開発メモ
+
+2011-05-11
+	クローンを伝搬させる方法で非破壊的編集の実装を書いている.
+
+	やっぱり、子供を管理するリストは自身で開発したほうが良さそうな気がしてきた.
+	子供のリストに要求されていることは
+		同じIDの子供が追加されないこと
+	なので,順序付きの集合になる.ApacheCommonsのCollectionAPIは何故かGenericsに対応していないので警告を吐きまくる.
+	やっぱり自分で書いたほうが良さそうですね.
+	
+	Apache CommonsのPredicateを使えば普通に実装できるはずなんだけど・・・・
+	PredicateとPredicateListの実装もうちょっと;)
 
 2011-05-10
 	MonotonicTreeNodeのAPI合わせをやった.
 	OnMemoryの実装に移ろう.実際はOnMemoryがキャッシュとして使いやすいようにしないといけないんだけどな.AbstractHogehogeとかみたいに,
 	フレームワーク的に使いたいね.
+	
+	OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNodeを実装した.OnMemoryMonotonicTreeNodeはだいたい完成している.
+	
+	NodeにcloneNodeっぽいメソッドを実装するの忘れてた.
 
 2011-05-09
 	Node自体はSingleLinkedNodeである,あるNodeを頂点とするTreeを作ることで、SingleLinkedNodeをラップしたDoubleLinkedNodeを作る.
--- a/src/treecms/api/Node.java	Wed May 11 03:34:01 2011 +0900
+++ b/src/treecms/api/Node.java	Wed May 11 22:08:20 2011 +0900
@@ -126,4 +126,14 @@
 	 * 全ての子供を削除します. 
 	 */
 	public void clearChildren();
+	
+	/**
+	 * このNodeのクローンを作成します.
+	 * 
+	 * クローンされたNodeはNodeIDとデータを受け継ぎます.クローンする際にデータに変更を加えることが出来ます.
+	 * 変更を加える必要がない場合はnullを_dataに引数として渡します.
+	 * 
+	 * @param _data クローンされるNodeに適用されるNodeData
+	 */
+	public Node cloneNode(NodeData _data);
 }
--- a/src/treecms/api/NodeData.java	Wed May 11 03:34:01 2011 +0900
+++ b/src/treecms/api/NodeData.java	Wed May 11 22:08:20 2011 +0900
@@ -179,4 +179,10 @@
 	{
 		m_children.clear();
 	}
+	
+	@Override
+	public Node cloneNode(NodeData _data)
+	{
+		throw new UnsupportedOperationException();
+	}
 }
--- a/src/treecms/memory/OnMemoryMonotonicTreeNode.java	Wed May 11 03:34:01 2011 +0900
+++ b/src/treecms/memory/OnMemoryMonotonicTreeNode.java	Wed May 11 22:08:20 2011 +0900
@@ -119,8 +119,7 @@
 	
 	/**
 	 * このMonotonicNodeに変更が加えられたら,こちらのメソッドが呼び出されます.
-	 * このメソッドでは非破壊的に変更するために,SingleLinkedNodeのクローンを作成し,
-	 * 親にも複製を依頼します.
+	 * 非破壊的に変更するために,SingleLinkedNodeのクローンを作成し,親にも複製を依頼します.
 	 * 
 	 * RootNodeまで伝搬すると親のNodeはnullとなる.親Nodeは担当するMonotonicTreeのオブジェクトを保持しており,そこにRootNodeが変更されたことを通知する.
 	 * 通知が終わり,処理が戻ってきた時に自身のOnMemoryNodeをクローンした新しいものに書き換えます.
@@ -128,18 +127,10 @@
 	 * _fromがnullの場合は,自身が編集元であることを示します.
 	 * @param _from 編集元のOnMemoryMonotonicTreeNode
 	 */
-	public void cloneAndTransmit(OnMemoryNode _from)
+	public void transmit(OnMemoryNode _from)
 	{
-		OnMemoryNode clone = m_node.cloneNode();
-		if(m_parent != null){
-			//親が存在する,親に変更があったことを伝搬する.
-			m_parent.cloneAndTransmit(clone);
-		}else{
-			//何かすることはないかな
-		}
-		
-		//編集終了
-		m_node = clone;
+		Node clone = m_node.cloneNode(null);
+		m_node.removeChild(_from);
 	}
 	
 	/*
--- a/src/treecms/memory/OnMemoryNode.java	Wed May 11 03:34:01 2011 +0900
+++ b/src/treecms/memory/OnMemoryNode.java	Wed May 11 22:08:20 2011 +0900
@@ -155,4 +155,12 @@
 	{
 		return getID().toString();
 	}
+	
+	@Override
+	public Node cloneNode(NodeData _data)
+	{
+		NodeData newData = (_data != null) ? _data : m_data;
+		Node clone = m_forest.createNode(m_id.update(),newData);
+		return clone;
+	}
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/tree/util/Predicate.java	Wed May 11 22:08:20 2011 +0900
@@ -0,0 +1,8 @@
+package treecms.tree.util;
+
+public interface Predicate<E>
+{
+	boolean evaluateGet(int index);
+	boolean evaluateAdd(int index,E _target);
+	boolean evaluateRemove(int index);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/treecms/tree/util/PredicatedList.java	Wed May 11 22:08:20 2011 +0900
@@ -0,0 +1,185 @@
+package treecms.tree.util;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ListIterator;
+
+public class PredicatedList<E> implements List<E>
+{
+	private Predicate<E> m_predicate;
+	private List<E> m_list;
+	
+	public PredicatedList(List<E> _list,Predicate<E> _predicate)
+	{
+		if(_list == null || _predicate == null){
+			throw new NullPointerException();
+		}
+		
+		m_list = _list;
+		m_predicate = _predicate;
+	}
+
+	@Override
+	public boolean add(E _item)
+	{
+		if(m_predicate.evaluateAdd(_item)){
+			return m_list.add(_item);
+		}
+		return false;
+	}
+
+	@Override
+	public void add(int _index,E _item)
+	{
+		if(m_predicate.evaluateAdd(_index,_item)){
+			m_list.add(_index,_item);
+		}
+	}
+
+	@Override
+	public boolean addAll(Collection<? extends E> _c)
+	{
+		boolean eval = false;
+		for(E i : _c){
+			eval = m_predicate.evaluate(i);
+			if(!eval){
+				return false;
+			}
+		}
+		
+		return m_list.addAll(_c);
+	}
+
+	@Override
+	public boolean addAll(int _index, Collection<? extends E> _c)
+	{
+		boolean eval = false;
+		for(E i : _c){
+			eval = m_predicate.evaluate(i);
+			if(!eval){
+				return false;
+			}
+		}
+		
+		return m_list.addAll(_index,_c);
+	}
+
+	@Override
+	public void clear()
+	{
+		m_list.clear();
+	}
+
+	@Override
+	public boolean contains(Object _obj)
+	{
+		return m_list.contains(_obj);
+	}
+
+	@Override
+	public boolean containsAll(Collection<?> _c)
+	{
+		return m_list.containsAll(_c);
+	}
+
+	@Override
+	public E get(int _index)
+	{
+		return m_list.get(_index);
+	}
+
+	@Override
+	public int indexOf(Object _obj)
+	{
+		return m_list.indexOf(_obj);
+	}
+
+	@Override
+	public boolean isEmpty()
+	{
+		return m_list.isEmpty();
+	}
+
+	@Override
+	public Iterator<E> iterator()
+	{
+		return m_list.iterator();
+	}
+
+	@Override
+	public int lastIndexOf(Object _obj)
+	{
+		return m_list.lastIndexOf(_obj);
+	}
+
+	@Override
+	public ListIterator<E> listIterator()
+	{
+		return m_list.listIterator();
+	}
+
+	@Override
+	public ListIterator<E> listIterator(int _index)
+	{
+		return m_list.listIterator(_index);
+	}
+
+	@Override
+	public boolean remove(Object _obj)
+	{
+		return m_list.remove(_obj);
+	}
+
+	@Override
+	public E remove(int _index)
+	{
+		return m_list.remove(_index);
+	}
+
+	@Override
+	public boolean removeAll(Collection<?> _c)
+	{
+		return m_list.removeAll(_c);
+	}
+
+	@Override
+	public boolean retainAll(Collection<?> _c)
+	{
+		return m_list.retainAll(_c);
+	}
+
+	@Override
+	public E set(int _index,E _element)
+	{
+		if(m_predicate.evaluate(_element)){
+			
+		}
+		return null;
+	}
+
+	@Override
+	public int size() {
+		// TODO Auto-generated method stub
+		return 0;
+	}
+
+	@Override
+	public List<E> subList(int fromIndex, int toIndex) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Object[] toArray() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public <T> T[] toArray(T[] a) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+}