1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package gov.nist.secauto.metaschema.core.datatype.adapter;
28
29 import com.fasterxml.jackson.databind.jsonFormatVisitors.JsonFormatTypes;
30
31 import gov.nist.secauto.metaschema.core.datatype.AbstractDataTypeAdapter;
32 import gov.nist.secauto.metaschema.core.metapath.item.atomic.IIPv4AddressItem;
33 import gov.nist.secauto.metaschema.core.util.ObjectUtils;
34
35 import java.util.List;
36
37 import edu.umd.cs.findbugs.annotations.NonNull;
38 import inet.ipaddr.AddressStringException;
39 import inet.ipaddr.IPAddressString;
40 import inet.ipaddr.IPAddressStringParameters;
41 import inet.ipaddr.IncompatibleAddressException;
42 import inet.ipaddr.ipv4.IPv4Address;
43
44 public class IPv4AddressAdapter
45 extends AbstractDataTypeAdapter<IPv4Address, IIPv4AddressItem> {
46 @NonNull
47 private static final List<String> NAMES = ObjectUtils.notNull(
48 List.of("ip-v4-address"));
49 private static final IPAddressStringParameters IP_V_4;
50
51 static {
52 IP_V_4 = new IPAddressStringParameters.Builder().allowIPv6(false).allowEmpty(false).allowSingleSegment(false)
53 .allowWildcardedSeparator(false).getIPv4AddressParametersBuilder().allowBinary(false).allowLeadingZeros(false)
54 .allowPrefixesBeyondAddressSize(false).getParentBuilder().toParams();
55 }
56
57 IPv4AddressAdapter() {
58 super(IPv4Address.class);
59 }
60
61 @Override
62 public List<String> getNames() {
63 return NAMES;
64 }
65
66 @Override
67 public JsonFormatTypes getJsonRawType() {
68 return JsonFormatTypes.STRING;
69 }
70
71 @SuppressWarnings("null")
72 @Override
73 public IPv4Address parse(String value) {
74 try {
75 return (IPv4Address) new IPAddressString(value, IP_V_4).toAddress();
76 } catch (AddressStringException | IncompatibleAddressException ex) {
77 throw new IllegalArgumentException(ex.getLocalizedMessage(), ex);
78 }
79 }
80
81 @Override
82 public IPv4Address copy(Object obj) {
83
84 return (IPv4Address) obj;
85 }
86
87 @Override
88 public Class<IIPv4AddressItem> getItemClass() {
89 return IIPv4AddressItem.class;
90 }
91
92 @Override
93 public IIPv4AddressItem newItem(Object value) {
94 IPv4Address item = toValue(value);
95 return IIPv4AddressItem.valueOf(item);
96 }
97 }