annotate src/main/java/jp/ac/u_ryukyu/cr/ie/tatsuki/bbs/JungleBulletinBoard.java @ 3:3dc5905739ef

add xml file
author tatsuki
date Fri, 24 Oct 2014 16:34:02 +0900
parents b036c87f1e5c
children 9f6ac805d323
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
tatsuki
parents:
diff changeset
1 package jp.ac.u_ryukyu.cr.ie.tatsuki.bbs;
tatsuki
parents:
diff changeset
2
tatsuki
parents:
diff changeset
3 import java.io.File;
tatsuki
parents:
diff changeset
4 import java.io.FileInputStream;
tatsuki
parents:
diff changeset
5 import java.io.IOException;
tatsuki
parents:
diff changeset
6 import java.nio.ByteBuffer;
tatsuki
parents:
diff changeset
7 import java.util.Iterator;
tatsuki
parents:
diff changeset
8 import java.util.concurrent.atomic.AtomicInteger;
tatsuki
parents:
diff changeset
9
tatsuki
parents:
diff changeset
10 import javax.xml.parsers.SAXParser;
tatsuki
parents:
diff changeset
11 import javax.xml.parsers.SAXParserFactory;
tatsuki
parents:
diff changeset
12
tatsuki
parents:
diff changeset
13 import ac.jp.u_ryukyu.cr.ie.tatsuki.xmlReader.ReadXmlHandler;
tatsuki
parents:
diff changeset
14 import fj.data.List;
tatsuki
parents:
diff changeset
15 import fj.data.TreeMap;
tatsuki
parents:
diff changeset
16 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.DefaultJungle;
tatsuki
parents:
diff changeset
17 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.Jungle;
tatsuki
parents:
diff changeset
18 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTree;
tatsuki
parents:
diff changeset
19 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.JungleTreeEditor;
tatsuki
parents:
diff changeset
20 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs.BoardMessage;
tatsuki
parents:
diff changeset
21 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.bbs.BulletinBoard;
tatsuki
parents:
diff changeset
22 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.core.Children;
tatsuki
parents:
diff changeset
23 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeList;
tatsuki
parents:
diff changeset
24 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.persistent.ChangeListReader;
tatsuki
parents:
diff changeset
25 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.NodePath;
tatsuki
parents:
diff changeset
26 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultNodePath;
tatsuki
parents:
diff changeset
27 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.DefaultTreeEditor;
tatsuki
parents:
diff changeset
28 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.TreeNode;
tatsuki
parents:
diff changeset
29 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.DefaultOperationLog;
tatsuki
parents:
diff changeset
30 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode;
tatsuki
parents:
diff changeset
31 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.OperationLog;
tatsuki
parents:
diff changeset
32 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.operations.PutAttributeOperation;
tatsuki
parents:
diff changeset
33 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.trasnformer.NodeEditor;
tatsuki
parents:
diff changeset
34 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultEvaluator;
tatsuki
parents:
diff changeset
35 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.DefaultTraverser;
tatsuki
parents:
diff changeset
36 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.InterfaceTraverser;
tatsuki
parents:
diff changeset
37 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.traverser.Traversal;
tatsuki
parents:
diff changeset
38 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.DefaultEither;
tatsuki
parents:
diff changeset
39 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Either;
tatsuki
parents:
diff changeset
40 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Error;
tatsuki
parents:
diff changeset
41 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.IterableConverter;
tatsuki
parents:
diff changeset
42 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.util.Pair;
tatsuki
parents:
diff changeset
43 import jp.ac.u_ryukyu.ie.cr.shoshi.jungle.store.impl.logger.LoggingNode;
tatsuki
parents:
diff changeset
44 import junit.framework.Assert;
tatsuki
parents:
diff changeset
45
tatsuki
parents:
diff changeset
46 public class JungleBulletinBoard implements XmlBulletinBoard {
tatsuki
parents:
diff changeset
47
tatsuki
parents:
diff changeset
48 private final Jungle jungle;
tatsuki
parents:
diff changeset
49
tatsuki
parents:
diff changeset
50
tatsuki
parents:
diff changeset
51 public JungleBulletinBoard() {
tatsuki
parents:
diff changeset
52 jungle = new DefaultJungle(null, "hoge", new DefaultTreeEditor(new DefaultTraverser()));
tatsuki
parents:
diff changeset
53 jungle.createNewTree("boards");
tatsuki
parents:
diff changeset
54 }
tatsuki
parents:
diff changeset
55
tatsuki
parents:
diff changeset
56
tatsuki
parents:
diff changeset
57
tatsuki
parents:
diff changeset
58 public Iterable<String> getBoards() {
tatsuki
parents:
diff changeset
59 JungleTree tree = jungle.getTreeByName("boards");
tatsuki
parents:
diff changeset
60 TreeNode node = tree.getRootNode();
tatsuki
parents:
diff changeset
61 Children chs = node.getChildren();
tatsuki
parents:
diff changeset
62
tatsuki
parents:
diff changeset
63 IterableConverter.Converter<String, TreeNode> converter = new IterableConverter.Converter<String, TreeNode>() {
tatsuki
parents:
diff changeset
64 public String conv(TreeNode _b) {
tatsuki
parents:
diff changeset
65 ByteBuffer e = _b.getAttributes().get("name");
tatsuki
parents:
diff changeset
66 System.out.println(new String(e.array()));
tatsuki
parents:
diff changeset
67 return new String(e.array());
tatsuki
parents:
diff changeset
68 }
tatsuki
parents:
diff changeset
69 };
tatsuki
parents:
diff changeset
70
tatsuki
parents:
diff changeset
71 return new IterableConverter<String, TreeNode>(chs, converter);
tatsuki
parents:
diff changeset
72 }
tatsuki
parents:
diff changeset
73
tatsuki
parents:
diff changeset
74
tatsuki
parents:
diff changeset
75 public void createBoards(final String _name) {
tatsuki
parents:
diff changeset
76 if (null == jungle.createNewTree(_name)) {
tatsuki
parents:
diff changeset
77 throw new IllegalStateException();
tatsuki
parents:
diff changeset
78 }
tatsuki
parents:
diff changeset
79
tatsuki
parents:
diff changeset
80 JungleTree tree = jungle.getTreeByName("boards");
tatsuki
parents:
diff changeset
81 JungleTreeEditor editor = tree.getTreeEditor();
tatsuki
parents:
diff changeset
82 DefaultNodePath root = new DefaultNodePath();
tatsuki
parents:
diff changeset
83 Either<Error, JungleTreeEditor> either = editor.addNewChildAt(root, 0);
tatsuki
parents:
diff changeset
84 if (either.isA()) {
tatsuki
parents:
diff changeset
85 throw new IllegalStateException();
tatsuki
parents:
diff changeset
86 }
tatsuki
parents:
diff changeset
87 editor = either.b();
tatsuki
parents:
diff changeset
88
tatsuki
parents:
diff changeset
89 either = editor.putAttribute(root.add(0), "name",ByteBuffer.wrap(_name.getBytes()));
tatsuki
parents:
diff changeset
90 if (either.isA()) {
tatsuki
parents:
diff changeset
91 throw new IllegalStateException();
tatsuki
parents:
diff changeset
92 }
tatsuki
parents:
diff changeset
93 editor = either.b();
tatsuki
parents:
diff changeset
94 either = either.b().success();
tatsuki
parents:
diff changeset
95 if (either.isA()) {
tatsuki
parents:
diff changeset
96 throw new IllegalStateException();
tatsuki
parents:
diff changeset
97 }
tatsuki
parents:
diff changeset
98
tatsuki
parents:
diff changeset
99 }
tatsuki
parents:
diff changeset
100
tatsuki
parents:
diff changeset
101 public void createFolder(final String _board, final String _author, final String _message, final String _editKey, String _nodeNum) {
tatsuki
parents:
diff changeset
102 JungleTree tree = jungle.getTreeByName(_board);
tatsuki
parents:
diff changeset
103 if (tree == null) {
tatsuki
parents:
diff changeset
104 throw new IllegalStateException();
tatsuki
parents:
diff changeset
105 }
tatsuki
parents:
diff changeset
106
tatsuki
parents:
diff changeset
107 DefaultNodePath path = new DefaultNodePath();
tatsuki
parents:
diff changeset
108 try {
tatsuki
parents:
diff changeset
109 for (int count = 0; _nodeNum.substring(count, count + 1) != null; count++) {
tatsuki
parents:
diff changeset
110 if (!_nodeNum.substring(count, count + 1).equals("/"))
tatsuki
parents:
diff changeset
111 path = path.add(Integer.parseInt(_nodeNum.substring(count,
tatsuki
parents:
diff changeset
112 count + 1)));
tatsuki
parents:
diff changeset
113 }
tatsuki
parents:
diff changeset
114 } catch (Exception _e) {
tatsuki
parents:
diff changeset
115 }
tatsuki
parents:
diff changeset
116 Either<Error, JungleTreeEditor> either;
tatsuki
parents:
diff changeset
117 final long timestamp = System.currentTimeMillis();
tatsuki
parents:
diff changeset
118 final ByteBuffer tBuffer = ByteBuffer.allocate(16);
tatsuki
parents:
diff changeset
119 tBuffer.putLong(timestamp);
tatsuki
parents:
diff changeset
120
tatsuki
parents:
diff changeset
121 do {
tatsuki
parents:
diff changeset
122 TreeNode node = tree.getRootNode();
tatsuki
parents:
diff changeset
123 DefaultTraverser traverser = new DefaultTraverser();
tatsuki
parents:
diff changeset
124 // TraversableNodeWrapper<Node> traversable = new
tatsuki
parents:
diff changeset
125 // TraversableNodeWrapper<Node>(node);
tatsuki
parents:
diff changeset
126 DefaultEvaluator evaluator = new DefaultEvaluator(path);
tatsuki
parents:
diff changeset
127 Either<Error, Traversal> ret = traverser.traverse(node,
tatsuki
parents:
diff changeset
128 evaluator);
tatsuki
parents:
diff changeset
129 if (ret.isA()) {
tatsuki
parents:
diff changeset
130 Assert.fail();
tatsuki
parents:
diff changeset
131 }
tatsuki
parents:
diff changeset
132
tatsuki
parents:
diff changeset
133 Traversal traversal = ret.b();
tatsuki
parents:
diff changeset
134 TreeNode target = traversal.destination();
tatsuki
parents:
diff changeset
135 int size = target.getChildren().size();
tatsuki
parents:
diff changeset
136 JungleTreeEditor editor = tree.getTreeEditor();
tatsuki
parents:
diff changeset
137 either = editor.addNewChildAt(path, size);
tatsuki
parents:
diff changeset
138 if (either.isA()) {
tatsuki
parents:
diff changeset
139 throw new IllegalStateException();
tatsuki
parents:
diff changeset
140 }
tatsuki
parents:
diff changeset
141 editor = either.b();
tatsuki
parents:
diff changeset
142
tatsuki
parents:
diff changeset
143 NodeEditor e = new NodeEditor() {
tatsuki
parents:
diff changeset
144
tatsuki
parents:
diff changeset
145 public Either<Error,LoggingNode> edit(TreeNode node) {
tatsuki
parents:
diff changeset
146 LoggingNode logNode = wrap(node , new DefaultOperationLog());
tatsuki
parents:
diff changeset
147 logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_message.getBytes())).b();
tatsuki
parents:
diff changeset
148 logNode = logNode.getAttributes().put("timestamp", tBuffer).b();
tatsuki
parents:
diff changeset
149 return DefaultEither.newB(logNode);
tatsuki
parents:
diff changeset
150 }
tatsuki
parents:
diff changeset
151
tatsuki
parents:
diff changeset
152 @Override
tatsuki
parents:
diff changeset
153 public LoggingNode wrap(TreeNode node, OperationLog op) {
tatsuki
parents:
diff changeset
154 return new LoggingNode(node, op);
tatsuki
parents:
diff changeset
155 }
tatsuki
parents:
diff changeset
156 };
tatsuki
parents:
diff changeset
157 path = path.add(size);
tatsuki
parents:
diff changeset
158 either = editor.edit(path, e);
tatsuki
parents:
diff changeset
159 if (either.isA()) {
tatsuki
parents:
diff changeset
160 throw new IllegalStateException();
tatsuki
parents:
diff changeset
161 }
tatsuki
parents:
diff changeset
162 editor = either.b();
tatsuki
parents:
diff changeset
163 either = editor.success();
tatsuki
parents:
diff changeset
164 } while (either.isA());
tatsuki
parents:
diff changeset
165
tatsuki
parents:
diff changeset
166 }
tatsuki
parents:
diff changeset
167
tatsuki
parents:
diff changeset
168 public void createBoardMessage(final String _board, final String _author, final String _message, final String _editKey) {
tatsuki
parents:
diff changeset
169 JungleTree tree = jungle.getTreeByName(_board);
tatsuki
parents:
diff changeset
170 if (tree == null) {
tatsuki
parents:
diff changeset
171 throw new IllegalStateException();
tatsuki
parents:
diff changeset
172 }
tatsuki
parents:
diff changeset
173
tatsuki
parents:
diff changeset
174 Either<Error, JungleTreeEditor> either;
tatsuki
parents:
diff changeset
175 final long timestamp = System.currentTimeMillis();
tatsuki
parents:
diff changeset
176 final ByteBuffer tBuffer = ByteBuffer.allocate(16);
tatsuki
parents:
diff changeset
177 tBuffer.putLong(timestamp);
tatsuki
parents:
diff changeset
178 do {
tatsuki
parents:
diff changeset
179
tatsuki
parents:
diff changeset
180 TreeNode node = tree.getRootNode();
tatsuki
parents:
diff changeset
181 int size = node.getChildren().size();
tatsuki
parents:
diff changeset
182 DefaultNodePath path = new DefaultNodePath();
tatsuki
parents:
diff changeset
183
tatsuki
parents:
diff changeset
184 JungleTreeEditor editor = tree.getTreeEditor();
tatsuki
parents:
diff changeset
185 either = editor.addNewChildAt(path, size);
tatsuki
parents:
diff changeset
186 if (either.isA()) {
tatsuki
parents:
diff changeset
187 throw new IllegalStateException();
tatsuki
parents:
diff changeset
188 }
tatsuki
parents:
diff changeset
189 editor = either.b();
tatsuki
parents:
diff changeset
190
tatsuki
parents:
diff changeset
191 NodeEditor e = new NodeEditor() {
tatsuki
parents:
diff changeset
192 public Either<Error,LoggingNode> edit(TreeNode node) {
tatsuki
parents:
diff changeset
193 LoggingNode logNode = wrap(node , new DefaultOperationLog());
tatsuki
parents:
diff changeset
194 logNode = logNode.getAttributes().put("author", ByteBuffer.wrap(_author.getBytes())).b();
tatsuki
parents:
diff changeset
195 logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_message.getBytes())).b();
tatsuki
parents:
diff changeset
196 logNode = logNode.getAttributes().put("key", ByteBuffer.wrap(_editKey.getBytes())).b();
tatsuki
parents:
diff changeset
197 logNode = logNode.getAttributes().put("timestamp", tBuffer).b();
tatsuki
parents:
diff changeset
198 return DefaultEither.newB(logNode);
tatsuki
parents:
diff changeset
199 }
tatsuki
parents:
diff changeset
200
tatsuki
parents:
diff changeset
201 @Override
tatsuki
parents:
diff changeset
202 public LoggingNode wrap(TreeNode node, OperationLog op) {
tatsuki
parents:
diff changeset
203 return new LoggingNode(node, op);
tatsuki
parents:
diff changeset
204 }
tatsuki
parents:
diff changeset
205
tatsuki
parents:
diff changeset
206 };
tatsuki
parents:
diff changeset
207 path = path.add(size);
tatsuki
parents:
diff changeset
208 either = editor.edit(path, e);
tatsuki
parents:
diff changeset
209 if (either.isA()) {
tatsuki
parents:
diff changeset
210 throw new IllegalStateException();
tatsuki
parents:
diff changeset
211 }
tatsuki
parents:
diff changeset
212 editor = either.b();
tatsuki
parents:
diff changeset
213 either = editor.success();
tatsuki
parents:
diff changeset
214 } while (either.isA());
tatsuki
parents:
diff changeset
215
tatsuki
parents:
diff changeset
216 }
tatsuki
parents:
diff changeset
217
tatsuki
parents:
diff changeset
218 public void editMessage(String _board, String _nodeNum,final String _author, final String _message, final String _editKey) {
tatsuki
parents:
diff changeset
219 final long timestamp = System.currentTimeMillis();
tatsuki
parents:
diff changeset
220 final ByteBuffer tBuffer = ByteBuffer.allocate(16);
tatsuki
parents:
diff changeset
221 tBuffer.putLong(timestamp);
tatsuki
parents:
diff changeset
222 JungleTree tree = jungle.getTreeByName(_board);
tatsuki
parents:
diff changeset
223 Either<Error, JungleTreeEditor> either = null;
tatsuki
parents:
diff changeset
224
tatsuki
parents:
diff changeset
225 do {
tatsuki
parents:
diff changeset
226 DefaultNodePath path = new DefaultNodePath();
tatsuki
parents:
diff changeset
227 try {
tatsuki
parents:
diff changeset
228 for (int count = 0; _nodeNum.substring(count, count + 1) != null; count++) {
tatsuki
parents:
diff changeset
229 if (!_nodeNum.substring(count, count + 1).equals("/"))
tatsuki
parents:
diff changeset
230 path = path.add(Integer.parseInt(_nodeNum.substring(count, count + 1)));
tatsuki
parents:
diff changeset
231 }
tatsuki
parents:
diff changeset
232 } catch (Exception _e) {
tatsuki
parents:
diff changeset
233 }
tatsuki
parents:
diff changeset
234 JungleTreeEditor editor = tree.getTreeEditor();
tatsuki
parents:
diff changeset
235 NodeEditor e = new NodeEditor() {
tatsuki
parents:
diff changeset
236 public Either<Error,LoggingNode> edit(TreeNode node) {
tatsuki
parents:
diff changeset
237 LoggingNode logNode = wrap(node , new DefaultOperationLog());
tatsuki
parents:
diff changeset
238 System.out.println(new String(node.getAttributes().get("mes").array()));
tatsuki
parents:
diff changeset
239 logNode = logNode.getAttributes().put("author", ByteBuffer.wrap(_author.getBytes())).b();
tatsuki
parents:
diff changeset
240 logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_message.getBytes())).b();
tatsuki
parents:
diff changeset
241 logNode = logNode.getAttributes().put("key", ByteBuffer.wrap(_editKey.getBytes())).b();
tatsuki
parents:
diff changeset
242 logNode = logNode.getAttributes().put("timestamp", tBuffer).b();
tatsuki
parents:
diff changeset
243 System.out.println(new String(node.getAttributes().get("mes").array()));
tatsuki
parents:
diff changeset
244 return DefaultEither.newB(logNode);
tatsuki
parents:
diff changeset
245 }
tatsuki
parents:
diff changeset
246
tatsuki
parents:
diff changeset
247 @Override
tatsuki
parents:
diff changeset
248 public LoggingNode wrap(TreeNode node, OperationLog op) {
tatsuki
parents:
diff changeset
249 return new LoggingNode(node, op);
tatsuki
parents:
diff changeset
250 }
tatsuki
parents:
diff changeset
251
tatsuki
parents:
diff changeset
252 };
tatsuki
parents:
diff changeset
253 either = editor.edit(path, e);
tatsuki
parents:
diff changeset
254 if (either.isA()) {
tatsuki
parents:
diff changeset
255 throw new IllegalStateException();
tatsuki
parents:
diff changeset
256 }
tatsuki
parents:
diff changeset
257 editor = either.b();
tatsuki
parents:
diff changeset
258 either = editor.success();
tatsuki
parents:
diff changeset
259 } while (either.isA());
tatsuki
parents:
diff changeset
260 }
tatsuki
parents:
diff changeset
261
tatsuki
parents:
diff changeset
262 public void createAttribute(String _board, String _uuid, final String _author, final String _message, final String _editKey) {
tatsuki
parents:
diff changeset
263 final long timestamp = System.currentTimeMillis();
tatsuki
parents:
diff changeset
264 final ByteBuffer tBuffer = ByteBuffer.allocate(16);
tatsuki
parents:
diff changeset
265 tBuffer.putLong(timestamp);
tatsuki
parents:
diff changeset
266 JungleTree tree = jungle.getTreeByName(_board);
tatsuki
parents:
diff changeset
267 Either<Error, JungleTreeEditor> either = null;
tatsuki
parents:
diff changeset
268 DefaultNodePath path = new DefaultNodePath();
tatsuki
parents:
diff changeset
269 do {
tatsuki
parents:
diff changeset
270 try {
tatsuki
parents:
diff changeset
271 for (int count = 0; _uuid.substring(count, count + 1) != null; count++) {
tatsuki
parents:
diff changeset
272 if (!_uuid.substring(count, count + 1).equals("/"))
tatsuki
parents:
diff changeset
273 path = path.add(Integer.parseInt(_uuid.substring(count,
tatsuki
parents:
diff changeset
274 count + 1)));
tatsuki
parents:
diff changeset
275 }
tatsuki
parents:
diff changeset
276 } catch (Exception _e) {
tatsuki
parents:
diff changeset
277 }
tatsuki
parents:
diff changeset
278
tatsuki
parents:
diff changeset
279 JungleTreeEditor editor = tree.getTreeEditor();
tatsuki
parents:
diff changeset
280 NodeEditor e = new NodeEditor() {
tatsuki
parents:
diff changeset
281 String str;
tatsuki
parents:
diff changeset
282
tatsuki
parents:
diff changeset
283 public Either<Error,LoggingNode> edit(TreeNode node) {
tatsuki
parents:
diff changeset
284 LoggingNode logNode = wrap(node , new DefaultOperationLog());
tatsuki
parents:
diff changeset
285 str = "0";
tatsuki
parents:
diff changeset
286 int count = 0;
tatsuki
parents:
diff changeset
287 for (; logNode.getAttributes().get("mes" + String.valueOf(count)) != null; count++) {
tatsuki
parents:
diff changeset
288 }
tatsuki
parents:
diff changeset
289 str = String.valueOf(count);
tatsuki
parents:
diff changeset
290 logNode = logNode.getAttributes().put("mes" + str,ByteBuffer.wrap(_message.getBytes())).b();
tatsuki
parents:
diff changeset
291 logNode = logNode.getAttributes().put("timestamp" + str, tBuffer).b();
tatsuki
parents:
diff changeset
292 return DefaultEither.newB(logNode);
tatsuki
parents:
diff changeset
293 }
tatsuki
parents:
diff changeset
294
tatsuki
parents:
diff changeset
295 @Override
tatsuki
parents:
diff changeset
296 public LoggingNode wrap(TreeNode node, OperationLog op) {
tatsuki
parents:
diff changeset
297 return new LoggingNode(node, op);
tatsuki
parents:
diff changeset
298 }
tatsuki
parents:
diff changeset
299 };
tatsuki
parents:
diff changeset
300 either = editor.edit(path, e);
tatsuki
parents:
diff changeset
301 if (either.isA()) {
tatsuki
parents:
diff changeset
302 throw new IllegalStateException();
tatsuki
parents:
diff changeset
303 }
tatsuki
parents:
diff changeset
304 editor = either.b();
tatsuki
parents:
diff changeset
305 either = editor.success();
tatsuki
parents:
diff changeset
306 } while (either.isA());
tatsuki
parents:
diff changeset
307 }
tatsuki
parents:
diff changeset
308
tatsuki
parents:
diff changeset
309 public void editAttribute(String boardName, String _path, final String id, final String _message) {
tatsuki
parents:
diff changeset
310 final long timestamp = System.currentTimeMillis();
tatsuki
parents:
diff changeset
311 final ByteBuffer tBuffer = ByteBuffer.allocate(16);
tatsuki
parents:
diff changeset
312 tBuffer.putLong(timestamp);
tatsuki
parents:
diff changeset
313 JungleTree tree = jungle.getTreeByName(boardName);
tatsuki
parents:
diff changeset
314 Either<Error, JungleTreeEditor> either = null;
tatsuki
parents:
diff changeset
315 DefaultNodePath path = new DefaultNodePath();
tatsuki
parents:
diff changeset
316 do {
tatsuki
parents:
diff changeset
317 try {
tatsuki
parents:
diff changeset
318 for (int count = 0; _path.substring(count, count + 1) != null; count++) {
tatsuki
parents:
diff changeset
319 if (!_path.substring(count, count + 1).equals("/"))
tatsuki
parents:
diff changeset
320 path = path.add(Integer.parseInt(_path.substring(count,
tatsuki
parents:
diff changeset
321 count + 1)));
tatsuki
parents:
diff changeset
322 }
tatsuki
parents:
diff changeset
323 } catch (Exception _e) {
tatsuki
parents:
diff changeset
324 }
tatsuki
parents:
diff changeset
325
tatsuki
parents:
diff changeset
326 JungleTreeEditor editor = tree.getTreeEditor();
tatsuki
parents:
diff changeset
327 NodeEditor e = new NodeEditor() {
tatsuki
parents:
diff changeset
328 public Either<Error,LoggingNode> edit(TreeNode node) {
tatsuki
parents:
diff changeset
329 LoggingNode logNode = wrap(node , new DefaultOperationLog());
tatsuki
parents:
diff changeset
330 // EnableNodeWrapper<T> node = _e.getWrap();
tatsuki
parents:
diff changeset
331 logNode = logNode.getAttributes().put("mes" + id,ByteBuffer.wrap(_message.getBytes())).b();
tatsuki
parents:
diff changeset
332 logNode = logNode.getAttributes().put("timestamp" + id, tBuffer).b();
tatsuki
parents:
diff changeset
333 return DefaultEither.newB(logNode);
tatsuki
parents:
diff changeset
334 }
tatsuki
parents:
diff changeset
335
tatsuki
parents:
diff changeset
336 @Override
tatsuki
parents:
diff changeset
337 public LoggingNode wrap(TreeNode node, OperationLog op) {
tatsuki
parents:
diff changeset
338 return new LoggingNode(node, op);
tatsuki
parents:
diff changeset
339 }
tatsuki
parents:
diff changeset
340
tatsuki
parents:
diff changeset
341 };
tatsuki
parents:
diff changeset
342 either = editor.edit(path, e);
tatsuki
parents:
diff changeset
343 if (either.isA()) {
tatsuki
parents:
diff changeset
344 throw new IllegalStateException();
tatsuki
parents:
diff changeset
345 }
tatsuki
parents:
diff changeset
346 editor = either.b();
tatsuki
parents:
diff changeset
347 either = editor.success();
tatsuki
parents:
diff changeset
348 } while (either.isA());
tatsuki
parents:
diff changeset
349 }
tatsuki
parents:
diff changeset
350
tatsuki
parents:
diff changeset
351 public void deleteNode(String _board, String _path, String _id) {
tatsuki
parents:
diff changeset
352 int id = Integer.parseInt(_id);
tatsuki
parents:
diff changeset
353 final long timestamp = System.currentTimeMillis();
tatsuki
parents:
diff changeset
354 final ByteBuffer tBuffer = ByteBuffer.allocate(16);
tatsuki
parents:
diff changeset
355 tBuffer.putLong(timestamp);
tatsuki
parents:
diff changeset
356 JungleTree tree = jungle.getTreeByName(_board);
tatsuki
parents:
diff changeset
357 Either<Error, JungleTreeEditor> either = null;
tatsuki
parents:
diff changeset
358 DefaultNodePath path = new DefaultNodePath();
tatsuki
parents:
diff changeset
359 do {
tatsuki
parents:
diff changeset
360 try {
tatsuki
parents:
diff changeset
361 for (int count = 0; _path.substring(count, count + 1) != null; count++) {
tatsuki
parents:
diff changeset
362 if (!_path.substring(count, count + 1).equals("/"))
tatsuki
parents:
diff changeset
363 path = path.add(Integer.parseInt(_path.substring(count,count + 1)));
tatsuki
parents:
diff changeset
364 }
tatsuki
parents:
diff changeset
365 } catch (Exception _e) {
tatsuki
parents:
diff changeset
366 }
tatsuki
parents:
diff changeset
367
tatsuki
parents:
diff changeset
368 JungleTreeEditor editor = tree.getTreeEditor();
tatsuki
parents:
diff changeset
369
tatsuki
parents:
diff changeset
370 either = editor.deleteChildAt(path, id);
tatsuki
parents:
diff changeset
371 if (either.isA()) {
tatsuki
parents:
diff changeset
372 throw new IllegalStateException();
tatsuki
parents:
diff changeset
373 }
tatsuki
parents:
diff changeset
374 editor = either.b();
tatsuki
parents:
diff changeset
375 either = editor.success();
tatsuki
parents:
diff changeset
376 } while (either.isA());
tatsuki
parents:
diff changeset
377
tatsuki
parents:
diff changeset
378 }
tatsuki
parents:
diff changeset
379
tatsuki
parents:
diff changeset
380 public void deleteAttribute(String _board, String _path, final String id) {
tatsuki
parents:
diff changeset
381 final long timestamp = System.currentTimeMillis();
tatsuki
parents:
diff changeset
382 final ByteBuffer tBuffer = ByteBuffer.allocate(16);
tatsuki
parents:
diff changeset
383 tBuffer.putLong(timestamp);
tatsuki
parents:
diff changeset
384 JungleTree tree = jungle.getTreeByName(_board);
tatsuki
parents:
diff changeset
385 Either<Error, JungleTreeEditor> either = null;
tatsuki
parents:
diff changeset
386 DefaultNodePath path = new DefaultNodePath();
tatsuki
parents:
diff changeset
387 do {
tatsuki
parents:
diff changeset
388 try {
tatsuki
parents:
diff changeset
389 for (int count = 0; _path.substring(count, count + 1) != null; count++) {
tatsuki
parents:
diff changeset
390 if (!_path.substring(count, count + 1).equals("/"))
tatsuki
parents:
diff changeset
391 path = path.add(Integer.parseInt(_path.substring(count,
tatsuki
parents:
diff changeset
392 count + 1)));
tatsuki
parents:
diff changeset
393 }
tatsuki
parents:
diff changeset
394 } catch (Exception _e) {
tatsuki
parents:
diff changeset
395 System.out.println("屑");
tatsuki
parents:
diff changeset
396 }
tatsuki
parents:
diff changeset
397
tatsuki
parents:
diff changeset
398 JungleTreeEditor editor = tree.getTreeEditor();
tatsuki
parents:
diff changeset
399 NodeEditor e = new NodeEditor() {
tatsuki
parents:
diff changeset
400 public Either<Error,LoggingNode> edit(TreeNode node) {
tatsuki
parents:
diff changeset
401 LoggingNode logNode = wrap(node , new DefaultOperationLog());
tatsuki
parents:
diff changeset
402 logNode = logNode.getAttributes().delete("mes" + id).b();
tatsuki
parents:
diff changeset
403 logNode = logNode.getAttributes().delete("timestamp" + id).b();
tatsuki
parents:
diff changeset
404 int count = Integer.parseInt(id);
tatsuki
parents:
diff changeset
405 for (; logNode.getAttributes().get("mes" + String.valueOf(count + 1)) != null;) {
tatsuki
parents:
diff changeset
406 logNode = logNode.getAttributes().put("mes" + count,node.getAttributes().get("mes"+ String.valueOf(count + 1))).b();
tatsuki
parents:
diff changeset
407 logNode = logNode.getAttributes().put("timestamp" + count, tBuffer).b();
tatsuki
parents:
diff changeset
408 count++;
tatsuki
parents:
diff changeset
409 }
tatsuki
parents:
diff changeset
410 if (count != Integer.parseInt(id)) {
tatsuki
parents:
diff changeset
411 logNode = logNode.getAttributes().delete("timestamp" + count).b();
tatsuki
parents:
diff changeset
412 logNode = logNode.getAttributes().delete("mes" + count).b();
tatsuki
parents:
diff changeset
413 }
tatsuki
parents:
diff changeset
414
tatsuki
parents:
diff changeset
415 return DefaultEither.newB(logNode);
tatsuki
parents:
diff changeset
416 }
tatsuki
parents:
diff changeset
417
tatsuki
parents:
diff changeset
418 @Override
tatsuki
parents:
diff changeset
419 public LoggingNode wrap(TreeNode node, OperationLog op) {
tatsuki
parents:
diff changeset
420 return new LoggingNode(node, op);
tatsuki
parents:
diff changeset
421 }
tatsuki
parents:
diff changeset
422 };
tatsuki
parents:
diff changeset
423 either = editor.edit(path, e);
tatsuki
parents:
diff changeset
424 if (either.isA()) {
tatsuki
parents:
diff changeset
425 throw new IllegalStateException();
tatsuki
parents:
diff changeset
426 }
tatsuki
parents:
diff changeset
427 editor = either.b();
tatsuki
parents:
diff changeset
428 either = editor.success();
tatsuki
parents:
diff changeset
429 } while (either.isA());
tatsuki
parents:
diff changeset
430 }
tatsuki
parents:
diff changeset
431
tatsuki
parents:
diff changeset
432 public void editMatrixMessage(String _board, String _uuid,
tatsuki
parents:
diff changeset
433 final String _author, final String _message, final String _editKey) {
tatsuki
parents:
diff changeset
434 final long timestamp = System.currentTimeMillis();
tatsuki
parents:
diff changeset
435 final ByteBuffer tBuffer = ByteBuffer.allocate(16);
tatsuki
parents:
diff changeset
436 tBuffer.putLong(timestamp);
tatsuki
parents:
diff changeset
437 JungleTree tree = jungle.getTreeByName(_board);
tatsuki
parents:
diff changeset
438 Either<Error, JungleTreeEditor> either = null;
tatsuki
parents:
diff changeset
439 do {
tatsuki
parents:
diff changeset
440 DefaultNodePath path = new DefaultNodePath();
tatsuki
parents:
diff changeset
441 path = path.add(Integer.parseInt(_uuid));
tatsuki
parents:
diff changeset
442
tatsuki
parents:
diff changeset
443 JungleTreeEditor editor = tree.getTreeEditor();
tatsuki
parents:
diff changeset
444 NodeEditor e = new NodeEditor() {
tatsuki
parents:
diff changeset
445 public Either<Error,LoggingNode> edit(TreeNode node) {
tatsuki
parents:
diff changeset
446 LoggingNode logNode = wrap(node , new DefaultOperationLog());
tatsuki
parents:
diff changeset
447 logNode = logNode.getAttributes().put("author", ByteBuffer.wrap(_author.getBytes())).b();
tatsuki
parents:
diff changeset
448 logNode = logNode.getAttributes().put("mes", ByteBuffer.wrap(_message.getBytes())).b();
tatsuki
parents:
diff changeset
449 logNode = logNode.getAttributes().put("key", ByteBuffer.wrap(_editKey.getBytes())).b();
tatsuki
parents:
diff changeset
450 logNode = logNode.getAttributes().put("timestamp", tBuffer).b();
tatsuki
parents:
diff changeset
451 return DefaultEither.newB(logNode);
tatsuki
parents:
diff changeset
452 }
tatsuki
parents:
diff changeset
453
tatsuki
parents:
diff changeset
454 @Override
tatsuki
parents:
diff changeset
455 public LoggingNode wrap(TreeNode node, OperationLog op) {
tatsuki
parents:
diff changeset
456 return new LoggingNode(node, op);
tatsuki
parents:
diff changeset
457 }
tatsuki
parents:
diff changeset
458
tatsuki
parents:
diff changeset
459
tatsuki
parents:
diff changeset
460 };
tatsuki
parents:
diff changeset
461 either = editor.edit(path, e);
tatsuki
parents:
diff changeset
462 if (either.isA()) {
tatsuki
parents:
diff changeset
463 throw new IllegalStateException();
tatsuki
parents:
diff changeset
464 }
tatsuki
parents:
diff changeset
465 editor = either.b();
tatsuki
parents:
diff changeset
466 either = editor.success();
tatsuki
parents:
diff changeset
467 } while (either.isA());
tatsuki
parents:
diff changeset
468 }
tatsuki
parents:
diff changeset
469
tatsuki
parents:
diff changeset
470 public Iterable<BoardMessage> getMessages(String _boardName) {
tatsuki
parents:
diff changeset
471 JungleTree tree = jungle.getTreeByName(_boardName);
tatsuki
parents:
diff changeset
472 TreeNode node = tree.getRootNode();
tatsuki
parents:
diff changeset
473 Children chs = node.getChildren();
tatsuki
parents:
diff changeset
474 final AtomicInteger counter = new AtomicInteger(0);
tatsuki
parents:
diff changeset
475 IterableConverter.Converter<BoardMessage, TreeNode> converter = new IterableConverter.Converter<BoardMessage, TreeNode>() {
tatsuki
parents:
diff changeset
476 public BoardMessage conv(TreeNode _b) {
tatsuki
parents:
diff changeset
477 String uuid = Integer.toString(counter.get());
tatsuki
parents:
diff changeset
478 String author = new String(_b.getAttributes().get("author").array());
tatsuki
parents:
diff changeset
479 String message = new String(_b.getAttributes().get("mes").array());
tatsuki
parents:
diff changeset
480 counter.incrementAndGet();
tatsuki
parents:
diff changeset
481 return new BoardMessageImpl(author, message, uuid);
tatsuki
parents:
diff changeset
482 }
tatsuki
parents:
diff changeset
483 };
tatsuki
parents:
diff changeset
484 return new IterableConverter<BoardMessage, TreeNode>(chs, converter);
tatsuki
parents:
diff changeset
485 }
tatsuki
parents:
diff changeset
486
tatsuki
parents:
diff changeset
487 public Iterable<BoardMessage> getFolder(String _boardName, String _nodeNum) {
tatsuki
parents:
diff changeset
488
tatsuki
parents:
diff changeset
489 DefaultNodePath path = new DefaultNodePath();
tatsuki
parents:
diff changeset
490 try {
tatsuki
parents:
diff changeset
491 for (int count = 0; _nodeNum.substring(count, count + 1) != null; count++) {
tatsuki
parents:
diff changeset
492 if (!_nodeNum.substring(count, count + 1).equals("/"))
tatsuki
parents:
diff changeset
493 path = path.add(Integer.parseInt(_nodeNum.substring(count,count + 1)));
tatsuki
parents:
diff changeset
494 }
tatsuki
parents:
diff changeset
495 } catch (Exception _e) {
tatsuki
parents:
diff changeset
496 }
tatsuki
parents:
diff changeset
497 JungleTree tree = jungle.getTreeByName(_boardName);
tatsuki
parents:
diff changeset
498 TreeNode node = tree.getRootNode();
tatsuki
parents:
diff changeset
499
tatsuki
parents:
diff changeset
500 DefaultTraverser traverser = new DefaultTraverser();
tatsuki
parents:
diff changeset
501 DefaultEvaluator evaluator = new DefaultEvaluator(path);
tatsuki
parents:
diff changeset
502 Either<Error, Traversal> ret = traverser.traverse(node,evaluator);
tatsuki
parents:
diff changeset
503 if (ret.isA()) {
tatsuki
parents:
diff changeset
504 Assert.fail();
tatsuki
parents:
diff changeset
505 }
tatsuki
parents:
diff changeset
506
tatsuki
parents:
diff changeset
507 Traversal traversal = ret.b();
tatsuki
parents:
diff changeset
508 TreeNode target = traversal.destination();
tatsuki
parents:
diff changeset
509 Children chs = target.getChildren();
tatsuki
parents:
diff changeset
510
tatsuki
parents:
diff changeset
511 final AtomicInteger counter = new AtomicInteger(0);
tatsuki
parents:
diff changeset
512 IterableConverter.Converter<BoardMessage, TreeNode> converter = new IterableConverter.Converter<BoardMessage, TreeNode>() {
tatsuki
parents:
diff changeset
513 public BoardMessage conv(TreeNode _b) {
tatsuki
parents:
diff changeset
514 String uuid = Integer.toString(counter.get());
tatsuki
parents:
diff changeset
515 String message = new String(_b.getAttributes().get("element").array());
tatsuki
parents:
diff changeset
516 counter.incrementAndGet();
tatsuki
parents:
diff changeset
517 return new BoardMessageImpl(null, message, uuid);
tatsuki
parents:
diff changeset
518 }
tatsuki
parents:
diff changeset
519 };
tatsuki
parents:
diff changeset
520 return new IterableConverter<BoardMessage, TreeNode>(chs, converter);
tatsuki
parents:
diff changeset
521 }
tatsuki
parents:
diff changeset
522
tatsuki
parents:
diff changeset
523 public getAttributeImp getAttribute(String _boardName, String _nodeNum) {
tatsuki
parents:
diff changeset
524
tatsuki
parents:
diff changeset
525 DefaultNodePath path = new DefaultNodePath();
tatsuki
parents:
diff changeset
526 try {
tatsuki
parents:
diff changeset
527 for (int count = 0; _nodeNum.substring(count, count + 1) != null; count++) {
tatsuki
parents:
diff changeset
528 if (!_nodeNum.substring(count, count + 1).equals("/"))
tatsuki
parents:
diff changeset
529 path = path.add(Integer.parseInt(_nodeNum.substring(count,
tatsuki
parents:
diff changeset
530 count + 1)));
tatsuki
parents:
diff changeset
531 }
tatsuki
parents:
diff changeset
532 } catch (Exception _e) {
tatsuki
parents:
diff changeset
533 }
tatsuki
parents:
diff changeset
534 JungleTree tree = jungle.getTreeByName(_boardName);
tatsuki
parents:
diff changeset
535 TreeNode node = tree.getRootNode();
tatsuki
parents:
diff changeset
536
tatsuki
parents:
diff changeset
537 DefaultTraverser traverser = new DefaultTraverser();
tatsuki
parents:
diff changeset
538 DefaultEvaluator evaluator = new DefaultEvaluator(path);
tatsuki
parents:
diff changeset
539 Either<Error, Traversal> ret = traverser.traverse(node,evaluator);
tatsuki
parents:
diff changeset
540 if (ret.isA()) {
tatsuki
parents:
diff changeset
541 Assert.fail();
tatsuki
parents:
diff changeset
542 }
tatsuki
parents:
diff changeset
543
tatsuki
parents:
diff changeset
544 Traversal traversal = ret.b();
tatsuki
parents:
diff changeset
545 TreeNode target = traversal.destination();
tatsuki
parents:
diff changeset
546 return new getAttributeImp(target);
tatsuki
parents:
diff changeset
547 }
tatsuki
parents:
diff changeset
548
tatsuki
parents:
diff changeset
549
tatsuki
parents:
diff changeset
550
tatsuki
parents:
diff changeset
551 private static class BoardMessageImpl implements BoardMessage {
tatsuki
parents:
diff changeset
552 private final String author;
tatsuki
parents:
diff changeset
553 private final String message;
tatsuki
parents:
diff changeset
554 private final String uuid;
tatsuki
parents:
diff changeset
555
tatsuki
parents:
diff changeset
556 public BoardMessageImpl(String _author, String _message, String _uuid) {
tatsuki
parents:
diff changeset
557 author = _author;
tatsuki
parents:
diff changeset
558 message = _message;
tatsuki
parents:
diff changeset
559 uuid = _uuid;
tatsuki
parents:
diff changeset
560 }
tatsuki
parents:
diff changeset
561
tatsuki
parents:
diff changeset
562 public String getAuthor() {
tatsuki
parents:
diff changeset
563 return author;
tatsuki
parents:
diff changeset
564 }
tatsuki
parents:
diff changeset
565
tatsuki
parents:
diff changeset
566 public String getMessage() {
tatsuki
parents:
diff changeset
567 return message;
tatsuki
parents:
diff changeset
568 }
tatsuki
parents:
diff changeset
569
tatsuki
parents:
diff changeset
570 public String getUUID() {
tatsuki
parents:
diff changeset
571 return uuid;
tatsuki
parents:
diff changeset
572 }
tatsuki
parents:
diff changeset
573
tatsuki
parents:
diff changeset
574 }
tatsuki
parents:
diff changeset
575
tatsuki
parents:
diff changeset
576 public void readXml(String xmlPath){
tatsuki
parents:
diff changeset
577 try {
tatsuki
parents:
diff changeset
578 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
tatsuki
parents:
diff changeset
579 SAXParser saxParser = saxParserFactory.newSAXParser();
tatsuki
parents:
diff changeset
580 createBoards("XMLTEST");
tatsuki
parents:
diff changeset
581 JungleTree tree = jungle.getTreeByName("XMLTEST");
tatsuki
parents:
diff changeset
582 ReadXmlHandler readXmlHandler = new ReadXmlHandler(tree);
3
3dc5905739ef add xml file
tatsuki
parents: 1
diff changeset
583 saxParser.parse(new FileInputStream("xml/" + xmlPath), readXmlHandler);
1
tatsuki
parents:
diff changeset
584 } catch (Exception e) {
tatsuki
parents:
diff changeset
585 e.printStackTrace();
tatsuki
parents:
diff changeset
586 }
tatsuki
parents:
diff changeset
587 }
tatsuki
parents:
diff changeset
588
tatsuki
parents:
diff changeset
589 public String sanitize(String str) {
tatsuki
parents:
diff changeset
590 if (str == null) {
tatsuki
parents:
diff changeset
591 return str;
tatsuki
parents:
diff changeset
592 }
tatsuki
parents:
diff changeset
593 str = str.replaceAll("&", "&amp;");
tatsuki
parents:
diff changeset
594 str = str.replaceAll("<", "&lt;");
tatsuki
parents:
diff changeset
595 str = str.replaceAll(">", "&gt;");
tatsuki
parents:
diff changeset
596 str = str.replaceAll("\"", "&quot;");
tatsuki
parents:
diff changeset
597 str = str.replaceAll("'", "&#39;");
tatsuki
parents:
diff changeset
598 return str;
tatsuki
parents:
diff changeset
599 }
tatsuki
parents:
diff changeset
600
tatsuki
parents:
diff changeset
601
tatsuki
parents:
diff changeset
602
tatsuki
parents:
diff changeset
603 @Override
tatsuki
parents:
diff changeset
604 public void createBoards(String _name, String _author, String _initMessage,
tatsuki
parents:
diff changeset
605 String _editKey) {
tatsuki
parents:
diff changeset
606 // TODO Auto-generated method stub
tatsuki
parents:
diff changeset
607
tatsuki
parents:
diff changeset
608 }
tatsuki
parents:
diff changeset
609
tatsuki
parents:
diff changeset
610 }