1 /* 2 (C) Copyright IBM Corp. 2006, 2009 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-11-30 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 * 2204488 2008-10-28 raman_arora Fix code to remove compiler warnings 19 * 2524131 2009-01-21 raman_arora Upgrade client to JDK 1.5 (Phase 1) 20 * 2531371 2009-02-10 raman_arora Upgrade client to JDK 1.5 (Phase 2) 21 * 2763216 2009-04-14 blaschke-oss Code cleanup: visible spelling/grammar errors 22 * 2797550 2009-06-01 raman_arora JSR48 compliance - add Java Generics 23 */ 24 25 package org.metricshub.wbem.sblim.cimclient.internal.cim; 26 27 /*- 28 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲ 29 * WBEM Java Client 30 * ჻჻჻჻჻჻ 31 * Copyright 2023 - 2025 MetricsHub 32 * ჻჻჻჻჻჻ 33 * Licensed under the Apache License, Version 2.0 (the "License"); 34 * you may not use this file except in compliance with the License. 35 * You may obtain a copy of the License at 36 * 37 * http://www.apache.org/licenses/LICENSE-2.0 38 * 39 * Unless required by applicable law or agreed to in writing, software 40 * distributed under the License is distributed on an "AS IS" BASIS, 41 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 42 * See the License for the specific language governing permissions and 43 * limitations under the License. 44 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱ 45 */ 46 47 import java.util.ArrayList; 48 import java.util.List; 49 import org.metricshub.wbem.javax.cim.CIMObjectPath; 50 import org.metricshub.wbem.javax.cim.CIMProperty; 51 52 /** 53 * Class CIMInstanceBuilder provides help for CIMInstance(CIMObjectPath, 54 * CIMProperty[]) constructor.<br> 55 * <br> 56 * CIMObjectPath param has to contain the key properties only.<br> 57 * ( VALUE.NAMEDINSTANCE->INSTANCENAME->KEYBINDING )<br> 58 * CIMProperty[] param has to contain all properties, including key properties.<br> 59 * ( VALUE.NAMEDINSTANCE->INSTANCE->PROPERTY* )<br> 60 * The implementation merges the properties from both params.<br> 61 * From CIMObjectPath's keys only the type and value information is considered.<br> 62 * 63 */ 64 public class CIMInstanceBuilder { 65 private CIMProperty<?>[] iProperties; 66 67 private static final Object[] EMPTY_RPOP_A = new CIMProperty[0]; 68 69 /** 70 * Ctor. 71 * 72 * @param pPath 73 * @param pProps 74 * @throws IllegalArgumentException 75 */ 76 public CIMInstanceBuilder(CIMObjectPath pPath, CIMProperty<?>[] pProps) throws IllegalArgumentException { 77 this.iProperties = pProps != null ? pProps : new CIMProperty[0]; 78 CIMElementSorter.sort(this.iProperties); 79 addPathKeys(pPath); 80 } 81 82 /** 83 * Extends the keys of the passed CIMObjectPath. 84 * 85 * @param pPath 86 * @return the new CIMObjectPath 87 */ 88 public CIMObjectPath setKeys(CIMObjectPath pPath) { 89 List<CIMProperty<?>> keys = new ArrayList<CIMProperty<?>>(); 90 for (int i = 0; i < this.iProperties.length; ++i) { 91 CIMProperty<?> prop = this.iProperties[i]; 92 if (prop.isKey()) keys.add(prop); 93 } 94 95 /* 96 * CIMObjectPath( String scheme, String host, String port, String 97 * namespace, String objectName, CIMProperty[] keys ) 98 */ 99 return new CIMObjectPath( 100 pPath.getScheme(), 101 pPath.getHost(), 102 pPath.getPort(), 103 pPath.getNamespace(), 104 pPath.getObjectName(), 105 (CIMProperty[]) keys.toArray(EMPTY_RPOP_A) 106 ); 107 } 108 109 /** 110 * getAllPropertis 111 * 112 * @return all properties in an ordered way 113 */ 114 public CIMProperty<?>[] getAllPropertis() { 115 return this.iProperties; 116 } 117 118 private void addPathKeys(CIMObjectPath pPath) throws IllegalArgumentException { 119 CIMProperty<?>[] keys = pPath.getKeys(); 120 for (int i = 0; i < keys.length; i++) { 121 CIMProperty<?> key = keys[i]; 122 int pos = CIMElementSorter.findIdx(this.iProperties, key.getName()); 123 if (pos < 0) { 124 pos = -pos - 1; 125 CIMProperty<?>[] newArray = new CIMProperty[this.iProperties.length + 1]; 126 System.arraycopy(this.iProperties, 0, newArray, 0, pos); 127 newArray[pos] = key; 128 System.arraycopy(this.iProperties, pos, newArray, pos + 1, this.iProperties.length - pos); 129 this.iProperties = newArray; 130 } else { 131 CIMProperty<?> prop = this.iProperties[pos]; 132 // typeAndValueCheck(key, prop); 133 if (!prop.isKey()) this.iProperties[pos] = mkKey(prop); 134 } 135 } 136 } 137 138 private static CIMProperty<Object> mkKey(CIMProperty<?> pProp) { 139 return new CIMProperty<Object>( 140 pProp.getName(), 141 pProp.getDataType(), 142 pProp.getValue(), 143 true, 144 pProp.isPropagated(), 145 pProp.getOriginClass() 146 ); 147 } 148 /* 149 * private static void typeAndValueCheck(CIMProperty pPathProp, CIMProperty 150 * pArrayProp) throws IllegalArgumentException { CIMDataType pType = 151 * pPathProp.getDataType(), aType = pArrayProp.getDataType(); if (pType == 152 * null ? aType != null : pType.getType() != aType.getType()) throw new 153 * IllegalArgumentException( pPathProp.getName() + " property presents in 154 * CIMObjectPath param and CIMProperty[] param " + "with different types!"); 155 * Object pValue = pPathProp.getValue(), aValue = pArrayProp.getValue(); if 156 * (pValue == null ? aValue != null : !pValue.equals(aValue)) throw new 157 * IllegalArgumentException( pPathProp.getName() + " property conatins 158 * different values in CIMObjectPath and " + "CIMProperty params!"); } 159 */ 160 161 }