OPNFLWPLUG-1071 : Removal of javax.annotation.Nonnnull and replacement of javax.annot...
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / util / OpenflowPortsUtil.java
index e5ca4f77c581c95f2971b672ae33e89f542a08fd..b72534b374eeeec54ab6a2a12770638c9bdde8f6 100644 (file)
@@ -5,12 +5,12 @@
  * 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.util;
 
 import com.google.common.collect.ImmutableBiMap;
+import com.google.common.collect.Maps;
 import java.util.Objects;
-import javax.annotation.Nullable;
+import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.openflowjava.protocol.api.util.BinContent;
 import org.opendaylight.openflowplugin.api.OFConstants;
 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
@@ -19,6 +19,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.P
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValues;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValuesV10;
+import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -32,9 +33,13 @@ public final class OpenflowPortsUtil {
     }
 
     private static final Logger LOG = LoggerFactory.getLogger(OpenflowPortsUtil.class);
-    private static final ImmutableBiMap<Short, ImmutableBiMap<String, Long>> VERSION_PORT_MAP;
+
+    // TODO: deprecate this
     private static final ImmutableBiMap<Short, ImmutableBiMap<Long, String>> VERSION_INVERSE_PORT_MAP;
 
+    private static final ImmutableBiMap<Short, ImmutableBiMap<String, Uint32>> VERSION_PORT_MAP_UINT;
+    private static final ImmutableBiMap<Short, ImmutableBiMap<Uint32, String>> VERSION_INVERSE_PORT_MAP_UINT;
+
     private static boolean inportWarnignAlreadyFired = false;
 
     static {
@@ -77,50 +82,73 @@ public final class OpenflowPortsUtil {
                         BinContent.intToUnsignedLong(PortNumberValues.ANY.getIntValue())) // 0xffffffff
                 .build();
 
-        VERSION_PORT_MAP = new ImmutableBiMap.Builder<Short, ImmutableBiMap<String, Long>>()
-                .put(OFConstants.OFP_VERSION_1_0, ofv10ports)
-                .put(OFConstants.OFP_VERSION_1_3, ofv13ports)
-                .build();
-
         VERSION_INVERSE_PORT_MAP = new ImmutableBiMap.Builder<Short, ImmutableBiMap<Long, String>>()
                 .put(OFConstants.OFP_VERSION_1_0, ofv10ports.inverse())
                 .put(OFConstants.OFP_VERSION_1_3, ofv13ports.inverse())
                 .build();
+
+        final ImmutableBiMap<String, Uint32> ofv10portsUint = ImmutableBiMap.copyOf(Maps.transformValues(ofv10ports,
+            l -> Uint32.valueOf(l).intern()));
+        final ImmutableBiMap<String, Uint32> ofv13portsUint = ImmutableBiMap.copyOf(Maps.transformValues(ofv13ports,
+            l -> Uint32.valueOf(l).intern()));
+
+        VERSION_PORT_MAP_UINT = new ImmutableBiMap.Builder<Short, ImmutableBiMap<String, Uint32>>()
+                .put(OFConstants.OFP_VERSION_1_0, ofv10portsUint)
+                .put(OFConstants.OFP_VERSION_1_3, ofv13portsUint)
+                .build();
+
+        VERSION_INVERSE_PORT_MAP_UINT = new ImmutableBiMap.Builder<Short, ImmutableBiMap<Uint32, String>>()
+                .put(OFConstants.OFP_VERSION_1_0, ofv10portsUint.inverse())
+                .put(OFConstants.OFP_VERSION_1_3, ofv13portsUint.inverse())
+                .build();
     }
 
+    // TODO: deprecate and migrate
     public static String getPortLogicalName(final short ofVersion, final Long portNumber) {
         return VERSION_INVERSE_PORT_MAP.get(ofVersion).get(portNumber);
     }
 
+    public static String getPortLogicalName(final short ofVersion, final Uint32 portNumber) {
+        return VERSION_INVERSE_PORT_MAP_UINT.get(ofVersion).get(portNumber);
+    }
+
+    // TODO: deprecate and migrate
     public static String getPortLogicalName(final OpenflowVersion ofVersion, final Long portNumber) {
         return ofVersion.equals(OpenflowVersion.UNSUPPORTED)
                 ? null
                 : getPortLogicalName(ofVersion.getVersion(), portNumber);
     }
 
+    public static String getPortLogicalName(final OpenflowVersion ofVersion, final Uint32 portNumber) {
+        return ofVersion.equals(OpenflowVersion.UNSUPPORTED)
+                ? null
+                : getPortLogicalName(ofVersion.getVersion(), portNumber);
+    }
+
     @Nullable
