1 /* 2 (C) Copyright IBM Corp. 2007, 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, IBM, ebak@de.ibm.com 12 * 13 * Change History 14 * Flag Date Prog Description 15 *------------------------------------------------------------------------------- 16 * 1804402 2007-09-28 ebak IPv6 ready SLP 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 * 2531371 2009-02-10 raman_arora Upgrade client to JDK 1.5 (Phase 2) 20 * 2650 2013-07-18 blaschke-oss SLP opaque value handling incorrect 21 */ 22 23 package org.metricshub.wbem.sblim.slp.internal; 24 25 /*- 26 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲ 27 * WBEM Java Client 28 * ჻჻჻჻჻჻ 29 * Copyright 2023 - 2025 MetricsHub 30 * ჻჻჻჻჻჻ 31 * Licensed under the Apache License, Version 2.0 (the "License"); 32 * you may not use this file except in compliance with the License. 33 * You may obtain a copy of the License at 34 * 35 * http://www.apache.org/licenses/LICENSE-2.0 36 * 37 * Unless required by applicable law or agreed to in writing, software 38 * distributed under the License is distributed on an "AS IS" BASIS, 39 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 40 * See the License for the specific language governing permissions and 41 * limitations under the License. 42 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱ 43 */ 44 45 import java.util.Iterator; 46 import java.util.Vector; 47 import org.metricshub.wbem.sblim.slp.ServiceLocationAttribute; 48 49 /** 50 * AttributeHandler 51 * 52 */ 53 public class AttributeHandler { 54 55 /* 56 * attr-list = attribute / attribute `,' attr-list attribute = `(' attr-tag 57 * `=' attr-val-list `)' / attr-tag attr-val-list = attr-val / attr-val `,' 58 * attr-val-list attr-tag = 1*safe-tag attr-val = intval / strval / boolval 59 * / opaque intval = [-]1*DIGIT strval = 1*safe-val boolval = "true" / 60 * "false" opaque = "\FF" 1*escape-val safe-val = ; Any character except 61 * reserved. safe-tag = ; Any character except reserved, star and bad-tag. 62 * reserved = `(' / `)' / `,' / `\' / `!' / `<' / `=' / `>' / `~' / CTL 63 * escape-val = `\' HEXDIG HEXDIG bad-tag = CR / LF / HTAB / `_' star = `*' 64 */ 65 /** 66 * @param pAttr 67 * @return String 68 */ 69 public static String buildString(ServiceLocationAttribute pAttr) { 70 StringBuffer buf = new StringBuffer(); 71 Vector<?> valVec = pAttr.getValues(); 72 if (valVec != null && valVec.size() > 0) buf.append('('); 73 buf.append(Convert.escape(pAttr.getId(), Convert.ATTR_RESERVED)); 74 if (valVec != null && valVec.size() > 0) { 75 buf.append('='); 76 Iterator<?> itr = valVec.iterator(); 77 boolean first = true; 78 while (itr.hasNext()) { 79 if (first) first = false; else buf.append(','); 80 buf.append(AttributeHandler.escapeValue(itr.next())); 81 } 82 buf.append(')'); 83 } 84 return buf.toString(); 85 } 86 87 /** 88 * escapeValue 89 * 90 * @param pValue 91 * @return String 92 */ 93 public static String escapeValue(Object pValue) { 94 if (pValue instanceof String) { 95 return Convert.escape((String) pValue, Convert.ATTR_RESERVED); 96 } else if (pValue instanceof Integer) { 97 return ((Integer) pValue).toString(); 98 } else if (pValue instanceof Boolean) { 99 return ((Boolean) pValue).toString(); 100 } else if (pValue instanceof byte[]) { 101 return AttributeHandler.mkOpaqueStr((byte[]) pValue); 102 } else if (pValue == null) { 103 return ""; 104 } 105 throw new IllegalArgumentException("Type: " + pValue.getClass().getName() + " cannot be an attribute value!"); 106 } 107 108 /** 109 * mkOpaqueStr 110 * 111 * @param pBytes 112 * @return String 113 */ 114 public static String mkOpaqueStr(byte[] pBytes) { 115 StringBuilder buf = new StringBuilder("\\FF"); 116 for (int i = 0; i < pBytes.length; i++) { 117 int value = pBytes[i] & 0xff; 118 String hexStr = Integer.toString(value, 16).toUpperCase(); 119 buf.append('\\'); 120 if (hexStr.length() == 1) buf.append('0'); 121 buf.append(hexStr); 122 } 123 return buf.toString(); 124 } 125 }