1
2
3
4
5
6 package gov.nist.secauto.metaschema.core.model;
7
8 import gov.nist.secauto.metaschema.core.util.CollectionUtil;
9
10 import java.util.Map;
11 import java.util.Objects;
12 import java.util.Set;
13
14 import edu.umd.cs.findbugs.annotations.NonNull;
15
16
17
18
19
20 public interface IAttributable {
21 @NonNull
22 String DEFAULT_PROPERY_NAMESPACE = IModule.XML_NAMESPACE;
23
24 @NonNull
25 Map<Key, Set<String>> EMPTY = CollectionUtil.emptyMap();
26
27
28
29
30
31
32 @NonNull
33 default Map<Key, Set<String>> getProperties() {
34 return EMPTY;
35 }
36
37
38
39
40
41
42
43
44 default boolean hasProperty(@NonNull Key key) {
45 return getProperties().containsKey(key);
46 }
47
48
49
50
51
52
53
54
55 @NonNull
56 default Set<String> getPropertyValues(@NonNull Key key) {
57 Set<String> retval = getProperties().get(key);
58 if (retval == null) {
59 retval = CollectionUtil.emptySet();
60 }
61 return retval;
62 }
63
64
65
66
67
68
69
70
71
72
73
74
75 default boolean hasPropertyValue(@NonNull Key key, @NonNull String value) {
76 Set<String> values = getProperties().get(key);
77 return values != null && values.contains(value);
78 }
79
80
81
82
83
84
85
86
87
88
89 @NonNull
90 static Key key(@NonNull String name, @NonNull String namespace) {
91 return new Key(name, namespace);
92 }
93
94
95
96
97
98
99
100
101
102 @NonNull
103 static Key key(@NonNull String name) {
104 return new Key(name);
105 }
106
107
108
109
110 @SuppressWarnings("PMD.ShortClassName")
111 final class Key {
112 @NonNull
113 private final String name;
114 @NonNull
115 private final String namespace;
116
117 private Key(@NonNull String name) {
118 this(name, DEFAULT_PROPERY_NAMESPACE);
119 }
120
121 private Key(@NonNull String name, @NonNull String namespace) {
122 this.name = name;
123 this.namespace = namespace;
124 }
125
126
127
128
129
130
131 @NonNull
132 public String getName() {
133 return name;
134 }
135
136
137
138
139
140
141 @NonNull
142 public String getNamespace() {
143 return namespace;
144 }
145
146 @Override
147 public int hashCode() {
148 return Objects.hash(name, namespace);
149 }
150
151 @SuppressWarnings("PMD.OnlyOneReturn")
152 @Override
153 public boolean equals(Object obj) {
154 if (this == obj) {
155 return true;
156 }
157 if (!(obj instanceof Key)) {
158 return false;
159 }
160 Key other = (Key) obj;
161 return Objects.equals(name, other.name) && Objects.equals(namespace, other.namespace);
162 }
163 }
164 }