blob: 25c4d8421358682f72b2574cd7e880a43e0c0218 [file] [log] [blame]
Aaron Kruglikov3e29f662016-07-13 10:18:10 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Aaron Kruglikov3e29f662016-07-13 10:18:10 -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
Jordan Halterman71635ae2017-07-28 10:35:43 -070019import java.util.HashMap;
Aaron Kruglikov3e29f662016-07-13 10:18:10 -070020import java.util.Map;
21import java.util.NavigableMap;
22import java.util.NavigableSet;
Jordan Halterman71635ae2017-07-28 10:35:43 -070023import java.util.TreeMap;
Aaron Kruglikov3e29f662016-07-13 10:18:10 -070024import java.util.concurrent.CompletableFuture;
Aaron Kruglikov3e29f662016-07-13 10:18:10 -070025
Jordan Halterman2bf177c2017-06-29 01:49:08 -070026import io.atomix.protocols.raft.proxy.RaftProxy;
27import org.onlab.util.KryoNamespace;
Jordan Halterman2bf177c2017-06-29 01:49:08 -070028import org.onosproject.store.primitives.TransactionId;
29import org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.FloorEntry;
30import org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.HigherEntry;
31import org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.LowerEntry;
32import org.onosproject.store.serializers.KryoNamespaces;
33import org.onosproject.store.service.AsyncConsistentTreeMap;
Jordan Halterman2bf177c2017-06-29 01:49:08 -070034import org.onosproject.store.service.Serializer;
35import org.onosproject.store.service.TransactionLog;
Jordan Halterman2bf177c2017-06-29 01:49:08 -070036import org.onosproject.store.service.Versioned;
37
Jordan Halterman2bf177c2017-06-29 01:49:08 -070038import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.CEILING_ENTRY;
39import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.CEILING_KEY;
Jordan Halterman2bf177c2017-06-29 01:49:08 -070040import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.CeilingEntry;
41import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.CeilingKey;
Jordan Halterman2bf177c2017-06-29 01:49:08 -070042import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.FIRST_ENTRY;
43import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.FIRST_KEY;
44import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.FLOOR_ENTRY;
45import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.FLOOR_KEY;
46import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.FloorKey;
Jordan Halterman2bf177c2017-06-29 01:49:08 -070047import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.HIGHER_ENTRY;
48import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.HIGHER_KEY;
49import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.HigherKey;
Jordan Halterman2bf177c2017-06-29 01:49:08 -070050import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.LAST_ENTRY;
51import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.LAST_KEY;
52import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.LOWER_ENTRY;
53import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.LOWER_KEY;
54import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.LowerKey;
55import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.POLL_FIRST_ENTRY;
56import static org.onosproject.store.primitives.resources.impl.AtomixConsistentTreeMapOperations.POLL_LAST_ENTRY;
Aaron Kruglikov3e29f662016-07-13 10:18:10 -070057
58/**
59 * Implementation of {@link AsyncConsistentTreeMap}.
60 */
Jordan Halterman71635ae2017-07-28 10:35:43 -070061public class AtomixConsistentTreeMap extends AtomixConsistentMap implements AsyncConsistentTreeMap<byte[]> {
Jordan Halterman2bf177c2017-06-29 01:49:08 -070062 private static final Serializer SERIALIZER = Serializer.using(KryoNamespace.newBuilder()
63 .register(KryoNamespaces.BASIC)
Jordan Halterman71635ae2017-07-28 10:35:43 -070064 .register(AtomixConsistentMapOperations.NAMESPACE)
Jordan Halterman2bf177c2017-06-29 01:49:08 -070065 .register(AtomixConsistentTreeMapOperations.NAMESPACE)
Jordan Halterman71635ae2017-07-28 10:35:43 -070066 .register(AtomixConsistentMapEvents.NAMESPACE)
67 .nextId(KryoNamespaces.BEGIN_USER_CUSTOM_ID + 150)
68 .register(AtomixConsistentMapService.TransactionScope.class)
69 .register(TransactionLog.class)
70 .register(TransactionId.class)
71 .register(AtomixConsistentMapService.MapEntryValue.class)
72 .register(AtomixConsistentMapService.MapEntryValue.Type.class)
73 .register(new HashMap().keySet().getClass())
74 .register(TreeMap.class)
Jordan Halterman2bf177c2017-06-29 01:49:08 -070075 .build());
Aaron Kruglikov3e29f662016-07-13 10:18:10 -070076
Jordan Halterman2bf177c2017-06-29 01:49:08 -070077 public AtomixConsistentTreeMap(RaftProxy proxy) {
78 super(proxy);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -070079 }
80
81 @Override
Jordan Halterman71635ae2017-07-28 10:35:43 -070082 protected Serializer serializer() {
83 return SERIALIZER;
Aaron Kruglikov3e29f662016-07-13 10:18:10 -070084 }
85
86 @Override
87 public CompletableFuture<String> firstKey() {
Jordan Halterman71635ae2017-07-28 10:35:43 -070088 return proxy.invoke(FIRST_KEY, serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -070089 }
90
91 @Override
92 public CompletableFuture<String> lastKey() {
Jordan Halterman71635ae2017-07-28 10:35:43 -070093 return proxy.invoke(LAST_KEY, serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -070094 }
95
96 @Override
97 public CompletableFuture<Map.Entry<String, Versioned<byte[]>>> ceilingEntry(String key) {
Jordan Halterman71635ae2017-07-28 10:35:43 -070098 return proxy.invoke(CEILING_ENTRY, serializer()::encode, new CeilingEntry(key), serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -070099 }
100
101 @Override
102 public CompletableFuture<Map.Entry<String, Versioned<byte[]>>> floorEntry(String key) {
Jordan Halterman71635ae2017-07-28 10:35:43 -0700103 return proxy.invoke(FLOOR_ENTRY, serializer()::encode, new FloorEntry(key), serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -0700104 }
105
106 @Override
107 public CompletableFuture<Map.Entry<String, Versioned<byte[]>>> higherEntry(
108 String key) {
Jordan Halterman71635ae2017-07-28 10:35:43 -0700109 return proxy.invoke(HIGHER_ENTRY, serializer()::encode, new HigherEntry(key), serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -0700110 }
111
112 @Override
113 public CompletableFuture<Map.Entry<String, Versioned<byte[]>>> lowerEntry(
114 String key) {
Jordan Halterman71635ae2017-07-28 10:35:43 -0700115 return proxy.invoke(LOWER_ENTRY, serializer()::encode, new LowerEntry(key), serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -0700116 }
117
118 @Override
119 public CompletableFuture<Map.Entry<String, Versioned<byte[]>>> firstEntry() {
Jordan Halterman71635ae2017-07-28 10:35:43 -0700120 return proxy.invoke(FIRST_ENTRY, serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -0700121 }
122
123 @Override
124 public CompletableFuture<Map.Entry<String, Versioned<byte[]>>> lastEntry() {
Jordan Halterman71635ae2017-07-28 10:35:43 -0700125 return proxy.invoke(LAST_ENTRY, serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -0700126 }
127
128 @Override
129 public CompletableFuture<Map.Entry<String, Versioned<byte[]>>> pollFirstEntry() {
Jordan Halterman71635ae2017-07-28 10:35:43 -0700130 return proxy.invoke(POLL_FIRST_ENTRY, serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -0700131 }
132
133 @Override
134 public CompletableFuture<Map.Entry<String, Versioned<byte[]>>> pollLastEntry() {
Jordan Halterman71635ae2017-07-28 10:35:43 -0700135 return proxy.invoke(POLL_LAST_ENTRY, serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -0700136 }
137
138 @Override
139 public CompletableFuture<String> lowerKey(String key) {
Jordan Halterman71635ae2017-07-28 10:35:43 -0700140 return proxy.invoke(LOWER_KEY, serializer()::encode, new LowerKey(key), serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -0700141 }
142
143 @Override
144 public CompletableFuture<String> floorKey(String key) {
Jordan Halterman71635ae2017-07-28 10:35:43 -0700145 return proxy.invoke(FLOOR_KEY, serializer()::encode, new FloorKey(key), serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -0700146 }
147
148 @Override
149 public CompletableFuture<String> ceilingKey(String key) {
Jordan Halterman71635ae2017-07-28 10:35:43 -0700150 return proxy.invoke(CEILING_KEY, serializer()::encode, new CeilingKey(key), serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -0700151 }
152
153 @Override
154 public CompletableFuture<String> higherKey(String key) {
Jordan Halterman71635ae2017-07-28 10:35:43 -0700155 return proxy.invoke(HIGHER_KEY, serializer()::encode, new HigherKey(key), serializer()::decode);
Aaron Kruglikov3e29f662016-07-13 10:18:10 -0700156 }
157
158 @Override
159 public CompletableFuture<NavigableSet<String>> navigableKeySet() {
Jordan Halterman948d6592017-04-20 17:18:24 -0700160 throw new UnsupportedOperationException("This operation is not yet supported.");
Aaron Kruglikov3e29f662016-07-13 10:18:10 -0700161 }
162
163 @Override
164 public CompletableFuture<NavigableMap<String, byte[]>> subMap(
165 String upperKey, String lowerKey, boolean inclusiveUpper,
166 boolean inclusiveLower) {
Jordan Halterman948d6592017-04-20 17:18:24 -0700167 throw new UnsupportedOperationException("This operation is not yet supported.");
Aaron Kruglikov3e29f662016-07-13 10:18:10 -0700168 }
Jordan Halterman2bf177c2017-06-29 01:49:08 -0700169}