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
28
29
30
31
32
33 package org.metricshub.wbem.sblim.cimclient.internal.cim;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 import java.io.Serializable;
56 import java.util.ArrayList;
57 import java.util.Arrays;
58 import org.metricshub.wbem.javax.cim.CIMDataType;
59 import org.metricshub.wbem.javax.cim.CIMFlavor;
60 import org.metricshub.wbem.javax.cim.CIMQualifiedElementInterface;
61 import org.metricshub.wbem.javax.cim.CIMQualifier;
62
63
64
65
66
67 public class CIMQualifiedElementInterfaceImpl implements CIMQualifiedElementInterface, Serializable {
68
69
70
71 private static final long serialVersionUID = 4533301297060752510L;
72
73 private CIMQualifier<?>[] iQualis;
74
75 private CIMQualifier<?>[] iLocalOnlyQualis;
76
77 private boolean iEmbeddedObject;
78
79 private static final CIMQualifier<Boolean> KEY = new CIMQualifier<Boolean>(
80 "Key",
81 CIMDataType.BOOLEAN_T,
82 Boolean.TRUE,
83 CIMFlavor.DISABLEOVERRIDE
84 );
85
86 private static final CIMQualifier<Boolean> ASSOCIATION = new CIMQualifier<Boolean>(
87 "Association",
88 CIMDataType.BOOLEAN_T,
89 Boolean.TRUE,
90 CIMFlavor.DISABLEOVERRIDE
91 );
92
93 private static final CIMQualifier<?>[] EMPTY_QA = new CIMQualifier[0];
94
95
96
97
98
99
100 public CIMQualifiedElementInterfaceImpl(CIMQualifier<?>[] pQualifiers) {
101 setQualis(pQualifiers);
102 }
103
104
105
106
107
108
109
110
111 public CIMQualifiedElementInterfaceImpl(CIMQualifier<?>[] pQualifiers, boolean pIsKeyed) {
112 this(pQualifiers, pIsKeyed, false);
113 }
114
115
116
117
118
119
120
121
122
123
124 public CIMQualifiedElementInterfaceImpl(CIMQualifier<?>[] pQualifiers, boolean pIsKeyed, boolean pKeepEmbObj) {
125 this(pQualifiers, pIsKeyed, pKeepEmbObj, false);
126 }
127
128
129
130
131
132
133
134
135
136
137
138
139 public CIMQualifiedElementInterfaceImpl(
140 CIMQualifier<?>[] pQualifiers,
141 boolean pIsKeyed,
142 boolean pKeepEmbObj,
143 boolean pIsAssociation
144 ) {
145 if (pKeepEmbObj) {
146 this.iQualis = (CIMQualifier[]) CIMElementSorter.sort(pQualifiers);
147 this.iEmbeddedObject = CIMElementSorter.findIdx(this.iQualis, "EmbeddedObject") >= 0;
148 } else {
149 setQualis(pQualifiers);
150 }
151 setBoolQualifier(KEY, pIsKeyed);
152 setBoolQualifier(ASSOCIATION, pIsAssociation);
153 }
154
155
156
157
158 @Override
159 public boolean equals(Object pObj) {
160 if (!(pObj instanceof CIMQualifiedElementInterfaceImpl)) return false;
161 CIMQualifiedElementInterfaceImpl that = (CIMQualifiedElementInterfaceImpl) pObj;
162 return Arrays.equals(getQualifiers(), that.getQualifiers());
163 }
164
165
166
167
168 @Override
169 public int hashCode() {
170 return Arrays.hashCode(getQualifiers());
171 }
172
173
174
175
176
177
178
179 private void setQualis(CIMQualifier<?>[] pQualiA) {
180 pQualiA = (CIMQualifier[]) CIMElementSorter.sort(pQualiA);
181 int rmIdx = CIMElementSorter.findIdx(pQualiA, "EmbeddedObject");
182 if (rmIdx < 0) {
183 this.iQualis = pQualiA;
184 return;
185 }
186 this.iEmbeddedObject = true;
187 this.iQualis = pQualiA;
188 }
189
190
191
192
193
194
195
196
197
198 private void setBoolQualifier(CIMQualifier<Boolean> pQuali, boolean pValue) {
199 int idx = CIMElementSorter.findIdx(this.iQualis, pQuali.getName());
200 if (pValue) {
201 if (idx < 0) {
202
203
204
205 insertQuali(pQuali, -idx - 1);
206 } else if (!pQuali.getValue().equals(this.iQualis[idx].getValue())) {
207
208 this.iQualis[idx] = pQuali;
209 }
210 } else {
211 if (idx > 0) {
212
213 removeQuali(idx);
214 }
215 }
216 }
217
218 private void insertQuali(CIMQualifier<Boolean> pQuali, int idx) {
219 int origLength = this.iQualis == null ? 0 : this.iQualis.length;
220 CIMQualifier<?>[] qualis = new CIMQualifier[origLength + 1];
221 int srcIdx = 0, dstIdx = 0;
222 while (srcIdx < idx) qualis[dstIdx++] = this.iQualis[srcIdx++];
223 qualis[dstIdx++] = pQuali;
224 while (srcIdx < origLength) qualis[dstIdx++] = this.iQualis[srcIdx++];
225 this.iQualis = qualis;
226 }
227
228 private void removeQuali(int idx) {
229 CIMQualifier<?>[] qualis = new CIMQualifier[this.iQualis.length - 1];
230 int srcIdx = 0, dstIdx = 0;
231 while (srcIdx < idx) qualis[dstIdx++] = this.iQualis[srcIdx++];
232 ++srcIdx;
233 while (srcIdx < this.iQualis.length) qualis[dstIdx++] = this.iQualis[srcIdx++];
234 this.iQualis = qualis;
235 }
236
237
238
239
240
241
242
243
244
245
246
247 public boolean isKeyed() {
248 return hasQualifierValue("key", Boolean.TRUE);
249 }
250
251
252
253
254
255
256 public boolean isEmbeddedObject() {
257 return this.iEmbeddedObject;
258 }
259
260
261
262
263 public CIMQualifier<?> getQualifier(int pIndex) {
264 return this.iQualis[pIndex];
265 }
266
267
268
269
270 public CIMQualifier<?> getQualifier(String pName) {
271 return (CIMQualifier<?>) CIMElementSorter.find(this.iQualis, pName);
272 }
273
274
275
276
277 public int getQualifierCount() {
278 return this.iQualis == null ? 0 : this.iQualis.length;
279 }
280
281
282
283
284 public Object getQualifierValue(String pName) {
285 CIMQualifier<?> quali = getQualifier(pName);
286 if (quali == null) return null;
287 return quali.getValue();
288 }
289
290
291
292
293 public CIMQualifier<?>[] getQualifiers() {
294 return getQualifiers(false);
295 }
296
297
298
299
300
301
302
303 public CIMQualifier<?>[] getQualifiers(boolean pLocalOnly) {
304 if (this.iQualis == null) return EMPTY_QA;
305 if (!pLocalOnly) return this.iQualis;
306 if (this.iLocalOnlyQualis == null) {
307 ArrayList<CIMQualifier<?>> qualiL = new ArrayList<CIMQualifier<?>>(this.iQualis.length);
308 for (int i = 0; i < this.iQualis.length; i++) if (!this.iQualis[i].isPropagated()) qualiL.add(this.iQualis[i]);
309 this.iLocalOnlyQualis = qualiL.toArray(new CIMQualifier[qualiL.size()]);
310 }
311 return this.iLocalOnlyQualis;
312 }
313
314
315
316
317 public boolean hasQualifier(String pName) {
318 return getQualifier(pName) != null;
319 }
320
321
322
323
324
325 public boolean hasQualifierValue(String pName, Object pValue) {
326 if (!hasQualifier(pName)) return false;
327 Object value = getQualifierValue(pName);
328 return value == null ? pValue == null : value.equals(pValue);
329 }
330 }