Do not generate union builders
[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 import org.opendaylight.mdsal.model.ietf.util.AbstractIetfInetUtil;
19
20 /**
21  * A set of utility methods to efficiently instantiate various ietf-inet-types DTOs.
22  */
23 @Beta
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();
27
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]\\.?)|\\.");
39
40     private static final Pattern IPADDRESS_IPV4_PATTERN;
41     static {
42         verify(Ipv4Address.PATTERN_CONSTANTS.size() == 1);
43         IPADDRESS_IPV4_PATTERN = Pattern.compile(Ipv4Address.PATTERN_CONSTANTS.get(0));
44     }
45
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:\\.]*");
48
49     private static final Pattern IPPREFIX_IPV4_PATTERN;
50     static {
51         verify(Ipv4Prefix.PATTERN_CONSTANTS.size() == 1);
52         IPPREFIX_IPV4_PATTERN = Pattern.compile(Ipv4Prefix.PATTERN_CONSTANTS.get(0));
53     }
54
55     private IetfInetUtil() {
56         super(Ipv4AddressNoZone.class, Ipv4Prefix.class, Ipv6AddressNoZone.class, Ipv6Prefix.class);
57     }
58
59     @Beta
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());
68         }
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());
76         }
77         if (matchers.size() > 1) {
78             throw new IllegalArgumentException("Cannot create Host from " + str + ". Value is ambigious for "
79                 + matchers);
80         }
81         if (ipv4Matcher.matches()) {
82             Ipv4Address ipv4 = new Ipv4Address(str);
83             IpAddress ipAddress = new IpAddress(ipv4);
84             return new Host(ipAddress);
85         }
86         if (ipv6Matcher1.matches() || ipv6Matcher2.matches()) {
87             Ipv6Address ipv6 = new Ipv6Address(str);
88             IpAddress ipAddress = new IpAddress(ipv6);
89             return new Host(ipAddress);
90         }
91         if (domainMatcher.matches()) {
92             DomainName domainName = new DomainName(str);
93             return new Host(domainName);
94         }
95         throw new IllegalArgumentException("Cannot create Host from " + str);
96     }
97
98     @Beta
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));
102     }
103
104     @Beta
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));
110         } else {
111             throw new IllegalArgumentException("Cannot create IpAddress from " + str);
112         }
113     }
114
115     @Beta
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));
119     }
120
121     @Override
122     protected IpAddress ipv4Address(final Ipv4AddressNoZone addr) {
123         return new IpAddress(addr);
124     }
125
126     @Override
127     protected IpAddressNoZone ipv4AddressNoZone(final Ipv4AddressNoZone addr) {
128         return new IpAddressNoZone(addr);
129     }
130
131     @Override
132     protected IpAddressNoZone ipv6AddressNoZone(final Ipv6AddressNoZone addr) {
133         return new IpAddressNoZone(addr);
134     }
135
136     @Override
137     protected IpAddress ipv6Address(final Ipv6AddressNoZone addr) {
138         return new IpAddress(addr);
139     }
140
141     @Override
142     protected IpPrefix ipv4Prefix(final Ipv4Prefix addr) {
143         return new IpPrefix(addr);
144     }
145
146     @Override
147     protected IpPrefix ipv6Prefix(final Ipv6Prefix addr) {
148         return new IpPrefix(addr);
149     }
150
151     @Override
152     protected String ipv4AddressString(final Ipv4Address addr) {
153         return addr.getValue();
154     }
155
156     @Override
157     protected String ipv6AddressString(final Ipv6Address addr) {
158         return addr.getValue();
159     }
160
161     @Override
162     protected String ipv4PrefixString(final Ipv4Prefix prefix) {
163         return prefix.getValue();
164     }
165
166     @Override
167     protected String ipv6PrefixString(final Ipv6Prefix prefix) {
168         return prefix.getValue();
169     }
170
171     @Override
172     protected Ipv4Address maybeIpv4Address(final IpAddress addr) {
173         return addr.getIpv4Address();
174     }
175
176     @Override
177     protected Ipv4AddressNoZone maybeIpv4AddressNoZone(final IpAddressNoZone addr) {
178         return addr.getIpv4AddressNoZone();
179     }
180
181     @Override
182     protected Ipv6Address maybeIpv6Address(final IpAddress addr) {
183         return addr.getIpv6Address();
184     }
185
186     @Override
187     protected Ipv6AddressNoZone maybeIpv6AddressNoZone(final IpAddressNoZone addr) {
188         return addr.getIpv6AddressNoZone();
189     }
190 }