| /* |
| * Copyright 2016-present Open Networking Laboratory |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.onosproject.store.primitives.resources.impl; |
| |
| import java.util.Collection; |
| import java.util.Map; |
| import java.util.Set; |
| |
| import com.google.common.base.MoreObjects; |
| import io.atomix.catalyst.buffer.BufferInput; |
| import io.atomix.catalyst.buffer.BufferOutput; |
| import io.atomix.catalyst.serializer.CatalystSerializable; |
| import io.atomix.catalyst.serializer.SerializableTypeResolver; |
| import io.atomix.catalyst.serializer.Serializer; |
| import io.atomix.catalyst.serializer.SerializerRegistry; |
| import io.atomix.catalyst.util.Assert; |
| import io.atomix.copycat.Command; |
| import io.atomix.copycat.Query; |
| import org.onlab.util.Match; |
| import org.onosproject.store.primitives.MapUpdate; |
| import org.onosproject.store.primitives.TransactionId; |
| import org.onosproject.store.service.TransactionLog; |
| import org.onosproject.store.service.Versioned; |
| |
| /** |
| * {@link AtomixConsistentMap} resource state machine operations. |
| */ |
| public final class AtomixConsistentMapCommands { |
| |
| private AtomixConsistentMapCommands() { |
| } |
| |
| /** |
| * Abstract map command. |
| */ |
| @SuppressWarnings("serial") |
| public abstract static class MapCommand<V> implements Command<V>, CatalystSerializable { |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .toString(); |
| } |
| |
| @Override |
| public void writeObject(BufferOutput<?> buffer, Serializer serializer) { |
| } |
| |
| @Override |
| public void readObject(BufferInput<?> buffer, Serializer serializer) { |
| } |
| } |
| |
| /** |
| * Abstract map query. |
| */ |
| @SuppressWarnings("serial") |
| public abstract static class MapQuery<V> implements Query<V>, CatalystSerializable { |
| |
| @Override |
| public ConsistencyLevel consistency() { |
| return ConsistencyLevel.SEQUENTIAL; |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .toString(); |
| } |
| |
| @Override |
| public void writeObject(BufferOutput<?> buffer, Serializer serializer) { |
| } |
| |
| @Override |
| public void readObject(BufferInput<?> buffer, Serializer serializer) { |
| } |
| } |
| |
| /** |
| * Abstract key-based query. |
| */ |
| @SuppressWarnings("serial") |
| public abstract static class KeyQuery<V> extends MapQuery<V> { |
| protected String key; |
| |
| public KeyQuery() { |
| } |
| |
| public KeyQuery(String key) { |
| this.key = Assert.notNull(key, "key"); |
| } |
| |
| /** |
| * Returns the key. |
| * @return key |
| */ |
| public String key() { |
| return key; |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .add("key", key) |
| .toString(); |
| } |
| |
| @Override |
| public void writeObject(BufferOutput<?> buffer, Serializer serializer) { |
| super.writeObject(buffer, serializer); |
| serializer.writeObject(key, buffer); |
| } |
| |
| @Override |
| public void readObject(BufferInput<?> buffer, Serializer serializer) { |
| super.readObject(buffer, serializer); |
| key = serializer.readObject(buffer); |
| } |
| } |
| |
| /** |
| * Abstract value-based query. |
| */ |
| @SuppressWarnings("serial") |
| public abstract static class ValueQuery<V> extends MapQuery<V> { |
| protected byte[] value; |
| |
| public ValueQuery() { |
| } |
| |
| public ValueQuery(byte[] value) { |
| this.value = Assert.notNull(value, "value"); |
| } |
| |
| /** |
| * Returns the value. |
| * @return value |
| */ |
| public byte[] value() { |
| return value; |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .add("value", value) |
| .toString(); |
| } |
| |
| @Override |
| public void writeObject(BufferOutput<?> buffer, Serializer serializer) { |
| super.writeObject(buffer, serializer); |
| serializer.writeObject(value, buffer); |
| } |
| |
| @Override |
| public void readObject(BufferInput<?> buffer, Serializer serializer) { |
| super.readObject(buffer, serializer); |
| value = serializer.readObject(buffer); |
| } |
| } |
| |
| /** |
| * Contains key command. |
| */ |
| @SuppressWarnings("serial") |
| public static class ContainsKey extends KeyQuery<Boolean> { |
| public ContainsKey() { |
| } |
| |
| public ContainsKey(String key) { |
| super(key); |
| } |
| } |
| |
| /** |
| * Contains value command. |
| */ |
| @SuppressWarnings("serial") |
| public static class ContainsValue extends ValueQuery<Boolean> { |
| public ContainsValue() { |
| } |
| |
| public ContainsValue(byte[] value) { |
| super(value); |
| } |
| } |
| |
| /** |
| * Transaction begin command. |
| */ |
| public static class TransactionBegin extends MapCommand<Long> { |
| private TransactionId transactionId; |
| |
| public TransactionBegin() { |
| } |
| |
| public TransactionBegin(TransactionId transactionId) { |
| this.transactionId = transactionId; |
| } |
| |
| public TransactionId transactionId() { |
| return transactionId; |
| } |
| |
| @Override |
| public void writeObject(BufferOutput<?> buffer, Serializer serializer) { |
| super.writeObject(buffer, serializer); |
| serializer.writeObject(transactionId, buffer); |
| } |
| |
| @Override |
| public void readObject(BufferInput<?> buffer, Serializer serializer) { |
| super.readObject(buffer, serializer); |
| transactionId = serializer.readObject(buffer); |
| } |
| } |
| |
| /** |
| * Map prepare command. |
| */ |
| @SuppressWarnings("serial") |
| public static class TransactionPrepare extends MapCommand<PrepareResult> { |
| private TransactionLog<MapUpdate<String, byte[]>> transactionLog; |
| |
| public TransactionPrepare() { |
| } |
| |
| public TransactionPrepare(TransactionLog<MapUpdate<String, byte[]>> transactionLog) { |
| this.transactionLog = transactionLog; |
| } |
| |
| public TransactionLog<MapUpdate<String, byte[]>> transactionLog() { |
| return transactionLog; |
| } |
| |
| @Override |
| public void writeObject(BufferOutput<?> buffer, Serializer serializer) { |
| super.writeObject(buffer, serializer); |
| serializer.writeObject(transactionLog, buffer); |
| } |
| |
| @Override |
| public void readObject(BufferInput<?> buffer, Serializer serializer) { |
| super.readObject(buffer, serializer); |
| transactionLog = serializer.readObject(buffer); |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .add("transactionLog", transactionLog) |
| .toString(); |
| } |
| } |
| |
| /** |
| * Map prepareAndCommit command. |
| */ |
| @SuppressWarnings("serial") |
| public static class TransactionPrepareAndCommit extends TransactionPrepare { |
| public TransactionPrepareAndCommit() { |
| } |
| |
| public TransactionPrepareAndCommit(TransactionLog<MapUpdate<String, byte[]>> transactionLog) { |
| super(transactionLog); |
| } |
| |
| @Override |
| public CompactionMode compaction() { |
| return CompactionMode.TOMBSTONE; |
| } |
| } |
| |
| /** |
| * Map transaction commit command. |
| */ |
| @SuppressWarnings("serial") |
| public static class TransactionCommit extends MapCommand<CommitResult> { |
| private TransactionId transactionId; |
| |
| public TransactionCommit() { |
| } |
| |
| public TransactionCommit(TransactionId transactionId) { |
| this.transactionId = transactionId; |
| } |
| |
| /** |
| * Returns the transaction identifier. |
| * @return transaction id |
| */ |
| public TransactionId transactionId() { |
| return transactionId; |
| } |
| |
| @Override |
| public void writeObject(BufferOutput<?> buffer, Serializer serializer) { |
| super.writeObject(buffer, serializer); |
| serializer.writeObject(transactionId, buffer); |
| } |
| |
| @Override |
| public void readObject(BufferInput<?> buffer, Serializer serializer) { |
| super.readObject(buffer, serializer); |
| transactionId = serializer.readObject(buffer); |
| } |
| |
| @Override |
| public CompactionMode compaction() { |
| return CompactionMode.TOMBSTONE; |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .add("transactionId", transactionId) |
| .toString(); |
| } |
| } |
| |
| /** |
| * Map transaction rollback command. |
| */ |
| @SuppressWarnings("serial") |
| public static class TransactionRollback extends MapCommand<RollbackResult> { |
| private TransactionId transactionId; |
| |
| public TransactionRollback() { |
| } |
| |
| public TransactionRollback(TransactionId transactionId) { |
| this.transactionId = transactionId; |
| } |
| |
| /** |
| * Returns the transaction identifier. |
| * @return transaction id |
| */ |
| public TransactionId transactionId() { |
| return transactionId; |
| } |
| |
| @Override |
| public void writeObject(BufferOutput<?> buffer, Serializer serializer) { |
| super.writeObject(buffer, serializer); |
| serializer.writeObject(transactionId, buffer); |
| } |
| |
| @Override |
| public void readObject(BufferInput<?> buffer, Serializer serializer) { |
| super.readObject(buffer, serializer); |
| transactionId = serializer.readObject(buffer); |
| } |
| |
| @Override |
| public CompactionMode compaction() { |
| return CompactionMode.TOMBSTONE; |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .add("transactionId", transactionId) |
| .toString(); |
| } |
| } |
| |
| /** |
| * Map update command. |
| */ |
| @SuppressWarnings("serial") |
| public static class UpdateAndGet extends MapCommand<MapEntryUpdateResult<String, byte[]>> { |
| private String key; |
| private byte[] value; |
| private Match<byte[]> valueMatch; |
| private Match<Long> versionMatch; |
| |
| public UpdateAndGet() { |
| } |
| |
| public UpdateAndGet(String key, |
| byte[] value, |
| Match<byte[]> valueMatch, |
| Match<Long> versionMatch) { |
| this.key = key; |
| this.value = value; |
| this.valueMatch = valueMatch; |
| this.versionMatch = versionMatch; |
| } |
| |
| /** |
| * Returns the key. |
| * @return key |
| */ |
| public String key() { |
| return this.key; |
| } |
| |
| /** |
| * Returns the value. |
| * @return value |
| */ |
| public byte[] value() { |
| return this.value; |
| } |
| |
| /** |
| * Returns the value match. |
| * @return value match |
| */ |
| public Match<byte[]> valueMatch() { |
| return this.valueMatch; |
| } |
| |
| /** |
| * Returns the version match. |
| * @return version match |
| */ |
| public Match<Long> versionMatch() { |
| return this.versionMatch; |
| } |
| |
| @Override |
| public CompactionMode compaction() { |
| return value == null ? CompactionMode.TOMBSTONE : CompactionMode.FULL; |
| } |
| |
| @Override |
| public void writeObject(BufferOutput<?> buffer, Serializer serializer) { |
| super.writeObject(buffer, serializer); |
| serializer.writeObject(key, buffer); |
| serializer.writeObject(value, buffer); |
| serializer.writeObject(valueMatch, buffer); |
| serializer.writeObject(versionMatch, buffer); |
| } |
| |
| @Override |
| public void readObject(BufferInput<?> buffer, Serializer serializer) { |
| super.readObject(buffer, serializer); |
| key = serializer.readObject(buffer); |
| value = serializer.readObject(buffer); |
| valueMatch = serializer.readObject(buffer); |
| versionMatch = serializer.readObject(buffer); |
| } |
| |
| @Override |
| public String toString() { |
| return MoreObjects.toStringHelper(getClass()) |
| .add("key", key) |
| .add("value", value) |
| .add("valueMatch", valueMatch) |
| .add("versionMatch", versionMatch) |
| .toString(); |
| } |
| } |
| |
| /** |
| * Get query. |
| */ |
| @SuppressWarnings("serial") |
| public static class Get extends KeyQuery<Versioned<byte[]>> { |
| public Get() { |
| } |
| |
| public Get(String key) { |
| super(key); |
| } |
| } |
| |
| /** |
| * Get or default query. |
| */ |
| @SuppressWarnings("serial") |
| public static class GetOrDefault extends KeyQuery<Versioned<byte[]>> { |
| private byte[] defaultValue; |
| |
| public GetOrDefault() { |
| } |
| |
| public GetOrDefault(String key, byte[] defaultValue) { |
| super(key); |
| this.defaultValue = defaultValue; |
| } |
| |
| /** |
| * Returns the default value. |
| * |
| * @return the default value |
| */ |
| public byte[] defaultValue() { |
| return defaultValue; |
| } |
| |
| @Override |
| public void writeObject(BufferOutput<?> buffer, Serializer serializer) { |
| super.writeObject(buffer, serializer); |
| serializer.writeObject(defaultValue, buffer); |
| } |
| |
| @Override |
| public void readObject(BufferInput<?> buffer, Serializer serializer) { |
| super.readObject(buffer, serializer); |
| defaultValue = serializer.readObject(buffer); |
| } |
| } |
| |
| /** |
| * Is empty query. |
| */ |
| @SuppressWarnings("serial") |
| public static class IsEmpty extends MapQuery<Boolean> { |
| } |
| |
| /** |
| * KeySet query. |
| */ |
| @SuppressWarnings("serial") |
| public static class KeySet extends MapQuery<Set<String>> { |
| } |
| |
| /** |
| * ValueSet query. |
| */ |
| @SuppressWarnings("serial") |
| public static class Values extends MapQuery<Collection<Versioned<byte[]>>> { |
| } |
| |
| /** |
| * EntrySet query. |
| */ |
| @SuppressWarnings("serial") |
| public static class EntrySet extends MapQuery<Set<Map.Entry<String, Versioned<byte[]>>>> { |
| } |
| |
| /** |
| * Size query. |
| */ |
| @SuppressWarnings("serial") |
| public static class Size extends MapQuery<Integer> { |
| } |
| |
| /** |
| * Clear command. |
| */ |
| @SuppressWarnings("serial") |
| public static class Clear extends MapCommand<MapEntryUpdateResult.Status> { |
| @Override |
| public CompactionMode compaction() { |
| return CompactionMode.TOMBSTONE; |
| } |
| } |
| |
| /** |
| * Change listen. |
| */ |
| @SuppressWarnings("serial") |
| public static class Listen implements Command<Void>, CatalystSerializable { |
| @Override |
| public void writeObject(BufferOutput<?> buffer, Serializer serializer) { |
| } |
| |
| @Override |
| public void readObject(BufferInput<?> buffer, Serializer serializer) { |
| } |
| |
| @Override |
| public CompactionMode compaction() { |
| return CompactionMode.QUORUM; |
| } |
| } |
| |
| /** |
| * Change unlisten. |
| */ |
| @SuppressWarnings("serial") |
| public static class Unlisten implements Command<Void>, CatalystSerializable { |
| @Override |
| public void writeObject(BufferOutput<?> buffer, Serializer serializer) { |
| } |
| |
| @Override |
| public void readObject(BufferInput<?> buffer, Serializer serializer) { |
| } |
| |
| @Override |
| public CompactionMode compaction() { |
| return CompactionMode.TOMBSTONE; |
| } |
| } |
| |
| /** |
| * Map command type resolver. |
| */ |
| public static class TypeResolver implements SerializableTypeResolver { |
| @Override |
| public void resolve(SerializerRegistry registry) { |
| registry.register(ContainsKey.class, -761); |
| registry.register(ContainsValue.class, -762); |
| registry.register(Get.class, -763); |
| registry.register(GetOrDefault.class, -778); |
| registry.register(EntrySet.class, -764); |
| registry.register(Values.class, -765); |
| registry.register(KeySet.class, -766); |
| registry.register(Clear.class, -767); |
| registry.register(IsEmpty.class, -768); |
| registry.register(Size.class, -769); |
| registry.register(Listen.class, -770); |
| registry.register(Unlisten.class, -771); |
| registry.register(TransactionBegin.class, -777); |
| registry.register(TransactionPrepare.class, -772); |
| registry.register(TransactionCommit.class, -773); |
| registry.register(TransactionRollback.class, -774); |
| registry.register(TransactionPrepareAndCommit.class, -775); |
| registry.register(UpdateAndGet.class, -776); |
| } |
| } |
| } |