2 * Copyright (c) 2016 Pantheon Technologies s.r.o. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
10 import static com.google.common.base.Verify.verify;
12 import com.google.common.annotations.Beta;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.regex.Matcher;
16 import java.util.regex.Pattern;
17 import org.eclipse.jdt.annotation.NonNull;
20 * A set of utility methods to efficiently instantiate various ietf-inet-types DTOs.
23 public final class IetfInetUtil extends AbstractIetfInetUtil {
24 public static final @NonNull IetfInetUtil INSTANCE = new IetfInetUtil();
26 private static final Pattern HOST_IPV4_PATTERN = Pattern.compile(
27 "(([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])"
28 + "(%[\\p{N}\\p{L}]+)?");
29 private static final Pattern HOST_IPV6_PATTERN1 = Pattern.compile("((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}"
30 +"((([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}"
31 + "(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(%[\\p{N}\\p{L}]+)?");
32 private static final Pattern HOST_IPV6_PATTERN2 = Pattern.compile(
33 "(([^:]+:){6}(([^:]+:[^:]+)|(.*\\..*)))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)(%.+)?");
34 private static final Pattern HOST_DOMAIN_PATTERN = Pattern.compile(
35 "((([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.)*([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?"
36 +"[a-zA-Z0-9]\\.?)|\\.");
38 private static final Pattern IPADDRESS_IPV4_PATTERN;
40 verify(Ipv4Address.PATTERN_CONSTANTS.size() == 1);
41 IPADDRESS_IPV4_PATTERN = Pattern.compile(Ipv4Address.PATTERN_CONSTANTS.get(0));
44 private static final Pattern IPADDRESS_NO_ZONE_IPV4_PATTERN = Pattern.compile("[0-9\\.]*");
45 private static final Pattern IPADDRESS_NO_ZONE_IPV6_PATTERN = Pattern.compile("[0-9a-fA-F:\\.]*");
47 private static final Pattern IPPREFIX_IPV4_PATTERN;
49 verify(Ipv4Prefix.PATTERN_CONSTANTS.size() == 1);
50 IPPREFIX_IPV4_PATTERN = Pattern.compile(Ipv4Prefix.PATTERN_CONSTANTS.get(0));
53 private IetfInetUtil() {
58 public static Host hostFor(final String str) {
59 final Matcher ipv4Matcher = HOST_IPV4_PATTERN.matcher(str);
60 final Matcher ipv6Matcher1 = HOST_IPV6_PATTERN1.matcher(str);
61 final Matcher ipv6Matcher2 = HOST_IPV6_PATTERN2.matcher(str);
62 final Matcher domainMatcher = HOST_DOMAIN_PATTERN.matcher(str);
63 List<String> matchers = new ArrayList<>(3);
64 if (ipv6Matcher1.matches() || ipv6Matcher2.matches()) {
65 matchers.add(Ipv6Address.class.getSimpleName());
67 // Ipv4 and Domain Name patterns are not exclusive
68 // Address 127.0.0.1 matches both patterns
69 // This way Ipv4 address is preferred to domain name
70 if (ipv4Matcher.matches()) {
71 matchers.add(Ipv4Address.class.getSimpleName());
72 } else if (domainMatcher.matches()) {
73 matchers.add(DomainName.class.getSimpleName());
75 if (matchers.size() > 1) {
76 throw new IllegalArgumentException("Cannot create Host from " + str + ". Value is ambigious for "
79 if (ipv4Matcher.matches()) {
80 Ipv4Address ipv4 = new Ipv4Address(str);
81 IpAddress ipAddress = new IpAddress(ipv4);
82 return new Host(ipAddress);
84 if (ipv6Matcher1.matches() || ipv6Matcher2.matches()) {
85 Ipv6Address ipv6 = new Ipv6Address(str);
86 IpAddress ipAddress = new IpAddress(ipv6);
87 return new Host(ipAddress);
89 if (domainMatcher.matches()) {
90 DomainName domainName = new DomainName(str);
91 return new Host(domainName);
93 throw new IllegalArgumentException("Cannot create Host from " + str);
97 public static IpAddress ipAddressFor(final String str) {
98 return IPADDRESS_IPV4_PATTERN.matcher(str).matches() ? new IpAddress(new Ipv4Address(str))
99 : new IpAddress(new Ipv6Address(str));
103 public static IpAddressNoZone ipAddressNoZoneFor(final String str) {
104 if (IPADDRESS_NO_ZONE_IPV4_PATTERN.matcher(str).matches()) {
105 return new IpAddressNoZone(new Ipv4AddressNoZone(str));
106 } else if (IPADDRESS_NO_ZONE_IPV6_PATTERN.matcher(str).matches()) {
107 return new IpAddressNoZone(new Ipv6AddressNoZone(str));
109 throw new IllegalArgumentException("Cannot create IpAddress from " + str);
114 public static IpPrefix ipPrefixFor(final String defaultValue) {
115 return IPPREFIX_IPV4_PATTERN.matcher(defaultValue).matches() ? new IpPrefix(new Ipv4Prefix(defaultValue))
116 : new IpPrefix(new Ipv6Prefix(defaultValue));