blob: d7654661f75428ab865799c759f11122011f64a3 [file] [log] [blame]
Aaron Kruglikova26f6542016-04-19 13:37:42 -07001/*
Brian O'Connor0a4e6742016-09-15 23:03:10 -07002 * Copyright 2016-present Open Networking Laboratory
Aaron Kruglikova26f6542016-04-19 13:37:42 -07003 *
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 */
16
17package org.onosproject.store.primitives.resources.impl;
18
19import com.google.common.base.MoreObjects;
20import com.google.common.collect.Multiset;
21import io.atomix.catalyst.buffer.BufferInput;
22import io.atomix.catalyst.buffer.BufferOutput;
23import io.atomix.catalyst.serializer.CatalystSerializable;
24import io.atomix.catalyst.serializer.SerializableTypeResolver;
25import io.atomix.catalyst.serializer.Serializer;
26import io.atomix.catalyst.serializer.SerializerRegistry;
27import io.atomix.catalyst.util.Assert;
28import io.atomix.copycat.Command;
29import io.atomix.copycat.Query;
30import org.onlab.util.Match;
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -070031import org.onosproject.store.service.Versioned;
Aaron Kruglikova26f6542016-04-19 13:37:42 -070032
33import java.util.Collection;
Aaron Kruglikova26f6542016-04-19 13:37:42 -070034import java.util.Map;
35import java.util.Set;
36
37/**
38 * AsyncConsistentMultimap state machine commands.
39 */
Aaron Kruglikova1801aa2016-07-12 15:17:30 -070040public final class AtomixConsistentMultimapCommands {
Aaron Kruglikova26f6542016-04-19 13:37:42 -070041
Aaron Kruglikova1801aa2016-07-12 15:17:30 -070042 private AtomixConsistentMultimapCommands() {
Aaron Kruglikova26f6542016-04-19 13:37:42 -070043 }
44
45 /**
46 * Abstract multimap command.
47 */
48 @SuppressWarnings("serial")
49 public abstract static class MultimapCommand<V> implements Command<V>,
50 CatalystSerializable {
Aaron Kruglikova26f6542016-04-19 13:37:42 -070051
52 @Override
53 public String toString() {
54 return MoreObjects.toStringHelper(getClass())
55 .toString();
56 }
57
58 @Override
59 public void writeObject(BufferOutput<?> buffer,
60 Serializer serializer) {
61 }
62
63 @Override
64 public void readObject(BufferInput<?> buffer, Serializer serializer) {
65 }
66 }
67
68 /**
69 * Abstract multimap query.
70 */
71 @SuppressWarnings("serial")
72 public abstract static class MultimapQuery<V> implements Query<V>,
73 CatalystSerializable {
74 @Override
75 public ConsistencyLevel consistency() {
76 return ConsistencyLevel.SEQUENTIAL;
77 }
78
79 @Override
80 public String toString() {
81 return MoreObjects.toStringHelper(getClass())
82 .toString();
83 }
84
85 @Override
86 public void writeObject(BufferOutput<?> buffer,
87 Serializer serializer) {
88 }
89
90 @Override
91 public void readObject(BufferInput<?> buffer,
92 Serializer serializer) {
93 }
94 }
95
96 /**
97 * Abstract key-based multimap query.
98 */
99 @SuppressWarnings("serial")
100 public abstract static class KeyQuery<V> extends MultimapQuery<V> {
101 protected String key;
102
103 public KeyQuery() {
104 }
105
106 public KeyQuery(String key) {
107 this.key = Assert.notNull(key, "key");
108 }
109
110 public String key() {
111 return key;
112 }
113
114 @Override
115 public String toString() {
116 return MoreObjects.toStringHelper(getClass())
117 .add("key", key)
118 .toString();
119 }
120
121 @Override
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700122 public void writeObject(BufferOutput<?> buffer,
123 Serializer serializer) {
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700124 super.writeObject(buffer, serializer);
125 serializer.writeObject(key, buffer);
126 }
127
128 @Override
129 public void readObject(BufferInput<?> buffer, Serializer serializer) {
130 super.readObject(buffer, serializer);
131 key = serializer.readObject(buffer);
132 }
133 }
134
135 /**
136 * Abstract value-based query.
137 */
138 @SuppressWarnings("serial")
139 public abstract static class ValueQuery<V> extends MultimapQuery<V> {
140 protected byte[] value;
141
142 public ValueQuery() {
143 }
144
145 public ValueQuery(byte[] value) {
146 this.value = Assert.notNull(value, "value");
147 }
148
149 /**
150 * Returns the value.
151 *
152 * @return value.
153 */
154 public byte[] value() {
155 return value;
156 }
157
158 @Override
159 public String toString() {
160 return MoreObjects.toStringHelper(getClass())
161 .add("value", value)
162 .toString();
163 }
164
165 @Override
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700166 public void writeObject(BufferOutput<?> buffer,
167 Serializer serializer) {
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700168 super.writeObject(buffer, serializer);
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -0700169 serializer.writeObject(value, buffer);
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700170 }
171
172 @Override
173 public void readObject(BufferInput<?> buffer, Serializer serializer) {
174 super.readObject(buffer, serializer);
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -0700175 value = serializer.readObject(buffer);
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700176 }
177 }
178
179 /**
180 * Size query.
181 */
182 public static class Size extends MultimapQuery<Integer> {
183 }
184
185 /**
186 * Is empty query.
187 */
188 public static class IsEmpty extends MultimapQuery<Boolean> {
189 }
190
191 /**
192 * Contains key query.
193 */
194 @SuppressWarnings("serial")
195 public static class ContainsKey extends KeyQuery<Boolean> {
196 public ContainsKey() {
197 }
198
199 public ContainsKey(String key) {
200 super(key);
201 }
202
203 }
204
205 /**
206 * Contains value query.
207 */
208 @SuppressWarnings("serial")
209 public static class ContainsValue extends ValueQuery<Boolean> {
210 public ContainsValue() {
211 }
212
213 public ContainsValue(byte[] value) {
214 super(value);
215 }
216 }
217
218 /**
219 * Contains entry query.
220 */
221 @SuppressWarnings("serial")
222 public static class ContainsEntry extends MultimapQuery<Boolean> {
223 protected String key;
224 protected byte[] value;
225
226 public ContainsEntry() {
227 }
228
229 public ContainsEntry(String key, byte[] value) {
230 this.key = Assert.notNull(key, "key");
231 this.value = Assert.notNull(value, "value");
232 }
233
234 public String key() {
235 return key;
236 }
237
238 public byte[] value() {
239 return value;
240 }
241
242 @Override
243 public String toString() {
244 return MoreObjects.toStringHelper(getClass())
245 .add("key", key)
246 .add("value", value)
247 .toString();
248 }
249
250 @Override
251 public void writeObject(BufferOutput<?> buffer,
252 Serializer serializer) {
253 super.writeObject(buffer, serializer);
254 serializer.writeObject(key, buffer);
255 serializer.writeObject(value, buffer);
256 }
257
258 @Override
259 public void readObject(BufferInput<?> buffer, Serializer serializer) {
260 super.readObject(buffer, serializer);
261 key = serializer.readObject(buffer);
262 value = serializer.readObject(buffer);
263
264 }
265 }
266
267 /**
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700268 * Remove command, backs remove and removeAll's that return booleans.
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700269 */
270 @SuppressWarnings("serial")
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700271 public static class RemoveAll extends
272 MultimapCommand<Versioned<Collection<? extends byte[]>>> {
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700273 private String key;
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700274 private Match<Long> versionMatch;
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700275
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700276 public RemoveAll() {
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700277 }
278
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700279 public RemoveAll(String key, Match<Long> versionMatch) {
280 this.key = Assert.notNull(key, "key");
281 this.versionMatch = versionMatch;
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700282 }
283
284 public String key() {
285 return this.key;
286 }
287
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700288 public Match<Long> versionMatch() {
289 return versionMatch;
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700290 }
291
292 @Override
293 public CompactionMode compaction() {
Jordan Halterman211ba6a2017-02-05 22:19:11 -0800294 return CompactionMode.TOMBSTONE;
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700295 }
296
297 @Override
298 public void writeObject(BufferOutput<?> buffer,
299 Serializer serializer) {
300 super.writeObject(buffer, serializer);
301 serializer.writeObject(key, buffer);
302 serializer.writeObject(versionMatch, buffer);
303 }
304
305 @Override
306 public void readObject(BufferInput<?> buffer, Serializer serializer) {
307 super.readObject(buffer, serializer);
308 key = serializer.readObject(buffer);
309 versionMatch = serializer.readObject(buffer);
310 }
311
312 @Override
313 public String toString() {
314 return MoreObjects.toStringHelper(getClass())
315 .add("key", key)
316 .add("versionMatch", versionMatch)
317 .toString();
318 }
319 }
320
321 /**
322 * Remove command, backs remove and removeAll's that return booleans.
323 */
324 @SuppressWarnings("serial")
325 public static class MultiRemove extends
326 MultimapCommand<Boolean> {
327 private String key;
328 private Collection<byte[]> values;
329 private Match<Long> versionMatch;
330
331 public MultiRemove() {
332 }
333
334 public MultiRemove(String key, Collection<byte[]> valueMatches,
335 Match<Long> versionMatch) {
336 this.key = Assert.notNull(key, "key");
337 this.values = valueMatches;
338 this.versionMatch = versionMatch;
339 }
340
341 public String key() {
342 return this.key;
343 }
344
345 public Collection<byte[]> values() {
346 return values;
347 }
348
349 public Match<Long> versionMatch() {
350 return versionMatch;
351 }
352
353 @Override
354 public CompactionMode compaction() {
Jordan Halterman211ba6a2017-02-05 22:19:11 -0800355 return CompactionMode.TOMBSTONE;
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700356 }
357
358 @Override
359 public void writeObject(BufferOutput<?> buffer,
360 Serializer serializer) {
361 super.writeObject(buffer, serializer);
362 serializer.writeObject(key, buffer);
363 serializer.writeObject(values, buffer);
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700364 serializer.writeObject(versionMatch, buffer);
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700365 }
366
367 @Override
368 public void readObject(BufferInput<?> buffer, Serializer serializer) {
369 super.readObject(buffer, serializer);
370 key = serializer.readObject(buffer);
371 values = serializer.readObject(buffer);
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700372 versionMatch = serializer.readObject(buffer);
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700373 }
374
375 @Override
376 public String toString() {
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700377 return MoreObjects.toStringHelper(getClass())
378 .add("key", key)
379 .add("values", values)
380 .add("versionMatch", versionMatch)
381 .toString();
382 }
383 }
384
385 /**
386 * Command to back the put and putAll methods.
387 */
388 @SuppressWarnings("serial")
389 public static class Put extends MultimapCommand<Boolean> {
390 private String key;
391 private Collection<? extends byte[]> values;
392 private Match<Long> versionMatch;
393
394 public Put() {
395 }
396
397 public Put(String key, Collection<? extends byte[]> values,
398 Match<Long> versionMatch) {
399 this.key = Assert.notNull(key, "key");
400 this.values = values;
401 this.versionMatch = versionMatch;
402 }
403
404 public String key() {
405 return key;
406 }
407
408 public Collection<? extends byte[]> values() {
409 return values;
410 }
411
412 public Match<Long> versionMatch() {
413 return versionMatch;
414 }
415
416 @Override
417 public CompactionMode compaction() {
418 return CompactionMode.QUORUM;
419 }
420
421 @Override
422 public void writeObject(BufferOutput<?> buffer,
423 Serializer serializer) {
424 super.writeObject(buffer, serializer);
425 serializer.writeObject(key, buffer);
426 serializer.writeObject(values, buffer);
427 serializer.writeObject(versionMatch, buffer);
428 }
429
430 @Override
431 public void readObject(BufferInput<?> buffer, Serializer serializer) {
432 super.readObject(buffer, serializer);
433 key = serializer.readObject(buffer);
434 values = serializer.readObject(buffer);
435 versionMatch = serializer.readObject(buffer);
436 }
437
438 @Override
439 public String toString() {
440 return MoreObjects.toStringHelper(getClass())
441 .add("key", key)
442 .add("values", values)
443 .add("versionMatch", versionMatch)
444 .toString();
445 }
446 }
447
448 /**
449 * Replace command, returns the collection that was replaced.
450 */
451 @SuppressWarnings("serial")
452 public static class Replace extends
453 MultimapCommand<Versioned<Collection<? extends byte[]>>> {
454 private String key;
455 private Collection<byte[]> values;
456 private Match<Long> versionMatch;
457
458 public Replace() {
459 }
460
461 public Replace(String key, Collection<byte[]> values,
462 Match<Long> versionMatch) {
463 this.key = Assert.notNull(key, "key");
464 this.values = values;
465 this.versionMatch = versionMatch;
466 }
467
468 public String key() {
469 return this.key;
470 }
471
472 public Match<Long> versionMatch() {
473 return versionMatch;
474 }
475
476 public Collection<byte[]> values() {
477 return values;
478 }
479
480 @Override
481 public CompactionMode compaction() {
Jordan Halterman211ba6a2017-02-05 22:19:11 -0800482 return CompactionMode.QUORUM;
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700483 }
484
485 @Override
486 public void writeObject(BufferOutput<?> buffer,
487 Serializer serializer) {
488 super.writeObject(buffer, serializer);
489 serializer.writeObject(key, buffer);
490 serializer.writeObject(values, buffer);
491 serializer.writeObject(versionMatch, buffer);
492 }
493
494 @Override
495 public void readObject(BufferInput<?> buffer, Serializer serializer) {
496 super.readObject(buffer, serializer);
497 key = serializer.readObject(buffer);
498 values = serializer.readObject(buffer);
499 versionMatch = serializer.readObject(buffer);
500 }
501
502 @Override
503 public String toString() {
504 return MoreObjects.toStringHelper(getClass())
505 .add("key", key)
506 .add("values", values)
507 .add("versionMatch", versionMatch)
508 .toString();
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700509 }
510 }
511
512 /**
513 * Clear multimap command.
514 */
515 @SuppressWarnings("serial")
516 public static class Clear extends MultimapCommand<Void> {
Jordan Halterman211ba6a2017-02-05 22:19:11 -0800517 @Override
518 public CompactionMode compaction() {
519 return CompactionMode.TOMBSTONE;
520 }
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700521 }
522
523 /**
524 * Key set query.
525 */
526 @SuppressWarnings("serial")
527 public static class KeySet extends MultimapQuery<Set<String>> {
528 }
529
530 /**
531 * Key multiset query.
532 */
533 @SuppressWarnings("serial")
534 public static class Keys extends MultimapQuery<Multiset<String>> {
535 }
536
537 /**
538 * Value collection query.
539 */
540 @SuppressWarnings("serial")
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700541 public static class Values extends MultimapQuery<Multiset<byte[]>> {
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700542 }
543
544 /**
545 * Entry set query.
546 */
547 @SuppressWarnings("serial")
548 public static class Entries extends
549 MultimapQuery<Collection<Map.Entry<String, byte[]>>> {
550 }
551
552 /**
553 * Get value query.
554 */
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700555 public static class Get extends
556 KeyQuery<Versioned<Collection<? extends byte[]>>> {
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -0700557 public Get() {
558 }
559
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700560 public Get(String key) {
561 super(key);
562 }
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700563 }
564
565 /**
566 * Multimap command type resolver.
567 */
568 @SuppressWarnings("serial")
569 public static class TypeResolver implements SerializableTypeResolver {
570 @Override
571 public void resolve(SerializerRegistry registry) {
572 registry.register(ContainsKey.class, -1000);
573 registry.register(ContainsValue.class, -1001);
574 registry.register(ContainsEntry.class, -1002);
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700575 registry.register(Replace.class, -1003);
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700576 registry.register(Clear.class, -1004);
577 registry.register(KeySet.class, -1005);
578 registry.register(Keys.class, -1006);
579 registry.register(Values.class, -1007);
580 registry.register(Entries.class, -1008);
581 registry.register(Size.class, -1009);
582 registry.register(IsEmpty.class, -1010);
583 registry.register(Get.class, -1011);
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700584 registry.register(Put.class, -1012);
585 registry.register(RemoveAll.class, -1013);
586 registry.register(MultiRemove.class, -1014);
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700587 }
588 }
589}