Fix findbugs violations in openflowplugin 91/68391/2
authorTom Pantelis <tompantelis@gmail.com>
Mon, 19 Feb 2018 01:56:48 +0000 (20:56 -0500)
committerTom Pantelis <tompantelis@gmail.com>
Wed, 28 Feb 2018 18:45:18 +0000 (13:45 -0500)
- Comparison of String parameter using == or !=
- Comparator doesn't implement Serializable
- Field is a mutable collection
- Incorrect lazy initialization of static field
- Inefficient use of keySet iterator instead of entrySet iterator
- Private method is never called
- Unsigned right shift cast to short/byte
- Class is final but declares protected field
- Consider returning a zero length array rather than null

Change-Id: I714bd4005a33a772b0b76b0c0f89f28b8517cd06
Signed-off-by: Tom Pantelis <tompantelis@gmail.com>
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/protocol/serialization/match/AbstractMatchEntrySerializer.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManager.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/common/IpConversionUtil.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/common/OrderComparator.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/flow/FlowConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorUtil.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/session/ExtensionSessionManagerImpl.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/ActionUtil.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/ByteUtil.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/InventoryDataServiceUtil.java

index a62ab0ae7de2646d4c96b93701ada04796965df8..2364645ccc21b74191c2670209cd4d5d18a87a11 100644 (file)
@@ -56,7 +56,11 @@ public abstract class AbstractMatchEntrySerializer implements HeaderSerializer<M
      * @param length mask length
      */
     protected static void writeMask(byte[] mask, ByteBuf outBuffer, int length) {
-        if (mask != null && mask.length != length) {
+        if (mask == null) {
+            return;
+        }
+
+        if (mask.length != length) {
             throw new IllegalArgumentException("incorrect length of mask: "
                     + mask.length + ", expected: " + length);
         }
index 8a3c66e4a63634863519211d31a79ec2283093c0..4d69388fc0e49e6fd1a76c68b22865b712517cc9 100644 (file)
@@ -13,6 +13,7 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
@@ -146,10 +147,11 @@ public class ConvertorManager implements ConvertorExecutor, ConvertorRegistrator
             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()) {
index 88ccb1ab0afb6fcd8f311a5ac1e97d048a3e56c0..dafb038c69311feba8252435abcfb15c0a9eb862 100644 (file)
@@ -15,6 +15,7 @@ import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
 import com.google.common.net.InetAddresses;
 import com.google.common.primitives.UnsignedBytes;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.math.BigInteger;
 import java.net.Inet4Address;
 import java.net.InetAddress;
@@ -24,6 +25,7 @@ import java.util.Arrays;
 import java.util.BitSet;
 import java.util.Iterator;
 import java.util.List;
+import javax.annotation.Nullable;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
@@ -654,6 +656,7 @@ public final class IpConversionUtil {
         return netMask;
     }
 
+    @Nullable
     public static Ipv6ArbitraryMask extractIpv6AddressMask(final Ipv6Prefix ipv6Prefix) {
         Iterator<String> addressParts = PREFIX_SPLITTER.split(ipv6Prefix.getValue()).iterator();
         addressParts.next();
@@ -671,6 +674,7 @@ public final class IpConversionUtil {
             inetAddress = InetAddress.getByAddress(finalmask);
         } catch (UnknownHostException e) {
             LOG.error("Failed to convert the Ipv6 subnetmask from integer to mask value ", e);
+            return null;
         }
         return new Ipv6ArbitraryMask(inetAddress.getHostAddress());
     }
@@ -687,6 +691,8 @@ public final class IpConversionUtil {
         return netmask;
     }
 
+    @Nullable
+    @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS")
     public static byte[] convertArbitraryMaskToByteArray(DottedQuad mask) {
         String maskValue;
         if (mask != null && mask.getValue() != null) {
@@ -699,6 +705,7 @@ public final class IpConversionUtil {
             maskInIpFormat = InetAddress.getByName(maskValue);
         } catch (UnknownHostException e) {
             LOG.error("Failed to resolve the ip address of the mask ", e);
+            return null;
         }
         byte[] bytes = maskInIpFormat.getAddress();
         return bytes;
@@ -735,6 +742,8 @@ public final class IpConversionUtil {
         return false;
     }
 
+    @Nullable
+    @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS")
     public static byte[] convertIpv6ArbitraryMaskToByteArray(final Ipv6ArbitraryMask mask) {
         String maskValue;
         if (mask != null && mask.getValue() != null) {
@@ -747,6 +756,7 @@ public final class IpConversionUtil {
             maskInIpFormat = InetAddress.getByName(maskValue);
         } catch (UnknownHostException e) {
             LOG.error("Failed to convert mask string to ipv6 format mask ",e);
+            return null;
         }
         return maskInIpFormat.getAddress();
     }
index 92d42ab2b5256883e498bc0e4ab911621c6590b2..a3d2bf5bd1e9cecf30cf6458bd2cd30a86c22227 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common;
 
+import java.io.Serializable;
 import java.util.Comparator;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.Ordered;
 
@@ -16,7 +17,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.Orde
  *
  * @param <T> T
  */
-public class OrderComparator<T extends Ordered> implements Comparator<T> {
+public class OrderComparator<T extends Ordered> implements Comparator<T>, Serializable {
+    private static final long serialVersionUID = 1L;
 
     @SuppressWarnings("rawtypes")
     private static final OrderComparator INSTANCE = new OrderComparator();
index ad37b2fb625516529af55dc046e34fb30ce398f2..a55570cca1de804d347a4c1ddb7b70854d475d6e 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.flow;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Ordering;
 import java.math.BigInteger;
 import java.util.ArrayList;
@@ -133,7 +134,7 @@ public class FlowConvertor extends Convertor<Flow, List<FlowModInputBuilder>, Ve
     /**
      * default match entries - empty.
      */
-    public static final List<MatchEntry> DEFAULT_MATCH_ENTRIES = new ArrayList<>();
+    public static final List<MatchEntry> DEFAULT_MATCH_ENTRIES = ImmutableList.of();
 
     // Default values for when things are null
     private static final TableId DEFAULT_TABLE_ID = new TableId(0L);
index 78d3fa3b0214250bf901eecb1a1c7b8cb4b62e23..b705326fc64372330636cff3b72b44d9cb5b2bcc 100644 (file)
@@ -8,7 +8,9 @@
 
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.Iterator;
+import javax.annotation.Nullable;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpDscp;
@@ -68,6 +70,8 @@ public final class MatchConvertorUtil {
      * @param addressParts the address parts
      * @return the byte [ ]
      */
+    @Nullable
+    @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS")
     public static byte[] extractIpv4Mask(final Iterator<String> addressParts) {
         final int prefix;
         if (addressParts.hasNext()) {
index b36bec666aca1c09df08fcb029045908a27caec2..cce3d46a4301b745327f257c5641a9c3c4f4933f 100644 (file)
@@ -14,19 +14,16 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public final class ExtensionSessionManagerImpl implements ExtensionSessionManager {
+    private static final Logger LOG = LoggerFactory.getLogger(ExtensionSessionManagerImpl.class);
+
+    private static ExtensionSessionManagerImpl INSTANCE = new ExtensionSessionManagerImpl();
 
-    protected static final Logger LOG = LoggerFactory.getLogger(ExtensionSessionManagerImpl.class);
-    private static ExtensionSessionManagerImpl INSTANCE;
     private ExtensionConverterProvider extensionConverterProvider;
 
     /**
      * Returns singleton instance.
      */
     public static ExtensionSessionManager getInstance() {
-        if (INSTANCE == null) {
-            INSTANCE = new ExtensionSessionManagerImpl();
-        }
-
         return INSTANCE;
     }
 
index 76e0b3ab432507e561df5b88ed15c8dea0c9f14b..bdf94a2da32fd79395c859a69d02002f2a479764 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.openflowplugin.openflow.md.util;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * OF-action related utilities.
@@ -27,6 +28,7 @@ public final class ActionUtil {
      * @param tosValue TypeOfService value
      * @return DSCP value
      */
+    @SuppressFBWarnings("ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT")
     public static Short tosToDscp(short tosValue) {
         return (short) (tosValue >>> ActionUtil.ENC_FIELD_BIT_SIZE);
     }
index 2b97dcdac968f4d468810b0e990a800f445e0e79..54d906f3d15594509e3a8774fc62281ec4463b5a 100644 (file)
@@ -9,8 +9,10 @@ package org.opendaylight.openflowplugin.openflow.md.util;
 
 import com.google.common.base.Preconditions;
 import com.google.common.io.BaseEncoding;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.math.BigInteger;
 import java.util.Arrays;
+import javax.annotation.Nullable;
 
 public final class ByteUtil {
     private ByteUtil() {
@@ -34,7 +36,7 @@ public final class ByteUtil {
      */
     public static String bytesToHexstring(final byte[] bytes, final String delimiter) {
         BaseEncoding be = HEX_16_ENCODING;
-        if (delimiter != DEFAULT_HEX_SEPARATOR) {
+        if (!DEFAULT_HEX_SEPARATOR.equals(delimiter)) {
             be = PLAIN_HEX_16_ENCODING.withSeparator(delimiter, 2);
         }
         return be.encode(bytes);
@@ -47,7 +49,9 @@ public final class ByteUtil {
      * @param numBytes convert to number of bytes
      * @return byte array containing n * 8 bits.
      */
-    public static byte[] convertBigIntegerToNBytes(final BigInteger bigInteger, final int numBytes) {
+    @Nullable
+    @SuppressFBWarnings("PZLA_PREFER_ZERO_LENGTH_ARRAYS")
+    public static byte[] convertBigIntegerToNBytes(@Nullable final BigInteger bigInteger, final int numBytes) {
         if (bigInteger == null) {
             return null;
         }
index e14c0e590aa840c322e86360861d4740c3a4f97d..18a17a09a8852b0f305630f57208e690a8414c06 100644 (file)
@@ -7,16 +7,12 @@
  */
 package org.opendaylight.openflowplugin.openflow.md.util;
 
-import com.google.common.base.Optional;
 import com.google.common.base.Splitter;
 import java.math.BigInteger;
 import java.util.List;
-import java.util.concurrent.ExecutionException;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import org.apache.commons.lang3.StringUtils;
-import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.openflowplugin.api.OFConstants;
 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
@@ -31,7 +27,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.No
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
-import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.slf4j.Logger;
@@ -164,20 +159,4 @@ public abstract class InventoryDataServiceUtil {
     public static String bigIntegerToPaddedHex(final BigInteger dataPathId) {
         return StringUtils.leftPad(dataPathId.toString(16), 16, "0");
     }
-
-    // TODO : create new module openflowplugin-util, move there this method along with
-    // TestProviderTransactionUtil#getDataObject
-    private static <T extends DataObject> T getDataObject(final ReadTransaction readOnlyTransaction,
-            final InstanceIdentifier<T> identifier) {
-        Optional<T> optionalData = null;
-        try {
-            optionalData = readOnlyTransaction.read(LogicalDatastoreType.OPERATIONAL, identifier).get();
-            if (optionalData.isPresent()) {
-                return optionalData.get();
-            }
-        } catch (ExecutionException | InterruptedException e) {
-            LOG.error("Read transaction for identifier {} failed.", identifier, e);
-        }
-        return null;
-    }
 }