-    static Long getPortFromLogicalName(final OpenflowVersion ofVersion, final String logicalNameOrPort) {
+    static Uint32 getPortFromLogicalName(final OpenflowVersion ofVersion, final String logicalNameOrPort) {
 
         //The correct keyword defined in openflow specification in IN_PORT so we need to allow to use it
         //for legacy reasons we can't just simply drop the misspelled INPORT
         //TODO: Consider to remove 'INPORT' keyword
-        Long port;
+        Uint32 port;
         if (Objects.equals(logicalNameOrPort, "INPORT")) {
             if (!inportWarnignAlreadyFired) {
                 LOG.warn("Using '{}' in port field is not recommended use 'IN_PORT' instead", logicalNameOrPort);
                 inportWarnignAlreadyFired = true;
             }
-            port = VERSION_PORT_MAP.get(ofVersion.getVersion()).get(OutputPortValues.INPORT.getName());
+            port = VERSION_PORT_MAP_UINT.get(ofVersion.getVersion()).get(OutputPortValues.INPORT.getName());
         } else {
-            port = VERSION_PORT_MAP.get(ofVersion.getVersion()).get(logicalNameOrPort);
+            port = VERSION_PORT_MAP_UINT.get(ofVersion.getVersion()).get(logicalNameOrPort);
         }
         if (port == null) {
             try {
-                port = Long.decode(logicalNameOrPort);
-            } catch (final NumberFormatException ne) {
+                port = Uint32.valueOf(Long.decode(logicalNameOrPort));
+            } catch (final IllegalArgumentException ne) {
                 //ignore, sent null back.
-                if (logicalNameOrPort.contains(":")) {
-                    port = Long.parseLong(logicalNameOrPort.substring(logicalNameOrPort.lastIndexOf(":") + 1));
+                final int lastColon = logicalNameOrPort.lastIndexOf(':');
+                if (lastColon != -1) {
+                    port = Uint32.valueOf(logicalNameOrPort.substring(lastColon + 1));
                 }
             }
         }
@@ -130,25 +158,35 @@ public final class OpenflowPortsUtil {
     public static PortNumberUni getProtocolAgnosticPort(final OpenflowVersion ofVersion, final Long portNumber) {
         final String reservedPortLogicalName = getPortLogicalName(ofVersion, portNumber);
 
+        return reservedPortLogicalName == null
+                ? new PortNumberUni(portNumber == null ? (Uint32) null : Uint32.valueOf(portNumber))
+                : new PortNumberUni(reservedPortLogicalName);
+    }
+
+    // TODO: deprecate and migrate
+    public static PortNumberUni getProtocolAgnosticPort(final OpenflowVersion ofVersion, final Uint32 portNumber) {
+        final String reservedPortLogicalName = getPortLogicalName(ofVersion, portNumber);
+
         return reservedPortLogicalName == null
                 ? new PortNumberUni(portNumber)
                 : new PortNumberUni(reservedPortLogicalName);
     }
 
-    public static Long getProtocolPortNumber(final OpenflowVersion ofVersion, final PortNumberUni port) {
+
+    public static Uint32 getProtocolPortNumber(final OpenflowVersion ofVersion, final PortNumberUni port) {
         final String portLogicalName = port.getString();
 
         return portLogicalName != null
-                ? VERSION_PORT_MAP.get(ofVersion.getVersion()).get(portLogicalName)
+                ? VERSION_PORT_MAP_UINT.get(ofVersion.getVersion()).get(portLogicalName)
                 : port.getUint32();
     }
 
-    public static Long getMaxPortForVersion(final OpenflowVersion ofVersion) {
+    public static Uint32 getMaxPortForVersion(final OpenflowVersion ofVersion) {
         return getPortFromLogicalName(ofVersion, OutputPortValues.MAX.getName());
     }
 
-    public static boolean isPortReserved(final OpenflowVersion ofVersion, final Long portNumber) {
-        return VERSION_INVERSE_PORT_MAP.get(ofVersion.getVersion()).containsKey(portNumber);
+    public static boolean isPortReserved(final OpenflowVersion ofVersion, final Uint32 portNumber) {
+        return VERSION_INVERSE_PORT_MAP_UINT.get(ofVersion.getVersion()).containsKey(portNumber);
     }
 
     /**
@@ -158,13 +196,11 @@ public final class OpenflowPortsUtil {
      * @param portNumber port number
      * @return true if port number is valid for given protocol version
      */
-    public static boolean checkPortValidity(final OpenflowVersion ofVersion, final Long portNumber) {
+    public static boolean checkPortValidity(final OpenflowVersion ofVersion, final Uint32 portNumber) {
         boolean portIsValid = true;
         if (portNumber == null) {
             portIsValid = false;
-        } else if (portNumber < 0) {
-            portIsValid = false;
-        } else if (portNumber > getMaxPortForVersion(ofVersion)) {
+        } else if (portNumber.compareTo(getMaxPortForVersion(ofVersion)) > 0) {
             if (!isPortReserved(ofVersion, portNumber)) {
                 portIsValid = false;
             }
@@ -195,7 +231,19 @@ public final class OpenflowPortsUtil {
      * @param portNumber port number
      * @return port number uri
      */
+    // TODO: deprecate and migrate
     public static Uri getProtocolAgnosticPortUri(final short version, final long portNumber) {
         return new Uri(portNumberToString(getProtocolAgnosticPort(OpenflowVersion.get(version), portNumber)));
     }
+
+    /**
+     * Converts port number to Uri.
+     *
+     * @param version openflow version
+     * @param portNumber port number
+     * @return port number uri
+     */
+    public static Uri getProtocolAgnosticPortUri(final short version, final Uint32 portNumber) {
+        return new Uri(portNumberToString(getProtocolAgnosticPort(OpenflowVersion.get(version), portNumber)));
+    }
 }