/* * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.openflowjava.protocol.impl.deserialization; import java.util.HashMap; import java.util.Map; import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry; import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector; import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer; import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey; import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; import org.opendaylight.openflowjava.protocol.impl.util.MatchDeserializer; import org.opendaylight.openflowjava.protocol.impl.util.OF10MatchDeserializer; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Stores and registers deserializers * * @author michal.polkorab */ public class DeserializerRegistryImpl implements DeserializerRegistry { private static final Logger LOG = LoggerFactory.getLogger(DeserializerRegistryImpl.class); private Map<MessageCodeKey, OFGeneralDeserializer> registry; /** * Decoder table provisioning */ @Override public void init() { registry = new HashMap<>(); // register message deserializers MessageDeserializerInitializer.registerMessageDeserializers(this); // register additional message deserializers AdditionalMessageDeserializerInitializer.registerMessageDeserializers(this); // register common structure deserializers registerDeserializer( new MessageCodeKey(EncodeConstants.OF10_VERSION_ID, EncodeConstants.EMPTY_VALUE, MatchV10.class), new OF10MatchDeserializer()); registerDeserializer( new MessageCodeKey(EncodeConstants.OF13_VERSION_ID, EncodeConstants.EMPTY_VALUE, Match.class), new MatchDeserializer()); // register match entry deserializers MatchEntryDeserializerInitializer.registerMatchEntryDeserializers(this); // register action deserializers ActionDeserializerInitializer.registerDeserializers(this); // register instruction deserializers InstructionDeserializerInitializer.registerDeserializers(this); } @Override @SuppressWarnings("unchecked") public <T extends OFGeneralDeserializer> T getDeserializer(MessageCodeKey key) { OFGeneralDeserializer deserializer = registry.get(key); if (deserializer == null) { throw new IllegalStateException("Deserializer for key: " + key + " was not found - please verify that all needed deserializers ale loaded correctly"); } return (T) deserializer; } @Override public void registerDeserializer(MessageCodeKey key, OFGeneralDeserializer deserializer) { if ((key == null) || (deserializer == null)) { throw new IllegalArgumentException("MessageCodeKey or Deserializer is null"); } OFGeneralDeserializer desInRegistry = registry.put(key, deserializer); if (desInRegistry != null) { LOG.debug("Deserializer for key {} overwritten. Old deserializer: {}, new deserializer: {}", key, desInRegistry.getClass().getName(), deserializer.getClass().getName()); } if (deserializer instanceof DeserializerRegistryInjector) { ((DeserializerRegistryInjector) deserializer).injectDeserializerRegistry(this); } } @Override public boolean unregisterDeserializer(MessageCodeKey key) { if (key == null) { throw new IllegalArgumentException("MessageCodeKey is null"); } OFGeneralDeserializer deserializer = registry.remove(key); if (deserializer == null) { return false; } return true; } }