2 * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
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
9 package org.opendaylight.openflowjava.protocol.impl.deserialization;
11 import java.util.HashMap;
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;
26 * Stores and registers deserializers
28 * @author michal.polkorab
30 public class DeserializerRegistryImpl implements DeserializerRegistry {
32 private static final Logger LOG = LoggerFactory.getLogger(DeserializerRegistryImpl.class);
33 private Map<MessageCodeKey, OFGeneralDeserializer> registry;
36 * Decoder table provisioning
40 registry = new HashMap<>();
42 // register message deserializers
43 MessageDeserializerInitializer.registerMessageDeserializers(this);
45 // register additional message deserializers
46 AdditionalMessageDeserializerInitializer.registerMessageDeserializers(this);
48 // register common structure deserializers
50 new MessageCodeKey(EncodeConstants.OF10_VERSION_ID, EncodeConstants.EMPTY_VALUE, MatchV10.class),
51 new OF10MatchDeserializer());
53 new MessageCodeKey(EncodeConstants.OF13_VERSION_ID, EncodeConstants.EMPTY_VALUE, Match.class),
54 new MatchDeserializer());
56 // register match entry deserializers
57 MatchEntryDeserializerInitializer.registerMatchEntryDeserializers(this);
58 // register action deserializers
59 ActionDeserializerInitializer.registerDeserializers(this);
60 // register instruction deserializers
61 InstructionDeserializerInitializer.registerDeserializers(this);
65 @SuppressWarnings("unchecked")
66 public <T extends OFGeneralDeserializer> T getDeserializer(MessageCodeKey key) {
67 OFGeneralDeserializer deserializer = registry.get(key);
68 if (deserializer == null) {
69 throw new IllegalStateException("Deserializer for key: " + key
70 + " was not found - please verify that all needed deserializers ale loaded correctly");
72 return (T) deserializer;
76 public void registerDeserializer(MessageCodeKey key, OFGeneralDeserializer deserializer) {
77 if ((key == null) || (deserializer == null)) {
78 throw new IllegalArgumentException("MessageCodeKey or Deserializer is null");
80 OFGeneralDeserializer desInRegistry = registry.put(key, deserializer);
81 if (desInRegistry != null) {
82 LOG.debug("Deserializer for key {} overwritten. Old deserializer: {}, new deserializer: {}", key,
83 desInRegistry.getClass().getName(), deserializer.getClass().getName());
85 if (deserializer instanceof DeserializerRegistryInjector) {
86 ((DeserializerRegistryInjector) deserializer).injectDeserializerRegistry(this);
91 public boolean unregisterDeserializer(MessageCodeKey key) {
93 throw new IllegalArgumentException("MessageCodeKey is null");
95 OFGeneralDeserializer deserializer = registry.remove(key);
96 if (deserializer == null) {