Merge "Add Serialization and Deserialization injectors"
authorJozef Bacigal <jozef.bacigal@pantheon.tech>
Tue, 20 Dec 2016 08:05:38 +0000 (08:05 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Tue, 20 Dec 2016 08:05:38 +0000 (08:05 +0000)
openflowplugin-impl/pom.xml
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderImpl.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/DeserializerInjector.java [new file with mode: 0644]
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/SerializerInjector.java [new file with mode: 0644]
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/AbstractDeserializerTest.java [new file with mode: 0644]
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/serialization/AbstractSerializerTest.java [new file with mode: 0644]

index b1c31e8ee24e787ce22ae1f9b62f5ea189719b37..ed45a808f53c746bfef876f9b276330e5bf8ce7e 100644 (file)
             <groupId>org.opendaylight.controller</groupId>
             <artifactId>sal-common-api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.opendaylight.openflowjava</groupId>
+            <artifactId>openflow-protocol-impl</artifactId>
+        </dependency>
     </dependencies>
 </project>
 
index 979fb0a842c569d782b44bba98dcf7397eed59fc..50abf44db6e4ed196aa6eef048973e41cc3d1e78 100644 (file)
@@ -12,16 +12,15 @@ package org.opendaylight.openflowplugin.impl;
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
 import io.netty.util.HashedWheelTimer;
 import java.lang.management.ManagementFactory;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.SynchronousQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
 import javax.management.InstanceAlreadyExistsException;
 import javax.management.MBeanRegistrationException;
@@ -47,6 +46,8 @@ import org.opendaylight.openflowplugin.extension.api.OpenFlowPluginExtensionRegi
 import org.opendaylight.openflowplugin.extension.api.core.extension.ExtensionConverterManager;
 import org.opendaylight.openflowplugin.impl.connection.ConnectionManagerImpl;
 import org.opendaylight.openflowplugin.impl.device.DeviceManagerImpl;
+import org.opendaylight.openflowplugin.impl.protocol.deserialization.DeserializerInjector;
+import org.opendaylight.openflowplugin.impl.protocol.serialization.SerializerInjector;
 import org.opendaylight.openflowplugin.impl.rpc.RpcManagerImpl;
 import org.opendaylight.openflowplugin.impl.statistics.StatisticsManagerImpl;
 import org.opendaylight.openflowplugin.impl.statistics.ofpspecific.MessageIntelligenceAgencyImpl;
@@ -129,19 +130,18 @@ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenF
     }
 
     private void startSwitchConnections() {
-        final List<ListenableFuture<Boolean>> starterChain = new ArrayList<>(switchConnectionProviders.size());
-        for (final SwitchConnectionProvider switchConnectionPrv : switchConnectionProviders) {
-            switchConnectionPrv.setSwitchConnectionHandler(connectionManager);
-            final ListenableFuture<Boolean> isOnlineFuture = switchConnectionPrv.startup();
-            starterChain.add(isOnlineFuture);
-        }
-
-        final ListenableFuture<List<Boolean>> srvStarted = Futures.allAsList(starterChain);
-        Futures.addCallback(srvStarted, new FutureCallback<List<Boolean>>() {
+        Futures.addCallback(Futures.allAsList(switchConnectionProviders.stream().map(switchConnectionProvider -> {
+            // Inject OpenflowPlugin custom serializers and deserializers into OpenflowJava
+            SerializerInjector.injectSerializers(switchConnectionProvider);
+            DeserializerInjector.injectDeserializers(switchConnectionProvider);
+
+            // Set handler of incoming connections and start switch connection provider
+            switchConnectionProvider.setSwitchConnectionHandler(connectionManager);
+            return switchConnectionProvider.startup();
+        }).collect(Collectors.toSet())), new FutureCallback<List<Boolean>>() {
             @Override
             public void onSuccess(final List<Boolean> result) {
-                LOG.info("All switchConnectionProviders are up and running ({}).",
-                        result.size());
+                LOG.info("All switchConnectionProviders are up and running ({}).", result.size());
             }
 
             @Override
diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/DeserializerInjector.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/DeserializerInjector.java
new file mode 100644 (file)
index 0000000..cf40f19
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2016 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.openflowplugin.impl.protocol.deserialization;
+
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider;
+
+/**
+ * Util class for injecting new deserializers into OpenflowJava
+ */
+public class DeserializerInjector {
+
+    /**
+     * Injects deserializers into provided {@link org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider}
+     * @param provider OpenflowJava deserializer extension provider
+     */
+    public static void injectDeserializers(final DeserializerExtensionProvider provider) {
+        // Inject new deserializers here
+    }
+}
diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/SerializerInjector.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/SerializerInjector.java
new file mode 100644 (file)
index 0000000..c897a22
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2016 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.openflowplugin.impl.protocol.serialization;
+
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerExtensionProvider;
+
+/**
+ * Util class for injecting new serializers into OpenflowJava
+ */
+public class SerializerInjector {
+
+    /**
+     * Injects serializers into provided {@link org.opendaylight.openflowjava.protocol.api.extensibility.SerializerExtensionProvider}
+     * @param provider OpenflowJava serializer extension provider
+     */
+    public static void injectSerializers(final SerializerExtensionProvider provider) {
+        // Inject new serializers here
+    }
+}
diff --git a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/AbstractDeserializerTest.java b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/deserialization/AbstractDeserializerTest.java
new file mode 100644 (file)
index 0000000..17959d6
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 2016 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.openflowplugin.impl.protocol.deserialization;
+
+import org.junit.Before;
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerExtensionProvider;
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterActionDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterInstructionDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
+import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
+import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializationFactory;
+import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializerRegistryImpl;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueueProperty;
+
+public abstract class AbstractDeserializerTest {
+    private DeserializerExtensionProvider provider;
+    private DeserializerRegistry registry;
+    private DeserializationFactory factory;
+
+    @Before
+    public void setUp() throws Exception {
+        registry = new DeserializerRegistryImpl();
+        registry.init();
+        factory = new DeserializationFactory();
+        factory.setRegistry(registry);
+        provider = new DeserializerExtensionProviderImpl(registry, factory);
+        DeserializerInjector.injectDeserializers(provider);
+        init();
+    }
+
+    protected DeserializationFactory getFactory() {
+        return factory;
+    }
+
+    protected DeserializerRegistry getRegistry() {
+        return registry;
+    }
+
+    protected DeserializerExtensionProvider getProvider() {
+        return provider;
+    }
+
+    protected abstract void init();
+
+    static class DeserializerExtensionProviderImpl implements DeserializerExtensionProvider {
+
+        private final DeserializerRegistry registry;
+        private final DeserializationFactory factory;
+
+        public DeserializerExtensionProviderImpl(final DeserializerRegistry registry, DeserializationFactory factory) {
+            this.registry = registry;
+            this.factory = factory;
+        }
+
+        @Override
+        public void registerDeserializer(MessageCodeKey messageCodeKey, OFGeneralDeserializer ofGeneralDeserializer) {
+            registry.registerDeserializer(messageCodeKey, ofGeneralDeserializer);
+        }
+
+        @Override
+        public boolean unregisterDeserializer(ExperimenterDeserializerKey key) {
+            return false;
+        }
+
+        @Override
+        public void registerActionDeserializer(ExperimenterActionDeserializerKey key, OFGeneralDeserializer deserializer) {
+
+        }
+
+        @Override
+        public void registerInstructionDeserializer(ExperimenterInstructionDeserializerKey key, OFGeneralDeserializer deserializer) {
+
+        }
+
+        @Override
+        public void registerMatchEntryDeserializer(MatchEntryDeserializerKey key, OFGeneralDeserializer deserializer) {
+
+        }
+
+        @Override
+        public void registerErrorDeserializer(ExperimenterIdDeserializerKey key, OFDeserializer<ErrorMessage> deserializer) {
+
+        }
+
+        @Override
+        public void registerExperimenterMessageDeserializer(ExperimenterIdDeserializerKey key, OFDeserializer<? extends ExperimenterDataOfChoice> deserializer) {
+
+        }
+
+        @Override
+        public void registerMultipartReplyMessageDeserializer(ExperimenterIdDeserializerKey key, OFDeserializer<? extends ExperimenterDataOfChoice> deserializer) {
+
+        }
+
+        @Override
+        public void registerMultipartReplyTFDeserializer(ExperimenterIdDeserializerKey key, OFGeneralDeserializer deserializer) {
+
+        }
+
+        @Override
+        public void registerMeterBandDeserializer(ExperimenterIdDeserializerKey key, OFDeserializer<MeterBandExperimenterCase> deserializer) {
+
+        }
+
+        @Override
+        public void registerQueuePropertyDeserializer(ExperimenterIdDeserializerKey key, OFDeserializer<QueueProperty> deserializer) {
+
+        }
+
+        @Override
+        public void registerDeserializerMapping(TypeToClassKey typeToClassKey, Class<?> aClass) {
+            factory.registerMapping(typeToClassKey, aClass);
+        }
+
+        @Override
+        public boolean unregisterDeserializerMapping(TypeToClassKey typeToClassKey) {
+            return factory.unregisterMapping(typeToClassKey);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/serialization/AbstractSerializerTest.java b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/protocol/serialization/AbstractSerializerTest.java
new file mode 100644 (file)
index 0000000..e39117f
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2016 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.openflowplugin.impl.protocol.serialization;
+
+import org.junit.Before;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralSerializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerExtensionProvider;
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.keys.ActionSerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdMeterSubTypeSerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdSerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterSerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.InstructionSerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.MatchEntrySerializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
+import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
+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.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;
+
+public abstract class AbstractSerializerTest {
+    private SerializerExtensionProvider provider;
+    private SerializerRegistry registry;
+
+    @Before
+    public void setUp() throws Exception {
+        registry = new SerializerRegistryImpl();
+        registry.init();
+        provider = new SerializerExtensionProviderImpl(registry);
+        SerializerInjector.injectSerializers(provider);
+        init();
+    }
+
+    protected SerializerRegistry getRegistry() {
+        return registry;
+    }
+
+    protected SerializerExtensionProvider getProvider() {
+        return provider;
+    }
+
+    protected abstract void init();
+
+    private static class SerializerExtensionProviderImpl implements SerializerExtensionProvider {
+
+        private final SerializerRegistry registry;
+
+        SerializerExtensionProviderImpl(final SerializerRegistry registry) {
+            this.registry = registry;
+        }
+
+        @Override
+        public <K> void registerSerializer(MessageTypeKey<K> messageTypeKey, OFGeneralSerializer ofGeneralSerializer) {
+           registry.registerSerializer(messageTypeKey, ofGeneralSerializer);
+        }
+
+        @Override
+        public boolean unregisterSerializer(ExperimenterSerializerKey key) {
+            return false;
+        }
+
+        @Override
+        public void registerActionSerializer(ActionSerializerKey<?> key, OFGeneralSerializer serializer) {
+
+        }
+
+        @Override
+        public void registerInstructionSerializer(InstructionSerializerKey<?> key, OFGeneralSerializer serializer) {
+
+        }
+
+        @Override
+        public <C extends OxmClassBase, F extends MatchField> void registerMatchEntrySerializer(MatchEntrySerializerKey<C, F> key, OFGeneralSerializer serializer) {
+
+        }
+
+        @Override
+        public void registerExperimenterMessageSerializer(ExperimenterIdSerializerKey<? extends ExperimenterDataOfChoice> key, OFSerializer<? extends ExperimenterDataOfChoice> serializer) {
+
+        }
+
+        @Override
+        public void registerMultipartRequestSerializer(ExperimenterIdSerializerKey<? extends ExperimenterDataOfChoice> key, OFSerializer<? extends ExperimenterDataOfChoice> serializer) {
+
+        }
+
+        @Override
+        public void registerMultipartRequestTFSerializer(ExperimenterIdSerializerKey<TableFeatureProperties> key, OFGeneralSerializer serializer) {
+
+        }
+
+        @Override
+        public void registerMeterBandSerializer(ExperimenterIdSerializerKey<MeterBandExperimenterCase> key, OFSerializer<MeterBandExperimenterCase> serializer) {
+
+        }
+
+        @Override
+        public void registerMeterBandSerializer(ExperimenterIdMeterSubTypeSerializerKey<MeterBandExperimenterCase> key, OFSerializer<MeterBandExperimenterCase> serializer) {
+
+        }
+    }
+
+}
\ No newline at end of file