bf535b2d2aaf8acbdeefc23f66181edf31149dfc
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / DeserializationFactory.java
1 /*
2  * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.openflowjava.protocol.impl.deserialization;
10
11 import com.google.common.collect.ImmutableMap;
12 import io.netty.buffer.ByteBuf;
13 import java.util.HashMap;
14 import java.util.Map;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
16 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
17 import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
18 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
19 import org.opendaylight.openflowjava.protocol.impl.util.TypeToClassKey;
20 import org.opendaylight.yangtools.yang.binding.DataObject;
21
22 /**
23  * @author michal.polkorab
24  * @author timotej.kubas
25  * @author giuseppex.petralia@intel.com
26  */
27 public class DeserializationFactory {
28
29     private final Map<TypeToClassKey, Class<?>> messageClassMap;
30     private DeserializerRegistry registry;
31
32     /**
33      * Constructor
34      */
35     public DeserializationFactory() {
36         final Map<TypeToClassKey, Class<?>> temp = new HashMap<>();
37         TypeToClassMapInitializer.initializeTypeToClassMap(temp);
38
39         // Register type to class map for additional deserializers
40         TypeToClassMapInitializer.initializeAdditionalTypeToClassMap(temp);
41
42         messageClassMap = ImmutableMap.copyOf(temp);
43     }
44
45     /**
46      * Transforms ByteBuf into correct POJO message
47      *
48      * @param rawMessage
49      * @param version
50      *            version decoded from OpenFlow protocol message
51      * @return correct POJO as DataObject
52      */
53     public DataObject deserialize(final ByteBuf rawMessage, final short version) {
54         DataObject dataObject = null;
55         int type = rawMessage.readUnsignedByte();
56         Class<?> clazz = messageClassMap.get(new TypeToClassKey(version, type));
57         rawMessage.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
58         OFDeserializer<DataObject> deserializer = registry.getDeserializer(new MessageCodeKey(version, type, clazz));
59         dataObject = deserializer.deserialize(rawMessage);
60         return dataObject;
61     }
62
63     /**
64      * @param registry
65      */
66     public void setRegistry(final DeserializerRegistry registry) {
67         this.registry = registry;
68     }
69
70 }