Remove redundant type specifiers
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / device / initialization / OF13DeviceInitializer.java
index abb1b70aa821fe3491a77e98cc1e850594eb1e69..514f2f43bdaae23df96cace9299cfa9a76a23974 100644 (file)
@@ -10,10 +10,10 @@ package org.opendaylight.openflowplugin.impl.device.initialization;
 
 import com.google.common.base.Function;
 import com.google.common.base.Preconditions;
-import com.google.common.util.concurrent.AsyncFunction;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
@@ -34,7 +34,6 @@ import org.opendaylight.openflowplugin.impl.util.DeviceInitializationUtil;
 import org.opendaylight.openflowplugin.impl.util.DeviceStateUtil;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFeatures;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.MultipartReply;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Capabilities;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
@@ -50,19 +49,21 @@ public class OF13DeviceInitializer extends AbstractDeviceInitializer {
     @Override
     protected Future<Void> initializeNodeInformation(@Nonnull final DeviceContext deviceContext,
                                                      final boolean switchFeaturesMandatory,
+                                                     final boolean skipTableFeatures,
                                                      @Nullable final MultipartWriterProvider multipartWriterProvider,
                                                      @Nullable final ConvertorExecutor convertorExecutor) {
-        final ConnectionContext connectionContext = Preconditions.checkNotNull(deviceContext.getPrimaryConnectionContext());
+        final ConnectionContext connectionContext =
+                Preconditions.checkNotNull(deviceContext.getPrimaryConnectionContext());
         final DeviceState deviceState = Preconditions.checkNotNull(deviceContext.getDeviceState());
         final DeviceInfo deviceInfo = Preconditions.checkNotNull(deviceContext.getDeviceInfo());
         final Capabilities capabilities = connectionContext.getFeatures().getCapabilities();
-        LOG.debug("Setting capabilities for device {}", deviceInfo.getLOGValue());
+        LOG.debug("Setting capabilities for device {}", deviceInfo);
         DeviceStateUtil.setDeviceStateBasedOnV13Capabilities(deviceState, capabilities);
 
         // First process description reply, write data to DS and write consequent data if successful
-        return  Futures.transform(
+        return Futures.transformAsync(
             requestMultipart(MultipartType.OFPMPDESC, deviceContext),
-            (AsyncFunction<RpcResult<List<OfHeader>>, Void>) input -> {
+            input -> {
                 translateAndWriteResult(
                     MultipartType.OFPMPDESC,
                     input.getResult(),
@@ -71,39 +72,47 @@ public class OF13DeviceInitializer extends AbstractDeviceInitializer {
                     convertorExecutor);
 
                 final List<ListenableFuture<RpcResult<List<OfHeader>>>> futures = new ArrayList<>();
-                futures.add(requestAndProcessMultipart(MultipartType.OFPMPMETERFEATURES, deviceContext, multipartWriterProvider, convertorExecutor));
-                futures.add(requestAndProcessMultipart(MultipartType.OFPMPGROUPFEATURES, deviceContext, multipartWriterProvider, convertorExecutor));
-                futures.add(requestAndProcessMultipart(MultipartType.OFPMPTABLEFEATURES, deviceContext, multipartWriterProvider, convertorExecutor));
-                futures.add(requestAndProcessMultipart(MultipartType.OFPMPPORTDESC, deviceContext, multipartWriterProvider, convertorExecutor));
+                futures.add(requestAndProcessMultipart(MultipartType.OFPMPMETERFEATURES, deviceContext,
+                        skipTableFeatures, multipartWriterProvider, convertorExecutor));
+                futures.add(requestAndProcessMultipart(MultipartType.OFPMPGROUPFEATURES, deviceContext,
+                        skipTableFeatures, multipartWriterProvider, convertorExecutor));
+                futures.add(requestAndProcessMultipart(MultipartType.OFPMPTABLEFEATURES, deviceContext,
+                        skipTableFeatures, multipartWriterProvider, convertorExecutor));
+                futures.add(requestAndProcessMultipart(MultipartType.OFPMPPORTDESC, deviceContext, skipTableFeatures,
+                        multipartWriterProvider, convertorExecutor));
 
                 return Futures.transform(
-                    (switchFeaturesMandatory ? Futures.allAsList(futures) : Futures.successfulAsList(futures)),
+                    switchFeaturesMandatory ? Futures.allAsList(futures) : Futures.successfulAsList(futures),
                     new Function<List<RpcResult<List<OfHeader>>>, Void>() {
                         @Nullable
                         @Override
                         public Void apply(@Nullable final List<RpcResult<List<OfHeader>>> input) {
-                            LOG.info("Static node {} successfully finished collecting", deviceContext.getDeviceInfo().getLOGValue());
+                            LOG.info("Static node {} successfully finished collecting",
+                                    deviceContext.getDeviceInfo());
                             return null;
                         }
-                    });
-            });
+                    }, MoreExecutors.directExecutor());
+            }, MoreExecutors.directExecutor());
 
     }
 
     /**
-     * Request multipart of specified type and then run some processing on it
+     * Request multipart of specified type and then run some processing on it.
+     *
      * @param type multipart type
      * @param deviceContext device context
+     * @param skipTableFeatures skip collecting of table features
      * @param multipartWriterProvider multipart writer provider
      * @param convertorExecutor convertor executor
      * @return list of multipart messages unified to parent interface
      */
     private static ListenableFuture<RpcResult<List<OfHeader>>> requestAndProcessMultipart(final MultipartType type,
-                                                                                          final DeviceContext deviceContext,
-                                                                                          final MultipartWriterProvider multipartWriterProvider,
-                                                                                          @Nullable final ConvertorExecutor convertorExecutor) {
+                                                                  final DeviceContext deviceContext,
+                                                                  final boolean skipTableFeatures,
+                                                                  final MultipartWriterProvider multipartWriterProvider,
+                                                                  @Nullable final ConvertorExecutor convertorExecutor) {
         final ListenableFuture<RpcResult<List<OfHeader>>> rpcResultListenableFuture =
-            MultipartType.OFPMPTABLEFEATURES.equals(type) && deviceContext.isSkipTableFeatures()
+            MultipartType.OFPMPTABLEFEATURES.equals(type) && skipTableFeatures
                 ? RpcResultBuilder.<List<OfHeader>>success().buildFuture()
                 : requestMultipart(type, deviceContext);
 
@@ -113,7 +122,8 @@ public class OF13DeviceInitializer extends AbstractDeviceInitializer {
 
     /**
      * Inject callback ti future for specified multipart type. This callback will translate and write
-     * result of multipart messages
+     * result of multipart messages.
+     *
      * @param type multipart type
      * @param future multipart collection future
      * @param deviceContext device context
@@ -127,9 +137,9 @@ public class OF13DeviceInitializer extends AbstractDeviceInitializer {
                                        @Nullable final ConvertorExecutor convertorExecutor) {
         Futures.addCallback(future, new FutureCallback<RpcResult<List<OfHeader>>>() {
             @Override
-            public void onSuccess(final RpcResult<List<OfHeader>> result) {
+            public void onSuccess(@Nonnull final RpcResult<List<OfHeader>> result) {
                 if (Objects.nonNull(result.getResult())) {
-                    LOG.info("Static node {} info: {} collected", deviceContext.getDeviceInfo().getLOGValue(), type);
+                    LOG.info("Static node {} info: {} collected", deviceContext.getDeviceInfo(), type);
                     translateAndWriteResult(
                         type,
                         result.getResult(),
@@ -156,20 +166,23 @@ public class OF13DeviceInitializer extends AbstractDeviceInitializer {
             }
 
             @Override
-            public void onFailure(@Nonnull final Throwable t) {
-                LOG.warn("Request of type {} for static info of node {} failed.", type, deviceContext.getDeviceInfo().getLOGValue());
+            public void onFailure(@Nonnull final Throwable throwable) {
+                LOG.warn("Request of type {} for static info of node {} failed.",
+                        type, deviceContext.getDeviceInfo());
             }
-        });
+        }, MoreExecutors.directExecutor());
     }
 
     /**
-     * Translate and write multipart messages from OpenflowJava
+     * Translate and write multipart messages from OpenflowJava.
+     *
      * @param type multipart type
      * @param result multipart messages
      * @param deviceContext device context
      * @param multipartWriterProvider multipart writer provider
      * @param convertorExecutor convertor executor
      */
+    @SuppressWarnings("checkstyle:IllegalCatch")
     private static void translateAndWriteResult(final MultipartType type,
                                                 final List<OfHeader> result,
                                                 final DeviceContext deviceContext,
@@ -188,8 +201,8 @@ public class OF13DeviceInitializer extends AbstractDeviceInitializer {
                         .ifPresent(translatedReply -> {
                             // If we collected meter features, check if we have support for meters
                             // and pass this information to device context
-                            if (MultipartType.OFPMPMETERFEATURES.equals(type) &&
-                                translatedReply instanceof MeterFeatures) {
+                            if (MultipartType.OFPMPMETERFEATURES.equals(type)
+                                    && translatedReply instanceof MeterFeatures) {
                                 final MeterFeatures meterFeatures = (MeterFeatures) translatedReply;
 
                                 if (meterFeatures.getMaxMeter().getValue() > 0) {
@@ -204,16 +217,17 @@ public class OF13DeviceInitializer extends AbstractDeviceInitializer {
                         });
                 });
             } catch (final Exception e) {
-                LOG.warn("Failed to write node {} to DS ", deviceContext.getDeviceInfo().getLOGValue(), e);
+                LOG.warn("Failed to write node {} to DS ", deviceContext.getDeviceInfo(), e);
             }
         } else {
             LOG.warn("Failed to write node {} to DS because we failed to gather device info.",
-                deviceContext.getDeviceInfo().getLOGValue());
+                deviceContext.getDeviceInfo());
         }
     }
 
     /**
-     * Send request to device and unify different possible reply types from OpenflowJava to common parent interface
+     * Send request to device and unify different possible reply types from OpenflowJava to common parent interface.
+     *
      * @param multipartType multipart type
      * @param deviceContext device context
      * @return unified replies
@@ -222,55 +236,39 @@ public class OF13DeviceInitializer extends AbstractDeviceInitializer {
                                                                                 final DeviceContext deviceContext) {
         if (deviceContext.canUseSingleLayerSerialization()) {
             final SingleLayerMultipartCollectorService service =
-                new SingleLayerMultipartCollectorService(deviceContext, deviceContext);
+                    new SingleLayerMultipartCollectorService(deviceContext, deviceContext);
 
-            return Futures.transform(service.handleServiceCall(multipartType), new Function<RpcResult<List<MultipartReply>>, RpcResult<List<OfHeader>>>() {
-                @Nullable
-                @Override
-                public RpcResult<List<OfHeader>> apply(final RpcResult<List<MultipartReply>> input) {
+            return Futures.transform(service.handleServiceCall(multipartType),
+                input -> {
                     if (Objects.isNull(input.getResult()) && input.isSuccessful()) {
-                        final List<OfHeader> temp = null;
-                        return RpcResultBuilder.success(temp).build();
+                        return RpcResultBuilder.<List<OfHeader>>success(null).build();
                     }
 
                     return input.isSuccessful()
-                        ? RpcResultBuilder.success(input
-                        .getResult()
-                        .stream()
-                        .map(reply -> (OfHeader) reply)
-                        .collect(Collectors.toList()))
-                        .build()
-                        : RpcResultBuilder.<List<OfHeader>>failed()
-                        .withRpcErrors(input.getErrors())
-                        .build();
-                }
-            });
+                            ? RpcResultBuilder.success(input
+                                    .getResult()
+                                    .stream()
+                                    .map(OfHeader.class::cast)
+                                    .collect(Collectors.toList()))
+                                    .build()
+                            : RpcResultBuilder.<List<OfHeader>>failed()
+                                    .withRpcErrors(input.getErrors())
+                                    .build();
+                }, MoreExecutors.directExecutor());
         }
 
         final MultiLayerMultipartCollectorService service =
             new MultiLayerMultipartCollectorService(deviceContext, deviceContext);
 
-        return Futures.transform(service.handleServiceCall(multipartType), new Function<RpcResult<List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply>>, RpcResult<List<OfHeader>>>() {
-            @Nullable
-            @Override
-            public RpcResult<List<OfHeader>> apply(final RpcResult<List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReply>> input) {
-                if (Objects.isNull(input.getResult()) && input.isSuccessful()) {
-                    final List<OfHeader> temp = null;
-                    return RpcResultBuilder.success(temp).build();
-                }
-
-                return input.isSuccessful()
-                    ? RpcResultBuilder.success(input
-                    .getResult()
-                    .stream()
-                    .map(reply -> (OfHeader) reply)
-                    .collect(Collectors.toList()))
-                    .build()
-                    : RpcResultBuilder.<List<OfHeader>>failed()
-                    .withRpcErrors(input.getErrors())
-                    .build();
+        return Futures.transform(service.handleServiceCall(multipartType), input -> {
+            if (Objects.isNull(input.getResult()) && input.isSuccessful()) {
+                return RpcResultBuilder.<List<OfHeader>>success(null).build();
             }
-        });
+
+            return input.isSuccessful() ? RpcResultBuilder
+                    .success(input.getResult().stream().map(OfHeader.class::cast).collect(Collectors.toList())).build()
+                    : RpcResultBuilder.<List<OfHeader>>failed().withRpcErrors(input.getErrors()).build();
+        }, MoreExecutors.directExecutor());
     }
 
 }