38
|
1 package jungle.test.bbs;
|
|
2
|
|
3 import java.util.Collections;
|
|
4 import java.util.List;
|
|
5 import java.util.UUID;
|
|
6
|
|
7 import org.apache.cassandra.locator.SimpleStrategy;
|
|
8
|
|
9 import me.prettyprint.cassandra.serializers.StringSerializer;
|
|
10 import me.prettyprint.cassandra.serializers.UUIDSerializer;
|
|
11 import me.prettyprint.cassandra.service.CassandraHost;
|
|
12 import me.prettyprint.cassandra.service.template.SuperCfResult;
|
|
13 import me.prettyprint.cassandra.service.template.SuperCfUpdater;
|
|
14 import me.prettyprint.cassandra.service.template.ThriftSuperCfTemplate;
|
|
15 import me.prettyprint.cassandra.utils.TimeUUIDUtils;
|
|
16 import me.prettyprint.hector.api.Cluster;
|
|
17 import me.prettyprint.hector.api.Keyspace;
|
|
18 import me.prettyprint.hector.api.beans.HSuperColumn;
|
|
19 import me.prettyprint.hector.api.beans.OrderedSuperRows;
|
|
20 import me.prettyprint.hector.api.beans.SuperRow;
|
|
21 import me.prettyprint.hector.api.beans.SuperSlice;
|
|
22 import me.prettyprint.hector.api.ddl.ColumnFamilyDefinition;
|
|
23 import me.prettyprint.hector.api.ddl.ColumnType;
|
|
24 import me.prettyprint.hector.api.ddl.ComparatorType;
|
|
25 import me.prettyprint.hector.api.ddl.KeyspaceDefinition;
|
|
26 import me.prettyprint.hector.api.factory.HFactory;
|
|
27 import me.prettyprint.hector.api.query.QueryResult;
|
|
28 import me.prettyprint.hector.api.query.RangeSuperSlicesQuery;
|
|
29 import me.prettyprint.hector.api.query.SuperSliceQuery;
|
|
30
|
|
31 public class CassandraBulletinBoard implements BulletinBoard
|
|
32 {
|
|
33 private final String address;
|
|
34 private final String clusterName;
|
|
35 private final Cluster cluster;
|
|
36 private final String keyspace;
|
|
37
|
|
38 private static final String COLUMN_FAMILY_BOARD = "boards";
|
|
39
|
|
40 public CassandraBulletinBoard(String _clusterName,String _address,String _keyspaceName)
|
|
41 {
|
|
42 address = _address;
|
|
43 clusterName = _clusterName;
|
|
44 keyspace = _keyspaceName;
|
|
45 cluster = HFactory.getOrCreateCluster(clusterName,address);
|
|
46
|
|
47 initialize();
|
|
48 }
|
|
49
|
|
50 private void initialize()
|
|
51 {
|
|
52 if(cluster.describeKeyspace(keyspace) == null){
|
|
53 KeyspaceDefinition keyspaceDefinition = HFactory.createKeyspaceDefinition(keyspace,
|
|
54 SimpleStrategy.class.getName(),1,Collections.<ColumnFamilyDefinition> emptyList());
|
|
55 cluster.addKeyspace(keyspaceDefinition,false);
|
|
56 ColumnFamilyDefinition columnFamilyDefinition = HFactory.createColumnFamilyDefinition(keyspace,COLUMN_FAMILY_BOARD,ComparatorType.UUIDTYPE);
|
|
57 columnFamilyDefinition.setColumnType(ColumnType.SUPER);
|
|
58 cluster.addColumnFamily(columnFamilyDefinition);
|
|
59 }
|
|
60 }
|
|
61
|
|
62 public Iterable<String> getBoards()
|
|
63 {
|
|
64 Keyspace ksp = HFactory.createKeyspace(keyspace, cluster);
|
|
65 RangeSuperSlicesQuery<String,UUID,String,String> query = HFactory.createRangeSuperSlicesQuery(ksp,StringSerializer.get(),
|
|
66 UUIDSerializer.get(),StringSerializer.get(),StringSerializer.get());
|
|
67 query.setColumnFamily(COLUMN_FAMILY_BOARD).setKeys(null,null).setRange(null,null,false,0);
|
|
68
|
|
69 QueryResult<OrderedSuperRows<String,UUID,String,String>> result = query.execute();
|
|
70 OrderedSuperRows<String,UUID,String,String> rows = result.get();
|
|
71 List<SuperRow<String,UUID,String,String>> list = rows.getList();
|
|
72
|
|
73 IterableConverter.Converter<String,SuperRow<String,UUID,String,String>> converter
|
|
74 = new IterableConverter.Converter<String, SuperRow<String,UUID,String,String>>(){
|
|
75 public String conv(SuperRow<String, UUID, String, String> _b) {
|
|
76 return _b.getKey();
|
|
77 }
|
|
78 };
|
|
79
|
|
80 return new IterableConverter<String,SuperRow<String,UUID,String,String>>(list,converter);
|
|
81 }
|
|
82
|
|
83 private static final String COLUMN_MESSAGE_AUTHOR = "author";
|
|
84 private static final String COLUMN_MESSAGE_BODY = "message";
|
|
85 private static final String COLUMN_MESSAGE_EDIT_KEY = "edit";
|
|
86
|
|
87 public void createBoardMessage(UUID _time,String _name,String _author,String _message,String _editKey)
|
|
88 {
|
|
89 Keyspace ksp = HFactory.createKeyspace(keyspace,cluster);
|
|
90 ThriftSuperCfTemplate<String,UUID,String> template =
|
|
91 new ThriftSuperCfTemplate<String,UUID,String>(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(),
|
|
92 UUIDSerializer.get(),StringSerializer.get());
|
|
93
|
|
94 SuperCfUpdater<String,UUID,String> updater = template.createUpdater(_name,_time);
|
|
95 updater.setString(COLUMN_MESSAGE_AUTHOR,_author);
|
|
96 updater.setString(COLUMN_MESSAGE_BODY,_message);
|
|
97 updater.setString(COLUMN_MESSAGE_EDIT_KEY,_editKey);
|
|
98
|
|
99 template.update(updater);
|
|
100 }
|
|
101
|
|
102 public void createBoards(String _name,String _author,String _initMessage,String _editKey)
|
|
103 {
|
|
104 UUID time = TimeUUIDUtils.getTimeUUID(0);
|
|
105 createBoardMessage(time,_name,_author,_initMessage,_editKey);
|
|
106 }
|
|
107
|
|
108 public Iterable<BoardMessage> getMessages(String _boardName)
|
|
109 {
|
|
110 Keyspace ksp = HFactory.createKeyspace(keyspace,cluster);
|
|
111 SuperSliceQuery<String, UUID, String, String> query = HFactory.createSuperSliceQuery(ksp, StringSerializer.get(), UUIDSerializer.get(), StringSerializer.get(), StringSerializer.get());
|
|
112
|
|
113 UUID start = TimeUUIDUtils.getTimeUUID(0);
|
|
114 query.setKey(_boardName).setColumnFamily(COLUMN_FAMILY_BOARD).setRange(start,null,false,100);
|
|
115
|
|
116 QueryResult<SuperSlice<UUID, String, String>> result = query.execute();
|
|
117 SuperSlice<UUID,String,String> ss = result.get();
|
|
118 List<HSuperColumn<UUID,String,String>> list = ss.getSuperColumns();
|
|
119
|
|
120 IterableConverter.Converter<BoardMessage,HSuperColumn<UUID,String,String>> converter =
|
|
121 new IterableConverter.Converter<BoardMessage,HSuperColumn<UUID,String,String>>(){
|
|
122 public BoardMessage conv(HSuperColumn<UUID, String, String> _b){
|
|
123 UUID uuid = _b.getName();
|
|
124 String author = _b.getSubColumnByName(COLUMN_MESSAGE_AUTHOR).getValue();
|
|
125 String message = _b.getSubColumnByName(COLUMN_MESSAGE_BODY).getValue();
|
|
126 BoardMessageImpl bm = new BoardMessageImpl(author,message,uuid.toString());
|
|
127 return bm;
|
|
128 }
|
|
129 };
|
|
130
|
|
131
|
|
132 return new IterableConverter<BoardMessage,HSuperColumn<UUID,String,String>>(list,converter);
|
|
133 }
|
|
134
|
|
135 private static class BoardMessageImpl implements BoardMessage
|
|
136 {
|
|
137 private final String author;
|
|
138 private final String message;
|
|
139 private final String uuid;
|
|
140
|
|
141 public BoardMessageImpl(String _author,String _message,String _uuid)
|
|
142 {
|
|
143 author = _author;
|
|
144 message = _message;
|
|
145 uuid = _uuid;
|
|
146 }
|
|
147
|
|
148 public String getAuthor()
|
|
149 {
|
|
150 return author;
|
|
151 }
|
|
152
|
|
153 public String getMessage()
|
|
154 {
|
|
155 return message;
|
|
156 }
|
|
157
|
|
158 public String getUUID()
|
|
159 {
|
|
160 return uuid;
|
|
161 }
|
|
162 }
|
|
163
|
|
164 public void createBoardMessage(String _board, String _author, String _message,String _editKey)
|
|
165 {
|
|
166 UUID time = TimeUUIDUtils.getUniqueTimeUUIDinMillis();
|
|
167 createBoardMessage(time,_board,_author,_message,_editKey);
|
|
168 }
|
|
169
|
|
170 public void editMessage(String _board,String _uuid,String _author,String _message,String _editKey)
|
|
171 {
|
|
172 Keyspace ksp = HFactory.createKeyspace(keyspace, cluster);
|
|
173 UUID time = UUID.fromString(_uuid);
|
|
174 ThriftSuperCfTemplate<String,UUID,String> template =
|
|
175 new ThriftSuperCfTemplate<String,UUID,String>(ksp,COLUMN_FAMILY_BOARD,StringSerializer.get(),
|
|
176 UUIDSerializer.get(),StringSerializer.get());
|
|
177
|
|
178 SuperCfResult<String,UUID,String> result = template.querySuperColumn(_board,time);
|
|
179 String editKey = result.getString(COLUMN_MESSAGE_EDIT_KEY);
|
|
180 if(!editKey.equals(editKey)){
|
|
181 return;
|
|
182 }
|
|
183
|
|
184 SuperCfUpdater<String, UUID, String> updater = template.createUpdater(_board,time);
|
|
185 updater.setString(COLUMN_MESSAGE_AUTHOR,_author);
|
|
186 updater.setString(COLUMN_MESSAGE_BODY,_message);
|
|
187 updater.setString(COLUMN_MESSAGE_EDIT_KEY,_editKey);
|
|
188
|
|
189 template.update(updater);
|
|
190 }
|
|
191
|
|
192 }
|