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