2 * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.openflowjava.protocol.impl.deserialization;
11 import io.netty.buffer.ByteBuf;
13 import java.util.concurrent.ConcurrentHashMap;
14 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
16 import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
17 import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
18 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
19 import org.opendaylight.yangtools.yang.binding.DataObject;
22 * @author michal.polkorab
23 * @author timotej.kubas
24 * @author giuseppex.petralia@intel.com
26 public class DeserializationFactory {
28 private final Map<TypeToClassKey, Class<?>> messageClassMap = new ConcurrentHashMap<>();
29 private DeserializerRegistry registry;
34 public DeserializationFactory() {
35 TypeToClassMapInitializer.initializeTypeToClassMap(messageClassMap);
37 // Register type to class map for additional deserializers
38 TypeToClassMapInitializer.initializeAdditionalTypeToClassMap(messageClassMap);
42 * Transforms ByteBuf into correct POJO message
46 * version decoded from OpenFlow protocol message
47 * @return correct POJO as DataObject
49 public DataObject deserialize(final ByteBuf rawMessage, final short version) {
50 DataObject dataObject = null;
51 int type = rawMessage.readUnsignedByte();
52 Class<?> clazz = messageClassMap.get(new TypeToClassKey(version, type));
53 rawMessage.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
54 OFDeserializer<DataObject> deserializer = registry.getDeserializer(new MessageCodeKey(version, type, clazz));
55 dataObject = deserializer.deserialize(rawMessage);
60 * Register new type to class mapping used to assign return type when deserializing message
61 * @param key type to class key
62 * @param clazz return class
64 public void registerMapping(final TypeToClassKey key, final Class<?> clazz) {
65 messageClassMap.put(key, clazz);
69 * Unregister type to class mapping used to assign return type when deserializing message
70 * @param key type to class key
71 * @return true if mapping was successfully removed
73 public boolean unregisterMapping(final TypeToClassKey key) {
75 throw new IllegalArgumentException("TypeToClassKey is null");
78 return messageClassMap.remove(key) != null;
84 public void setRegistry(final DeserializerRegistry registry) {
85 this.registry = registry;