BUG-4283: experimenter msg 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 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
14 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
15 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer;
16 import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
17 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
18 import org.opendaylight.openflowjava.protocol.impl.util.MatchDeserializer;
19 import org.opendaylight.openflowjava.protocol.impl.util.OF10MatchDeserializer;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10;
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 /**
26  * Stores and registers deserializers
27  * @author michal.polkorab
28  */
29 public class DeserializerRegistryImpl implements DeserializerRegistry {
30
31     private static final Logger LOGGER = LoggerFactory.getLogger(DeserializerRegistryImpl.class);
32     private Map<MessageCodeKey, OFGeneralDeserializer> registry;
33
34     /**
35      * Decoder table provisioning
36      */
37     @Override
38     public void init() {
39         registry = new HashMap<>();
40         // register message deserializers
41         MessageDeserializerInitializer.registerMessageDeserializers(this);
42
43         // register common structure deserializers
44         registerDeserializer(new MessageCodeKey(EncodeConstants.OF10_VERSION_ID,
45                 EncodeConstants.EMPTY_VALUE, MatchV10.class), new OF10MatchDeserializer());
46         registerDeserializer(new MessageCodeKey(EncodeConstants.OF13_VERSION_ID,
47                 EncodeConstants.EMPTY_VALUE, Match.class), new MatchDeserializer());
48
49         // register match entry deserializers
50         MatchEntryDeserializerInitializer.registerMatchEntryDeserializers(this);
51         // register action deserializers
52         ActionDeserializerInitializer.registerDeserializers(this);
53         // register instruction deserializers
54         InstructionDeserializerInitializer.registerDeserializers(this);
55     }
56
57     @Override
58     @SuppressWarnings("unchecked")
59     public <T extends OFGeneralDeserializer> T getDeserializer(
60             MessageCodeKey key) {
61         OFGeneralDeserializer deserializer = registry.get(key);
62         if (deserializer == null) {
63             throw new IllegalStateException("Deserializer for key: " + key
64                     + " was not found - please verify that all needed deserializers ale loaded correctly");
65         }
66         return (T) deserializer;
67     }
68
69     @Override
70     public void registerDeserializer(MessageCodeKey key,
71             OFGeneralDeserializer deserializer) {
72         if ((key == null) || (deserializer == null)) {
73             throw new IllegalArgumentException("MessageCodeKey or Deserializer is null");
74         }
75         OFGeneralDeserializer desInRegistry = registry.put(key, deserializer);
76         if (desInRegistry != null) {
77             LOGGER.debug("Deserializer for key {} overwritten. Old deserializer: {}, new deserializer: {}",
78                     key, desInRegistry.getClass().getName(), deserializer.getClass().getName());
79         }
80         if (deserializer instanceof DeserializerRegistryInjector) {
81             ((DeserializerRegistryInjector) deserializer).injectDeserializerRegistry(this);
82         }
83     }
84
85     @Override
86     public boolean unregisterDeserializer(MessageCodeKey key) {
87         if (key == null) {
88             throw new IllegalArgumentException("MessageCodeKey is null");
89         }
90         OFGeneralDeserializer deserializer = registry.remove(key);
91         if (deserializer == null) {
92             return false;
93         }
94         return true;
95     }
96
97 }