1 /*
2 (C) Copyright IBM Corp. 2006, 2013
3
4 THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE
5 ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE
6 CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT.
7
8 You can obtain a current copy of the Eclipse Public License from
9 http://www.opensource.org/licenses/eclipse-1.0.php
10
11 @author : Endre Bak, ebak@de.ibm.com
12 *
13 * Flag Date Prog Description
14 * -------------------------------------------------------------------------------
15 * 1565892 2006-10-06 ebak Make SBLIM client JSR48 compliant
16 * 1669961 2006-04-16 lupusalex CIMTypedElement.getType() =>getDataType()
17 * 2003590 2008-06-30 blaschke-oss Change licensing from CPL to EPL
18 * 2524131 2009-01-21 raman_arora Upgrade client to JDK 1.5 (Phase 1)
19 * 2797550 2009-06-01 raman_arora JSR48 compliance - add Java Generics
20 * 2935258 2010-01-22 blaschke-oss Sync up javax.cim.* javadoc with JSR48 1.0.0
21 * 3400209 2011-08-31 blaschke-oss Highlighted Static Analysis (PMD) issues
22 * 3411879 2011-09-20 blaschke-oss TCK: CIM element value must match type
23 * 2716 2013-12-11 blaschke-oss Sync up javax.* javadoc with JSR48 1.0.0 Final V
24 */
25
26 package org.metricshub.wbem.javax.cim;
27
28 /*-
29 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲
30 * WBEM Java Client
31 * ჻჻჻჻჻჻
32 * Copyright 2023 - 2025 MetricsHub
33 * ჻჻჻჻჻჻
34 * Licensed under the Apache License, Version 2.0 (the "License");
35 * you may not use this file except in compliance with the License.
36 * You may obtain a copy of the License at
37 *
38 * http://www.apache.org/licenses/LICENSE-2.0
39 *
40 * Unless required by applicable law or agreed to in writing, software
41 * distributed under the License is distributed on an "AS IS" BASIS,
42 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
43 * See the License for the specific language governing permissions and
44 * limitations under the License.
45 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱
46 */
47
48 import java.util.Arrays;
49 import org.metricshub.wbem.sblim.cimclient.internal.util.MOF;
50
51 //Sync'd against JSR48 1.0.0 javadoc (version 1.7.0_03) on Tue Dec 10 07:02:50 EST 2013
52 /**
53 * <code>CIMValuedElement</code> is a base class used by any element that
54 * contains a name, type and value.
55 *
56 * @param <E>
57 * Type parameter.
58 */
59 public abstract class CIMValuedElement<E> extends CIMTypedElement {
60 private static final long serialVersionUID = 4234L;
61
62 private E iValue;
63
64 /**
65 * Creates a new CIM element with the given name, type and value.
66 *
67 * @param pName
68 * The string for the name for this element.
69 * @param pType
70 * The data type for this element.
71 * @param pValue
72 * The value for this element. <code>null</code> is a valid
73 * value.
74 * @throws IllegalArgumentException
75 * If the value does not match the data type.
76 */
77 protected CIMValuedElement(String pName, CIMDataType pType, E pValue) {
78 super(pName, pType);
79 if (pType != null && pValue != null) {
80 CIMDataType valueDataType;
81 try {
82 valueDataType = CIMDataType.getDataType(pValue);
83 } catch (IllegalArgumentException e) {
84 // Value has unknown data type, cannot validate
85 valueDataType = null;
86 }
87 if (valueDataType != null && valueDataType.getType() != pType.getType()) throw new IllegalArgumentException(
88 "CIM value does not match type: " + valueDataType.getType() + " != " + pType.getType()
89 );
90 }
91
92 this.iValue = pValue;
93 }
94
95 /**
96 * Compares this object against the specified object. The result is
97 * <code>true</code> if and only if the argument is not <code>null</code>
98 * and is a <code>CIMValuedElement</code> that represents the same name,
99 * type and value as this object.
100 *
101 * @param pObj
102 * The object to compare with.
103 * @return <code>true</code> if the objects are the same; <code>false</code>
104 * otherwise.
105 */
106 @Override
107 public boolean equals(Object pObj) {
108 if (!(pObj instanceof CIMValuedElement)) return false;
109 CIMValuedElement<?> that = (CIMValuedElement<?>) pObj;
110 if (!super.equals(that)) return false;
111 if (getDataType().isArray()) {
112 return Arrays.equals((Object[]) this.iValue, (Object[]) that.iValue);
113 }
114 return this.iValue == null ? that.iValue == null : this.iValue.equals(that.iValue);
115 }
116
117 /**
118 * Returns the value for this CIM Element.
119 *
120 * @return The value of the CIM Element. <code>null</code> is a valid value.
121 */
122 public E getValue() {
123 return this.iValue;
124 }
125
126 /**
127 * Returns a hash code value for the CIM valued element. This method is
128 * supported for the benefit of hashtables such as those provided by
129 * <code>java.util.Hashtable</code>.
130 *
131 * @return A hash code value for this CIM valued element.
132 */
133 @Override
134 public int hashCode() {
135 return toString().hashCode();
136 }
137
138 /**
139 * Returns a <code>String</code> representation of the CIM Element. This
140 * method is intended to be used only for debugging purposes, and the format
141 * of the returned string may vary between implementations. The returned
142 * string may be empty but may not be <code>null</code>.
143 *
144 * @return String representation of this element.
145 */
146 @Override
147 public String toString() {
148 return MOF.valuedElement(this, MOF.EMPTY);
149 }
150 }