diff src/treecms/api/NodeData.java @ 12:fbbb7e414346

modified OnMemoryNode,OnMemoryTreeNode,OnMemoryMonotonicTreeNode
author shoshi
date Wed, 11 May 2011 03:34:01 +0900
parents 85061e874775
children c8601b0fa8a3
line wrap: on
line diff
--- a/src/treecms/api/NodeData.java	Fri May 06 00:42:57 2011 +0900
+++ b/src/treecms/api/NodeData.java	Wed May 11 03:34:01 2011 +0900
@@ -1,28 +1,35 @@
 package treecms.api;
 
 import java.nio.ByteBuffer;
+
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArrayList;
+import org.apache.commons.collections.list.SetUniqueList;
 
 /**
- * Nodeが保持するデータの集合です.Nodeを大きく変更するときや新しく作成される場合に使用されます.
- * 通常このクラスのインスタンスをNodeから取得した場合,NodeDataインスタンスに変更(set,add)を加えても元のNodeに変更は反映されません.
+ * Node が保持するデータのスナップショットです.Node を大きく変更するときや新しく作成される場合に使用されます.
+ * 通常このクラスのインスタンスを Node から取得した場合,NodeData インスタンスに変更(set,add)を加えても元の Node に変更は反映されません.
  * その様に実装してください.
+ * 
+ * このクラスは Node が保持するデータのうち 子供ノードのリスト・属性のマップ のみ保持しています.つまり,ノードが持っているはずの ID は保持していません.
+ * getID,getForest を呼び出すと UnsupportedOperationException をスローします.
  * @author shoshi
  */
 public final class NodeData implements Node
 {
 	/**
-	 * 子供Nodeのリスト
+	 * 子供 Node の List
+	 * 子供 Node の List は重複する Node を許可しない.
 	 */
 	private List<Node> m_children;
 	
 	/**
-	 * キーと対応する値のマップ
+	 * Key と対応する Value の Map
 	 */
 	private Map<ByteBuffer,ByteBuffer> m_attrs;
 	
@@ -35,154 +42,141 @@
 	}
 	
 	/**
-	 * コピーコンストラクタです.NodeDataの内容を防御的にコピーします.
+	 * コピーコンストラクタです.
+	 * NodeData の内容を防御的にコピーします.
 	 * @param _data
 	 */
 	public NodeData(NodeData _data)
 	{
 		if(_data != null){
-			m_children = new CopyOnWriteArrayList<Node>(_data.m_children);
-			m_attrs = new ConcurrentHashMap<ByteBuffer,ByteBuffer>(_data.m_attrs);
+			// SetUniqueList を使用することにより,List の重複要素を許可しない.
+			m_children = SetUniqueList.decorate(_data.m_children);
+			m_attrs = new HashMap<ByteBuffer,ByteBuffer>(_data.m_attrs);
 			return;
 		}
-		m_children = new CopyOnWriteArrayList<Node>();
-		m_attrs = new ConcurrentHashMap<ByteBuffer,ByteBuffer>();
+		m_children = SetUniqueList.decorate(new ArrayList<Node>());
+		m_attrs = new HashMap<ByteBuffer,ByteBuffer>();
 	}
 	
 	/**
 	 * 内部でコピーコンストラクタを呼び出します.
-	 * @return このNodeDataのコピー
+	 * @return この NodeData のコピー
 	 */
 	public NodeData deepCopy()
 	{
 		return new NodeData(this);
 	}
 	
