Update MRI projects for Aluminium
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / ConvertorManager.java
index 5c3ed315fcb1ad264918ac34dc387666861c5f62..42c6af9f7b0b09e50a14afcff005a6a508d33fe4 100644 (file)
@@ -5,7 +5,6 @@
  * 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.openflow.md.core.sal.convertor;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -13,7 +12,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
-import java.util.Objects;
+import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Stream;
@@ -24,7 +23,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * Manages various convertors and allows to use them all in one generic way
+ * Manages various convertors and allows to use them all in one generic way.
  */
 public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator {
     private static final Logger LOG = LoggerFactory.getLogger(ConvertorManager.class);
@@ -34,7 +33,8 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
     private Map<Short, Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>>> convertors;
 
     /**
-     * Create new instance of Convertor Manager
+     * Create new instance of Convertor Manager.
+     *
      * @param supportedVersions supported versions
      */
     public ConvertorManager(final Short... supportedVersions) {
@@ -42,7 +42,8 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
 
         if (supportedVersions.length == 1) {
             final Optional<Short> versionOptional = stream.findFirst();
-            versionOptional.ifPresent(version -> convertors = Collections.singletonMap(version, new ConcurrentHashMap<>()));
+            versionOptional.ifPresent(version -> convertors =
+                    Collections.singletonMap(version, new ConcurrentHashMap<>()));
         } else {
             convertors = new ConcurrentHashMap<>();
             stream.forEach(version -> convertors.putIfAbsent(version, new ConcurrentHashMap<>()));
@@ -50,15 +51,16 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
     }
 
     @Override
-    public ConvertorManager registerConvertor(final short version, final Convertor<?, ?, ? extends ConvertorData> convertor) {
+    public ConvertorManager registerConvertor(final short version,
+            final Convertor<?, ?, ? extends ConvertorData> convertor) {
         final Map<Class<?>, Convertor<?, ?, ? extends ConvertorData>> convertorsForVersion =
                 convertors.get(version);
 
-        if (Objects.nonNull(convertorsForVersion)) {
+        if (convertorsForVersion != null) {
             for (final Class<?> type : convertor.getTypes()) {
                 final Convertor<?, ?, ? extends ConvertorData> result = convertorsForVersion.get(type);
 
-                if (Objects.isNull(result)) {
+                if (result == null) {
                     convertor.setConvertorExecutor(this);
                     convertorsForVersion.put(type, convertor);
                     LOG.debug("{} for version {} is now converted by {}", type, version, convertor);
@@ -75,57 +77,83 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
 
     @Override
     @SuppressWarnings("unchecked")
-    public <FROM, TO, DATA extends ConvertorData> Optional<TO> convert(final FROM source, final DATA data) {
-        Optional<TO> result = Optional.empty();
+    public <F, T, D extends ConvertorData> Optional<T> convert(final F source, final D data) {
+        Optional<T> result = Optional.empty();
 
-        if (Objects.isNull(source)) {
+        if (source == null) {
             LOG.trace("Cannot extract type from null source");
             return result;
         }
 
-        final Class<?> type = source instanceof DataContainer ?
-                ((DataContainer)source).getImplementedInterface()
+        final Class<?> type = source instanceof DataContainer ? ((DataContainer) source).implementedInterface()
                 : source.getClass();
 
-        if (Objects.isNull(type)) {
-            LOG.warn("Cannot extract type from {}, because getImplementedInterface() returns null", source);
+        if (type == null) {
+            LOG.warn("Cannot extract type from {}, because implementedInterface() returns null", source);
+            return result;
+        }
+
+        return findConvertor(data.getVersion(), type).map(convertor -> (T)convertor.convert(source, data));
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <K, F, T, D extends ConvertorData> Optional<T> convert(final Map<K, F> source, final D data) {
+        Optional<T> result = Optional.empty();
+
+        if (source == null) {
+            LOG.trace("Cannot extract type from null source");
+            return result;
+        }
+
+        final Optional<F> firstOptional = source.values().stream().findFirst();
+
+        if (!firstOptional.isPresent()) {
+            LOG.trace("Cannot extract type from empty collection");
+            return result;
+        }
+
+        final F first = firstOptional.get();
+
+        final Class<?> type = first instanceof DataContainer ? ((DataContainer) first).implementedInterface()
+                : first.getClass();
+
+        if (type == null) {
+            LOG.warn("Cannot extract type from {}, because implementedInterface() returns null", source);
             return result;
         }
 
-         return findConvertor(data.getVersion(), type)
-                .map(convertor -> (TO)convertor.convert(source, data));
+        return findConvertor(data.getVersion(), type).map(convertor -> (T)convertor.convert(source.values(), data));
     }
 
     @Override
     @SuppressWarnings("unchecked")
-    public <FROM, TO, DATA extends ConvertorData> Optional<TO> convert(final Collection<FROM> source, final DATA data) {
-        Optional<TO> result = Optional.empty();
+    public <F, T, D extends ConvertorData> Optional<T> convert(final Collection<F> source, final D data) {
+        Optional<T> result = Optional.empty();
 
-        if (Objects.isNull(source)) {
+        if (source == null) {
             LOG.trace("Cannot extract type from null source");
             return result;
         }
 
-        final Optional<FROM> firstOptional = source.stream().findFirst();
+        final Optional<F> firstOptional = source.stream().findFirst();
 
         if (!firstOptional.isPresent()) {
             LOG.trace("Cannot extract type from empty collection");
             return result;
         }
 
-        final FROM first = firstOptional.get();
+        final F first = firstOptional.get();
 
-        final Class<?> type = first instanceof DataContainer ?
-                ((DataContainer)first).getImplementedInterface()
+        final Class<?> type = first instanceof DataContainer ? ((DataContainer) first).implementedInterface()
                 : first.getClass();
 
-        if (Objects.isNull(type)) {
-            LOG.warn("Cannot extract type from {}, because getImplementedInterface() returns null", source);
+        if (type == null) {
+            LOG.warn("Cannot extract type from {}, because implementedInterface() returns null", source);
             return result;
         }
 
-        return findConvertor(data.getVersion(), type)
-                .map(convertor -> (TO)convertor.convert(source, data));
+        return findConvertor(data.getVersion(), type).map(convertor -> (T)convertor.convert(source, data));
     }
 
     /**
@@ -142,18 +170,21 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
 
         Optional<Convertor> convertor = Optional.empty();
 
-        if (Objects.nonNull(convertorsForVersion)) {
+        if (convertorsForVersion != null) {
             convertor = Optional.ofNullable(convertorsForVersion.get(type));
 
             if (!convertor.isPresent()) {
-                for (final Class<?> convertorType : convertorsForVersion.keySet()) {
+                for (Entry<Class<?>, Convertor<?, ?, ? extends ConvertorData>> entry :
+                            convertorsForVersion.entrySet()) {
+                    final Class<?> convertorType = entry.getKey();
                     if (type.isAssignableFrom(convertorType)) {
-                        final Convertor<?, ?, ? extends ConvertorData> foundConvertor = convertorsForVersion.get(convertorType);
+                        final Convertor<?, ?, ? extends ConvertorData> foundConvertor = entry.getValue();
                         convertor = Optional.ofNullable(foundConvertor);
 
                         if (convertor.isPresent()) {
                             convertorsForVersion.put(type, foundConvertor);
-                            LOG.warn("{} for version {} is now converted by {} using last resort method", type, version, foundConvertor);
+                            LOG.warn("{} for version {} is now converted by {} using last resort method",
+                                    type, version, foundConvertor);
                             break;
                         }
                     }
@@ -169,4 +200,4 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
 
         return convertor;
     }
-}
\ No newline at end of file
+}