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 }