annotate src/main/java/jp/ac/u_ryukyu/ie/cr/bbs/local/JungleBulletinBoard.java @ 4:5acde010c6db

add jungle browsing system
author tatsuki
date Tue, 28 Jun 2016 19:45:55 +0900
parents 64a72a7a0491
children 6e91ad317eb0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
1 package jp.ac.u_ryukyu.ie.cr.bbs.local;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
2
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
3
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
4 import jp.ac.u_ryukyu.ie.cr.jungle.DefaultJungle;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
5 import jp.ac.u_ryukyu.ie.cr.jungle.Jungle;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
6 import jp.ac.u_ryukyu.ie.cr.jungle.JungleTree;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
7 import jp.ac.u_ryukyu.ie.cr.jungle.JungleTreeEditor;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
8 import jp.ac.u_ryukyu.ie.cr.jungle.core.Children;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
9 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultNodePath;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
10 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.DefaultTreeEditor;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
11 import jp.ac.u_ryukyu.ie.cr.jungle.store.impl.TreeNode;
4
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
12 import jp.ac.u_ryukyu.ie.cr.jungle.transaction.DefaultTreeNode;
1
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
13 import jp.ac.u_ryukyu.ie.cr.jungle.traverser.DefaultTraverser;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
14 import jp.ac.u_ryukyu.ie.cr.jungle.util.Either;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
15 import jp.ac.u_ryukyu.ie.cr.jungle.util.Error;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
16
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
17 import java.nio.ByteBuffer;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
18 import java.util.concurrent.atomic.AtomicInteger;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
19
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
20 public class JungleBulletinBoard implements
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
21 BulletinBoard {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
22 private final Jungle jungle;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
23
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
24 public JungleBulletinBoard() {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
25 jungle = new DefaultJungle(null, "hoge", new DefaultTreeEditor(
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
26 new DefaultTraverser()));
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
27 jungle.createNewTree("boards");
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
28 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
29
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
30 public Iterable<String> getBoards() {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
31 JungleTree tree = jungle.getTreeByName("boards");
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
32 TreeNode node = tree.getRootNode();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
33 Children chs = node.getChildren();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
34
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
35 IterableConverter.Converter<String, TreeNode> converter = new IterableConverter.Converter<String, TreeNode>() {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
36 public String conv(TreeNode _b) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
37 ByteBuffer e = _b.getAttributes().get("name");
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
38 return new String(e.array());
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
39 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
40 };
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
41
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
42 return new IterableConverter<String, TreeNode>(chs, converter);
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
43 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
44
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
45 public void createBoards(final String _name, final String _author,
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
46 final String _initMessage, final String _editKey) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
47 if (null == jungle.createNewTree(_name)) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
48 throw new IllegalStateException();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
49 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
50 JungleTree tree = jungle.getTreeByName("boards");
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
51 JungleTreeEditor editor = tree.getTreeEditor();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
52 DefaultNodePath root = new DefaultNodePath();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
53 Either<Error, JungleTreeEditor> either = editor.addNewChildAt(root, 0);
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
54 if (either.isA()) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
55 throw new IllegalStateException();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
56 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
57 editor = either.b();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
58
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
59 either = editor.putAttribute(root.add(0), "name", ByteBuffer.wrap(_name.getBytes()));
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
60 if (either.isA()) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
61 throw new IllegalStateException();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
62 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
63 editor = either.b();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
64 Either<Error, JungleTreeEditor> result = editor.success();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
65 if (result.isA()) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
66 throw new IllegalStateException();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
67 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
68
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
69 tree = jungle.getTreeByName(_name);
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
70 editor = tree.getTreeEditor();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
71 editor = editor.putAttribute(root,"author", ByteBuffer.wrap(_author.getBytes())).b();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
72 editor = editor.putAttribute(root,"key", ByteBuffer.wrap(_editKey.getBytes())).b();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
73 either = editor.putAttribute(root,"mes", ByteBuffer.wrap(_initMessage.getBytes()));
4
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
74
1
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
75 if (either.isA()) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
76 throw new IllegalStateException();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
77 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
78 editor = either.b();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
79 editor.success();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
80 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
81
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
82 public void createBoardMessage(final String _board, final String _author,
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
83 final String _message, final String _editKey) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
84 JungleTree tree = jungle.getTreeByName(_board);
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
85 if (tree == null) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
86 throw new IllegalStateException();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
87 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
88
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
89 JungleTreeEditor editor;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
90 do {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
91 TreeNode node = tree.getRootNode();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
92 int size = node.getChildren().size();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
93 DefaultNodePath path = new DefaultNodePath();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
94
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
95 editor = tree.getTreeEditor();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
96 Either<Error, JungleTreeEditor> either = editor.addNewChildAt(path,
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
97 size);
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
98 if (either.isA()) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
99 throw new IllegalStateException();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
100 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
101 editor = either.b();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
102 editor = editor.putAttribute(path.add(size),"author", ByteBuffer.wrap(_author.getBytes())).b();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
103 editor = editor.putAttribute(path.add(size),"key", ByteBuffer.wrap(_editKey.getBytes())).b();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
104 either = editor.putAttribute(path.add(size),"mes", ByteBuffer.wrap(_message.getBytes()));
4
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
105
1
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
106 if (either.isA()) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
107 throw new IllegalStateException();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
108 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
109 editor = either.b();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
110 }while (editor.success().isA());
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
111 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
112
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
113 public void editMessage(String _board, String _uuid, final String _author,
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
114 final String _message, final String _editKey) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
115 JungleTreeEditor editor = null;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
116 do {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
117 DefaultNodePath path = new DefaultNodePath();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
118 path = path.add(Integer.parseInt(_uuid));
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
119
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
120 JungleTree tree = jungle.getTreeByName(_board);
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
121 editor = tree.getTreeEditor();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
122
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
123 editor = editor.putAttribute(path,"author", ByteBuffer.wrap(_author.getBytes())).b();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
124 editor = editor.putAttribute(path,"key", ByteBuffer.wrap(_editKey.getBytes())).b();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
125 Either<Error, JungleTreeEditor> either = editor.putAttribute(path,"mes", ByteBuffer.wrap(_message.getBytes()));
4
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
126
1
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
127 if (either.isA()) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
128 throw new IllegalStateException();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
129 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
130 editor = either.b();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
131 }while (editor.success().isA());
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
132 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
133
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
134 public Iterable<BoardMessage> getMessages(String _boardName) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
135 JungleTree tree = jungle.getTreeByName(_boardName);
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
136 TreeNode node = tree.getRootNode();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
137 Children chs = node.getChildren();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
138
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
139 final AtomicInteger counter = new AtomicInteger(0);
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
140 IterableConverter.Converter<BoardMessage, TreeNode> converter = new IterableConverter.Converter<BoardMessage, TreeNode>() {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
141 public BoardMessage conv(TreeNode _b) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
142 String uuid = Integer.toString(counter.get());
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
143 String author = new String(_b.getAttributes().get("author").array());
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
144 String message = new String(_b.getAttributes().get("mes").array());
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
145 counter.incrementAndGet();
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
146 return new BoardMessageImpl(author, message, uuid);
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
147 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
148 };
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
149
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
150 return new IterableConverter<BoardMessage, TreeNode>(chs, converter);
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
151 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
152
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
153 private static class BoardMessageImpl implements BoardMessage {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
154 private final String author;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
155 private final String message;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
156 private final String uuid;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
157
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
158 public BoardMessageImpl(String _author, String _message, String _uuid) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
159 author = _author;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
160 message = _message;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
161 uuid = _uuid;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
162 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
163
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
164 public String getAuthor() {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
165 return author;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
166 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
167
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
168 public String getMessage() {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
169 return message;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
170 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
171
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
172 public String getUUID() {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
173 return uuid;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
174 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
175 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
176
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
177 public String sanitize(String str) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
178 if (str == null) {
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
179 return str;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
180 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
181 str = str.replaceAll("&", "&amp;");
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
182 str = str.replaceAll("<", "&lt;");
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
183 str = str.replaceAll(">", "&gt;");
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
184 str = str.replaceAll("\"", "&quot;");
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
185 str = str.replaceAll("'", "&#39;");
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
186 return str;
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
187 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
188
4
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
189 public GetAttributeImp getAttribute(String _bname, String nodePath,String revisionStr) {
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
190 Long revision = Long.parseLong(revisionStr);
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
191 DefaultNodePath path = createNodePath(nodePath);
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
192 JungleTree tree = jungle.getTreeByName(_bname);
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
193 JungleTree oldTree = tree.getOldTree(revision).b();
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
194 Either<Error, TreeNode> either = tree.getNodeOfPath(path);
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
195 if (either.isA())
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
196 return new GetAttributeImp(new DefaultTreeNode());
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
197 TreeNode node = either.b();
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
198 return new GetAttributeImp(node);
1
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
199 }
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
200
4
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
201 private DefaultNodePath createNodePath(String nodePath) {
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
202 DefaultNodePath path = new DefaultNodePath();
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
203 try {
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
204 for (int count = 0; nodePath.substring(count, count + 1) != null; count++) {
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
205 if (!nodePath.substring(count, count + 1).equals("/"))
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
206 path = path.add(Integer.parseInt(nodePath.substring(count, count + 1)));
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
207 }
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
208 } catch (Exception _e) {
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
209 }
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
210 return path;
5acde010c6db add jungle browsing system
tatsuki
parents: 1
diff changeset
211 }
1
64a72a7a0491 add local bbs
tatsuki
parents:
diff changeset
212 }