Move AbstractIetfInetUtil
[mdsal.git] / model / ietf / rfc6991-ietf-inet-types / src / main / java / org / opendaylight / yang / gen / v1 / urn / ietf / params / xml / ns / yang / ietf / inet / types / rev130715 / IetfInetUtil.java
1 /*
2  * Copyright (c) 2016 Pantheon Technologies s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715;
9
10 import static com.google.common.base.Verify.verify;
11
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
19 /**
20  * A set of utility methods to efficiently instantiate various ietf-inet-types DTOs.
21  */
22 @Beta
23 public final class IetfInetUtil extends AbstractIetfInetUtil {
24     public static final @NonNull IetfInetUtil INSTANCE = new IetfInetUtil();
25
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]\\.?)|\\.");
37
38     private static final Pattern IPADDRESS_IPV4_PATTERN;
39     static {
40         verify(Ipv4Address.PATTERN_CONSTANTS.size() == 1);
41         IPADDRESS_IPV4_PATTERN = Pattern.compile(Ipv4Address.PATTERN_CONSTANTS.get(0));
42     }
43
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:\\.]*");
46
47     private static final Pattern IPPREFIX_IPV4_PATTERN;
48     static {
49         verify(Ipv4Prefix.PATTERN_CONSTANTS.size() == 1);
50         IPPREFIX_IPV4_PATTERN = Pattern.compile(Ipv4Prefix.PATTERN_CONSTANTS.get(0));
51     }
52
53     private IetfInetUtil() {
54         // Hidden on purpose
55     }
56
57     @Beta
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());
66         }
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());
74         }
75         if (matchers.size() > 1) {
76             throw new IllegalArgumentException("Cannot create Host from " + str + ". Value is ambigious for "
77                 + matchers);
78         }
79         if (ipv4Matcher.matches()) {
80             Ipv4Address ipv4 = new Ipv4Address(str);
81             IpAddress ipAddress = new IpAddress(ipv4);
82             return new Host(ipAddress);
83         }
84         if (ipv6Matcher1.matches() || ipv6Matcher2.matches()) {
85             Ipv6Address ipv6 = new Ipv6Address(str);
86             IpAddress ipAddress = new IpAddress(ipv6);
87             return new Host(ipAddress);
88         }
89         if (domainMatcher.matches()) {
90             DomainName domainName = new DomainName(str);
91             return new Host(domainName);
92         }
93         throw new IllegalArgumentException("Cannot create Host from " + str);
94     }
95
96     @Beta
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));
100     }
101
102     @Beta
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));
108         } else {
109             throw new IllegalArgumentException("Cannot create IpAddress from " + str);
110         }
111     }
112
113     @Beta
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));
117     }
118
119     @Override
120     protected IpAddress ipv4Address(final Ipv4AddressNoZone addr) {
121         return new IpAddress(addr);
122     }
123
124     @Override
125     protected IpAddressNoZone ipv4AddressNoZone(final Ipv4AddressNoZone addr) {
126         return new IpAddressNoZone(addr);
127     }
128
129     @Override
130     protected IpAddressNoZone ipv6AddressNoZone(final Ipv6AddressNoZone addr) {
131         return new IpAddressNoZone(addr);
132     }
133
134     @Override
135     protected IpAddress ipv6Address(final Ipv6AddressNoZone addr) {
136         return new IpAddress(addr);
137     }
138
139     @Override
140     protected IpPrefix ipv4Prefix(final Ipv4Prefix addr) {
141         return new IpPrefix(addr);
142     }
143
144     @Override
145     protected IpPrefix ipv6Prefix(final Ipv6Prefix addr) {
146         return new IpPrefix(addr);
147     }
148
149     @Override
150     protected String ipv4AddressString(final Ipv4Address addr) {
151         return addr.getValue();
152     }
153
154     @Override
155     protected String ipv6AddressString(final Ipv6Address addr) {
156         return addr.getValue();
157     }
158
159     @Override
160     protected String ipv4PrefixString(final Ipv4Prefix prefix) {
161         return prefix.getValue();
162     }
163
164     @Override
165     protected String ipv6PrefixString(final Ipv6Prefix prefix) {
166         return prefix.getValue();
167     }
168
169     @Override
170     protected Ipv4Address maybeIpv4Address(final IpAddress addr) {
171         return addr.getIpv4Address();
172     }
173
174     @Override
175     protected Ipv4AddressNoZone maybeIpv4AddressNoZone(final IpAddressNoZone addr) {
176         return addr.getIpv4AddressNoZone();
177     }
178
179     @Override
180     protected Ipv6Address maybeIpv6Address(final IpAddress addr) {
181         return addr.getIpv6Address();
182     }
183
184     @Override
185     protected Ipv6AddressNoZone maybeIpv6AddressNoZone(final IpAddressNoZone addr) {
186         return addr.getIpv6AddressNoZone();
187     }
188 }