blob: 3a92745f3af68e569c42e983a12c87ccd8c93ec9 [file] [log] [blame]
Yuta HIGUCHI3cc4d9b2014-11-29 18:17:17 -08001/*
2 * Copyright 2014 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 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.store.hz;
Yuta HIGUCHI3cc4d9b2014-11-29 18:17:17 -080017
18import static com.google.common.base.Preconditions.checkNotNull;
19
20import java.util.ArrayList;
21import java.util.Collection;
22import java.util.HashSet;
23import java.util.Set;
24import java.util.concurrent.TimeUnit;
25
Brian O'Connorabafb502014-12-02 22:26:20 -080026import org.onosproject.store.serializers.StoreSerializer;
Yuta HIGUCHI3cc4d9b2014-11-29 18:17:17 -080027
28import com.hazelcast.core.TransactionalMap;
29import com.hazelcast.query.Predicate;
30
Yuta HIGUCHI3cc4d9b2014-11-29 18:17:17 -080031/**
32 * Wrapper around TransactionalMap<byte[], byte[]> which serializes/deserializes
33 * key and value using StoreSerializer.
34 *
35 * @param <K> key type
36 * @param <V> value type
37 */
38public class STxMap<K, V> implements TransactionalMap<K, V> {
39
40 private final TransactionalMap<byte[], byte[]> m;
41 private final StoreSerializer serializer;
42
43 /**
44 * Creates a STxMap instance.
45 *
46 * @param baseMap base IMap to use
47 * @param serializer serializer to use for both key and value
48 */
49 public STxMap(TransactionalMap<byte[], byte[]> baseMap, StoreSerializer serializer) {
50 this.m = checkNotNull(baseMap);
51 this.serializer = checkNotNull(serializer);
52 }
53
54 @Override
55 public int size() {
56 return m.size();
57 }
58
59 @Override
60 public boolean isEmpty() {
61 return m.isEmpty();
62 }
63
64 @Deprecated
65 @Override
66 public Object getId() {
67 return m.getId();
68 }
69
70 @Override
71 public String getPartitionKey() {
72 return m.getPartitionKey();
73 }
74
75 @Override
76 public String getName() {
77 return m.getName();
78 }
79
80 @Override
81 public String getServiceName() {
82 return m.getServiceName();
83 }
84
85 @Override
86 public void destroy() {
87 m.destroy();
88 }
89
90 @Override
91 public boolean containsKey(Object key) {
92 return m.containsKey(serializeKey(key));
93 }
94
95 @Override
96 public V get(Object key) {
97 return deserializeVal(m.get(serializeKey(key)));
98 }
99
100 @Override
101 public V getForUpdate(Object key) {
Yuta HIGUCHI3cc4d9b2014-11-29 18:17:17 -0800102 return deserializeVal(m.getForUpdate(serializeKey(key)));
103 }
104
105 @Override
106 public V put(K key, V value) {
107 return deserializeVal(m.put(serializeKey(key), serializeVal(value)));
108 }
109
110 @Override
111 public V remove(Object key) {
112 return deserializeVal(m.remove(serializeKey(key)));
113 }
114
115 @Override
116 public boolean remove(Object key, Object value) {
117 return m.remove(serializeKey(key), serializeVal(value));
118 }
119
120 @Override
121 public void delete(Object key) {
122 m.delete(serializeKey(key));
123 }
124
125 @Override
126 public V put(K key, V value, long ttl, TimeUnit timeunit) {
127 return deserializeVal(m.put(serializeKey(key), serializeVal(value), ttl, timeunit));
128 }
129
130 @Override
131 public V putIfAbsent(K key, V value) {
132 return deserializeVal(m.putIfAbsent(serializeKey(key), serializeVal(value)));
133 }
134
135 @Override
136 public boolean replace(K key, V oldValue, V newValue) {
137 return m.replace(serializeKey(key), serializeVal(oldValue), serializeVal(newValue));
138 }
139
140 @Override
141 public V replace(K key, V value) {
142 return deserializeVal(m.replace(serializeKey(key), serializeVal(value)));
143 }
144
145 @Override
146 public void set(K key, V value) {
147 m.set(serializeKey(key), serializeVal(value));
148 }
149
150
151 @Override
152 public Set<K> keySet() {
153 return deserializeKeySet(m.keySet());
154 }
155
156 @Override
157 public Collection<V> values() {
158 return deserializeVals(m.values());
159 }
160
161 @Deprecated // marking method not implemented
162 @SuppressWarnings("rawtypes")
163 @Override
164 public Set<K> keySet(Predicate predicate) {
165 throw new UnsupportedOperationException();
166 }
167
168 @Deprecated // marking method not implemented
169 @SuppressWarnings("rawtypes")
170 @Override
171 public Collection<V> values(Predicate predicate) {
172 throw new UnsupportedOperationException();
173 }
174
175 private byte[] serializeKey(Object key) {
176 return serializer.encode(key);
177 }
178
179 private K deserializeKey(byte[] key) {
180 return serializer.decode(key);
181 }
182
183 private byte[] serializeVal(Object val) {
184 return serializer.encode(val);
185 }
186
187 private V deserializeVal(byte[] val) {
188 if (val == null) {
189 return null;
190 }
191 return serializer.decode(val.clone());
192 }
193
194 private Set<K> deserializeKeySet(Set<byte[]> keys) {
195 Set<K> dsk = new HashSet<>(keys.size());
196 for (byte[] key : keys) {
197 dsk.add(deserializeKey(key));
198 }
199 return dsk;
200 }
201
202 private Collection<V> deserializeVals(Collection<byte[]> vals) {
203 Collection<V> dsl = new ArrayList<>(vals.size());
204 for (byte[] val : vals) {
205 dsl.add(deserializeVal(val));
206 }
207 return dsl;
208 }
209}