blob: 4b9ddad3d3a3955991ce3aa165dae75a0efe2215 [file] [log] [blame]
Aaron Kruglikova26f6542016-04-19 13:37:42 -07001/*
2 * Copyright 2016 Open Networking Laboratory
3 *
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() {
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700294 return CompactionMode.FULL;
295 }
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() {
355 return CompactionMode.FULL;
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() {
482 return CompactionMode.FULL;
483 }
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> {
517 }
518
519 /**
520 * Key set query.
521 */
522 @SuppressWarnings("serial")
523 public static class KeySet extends MultimapQuery<Set<String>> {
524 }
525
526 /**
527 * Key multiset query.
528 */
529 @SuppressWarnings("serial")
530 public static class Keys extends MultimapQuery<Multiset<String>> {
531 }
532
533 /**
534 * Value collection query.
535 */
536 @SuppressWarnings("serial")
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700537 public static class Values extends MultimapQuery<Multiset<byte[]>> {
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700538 }
539
540 /**
541 * Entry set query.
542 */
543 @SuppressWarnings("serial")
544 public static class Entries extends
545 MultimapQuery<Collection<Map.Entry<String, byte[]>>> {
546 }
547
548 /**
549 * Get value query.
550 */
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700551 public static class Get extends
552 KeyQuery<Versioned<Collection<? extends byte[]>>> {
Aaron Kruglikovc0c27c02016-06-07 16:05:00 -0700553 public Get() {
554 }
555
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700556 public Get(String key) {
557 super(key);
558 }
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700559 }
560
561 /**
562 * Multimap command type resolver.
563 */
564 @SuppressWarnings("serial")
565 public static class TypeResolver implements SerializableTypeResolver {
566 @Override
567 public void resolve(SerializerRegistry registry) {
568 registry.register(ContainsKey.class, -1000);
569 registry.register(ContainsValue.class, -1001);
570 registry.register(ContainsEntry.class, -1002);
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700571 registry.register(Replace.class, -1003);
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700572 registry.register(Clear.class, -1004);
573 registry.register(KeySet.class, -1005);
574 registry.register(Keys.class, -1006);
575 registry.register(Values.class, -1007);
576 registry.register(Entries.class, -1008);
577 registry.register(Size.class, -1009);
578 registry.register(IsEmpty.class, -1010);
579 registry.register(Get.class, -1011);
Aaron Kruglikov44a1fef2016-04-27 11:29:23 -0700580 registry.register(Put.class, -1012);
581 registry.register(RemoveAll.class, -1013);
582 registry.register(MultiRemove.class, -1014);
Aaron Kruglikova26f6542016-04-19 13:37:42 -0700583 }
584 }
585}