-	/**
-	 * キーのセットを取得します.
-	 * @return キーのセット
-	 */
-	public Set<ByteBuffer> keySet()
-	{
-		return m_attrs.keySet();
-	}
-	
-	/**
-	 * キーに対応する値を取得します. 
-	 * @param _name
-	 * @return キーに対応する値
-	 */
-	public ByteBuffer get(ByteBuffer _name)
-	{
-		return m_attrs.get(_name);
-	}
-	
-	/**
-	 * キーとそれに対応する値を追加します.
-	 * @param _name キー
-	 * @param _value 値
-	 */
-	public void put(ByteBuffer _name,ByteBuffer _value)
-	{
-		m_attrs.put(_name,_value);
-	}
-	
-	/**
-	 * キーとその対応する値をマップから削除します
-	 * @param _name
-	 */
-	public void remove(ByteBuffer _name)
-	{
-		m_attrs.remove(_name);
-	}
-	
-	/**
-	 * キーとそれに対応する値のマップ全体を追加します.
-	 * @param _map
-	 */
-	public void putAll(Map<ByteBuffer,ByteBuffer> _map)
-	{
-		m_attrs.putAll(_map);
-	}
-	
-	/**
-	 * 子供Nodeのリストを取得します.<br/>
-	 * この取得されたリストは編集できません.編集はadd,addAllより行ってください.
-	 * @return 子供Nodeのリスト
-	 */
-	public List<Node> children()
-	{
-		return Collections.unmodifiableList(m_children);
-	}
-	
-	/**
-	 * 子供Nodeを追加します.
-	 * @param _child
-	 */
-	public void add(Node _child)
-	{
-		m_children.add(_child);
-	}
-	
-	/**
-	 * 子供Nodeリスト全部を子供Nodeとして追加します.
-	 * @param _child
-	 */
-	public void addAll(List<Node> _child)
-	{
-		m_children.addAll(_child);
-	}
-	
-	/**
-	 * 指定されたNodeを子供Nodeのリストから削除します.
-	 * @param _child
-	 */
-	public void remove(Node _child)
-	{
-		m_children.remove(_child);
-	}
-	
-	/**
-	 * 指定されたNodeのリストに含まれるすべてのNodeを子供Nodeのリストから削除します.
-	 * @param _child
-	 */
-	public void removeAll(List<Node> _child)
-	{
-		m_children.removeAll(_child);
-	}
-	
-	/**
-	 * NodeDataが保持しているすべてのキーと値の組のマップを返します.
-	 * @return すべてのキーと値のマップ
-	 */
-	public Map<ByteBuffer,ByteBuffer> getAll()
-	{
-		return Collections.unmodifiableMap(m_attrs);
-	}
-	
-	/**
-	 * 子供Nodeのリストをクリアします.(すべて削除します.)
-	 */
-	public void clear()
-	{
-		m_children.clear();
-	}
-
 	@Override
 	public NodeID getID()
 	{
+		//このクラスはデータのみ保持する.
 		return null;
 	}
 
 	@Override
 	public NodeData getData()
 	{
-		return this;
+		return new NodeData(this);
 	}
 
 	@Override
 	public Forest getForest()
 	{
+		//このクラスはデータのみ保持する.
 		return null;
 	}
+	
+	/*
+	 * 属性関連
+	 */
+	
+	public Set<ByteBuffer> keySet()
+	{
+		return m_attrs.keySet();
+	}
+	
+	@Override
+	public ByteBuffer get(ByteBuffer _name)
+	{
+		return m_attrs.get(_name);
+	}
+	
+	@Override
+	public Map<ByteBuffer,ByteBuffer> getAll()
+	{
+		return Collections.unmodifiableMap(this.m_attrs);
+	}
+	
+	@Override
+	public void put(ByteBuffer _name,ByteBuffer _value)
+	{
+		m_attrs.put(_name,_value);
+	}
+	
+	@Override
+	public void putAll(Map<ByteBuffer,ByteBuffer> _map)
+	{
+		m_attrs.putAll(_map);
+	}
+	
+	@Override
+	public void remove(ByteBuffer _name)
+	{
+		m_attrs.remove(_name);
+	}
+	
+	@Override
+	public void removeAll(Set<ByteBuffer> _keySet)
+	{
+		for(ByteBuffer _key : _keySet){
+			m_attrs.remove(_key);
+		}
+	}
+	
+	@Override
+	public void clear()
+	{
+		m_attrs.clear();
+	}
+	
+	/*
+	 * 子供関連
+	 */
+	
+	@Override
+	public Iterator<Node> getChildren()
+	{
+		return Collections.unmodifiableList(m_children).iterator();
+	}
+	
+	@Override
+	public void addChild(Node _child)
+	{
+		m_children.add(_child);
+	}
+	
+	@Override
+	public void addChildren(List<Node> _child)
+	{
+		m_children.addAll(_child);
+	}
+	
+	@Override
+	public void removeChild(Node _child)
+	{
+		m_children.remove(_child);
+	}
+	
+	@Override
+	public void removeChildren(List<Node> _child)
+	{
+		m_children.removeAll(_child);
+	}
+	
+	@Override
+	public void clearChildren()
+	{
+		m_children.clear();
+	}
 }