Optimize Ip{Address,Prefix}Builder 49/74349/3
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 23 Jul 2018 16:39:15 +0000 (18:39 +0200)
committerRobert Varga <nite@hq.sk>
Tue, 24 Jul 2018 00:21:02 +0000 (00:21 +0000)
These builders are heavily used and are overly defensive, to the point
where they do not follow YANG specification -- which clearly states that
members need to be tried in the order of declaration.

This means there is no ambiguity between ipv4 and ipv6 and if IPv4
succeeds, that's what we'll use. This allows us to reduce number
of regex matches performed, which retaining correctness.

Also remove ugly duplication of patterns are pick them up from the pattern
constants in the class.

Change-Id: Ia35d040881e721375b240dd5848ad9501ae2e192
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
model/ietf/ietf-inet-types-2013-07-15/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpAddressBuilder.java
model/ietf/ietf-inet-types-2013-07-15/src/main/java/org/opendaylight/yang/gen/v1/urn/ietf/params/xml/ns/yang/ietf/inet/types/rev130715/IpPrefixBuilder.java

index de52c0be9077c1d5c938a9324aa37113e7d5fe93..c1e4cafc3b2a45aeea5e98d3a95a036b3ea72733 100644 (file)
@@ -5,43 +5,29 @@
  * 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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
 
-import java.util.regex.Matcher;
+import static com.google.common.base.Verify.verify;
+
 import java.util.regex.Pattern;
 
 /**
- *
+ * Builder for {@link IpAddress} instances.
  */
 public class IpAddressBuilder {
-    private static final Pattern IPV4_PATTERN =
-        Pattern.compile("(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\\p{N}\\p{L}]+)?");
-    private static final Pattern IPV6_PATTERN1 =
-        Pattern.compile("((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(%[\\p{N}\\p{L}]+)?");
-    private static final Pattern IPV6_PATTERN2 =
-        Pattern.compile("(([^:]+:){6}(([^:]+:[^:]+)|(.*\\..*)))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)(%.+)?");
-
-    private IpAddressBuilder() {
+    private static final Pattern IPV4_PATTERN;
 
+    static {
+        verify(Ipv4Address.PATTERN_CONSTANTS.size() == 1);
+        IPV4_PATTERN = Pattern.compile(Ipv4Address.PATTERN_CONSTANTS.get(0));
     }
 
-    public static IpAddress getDefaultInstance(java.lang.String defaultValue) {
-        final Matcher ipv4Matcher = IPV4_PATTERN.matcher(defaultValue);
-
-        if (ipv4Matcher.matches()) {
-            if (IPV6_PATTERN1.matcher(defaultValue).matches() && IPV6_PATTERN2.matcher(defaultValue).matches()) {
-                throw new IllegalArgumentException(
-                    String.format("Cannot create IpAddress from \"%s\", matches both %s and %s",
-                        defaultValue, Ipv4Address.class.getSimpleName(), Ipv6Address.class.getSimpleName()));
+    private IpAddressBuilder() {
 
-            }
-            return new IpAddress(new Ipv4Address(defaultValue));
-        } else if (IPV6_PATTERN1.matcher(defaultValue).matches() && IPV6_PATTERN2.matcher(defaultValue).matches()) {
-            return new IpAddress(new Ipv6Address(defaultValue));
-        } else {
-            throw new IllegalArgumentException("Cannot create IpAddress from " + defaultValue);
-        }
+    }
 
+    public static IpAddress getDefaultInstance(final String defaultValue) {
+        return IPV4_PATTERN.matcher(defaultValue).matches() ? new IpAddress(new Ipv4Address(defaultValue))
+                : new IpAddress(new Ipv6Address(defaultValue));
     }
 }
index 973d94bf865def0f2b74fcbd75f1986482cce8b2..155cae65563941d34774540f69f5b36e2ae51aa4 100644 (file)
@@ -5,39 +5,29 @@
  * 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.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
+import static com.google.common.base.Verify.verify;
+
+import java.util.regex.Pattern;
 
 /**
- *
+ * Builder for {@link IpPrefix} instances.
  */
 public class IpPrefixBuilder {
-    private static final Pattern IPV4_PATTERN = Pattern.compile("(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])/(([0-9])|([1-2][0-9])|(3[0-2]))");
-    private static final Pattern IPV6_PATTERN1 = Pattern.compile("((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(/(([0-9])|([0-9]{2})|(1[0-1][0-9])|(12[0-8])))");
-    private static final Pattern IPV6_PATTERN2 = Pattern.compile("(([^:]+:){6}(([^:]+:[^:]+)|(.*\\..*)))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)(/.+)");
+    private static final Pattern IPV4_PATTERN;
+
+    static {
+        verify(Ipv4Prefix.PATTERN_CONSTANTS.size() == 1);
+        IPV4_PATTERN = Pattern.compile(Ipv4Prefix.PATTERN_CONSTANTS.get(0));
+    }
 
     private IpPrefixBuilder() {
 
     }
 
     public static IpPrefix getDefaultInstance(final String defaultValue) {
-        final Matcher ipv4Matcher = IPV4_PATTERN.matcher(defaultValue);
-
-        if (ipv4Matcher.matches()) {
-            if (IPV6_PATTERN1.matcher(defaultValue).matches() && IPV6_PATTERN2.matcher(defaultValue).matches()) {
-                throw new IllegalArgumentException(
-                    String.format("Cannot create IpPrefix from \"%s\", matches both %s and %s",
-                        defaultValue, Ipv4Address.class.getSimpleName(), Ipv6Address.class.getSimpleName()));
-
-            }
-            return new IpPrefix(new Ipv4Prefix(defaultValue));
-        } else if (IPV6_PATTERN1.matcher(defaultValue).matches() && IPV6_PATTERN2.matcher(defaultValue).matches()) {
-            return new IpPrefix(new Ipv6Prefix(defaultValue));
-        } else {
-            throw new IllegalArgumentException("Cannot create IpPrefix from " + defaultValue);
-        }
+        return IPV4_PATTERN.matcher(defaultValue).matches() ? new IpPrefix(new Ipv4Prefix(defaultValue))
+                : new IpPrefix(new Ipv6Prefix(defaultValue));
     }
 }