annotate src/treecms/memory/OnMemoryForest.java @ 15:22cd920986c5

commit
author misaka
date Tue, 17 May 2011 21:25:17 +0900
parents 85061e874775
children bb9760760744
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
1 package treecms.memory;
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
2
6
12604eb6b615 added javadoc
shoshi
parents: 4
diff changeset
3 import java.util.Map;
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
4 import java.util.Random;
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
5 import java.util.UUID;
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
6 import java.util.concurrent.ConcurrentHashMap;
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
7 import treecms.api.Forest;
4
f5ed85be5640 finished treecms.cassandra.v1 implementation (not tested yet)
shoshi
parents: 3
diff changeset
8 import treecms.api.NodeData;
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
9 import treecms.api.NodeID;
15
misaka
parents: 11
diff changeset
10 import treecms.api.SingleNode;
8
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
11 import treecms.api.Tree;
11
shoshi
parents: 9
diff changeset
12 import treecms.api.MonotonicTree;
6
12604eb6b615 added javadoc
shoshi
parents: 4
diff changeset
13 import treecms.tree.id.AbstractRandomNodeID;
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
14
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
15 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
16 * Forestのオンメモリ上の実装.
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
17 * @author shoshi
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
18 */
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
19 public class OnMemoryForest implements Forest
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
20 {
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
21 //Nodeのマップ
6
12604eb6b615 added javadoc
shoshi
parents: 4
diff changeset
22 Map<NodeID,OnMemoryNode> m_table;
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
23 //最新版Nodeのマップ
6
12604eb6b615 added javadoc
shoshi
parents: 4
diff changeset
24 Map<String,OnMemoryNode> m_tipTable;
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
25
8
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
26 //MainTreeのUUID
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
27 String m_mainID;
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
28
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
29 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
30 * コンストラクタ
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
31 */
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
32 public OnMemoryForest()
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
33 {
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
34 m_table = new ConcurrentHashMap<NodeID,OnMemoryNode>();
6
12604eb6b615 added javadoc
shoshi
parents: 4
diff changeset
35 m_tipTable = new ConcurrentHashMap<String,OnMemoryNode>();
8
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
36
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
37 m_mainID = createNode(null,null).getID().getUUID();
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
38 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
39
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
40 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
41 * 新しくNodeを作成します
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
42 * @param _id Nodeに適用されるNodeID
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
43 * @param _newData Nodeが保持するNodeData
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
44 * @return 作成されたOnMemoryNode
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
45 */
15
misaka
parents: 11
diff changeset
46 public OnMemoryNode createNode(NodeID _id,NodeData<SingleNode> _newData)
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
47 {
4
f5ed85be5640 finished treecms.cassandra.v1 implementation (not tested yet)
shoshi
parents: 3
diff changeset
48 NodeID newID = (_id != null) ? _id : createID();
15
misaka
parents: 11
diff changeset
49 NodeData<SingleNode> newData = (_newData != null) ? _newData : new NodeData<SingleNode>();
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
50
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
51 //newIDとnewDataを元にOnMemoryNodeを生成する.
4
f5ed85be5640 finished treecms.cassandra.v1 implementation (not tested yet)
shoshi
parents: 3
diff changeset
52 OnMemoryNode newNode = new OnMemoryNode(this,newID,newData);
6
12604eb6b615 added javadoc
shoshi
parents: 4
diff changeset
53
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
54 //登録
4
f5ed85be5640 finished treecms.cassandra.v1 implementation (not tested yet)
shoshi
parents: 3
diff changeset
55 m_table.put(newID,newNode);
6
12604eb6b615 added javadoc
shoshi
parents: 4
diff changeset
56 m_tipTable.put(newID.getUUID(),newNode);
12604eb6b615 added javadoc
shoshi
parents: 4
diff changeset
57
3
5fa718b63cd5 finished treecms.memory basic implementation ( not tested yet. )
shoshi
parents: 2
diff changeset
58 return newNode;
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
59 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
60
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
61 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
62 * 新しいNodeIDを作成します
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
63 * @return 新しいNodeID
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
64 */
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
65 private NodeID createID()
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
66 {
6
12604eb6b615 added javadoc
shoshi
parents: 4
diff changeset
67 return new RandomNodeID(null);
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
68 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
69
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
70 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
71 * NodeIDに対応するNodeを取得します
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
72 * @return NodeIDに対応するNode
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
73 */
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
74 @Override
15
misaka
parents: 11
diff changeset
75 public SingleNode get(NodeID _id)
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
76 {
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
77 return m_table.get(_id);
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
78 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
79
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
80 /**
8
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
81 * あるNodeをルートとしてTreeのオブジェクトを取得します。
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
82 * @param _id 木のルートとなるNodeのNodeID
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
83 * @return Tree
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
84 */
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
85 @Override
15
misaka
parents: 11
diff changeset
86 public Tree getTree(SingleNode _node)
8
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
87 {
9
shoshi
parents: 8
diff changeset
88 Forest forest = _node.getForest();
shoshi
parents: 8
diff changeset
89 if(forest != this){
shoshi
parents: 8
diff changeset
90 throw new IllegalArgumentException();
shoshi
parents: 8
diff changeset
91 }
shoshi
parents: 8
diff changeset
92
shoshi
parents: 8
diff changeset
93 return new OnMemoryTree((OnMemoryNode)_node);
8
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
94 }
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
95
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
96 /**
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
97 * あるNodeをルートとしたTreeを非破壊的に編集するTreeEditorを取得します。
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
98 * @param _id 木のルートとなるNodeのNodeID
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
99 * @return TreeEditor
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
100 */
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
101 @Override
15
misaka
parents: 11
diff changeset
102 public MonotonicTree getMonotonicTree(SingleNode _node)
8
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
103 {
15
misaka
parents: 11
diff changeset
104 Forest forest = _node.getForest();
9
shoshi
parents: 8
diff changeset
105 if(forest != this){
shoshi
parents: 8
diff changeset
106 throw new IllegalArgumentException();
shoshi
parents: 8
diff changeset
107 }
shoshi
parents: 8
diff changeset
108
15
misaka
parents: 11
diff changeset
109 return new OnMemoryMonotonicTree((OnMemoryNode)_node);
8
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
110 }
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
111
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
112 /**
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
113 * 新しくNodeを作成します.
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
114 * @return 新しいNode
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
115 */
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
116 @Override
15
misaka
parents: 11
diff changeset
117 public SingleNode create()
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
118 {
4
f5ed85be5640 finished treecms.cassandra.v1 implementation (not tested yet)
shoshi
parents: 3
diff changeset
119 return createNode(null,null);
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
120 }
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
121
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
122 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
123 * NodeDataを保持した新しいNodeを作成します
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
124 * @return NodeDataを保持した新しいNode
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
125 */
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
126 @Override
15
misaka
parents: 11
diff changeset
127 public SingleNode create(NodeData<SingleNode> _data)
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
128 {
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
129 return createNode(null,_data);
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
130 }
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
131
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
132 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
133 * 最新のNodeを取得します.
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
134 * @return UUIDに対応する最新のNode
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
135 */
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
136 @Override
15
misaka
parents: 11
diff changeset
137 public SingleNode getTip(String _uuid)
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
138 {
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
139 return m_tipTable.get(_uuid);
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
140 }
8
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
141
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
142 /**
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
143 * MainTreeを取得します。
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
144 * @return このForestのMainTree
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
145 */
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
146 @Override
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
147 public Tree getMainTree()
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
148 {
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
149 return new OnMemoryTree(m_tipTable.get(m_mainID));
f96193babac0 changed byte[] to ByteBuffer
shoshi
parents: 7
diff changeset
150 }
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
151
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
152 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
153 * ランダムにバージョン番号を生成するNodeIDです.ファクトリを内包します.
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
154 * @author shoshi
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
155 */
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
156 private static class RandomNodeID extends AbstractRandomNodeID
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
157 {
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
158 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
159 * UUID
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
160 */
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
161 private String m_uuid;
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
162
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
163 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
164 * バージョン番号(ランダム値)
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
165 */
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
166 private long m_version;
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
167
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
168 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
169 * コンストラクタ
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
170 * @param _uuid 継承するUUID
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
171 */
6
12604eb6b615 added javadoc
shoshi
parents: 4
diff changeset
172 public RandomNodeID(String _uuid)
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
173 {
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
174 m_uuid = (_uuid != null) ? _uuid : UUID.randomUUID().toString();
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
175 m_version = (new Random()).nextLong();
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
176 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
177
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
178 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
179 * 新しいRandomNodeIDを作成します。
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
180 * @return 新しいRandomNodeID
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
181 */
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
182 @Override
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
183 public NodeID create()
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
184 {
6
12604eb6b615 added javadoc
shoshi
parents: 4
diff changeset
185 return new RandomNodeID(null);
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
186 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
187
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
188 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
189 * UUIDを継承したRandomNodeIDを作成します.
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
190 * @return 新しいRandomNodeID
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
191 */
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
192 @Override
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
193 public NodeID update()
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
194 {
6
12604eb6b615 added javadoc
shoshi
parents: 4
diff changeset
195 return new RandomNodeID(m_uuid);
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
196 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
197
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
198 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
199 * UUIDを取得します.
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
200 * @return UUID
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
201 */
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
202 @Override
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
203 public String getUUID()
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
204 {
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
205 return m_uuid;
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
206 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
207
7
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
208 /**
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
209 * バージョンを取得します.
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
210 * @return バージョン
fc19e38b669b added concurrent access client for cassandr
shoshi
parents: 6
diff changeset
211 */
2
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
212 @Override
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
213 public String getVersion()
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
214 {
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
215 return Long.toHexString(m_version);
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
216 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
217 }
4a5ee88f02cf added OnMemoryForest
shoshi
parents:
diff changeset
218 }