blob: 7e7b979ee73564799012c4d808f59c260f9554f0 [file] [log] [blame]
Madan Jampani5e5b3d62016-02-01 16:03:33 -08001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2016-present Open Networking Laboratory
Madan Jampani5e5b3d62016-02-01 16:03:33 -08003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package org.onosproject.store.primitives.resources.impl;
17
18import io.atomix.catalyst.buffer.BufferInput;
19import io.atomix.catalyst.buffer.BufferOutput;
20import io.atomix.catalyst.serializer.CatalystSerializable;
Madan Jampanifc981772016-02-16 09:46:42 -080021import io.atomix.catalyst.serializer.SerializableTypeResolver;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080022import io.atomix.catalyst.serializer.Serializer;
Madan Jampanifc981772016-02-16 09:46:42 -080023import io.atomix.catalyst.serializer.SerializerRegistry;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080024import io.atomix.catalyst.util.Assert;
Madan Jampani3a9911c2016-02-21 11:25:45 -080025import io.atomix.copycat.Command;
26import io.atomix.copycat.Query;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080027
28import java.util.Collection;
29import java.util.Map;
30import java.util.Set;
31
32import org.onlab.util.Match;
Madan Jampanicadd70b2016-02-08 13:45:43 -080033import org.onosproject.store.primitives.TransactionId;
Madan Jampani74da78b2016-02-09 21:18:36 -080034import org.onosproject.store.service.MapTransaction;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080035import org.onosproject.store.service.Versioned;
36
37import com.google.common.base.MoreObjects;
38
39/**
40 * {@link AtomixConsistentMap} resource state machine operations.
41 */
42public final class AtomixConsistentMapCommands {
43
44 private AtomixConsistentMapCommands() {
45 }
46
47 /**
48 * Abstract map command.
49 */
50 @SuppressWarnings("serial")
51 public abstract static class MapCommand<V> implements Command<V>, CatalystSerializable {
52
53 @Override
Madan Jampani5e5b3d62016-02-01 16:03:33 -080054 public String toString() {
55 return MoreObjects.toStringHelper(getClass())
56 .toString();
57 }
58
59 @Override
60 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
61 }
62
63 @Override
64 public void readObject(BufferInput<?> buffer, Serializer serializer) {
65 }
66 }
67
68 /**
69 * Abstract map query.
70 */
71 @SuppressWarnings("serial")
72 public abstract static class MapQuery<V> implements Query<V>, CatalystSerializable {
73
74 @Override
75 public ConsistencyLevel consistency() {
Madan Jampani5ddaf192016-04-04 07:39:31 -070076 return ConsistencyLevel.SEQUENTIAL;
Madan Jampani5e5b3d62016-02-01 16:03:33 -080077 }
78
79 @Override
80 public String toString() {
81 return MoreObjects.toStringHelper(getClass())
82 .toString();
83 }
84
85 @Override
86 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
87 }
88
89 @Override
90 public void readObject(BufferInput<?> buffer, Serializer serializer) {
91 }
92 }
93
94 /**
95 * Abstract key-based query.
96 */
97 @SuppressWarnings("serial")
98 public abstract static class KeyQuery<V> extends MapQuery<V> {
99 protected String key;
100
101 public KeyQuery() {
102 }
103
104 public KeyQuery(String key) {
105 this.key = Assert.notNull(key, "key");
106 }
107
108 /**
109 * Returns the key.
110 * @return key
111 */
112 public String key() {
113 return key;
114 }
115
116 @Override
117 public String toString() {
118 return MoreObjects.toStringHelper(getClass())
119 .add("key", key)
120 .toString();
121 }
122
123 @Override
124 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
125 super.writeObject(buffer, serializer);
126 serializer.writeObject(key, buffer);
127 }
128
129 @Override
130 public void readObject(BufferInput<?> buffer, Serializer serializer) {
131 super.readObject(buffer, serializer);
132 key = serializer.readObject(buffer);
133 }
134 }
135
136 /**
Aaron Kruglikov56423ba2016-04-19 13:39:16 -0700137 * Abstract value-based query.
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800138 */
139 @SuppressWarnings("serial")
140 public abstract static class ValueQuery<V> extends MapQuery<V> {
141 protected byte[] value;
142
143 public ValueQuery() {
144 }
145
146 public ValueQuery(byte[] value) {
147 this.value = Assert.notNull(value, "value");
148 }
149
150 /**
Aaron Kruglikov56423ba2016-04-19 13:39:16 -0700151 * Returns the value.
152 * @return value
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800153 */
154 public byte[] value() {
155 return value;
156 }
157
158 @Override
159 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
160 super.writeObject(buffer, serializer);
161 serializer.writeObject(value, buffer);
162 }
163
164 @Override
165 public void readObject(BufferInput<?> buffer, Serializer serializer) {
166 super.readObject(buffer, serializer);
167 value = serializer.readObject(buffer);
168 }
169 }
170
171 /**
172 * Contains key command.
173 */
174 @SuppressWarnings("serial")
175 public static class ContainsKey extends KeyQuery<Boolean> {
176 public ContainsKey() {
177 }
178
179 public ContainsKey(String key) {
180 super(key);
181 }
182 }
183
184 /**
Aaron Kruglikov56423ba2016-04-19 13:39:16 -0700185 * Contains value command.
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800186 */
187 @SuppressWarnings("serial")
188 public static class ContainsValue extends ValueQuery<Boolean> {
189 public ContainsValue() {
190 }
191
192 public ContainsValue(byte[] value) {
193 super(value);
194 }
195
196 @Override
197 public String toString() {
198 return MoreObjects.toStringHelper(getClass())
199 .add("value", value)
200 .toString();
201 }
202 }
203
204 /**
205 * Map prepare command.
206 */
207 @SuppressWarnings("serial")
208 public static class TransactionPrepare extends MapCommand<PrepareResult> {
Madan Jampani74da78b2016-02-09 21:18:36 -0800209 private MapTransaction<String, byte[]> mapTransaction;
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800210
211 public TransactionPrepare() {
212 }
213
Madan Jampani74da78b2016-02-09 21:18:36 -0800214 public TransactionPrepare(MapTransaction<String, byte[]> mapTransaction) {
215 this.mapTransaction = mapTransaction;
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800216 }
217
Madan Jampani74da78b2016-02-09 21:18:36 -0800218 public MapTransaction<String, byte[]> transaction() {
219 return mapTransaction;
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800220 }
221
222 @Override
223 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
224 super.writeObject(buffer, serializer);
Madan Jampani74da78b2016-02-09 21:18:36 -0800225 serializer.writeObject(mapTransaction, buffer);
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800226 }
227
228 @Override
229 public void readObject(BufferInput<?> buffer, Serializer serializer) {
230 super.readObject(buffer, serializer);
Madan Jampani74da78b2016-02-09 21:18:36 -0800231 mapTransaction = serializer.readObject(buffer);
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800232 }
233
234 @Override
235 public String toString() {
236 return MoreObjects.toStringHelper(getClass())
Madan Jampani74da78b2016-02-09 21:18:36 -0800237 .add("mapTransaction", mapTransaction)
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800238 .toString();
239 }
240 }
241
242 /**
Madan Jampani542d9e22016-04-05 15:39:55 -0700243 * Map prepareAndCommit command.
244 */
245 @SuppressWarnings("serial")
246 public static class TransactionPrepareAndCommit extends TransactionPrepare {
247 public TransactionPrepareAndCommit() {
248 }
249
250 public TransactionPrepareAndCommit(MapTransaction<String, byte[]> mapTransaction) {
251 super(mapTransaction);
252 }
253 }
254
255 /**
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800256 * Map transaction commit command.
257 */
258 @SuppressWarnings("serial")
259 public static class TransactionCommit extends MapCommand<CommitResult> {
260 private TransactionId transactionId;
261
262 public TransactionCommit() {
263 }
264
265 public TransactionCommit(TransactionId transactionId) {
266 this.transactionId = transactionId;
267 }
268
269 /**
270 * Returns the transaction identifier.
271 * @return transaction id
272 */
273 public TransactionId transactionId() {
274 return transactionId;
275 }
276
277 @Override
278 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
279 super.writeObject(buffer, serializer);
280 serializer.writeObject(transactionId, buffer);
281 }
282
283 @Override
284 public void readObject(BufferInput<?> buffer, Serializer serializer) {
285 super.readObject(buffer, serializer);
286 transactionId = serializer.readObject(buffer);
287 }
288
289 @Override
290 public String toString() {
291 return MoreObjects.toStringHelper(getClass())
292 .add("transactionId", transactionId)
293 .toString();
294 }
295 }
296
297 /**
298 * Map transaction rollback command.
299 */
300 @SuppressWarnings("serial")
301 public static class TransactionRollback extends MapCommand<RollbackResult> {
302 private TransactionId transactionId;
303
304 public TransactionRollback() {
305 }
306
307 public TransactionRollback(TransactionId transactionId) {
308 this.transactionId = transactionId;
309 }
310
311 /**
312 * Returns the transaction identifier.
313 * @return transaction id
314 */
315 public TransactionId transactionId() {
316 return transactionId;
317 }
318
319 @Override
320 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
321 super.writeObject(buffer, serializer);
322 serializer.writeObject(transactionId, buffer);
323 }
324
325 @Override
326 public void readObject(BufferInput<?> buffer, Serializer serializer) {
327 super.readObject(buffer, serializer);
328 transactionId = serializer.readObject(buffer);
329 }
330
331 @Override
332 public String toString() {
333 return MoreObjects.toStringHelper(getClass())
334 .add("transactionId", transactionId)
335 .toString();
336 }
337 }
338
339 /**
340 * Map update command.
341 */
342 @SuppressWarnings("serial")
343 public static class UpdateAndGet extends MapCommand<MapEntryUpdateResult<String, byte[]>> {
344 private String key;
345 private byte[] value;
346 private Match<byte[]> valueMatch;
347 private Match<Long> versionMatch;
348
349 public UpdateAndGet() {
350 }
351
352 public UpdateAndGet(String key,
353 byte[] value,
354 Match<byte[]> valueMatch,
355 Match<Long> versionMatch) {
356 this.key = key;
357 this.value = value;
358 this.valueMatch = valueMatch;
359 this.versionMatch = versionMatch;
360 }
361
362 /**
363 * Returns the key.
364 * @return key
365 */
366 public String key() {
367 return this.key;
368 }
369
370 /**
371 * Returns the value.
372 * @return value
373 */
374 public byte[] value() {
375 return this.value;
376 }
377
378 /**
379 * Returns the value match.
380 * @return value match
381 */
382 public Match<byte[]> valueMatch() {
383 return this.valueMatch;
384 }
385
386 /**
387 * Returns the version match.
388 * @return version match
389 */
390 public Match<Long> versionMatch() {
391 return this.versionMatch;
392 }
393
394 @Override
395 public CompactionMode compaction() {
396 return value == null ? CompactionMode.FULL : CompactionMode.QUORUM;
397 }
398
399 @Override
400 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
401 super.writeObject(buffer, serializer);
402 serializer.writeObject(key, buffer);
403 serializer.writeObject(value, buffer);
404 serializer.writeObject(valueMatch, buffer);
405 serializer.writeObject(versionMatch, buffer);
406 }
407
408 @Override
409 public void readObject(BufferInput<?> buffer, Serializer serializer) {
410 super.readObject(buffer, serializer);
411 key = serializer.readObject(buffer);
412 value = serializer.readObject(buffer);
413 valueMatch = serializer.readObject(buffer);
414 versionMatch = serializer.readObject(buffer);
415 }
416
417 @Override
418 public String toString() {
419 return MoreObjects.toStringHelper(getClass())
420 .add("key", key)
421 .add("value", value)
422 .add("valueMatch", valueMatch)
423 .add("versionMatch", versionMatch)
424 .toString();
425 }
426 }
427
428 /**
429 * Get query.
430 */
431 @SuppressWarnings("serial")
432 public static class Get extends KeyQuery<Versioned<byte[]>> {
433 public Get() {
434 }
435
436 public Get(String key) {
437 super(key);
438 }
439 }
440
441 /**
442 * Is empty query.
443 */
444 @SuppressWarnings("serial")
445 public static class IsEmpty extends MapQuery<Boolean> {
446 }
447
448 /**
449 * KeySet query.
450 */
451 @SuppressWarnings("serial")
452 public static class KeySet extends MapQuery<Set<String>> {
453 }
454
455 /**
456 * KeySet query.
457 */
458 @SuppressWarnings("serial")
459 public static class Values extends MapQuery<Collection<Versioned<byte[]>>> {
460 }
461
462 /**
463 * KeySet query.
464 */
465 @SuppressWarnings("serial")
466 public static class EntrySet extends MapQuery<Set<Map.Entry<String, Versioned<byte[]>>>> {
467 }
468
469 /**
470 * Size query.
471 */
472 @SuppressWarnings("serial")
473 public static class Size extends MapQuery<Integer> {
474 }
475
476 /**
477 * Clear command.
478 */
479 @SuppressWarnings("serial")
480 public static class Clear extends MapCommand<MapEntryUpdateResult.Status> {
481
482 @Override
483 public CompactionMode compaction() {
484 return CompactionMode.FULL;
485 }
486 }
487
488 /**
489 * Change listen.
490 */
491 @SuppressWarnings("serial")
492 public static class Listen implements Command<Void>, CatalystSerializable {
493 @Override
494 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
495 }
496
497 @Override
498 public void readObject(BufferInput<?> buffer, Serializer serializer) {
499 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800500 }
501
502 /**
503 * Change unlisten.
504 */
505 @SuppressWarnings("serial")
506 public static class Unlisten implements Command<Void>, CatalystSerializable {
507 @Override
508 public void writeObject(BufferOutput<?> buffer, Serializer serializer) {
509 }
510
511 @Override
512 public void readObject(BufferInput<?> buffer, Serializer serializer) {
513 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800514 }
Madan Jampanifc981772016-02-16 09:46:42 -0800515
516 /**
517 * Map command type resolver.
518 */
519 public static class TypeResolver implements SerializableTypeResolver {
520 @Override
521 public void resolve(SerializerRegistry registry) {
522 registry.register(ContainsKey.class, -761);
523 registry.register(ContainsValue.class, -762);
524 registry.register(Get.class, -763);
525 registry.register(EntrySet.class, -764);
526 registry.register(Values.class, -765);
527 registry.register(KeySet.class, -766);
528 registry.register(Clear.class, -767);
529 registry.register(IsEmpty.class, -768);
530 registry.register(Size.class, -769);
531 registry.register(Listen.class, -770);
532 registry.register(Unlisten.class, -771);
533 registry.register(TransactionPrepare.class, -772);
534 registry.register(TransactionCommit.class, -773);
535 registry.register(TransactionRollback.class, -774);
Madan Jampani542d9e22016-04-05 15:39:55 -0700536 registry.register(TransactionPrepareAndCommit.class, -775);
537 registry.register(UpdateAndGet.class, -776);
Madan Jampanifc981772016-02-16 09:46:42 -0800538 }
539 }
Madan Jampani5e5b3d62016-02-01 16:03:33 -0800540}