Extensibility refactoring
[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 io.netty.buffer.ByteBuf;
12
13 import java.util.HashMap;
14 import java.util.Map;
15
16 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
17 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
18 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
19 import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
20 import org.opendaylight.yangtools.yang.binding.DataObject;
21
22 /**
23  * @author michal.polkorab
24  * @author timotej.kubas
25  */
26 public class DeserializationFactory {
27
28     private DeserializerRegistry registry;
29     private Map<TypeToClassKey, Class<?>> messageClassMap;
30
31     /**
32      * Constructor
33      */
34     public DeserializationFactory() {
35         messageClassMap = new HashMap<>();
36         TypeToClassMapInitializer.initializeTypeToClassMap(messageClassMap);
37     }
38
39     /**
40      * Transforms ByteBuf into correct POJO message
41      * @param rawMessage
42      * @param version version decoded from OpenFlow protocol message
43      * @return correct POJO as DataObject
44      */
45     public DataObject deserialize(ByteBuf rawMessage, short version) {
46         DataObject dataObject = null;
47         int type = rawMessage.readUnsignedByte();
48         Class<?> clazz = messageClassMap.get(new TypeToClassKey(version, type));
49         rawMessage.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
50         OFDeserializer<DataObject> deserializer = registry.getDeserializer(
51                 new MessageCodeKey(version, type, clazz));
52         if (deserializer != null) {
53             dataObject = deserializer.deserialize(rawMessage);
54         }
55         return dataObject;
56     }
57
58     /**
59      * @param registry
60      */
61     public void setRegistry(DeserializerRegistry registry) {
62         this.registry = registry;
63     }
64
65 }