/** * Copyright (c) 2014 Cisco Systems, Inc. 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.nx.api.impl; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.google.common.annotations.VisibleForTesting; import org.opendaylight.openflowjava.nx.api.NiciraActionDeserializerKey; import org.opendaylight.openflowjava.nx.api.NiciraActionSerializerKey; import org.opendaylight.openflowjava.nx.api.NiciraExtensionCodecRegistrator; import org.opendaylight.openflowjava.nx.api.NiciraUtil; import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer; import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer; import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralSerializer; import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer; import org.opendaylight.openflowjava.protocol.api.keys.ActionSerializerKey; import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterActionDeserializerKey; import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterDeserializerKey; import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterSerializerKey; import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey; import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey; import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OxmClassBase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry; /** * @author msunal * */ public class NiciraExtensionCodecRegistratorImpl implements NiciraExtensionCodecRegistrator, AutoCloseable { private static final Map<NiciraActionDeserializerKey, OFDeserializer<Action>> actionDeserializers = new ConcurrentHashMap<>(); private final List<SwitchConnectionProvider> providers; /** * @param providers */ public NiciraExtensionCodecRegistratorImpl(List<SwitchConnectionProvider> providers) { this.providers = providers; ActionDeserializer of10ActionDeserializer = new ActionDeserializer(EncodeConstants.OF10_VERSION_ID); ActionDeserializer of13ActionDeserializer = new ActionDeserializer(EncodeConstants.OF13_VERSION_ID); registerActionDeserializer(ActionDeserializer.OF10_DESERIALIZER_KEY, of10ActionDeserializer); registerActionDeserializer(ActionDeserializer.OF13_DESERIALIZER_KEY, of13ActionDeserializer); } private void registerActionDeserializer(ExperimenterActionDeserializerKey key, OFGeneralDeserializer deserializer) { for (SwitchConnectionProvider provider : providers) { provider.registerActionDeserializer(key, deserializer); } } private void registerActionSerializer(ActionSerializerKey<?> key, OFGeneralSerializer serializer) { for (SwitchConnectionProvider provider : providers) { provider.registerActionSerializer(key, serializer); } } private void unregisterDeserializer(ExperimenterDeserializerKey key) { for (SwitchConnectionProvider provider : providers) { provider.unregisterDeserializer(key); } } private void unregisterSerializer(ExperimenterSerializerKey key) { for (SwitchConnectionProvider provider : providers) { provider.unregisterSerializer(key); } } /* * (non-Javadoc) * * @see org.opendaylight.openflow.extension.nicira.api. * NiciraExtensionCodecRegistrator * #registerActionDeserializer(org.opendaylight * .openflow.extension.nicira.api.NiciraActionDeserializerKey, * org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer) */ @Override public void registerActionDeserializer(NiciraActionDeserializerKey key, OFDeserializer<Action> deserializer) { actionDeserializers.put(key, deserializer); } /* * (non-Javadoc) * * @see org.opendaylight.openflow.extension.nicira.api. * NiciraExtensionCodecRegistrator * #unregisterActionDeserializer(org.opendaylight * .openflow.extension.nicira.api.NiciraActionDeserializerKey) */ @Override public void unregisterActionDeserializer(NiciraActionDeserializerKey key) { actionDeserializers.remove(key); } static OFDeserializer<Action> getActionDeserializer(NiciraActionDeserializerKey key) { return actionDeserializers.get(key); } /* * (non-Javadoc) * * @see org.opendaylight.openflow.extension.nicira.api. * NiciraExtensionCodecRegistrator * #registerActionSerializer(org.opendaylight. * openflow.extension.nicira.api.NiciraActionSerializerKey, * org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer) */ @Override public void registerActionSerializer(NiciraActionSerializerKey key, OFSerializer<Action> serializer) { registerActionSerializer(NiciraUtil.createOfJavaKeyFrom(key), serializer); } /* * (non-Javadoc) * * @see org.opendaylight.openflow.extension.nicira.api. * NiciraExtensionCodecRegistrator * #unregisterActionSerializer(org.opendaylight * .openflow.extension.nicira.api.NiciraActionSerializerKey) */ @Override public void unregisterActionSerializer(NiciraActionSerializerKey key) { unregisterSerializer(NiciraUtil.createOfJavaKeyFrom(key)); } /* * (non-Javadoc) * * @see org.opendaylight.openflow.extension.nicira.api. * NiciraExtensionCodecRegistrator * #registerMatchEntryDeserializer(org.opendaylight * .openflowjava.protocol.api.keys.MatchEntryDeserializerKey, * org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer) */ @Override public void registerMatchEntryDeserializer(MatchEntryDeserializerKey key, OFDeserializer<MatchEntry> deserializer) { for (SwitchConnectionProvider provider : providers) { provider.registerMatchEntryDeserializer(key, deserializer); } } /* * (non-Javadoc) * * @see org.opendaylight.openflow.extension.nicira.api. * NiciraExtensionCodecRegistrator * #unregisterMatchEntryDeserializer(org.opendaylight * .openflowjava.protocol.api.keys.MatchEntryDeserializerKey) */ @Override public void unregisterMatchEntryDeserializer(MatchEntryDeserializerKey key) { unregisterDeserializer(key); } /* * (non-Javadoc) * * @see org.opendaylight.openflow.extension.nicira.api. * NiciraExtensionCodecRegistrator * #registerMatchEntrySerializer(org.opendaylight * .openflowjava.protocol.api.keys.MatchEntrySerializerKey, * org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer) */ @Override public void registerMatchEntrySerializer(MatchEntrySerializerKey<? extends OxmClassBase, ? extends MatchField> key, OFSerializer<MatchEntry> serializer) { for (SwitchConnectionProvider provider : providers) { provider.registerMatchEntrySerializer(key, serializer); } } /* * (non-Javadoc) * * @see org.opendaylight.openflow.extension.nicira.api. * NiciraExtensionCodecRegistrator * #unregisterMatchEntrySerializer(org.opendaylight * .openflowjava.protocol.api.keys.MatchEntrySerializerKey) */ @Override public void unregisterMatchEntrySerializer(MatchEntrySerializerKey<? extends OxmClassBase, ? extends MatchField> key) { unregisterSerializer(key); } @Override public void close() throws Exception { // TODO Auto-generated method stub } @VisibleForTesting boolean isEmptyActionDeserializers() { return actionDeserializers.isEmpty(); } }