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