Default experimenters moved to separate bundle + unit tests
[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.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.rev130731.match.grouping.Match;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10;
23
24 /**
25  * Stores and registers deserializers
26  * @author michal.polkorab
27  */
28 public class DeserializerRegistryImpl implements DeserializerRegistry {
29     
30     private Map<MessageCodeKey, OFGeneralDeserializer> registry;
31
32     /**
33      * Decoder table provisioning
34      */
35     @Override
36     public void init() {
37         registry = new HashMap<>();
38         // register message deserializers
39         MessageDerializerInitializer.registerMessageDeserializers(this);
40
41         // register common structure deserializers
42         registerDeserializer(new MessageCodeKey(EncodeConstants.OF10_VERSION_ID,
43                 EncodeConstants.EMPTY_VALUE, MatchV10.class), new OF10MatchDeserializer());
44         registerDeserializer(new MessageCodeKey(EncodeConstants.OF13_VERSION_ID,
45                 EncodeConstants.EMPTY_VALUE, Match.class), new MatchDeserializer());
46
47         // register match entry deserializers
48         MatchEntryDeserializerInitializer.registerMatchEntryDeserializers(this);
49         // register action deserializers
50         ActionDeserializerInitializer.registerDeserializers(this);
51         // register instruction deserializers
52         InstructionDeserializerInitializer.registerDeserializers(this);
53     }
54
55     @Override
56     @SuppressWarnings("unchecked")
57     public <DESERIALIZER_TYPE extends OFGeneralDeserializer> DESERIALIZER_TYPE getDeserializer(
58             MessageCodeKey key) {
59         OFGeneralDeserializer deserializer = registry.get(key);
60         if (deserializer == null) {
61             throw new NullPointerException("Deserializer for key: " + key.toString()
62                     + " was not found");
63         }
64         return (DESERIALIZER_TYPE) deserializer;
65     }
66
67     @Override
68     public void registerDeserializer(MessageCodeKey key,
69             OFGeneralDeserializer deserializer) {
70         if ((key == null) || (deserializer == null)) {
71             throw new NullPointerException("MessageCodeKey or Deserializer is null");
72         }
73         if (deserializer instanceof DeserializerRegistryInjector) {
74             ((DeserializerRegistryInjector) deserializer).injectDeserializerRegistry(this);
75         }
76         registry.put(key, deserializer);
77     }
78
79     @Override
80     public boolean unregisterDeserializer(MessageCodeKey key) {
81         if (key == null) {
82             throw new NullPointerException("MessageCodeKey is null");
83         }
84         OFGeneralDeserializer deserializer = registry.remove(key);
85         if (deserializer == null) {
86             return false;
87         }
88         return true;
89     }
90
91 }