Extensibility support (deserialization part)
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / DeserializerRegistryImpl.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 java.util.HashMap;
12 import java.util.Map;
13
14 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
16 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
17 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer;
18 import org.opendaylight.openflowjava.protocol.impl.util.ActionsDeserializer;
19 import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
20 import org.opendaylight.openflowjava.protocol.impl.util.InstructionsDeserializer;
21 import org.opendaylight.openflowjava.protocol.impl.util.MatchDeserializer;
22 import org.opendaylight.openflowjava.protocol.impl.util.OF10ActionsDeserializer;
23 import org.opendaylight.openflowjava.protocol.impl.util.OF10MatchDeserializer;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.Match;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10;
28
29 /**
30  * Stores and registers deserializers
31  * @author michal.polkorab
32  */
33 public class DeserializerRegistryImpl implements DeserializerRegistry {
34     
35     private Map<MessageCodeKey, OFGeneralDeserializer> registry;
36
37     /**
38      * Decoder table provisioning
39      */
40     @Override
41     public void init() {
42         registry = new HashMap<>();
43         // register message deserializers
44         MessageDerializerInitializer.registerMessageDeserializers(this);
45
46         // register common structure deserializers
47         registerDeserializer(new MessageCodeKey(EncodeConstants.OF10_VERSION_ID,
48                 EncodeConstants.EMPTY_VALUE, MatchV10.class), new OF10MatchDeserializer());
49         registerDeserializer(new MessageCodeKey(EncodeConstants.OF10_VERSION_ID,
50                 EncodeConstants.EMPTY_VALUE, Action.class), new OF10ActionsDeserializer());
51         registerDeserializer(new MessageCodeKey(EncodeConstants.OF13_VERSION_ID,
52                 EncodeConstants.EMPTY_VALUE, Match.class), new MatchDeserializer());
53         registerDeserializer(new MessageCodeKey(EncodeConstants.OF13_VERSION_ID,
54                 EncodeConstants.EMPTY_VALUE, Action.class), new ActionsDeserializer());
55         registerDeserializer(new MessageCodeKey(EncodeConstants.OF13_VERSION_ID,
56                 EncodeConstants.EMPTY_VALUE, Instruction.class), new InstructionsDeserializer());
57
58         // register match entry deserializers
59         MatchEntryDeserializerInitializer.registerMatchEntryDeserializers(this);
60     }
61
62     @Override
63     @SuppressWarnings("unchecked")
64     public <DESERIALIZER_TYPE extends OFGeneralDeserializer> DESERIALIZER_TYPE getDeserializer(
65             MessageCodeKey key) {
66         OFGeneralDeserializer deserializer = registry.get(key);
67         if (deserializer == null) {
68             throw new NullPointerException("Deserializer for key: " + key.toString()
69                     + " was not found");
70         }
71         return (DESERIALIZER_TYPE) deserializer;
72     }
73
74     @Override
75     public void registerDeserializer(MessageCodeKey key,
76             OFGeneralDeserializer deserializer) {
77         if ((key == null) || (deserializer == null)) {
78             throw new NullPointerException("MessageCodeKey or Deserializer is null");
79         }
80         if (deserializer instanceof DeserializerRegistryInjector) {
81             ((DeserializerRegistryInjector) deserializer).injectDeserializerRegistry(this);
82         }
83         registry.put(key, deserializer);
84     }
85
86 }