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;
18 import org.opendaylight.mdsal.model.ietf.util.AbstractIetfInetUtil;
21 * A set of utility methods to efficiently instantiate various ietf-inet-types DTOs.
24 public final class IetfInetUtil extends AbstractIetfInetUtil<Ipv4Address, Ipv4AddressNoZone, Ipv4Prefix, Ipv6Address,
25 Ipv6AddressNoZone, Ipv6Prefix, IpAddress, IpAddressNoZone, IpPrefix> {
26 public static final @NonNull IetfInetUtil INSTANCE = new IetfInetUtil();
28 private static final Pattern HOST_IPV4_PATTERN = Pattern.compile(
29 "(([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])"
30 + "(%[\\p{N}\\p{L}]+)?");
31 private static final Pattern HOST_IPV6_PATTERN1 = Pattern.compile("((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}"
32 +"((([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}"
33 + "(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(%[\\p{N}\\p{L}]+)?");
34 private static final Pattern HOST_IPV6_PATTERN2 = Pattern.compile(
35 "(([^:]+:){6}(([^:]+:[^:]+)|(.*\\..*)))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)(%.+)?");
36 private static final Pattern HOST_DOMAIN_PATTERN = Pattern.compile(
37 "((([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?[a-zA-Z0-9]\\.)*([a-zA-Z0-9_]([a-zA-Z0-9\\-_]){0,61})?"
38 +"[a-zA-Z0-9]\\.?)|\\.");
40 private static final Pattern IPADDRESS_IPV4_PATTERN;
42 verify(Ipv4Address.PATTERN_CONSTANTS.size() == 1);
43 IPADDRESS_IPV4_PATTERN = Pattern.compile(Ipv4Address.PATTERN_CONSTANTS.get(0));
46 private static final Pattern IPADDRESS_NO_ZONE_IPV4_PATTERN = Pattern.compile("[0-9\\.]*");
47 private static final Pattern IPADDRESS_NO_ZONE_IPV6_PATTERN = Pattern.compile("[0-9a-fA-F:\\.]*");
49 private static final Pattern IPPREFIX_IPV4_PATTERN;
51 verify(Ipv4Prefix.PATTERN_CONSTANTS.size() == 1);
52 IPPREFIX_IPV4_PATTERN = Pattern.compile(Ipv4Prefix.PATTERN_CONSTANTS.get(0));
55 private IetfInetUtil() {
56 super(Ipv4AddressNoZone.class, Ipv4Prefix.class, Ipv6AddressNoZone.class, Ipv6Prefix.class);
60 public static Host hostFor(final String str) {
61 final Matcher ipv4Matcher = HOST_IPV4_PATTERN.matcher(str);
62 final Matcher ipv6Matcher1 = HOST_IPV6_PATTERN1.matcher(str);
63 final Matcher ipv6Matcher2 = HOST_IPV6_PATTERN2.matcher(str);
64 final Matcher domainMatcher = HOST_DOMAIN_PATTERN.matcher(str);
65 List<String> matchers = new ArrayList<>(3);
66 if (ipv6Matcher1.matches() || ipv6Matcher2.matches()) {
67 matchers.add(Ipv6Address.class.getSimpleName());
69 // Ipv4 and Domain Name patterns are not exclusive
70 // Address 127.0.0.1 matches both patterns
71 // This way Ipv4 address is preferred to domain name
72 if (ipv4Matcher.matches()) {
73 matchers.add(Ipv4Address.class.getSimpleName());
74 } else if (domainMatcher.matches()) {
75 matchers.add(DomainName.class.getSimpleName());
77 if (matchers.size() > 1) {
78 throw new IllegalArgumentException("Cannot create Host from " + str + ". Value is ambigious for "
81 if (ipv4Matcher.matches()) {
82 Ipv4Address ipv4 = new Ipv4Address(str);
83 IpAddress ipAddress = new IpAddress(ipv4);
84 return new Host(ipAddress);
86 if (ipv6Matcher1.matches() || ipv6Matcher2.matches()) {
87 Ipv6Address ipv6 = new Ipv6Address(str);
88 IpAddress ipAddress = new IpAddress(ipv6);
89 return new Host(ipAddress);
91 if (domainMatcher.matches()) {
92 DomainName domainName = new DomainName(str);
93 return new Host(domainName);
95 throw new IllegalArgumentException("Cannot create Host from " + str);
99 public static IpAddress ipAddressFor(final String str) {
100 return IPADDRESS_IPV4_PATTERN.matcher(str).matches() ? new IpAddress(new Ipv4Address(str))
101 : new IpAddress(new Ipv6Address(str));
105 public static IpAddressNoZone ipAddressNoZoneFor(final String str) {
106 if (IPADDRESS_NO_ZONE_IPV4_PATTERN.matcher(str).matches()) {
107 return new IpAddressNoZone(new Ipv4AddressNoZone(str));
108 } else if (IPADDRESS_NO_ZONE_IPV6_PATTERN.matcher(str).matches()) {
109 return new IpAddressNoZone(new Ipv6AddressNoZone(str));
111 throw new IllegalArgumentException("Cannot create IpAddress from " + str);
116 public static IpPrefix ipPrefixFor(final String defaultValue) {
117 return IPPREFIX_IPV4_PATTERN.matcher(defaultValue).matches() ? new IpPrefix(new Ipv4Prefix(defaultValue))
118 : new IpPrefix(new Ipv6Prefix(defaultValue));
122 protected IpAddress ipv4Address(final Ipv4AddressNoZone addr) {
123 return new IpAddress(addr);
127 protected IpAddressNoZone ipv4AddressNoZone(final Ipv4AddressNoZone addr) {
128 return new IpAddressNoZone(addr);
132 protected IpAddressNoZone ipv6AddressNoZone(final Ipv6AddressNoZone addr) {
133 return new IpAddressNoZone(addr);
137 protected IpAddress ipv6Address(final Ipv6AddressNoZone addr) {
138 return new IpAddress(addr);
142 protected IpPrefix ipv4Prefix(final Ipv4Prefix addr) {
143 return new IpPrefix(addr);
147 protected IpPrefix ipv6Prefix(final Ipv6Prefix addr) {
148 return new IpPrefix(addr);
152 protected String ipv4AddressString(final Ipv4Address addr) {
153 return addr.getValue();
157 protected String ipv6AddressString(final Ipv6Address addr) {
158 return addr.getValue();
162 protected String ipv4PrefixString(final Ipv4Prefix prefix) {
163 return prefix.getValue();
167 protected String ipv6PrefixString(final Ipv6Prefix prefix) {
168 return prefix.getValue();
172 protected Ipv4Address maybeIpv4Address(final IpAddress addr) {
173 return addr.getIpv4Address();
177 protected Ipv4AddressNoZone maybeIpv4AddressNoZone(final IpAddressNoZone addr) {
178 return addr.getIpv4AddressNoZone();
182 protected Ipv6Address maybeIpv6Address(final IpAddress addr) {
183 return addr.getIpv6Address();
187 protected Ipv6AddressNoZone maybeIpv6AddressNoZone(final IpAddressNoZone addr) {
188 return addr.getIpv6AddressNoZone();