blob: d567adc35f10d100dc33a5ed1fa90af9837679f6 [file] [log] [blame]
Madan Jampani068a4382016-02-01 09:54:47 -08001/*
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 */
16package org.onosproject.store.primitives.impl;
17
Madan Jampanie14a09c2016-02-11 10:43:21 -080018import static org.slf4j.LoggerFactory.getLogger;
19
Madan Jampani068a4382016-02-01 09:54:47 -080020import org.onosproject.store.service.Serializer;
Madan Jampanie14a09c2016-02-11 10:43:21 -080021import org.slf4j.Logger;
22
23import com.google.common.base.Throwables;
Madan Jampani068a4382016-02-01 09:54:47 -080024
25import io.atomix.catalyst.buffer.BufferInput;
26import io.atomix.catalyst.buffer.BufferOutput;
27import io.atomix.catalyst.serializer.TypeSerializer;
28import io.atomix.catalyst.serializer.TypeSerializerFactory;
29
30/**
31 * {@link TypeSerializerFactory} for providing {@link TypeSerializer}s based on
32 * {@code org.onosproject.store.service.Serializer}.
33 */
34public class DefaultCatalystTypeSerializerFactory implements TypeSerializerFactory {
35
Madan Jampanie14a09c2016-02-11 10:43:21 -080036 private final Logger log = getLogger(getClass());
Madan Jampani068a4382016-02-01 09:54:47 -080037 private final TypeSerializer<?> typeSerializer;
38
39 public DefaultCatalystTypeSerializerFactory(Serializer serializer) {
40 typeSerializer = new InternalSerializer<>(serializer);
41 }
42
43 @Override
44 public TypeSerializer<?> createSerializer(Class<?> clazz) {
45 return typeSerializer;
46 }
47
48 private class InternalSerializer<T> implements TypeSerializer<T> {
49
50 private final Serializer serializer;
51
52 InternalSerializer(Serializer serializer) {
53 this.serializer = serializer;
54 }
55
56 @Override
Madan Jampani86cb2432016-02-17 11:07:56 -080057 public void write(T object, BufferOutput buffer,
Madan Jampani39fff102016-02-14 13:17:28 -080058 io.atomix.catalyst.serializer.Serializer serializer) {
Madan Jampanie14a09c2016-02-11 10:43:21 -080059 try {
Madan Jampani39fff102016-02-14 13:17:28 -080060 byte[] payload = this.serializer.encode(object);
61 buffer.writeInt(payload.length);
62 buffer.write(payload);
Madan Jampanie14a09c2016-02-11 10:43:21 -080063 } catch (Exception e) {
Madan Jampani39fff102016-02-14 13:17:28 -080064 log.warn("Failed to serialize {}", object, e);
Madan Jampanie14a09c2016-02-11 10:43:21 -080065 }
Madan Jampani068a4382016-02-01 09:54:47 -080066 }
67
68 @Override
Madan Jampani86cb2432016-02-17 11:07:56 -080069 public T read(Class<T> type, BufferInput buffer,
Madan Jampani39fff102016-02-14 13:17:28 -080070 io.atomix.catalyst.serializer.Serializer serializer) {
71 int size = buffer.readInt();
Madan Jampanie14a09c2016-02-11 10:43:21 -080072 try {
Madan Jampani39fff102016-02-14 13:17:28 -080073 byte[] payload = new byte[size];
74 buffer.read(payload);
75 return this.serializer.decode(payload);
Madan Jampanie14a09c2016-02-11 10:43:21 -080076 } catch (Exception e) {
Madan Jampani39fff102016-02-14 13:17:28 -080077 log.warn("Failed to deserialize as type {}. Payload size: {}", type, size, e);
78 Throwables.propagate(e);
79 return null;
Madan Jampanie14a09c2016-02-11 10:43:21 -080080 }
Madan Jampani068a4382016-02-01 09:54:47 -080081 }
82 }
83}