Remove useless UnsupportedOperationExceptions
[bgpcep.git] / bgp / concepts / src / main / java / org / opendaylight / bgp / concepts / NextHopUtil.java
index 78b3da4f8bb5b6a9cc9e3366eb825c8414c392f8..f4e761c0f0cbd60442b75f72fb786465894c850b 100644 (file)
@@ -7,45 +7,48 @@
  */
 package org.opendaylight.bgp.concepts;
 
+import com.google.common.base.Preconditions;
 import io.netty.buffer.ByteBuf;
 import org.opendaylight.protocol.util.Ipv4Util;
 import org.opendaylight.protocol.util.Ipv6Util;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.CNextHop;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCase;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.Ipv6NextHopCaseBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHop;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev130919.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.CNextHop;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.EmptyNextHopCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv4NextHopCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv4NextHopCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv6NextHopCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.Ipv6NextHopCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.ipv4.next.hop._case.Ipv4NextHopBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHop;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.types.rev180329.next.hop.c.next.hop.ipv6.next.hop._case.Ipv6NextHopBuilder;
 
 /**
  * Utility class for of CNextHop serialization and parsing.
  */
 public final class NextHopUtil {
-
     private NextHopUtil() {
-        throw new UnsupportedOperationException();
+        // Hidden on purpose
     }
 
     /**
      * Writes serialized cnextHop IP address as byte value into ByteBuf.
      *
-     * @param cnextHop next hop to be serialized
+     * @param cnextHop       next hop to be serialized
      * @param byteAggregator where the next hop will be written
      */
     public static void serializeNextHop(final CNextHop cnextHop, final ByteBuf byteAggregator) {
         if (cnextHop instanceof Ipv4NextHopCase) {
-            byteAggregator.writeBytes(Ipv4Util.bytesForAddress(((Ipv4NextHopCase) cnextHop).getIpv4NextHop().getGlobal()));
+            byteAggregator.writeBytes(Ipv4Util.bytesForAddress(((Ipv4NextHopCase) cnextHop)
+                    .getIpv4NextHop().getGlobal()));
         } else if (cnextHop instanceof Ipv6NextHopCase) {
             final Ipv6NextHop nextHop = ((Ipv6NextHopCase) cnextHop).getIpv6NextHop();
-            if (nextHop.getGlobal() == null) {
-                throw new IllegalArgumentException("Ipv6 Next Hop is missing Global address.");
-            }
+            Preconditions.checkArgument(nextHop.getGlobal() != null,
+                    "Ipv6 Next Hop is missing Global address.");
             byteAggregator.writeBytes(Ipv6Util.bytesForAddress(nextHop.getGlobal()));
             if (nextHop.getLinkLocal() != null) {
                 byteAggregator.writeBytes(Ipv6Util.bytesForAddress(nextHop.getLinkLocal()));
             }
+        } else if (!(cnextHop instanceof EmptyNextHopCase)) {
+            throw new IllegalArgumentException("Cannot serialize NEXT_HOP. Class not supported: " + cnextHop);
         }
     }
 
@@ -57,15 +60,49 @@ public final class NextHopUtil {
      */
     public static CNextHop parseNextHop(final ByteBuf buffer) {
         switch (buffer.writerIndex()) {
-        case Ipv4Util.IP4_LENGTH:
-            return new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder().setGlobal(Ipv4Util.addressForByteBuf(buffer)).build()).build();
-        case Ipv6Util.IPV6_LENGTH:
-            return new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder().setGlobal(Ipv6Util.addressForByteBuf(buffer)).build()).build();
-        case Ipv6Util.IPV6_LENGTH * 2:
-            return new Ipv6NextHopCaseBuilder().setIpv6NextHop(
-                    new Ipv6NextHopBuilder().setGlobal(Ipv6Util.addressForByteBuf(buffer)).setLinkLocal(Ipv6Util.addressForByteBuf(buffer)).build()).build();
-        default:
-            throw new IllegalArgumentException("Cannot parse NEXT_HOP attribute. Wrong bytes length: " + buffer.writerIndex());
+            case Ipv4Util.IP4_LENGTH:
+                return parseNextHopIpv4(buffer);
+            case Ipv6Util.IPV6_LENGTH:
+                return parseNextHopIpv6(buffer);
+            case Ipv6Util.IPV6_LENGTH * 2:
+                return parseNextHopFullIpv6(buffer);
+            default:
+                throw new IllegalArgumentException("Cannot parse NEXT_HOP attribute. Wrong bytes length: "
+                        + buffer.writerIndex());
         }
     }
+
+    /**
+     * Parses CNextHop IPv4 address from given ByteBuf, which has already been checked for size.
+     *
+     * @param buffer contains byte array representation of CNextHop
+     * @return CNexthop object
+     */
+    public static CNextHop parseNextHopIpv4(final ByteBuf buffer) {
+        return new Ipv4NextHopCaseBuilder().setIpv4NextHop(new Ipv4NextHopBuilder()
+            .setGlobal(Ipv4Util.addressForByteBuf(buffer)).build()).build();
+    }
+
+    /**
+     * Parses CNextHop IPv6 global address from given ByteBuf, which has already been checked for size.
+     *
+     * @param buffer contains byte array representation of CNextHop
+     * @return CNexthop object
+     */
+    public static CNextHop parseNextHopIpv6(final ByteBuf buffer) {
+        return new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder()
+            .setGlobal(Ipv6Util.addressForByteBuf(buffer)).build()).build();
+    }
+
+    /**
+     * Parses CNextHop IPv6 global+local address from given ByteBuf, which has already been checked for size.
+     *
+     * @param buffer contains byte array representation of CNextHop
+     * @return CNexthop object
+     */
+    public static CNextHop parseNextHopFullIpv6(final ByteBuf buffer) {
+        return new Ipv6NextHopCaseBuilder().setIpv6NextHop(new Ipv6NextHopBuilder()
+            .setGlobal(Ipv6Util.addressForByteBuf(buffer))
+            .setLinkLocal(Ipv6Util.addressForByteBuf(buffer)).build()).build();
+    }
 }