From: Dave B. <bla...@us...> - 2013-12-10 16:22:02
|
Update of /cvsroot/sblim/jsr48-client/src/org/sblim/cimclient/internal/cimxml In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv7285/src/org/sblim/cimclient/internal/cimxml Modified Files: CIMXMLParserImpl.java Log Message: 2715 Add VALUE.NULL support Index: CIMXMLParserImpl.java =================================================================== RCS file: /cvsroot/sblim/jsr48-client/src/org/sblim/cimclient/internal/cimxml/CIMXMLParserImpl.java,v retrieving revision 1.85 retrieving revision 1.86 diff -u -d -r1.85 -r1.86 --- CIMXMLParserImpl.java 9 Dec 2013 10:33:42 -0000 1.85 +++ CIMXMLParserImpl.java 10 Dec 2013 16:22:00 -0000 1.86 @@ -92,6 +92,7 @@ * 2710 2013-11-13 blaschke-oss parseVALUEOBJECTWITH(LOCAL)PATH ignores (LOCAL)CLASSPATH child * 2711 2013-11-13 blaschke-oss LOCALNAMESPACEPATH allows 0 NAMESPACE children * 2713 2013-11-22 blaschke-oss Enforce loose validation of CIM-XML documents + * 2715 2013-11-26 blaschke-oss Add VALUE.NULL support */ package org.sblim.cimclient.internal.cimxml; @@ -245,19 +246,27 @@ * value is always String[], the caller method have to convert it. * @throws CIMXMLParseException */ - @SuppressWarnings("null") public static TypedValue parseVALUEARRAY(Element pValueArrayE) throws CIMXMLParseException { - // <! ELEMENT VALUE.ARRAY (VALUE*)> + // <! ELEMENT VALUE.ARRAY (VALUE|VALUE.NULL)*> String typeStr = attribute(pValueArrayE, "TYPE"); CIMDataType type = typeStr == null ? null : parseArrayTypeStr(typeStr); - Element[] valueEA = searchNodes(pValueArrayE, "VALUE"); - String[] strA = new String[valueEA == null ? 0 : valueEA.length]; - for (int i = 0; i < strA.length; i++) { - Element valueE = valueEA[i]; - String valueStr = (String) parseVALUE(valueE).getValue(); - strA[i] = valueStr; + + // Process node list here, order of VALUE/VALUE.NULL IS important + NodeList nl = pValueArrayE.getChildNodes(); + if (nl == null || nl.getLength() == 0) return new TypedValue(type, new String[0]); + Vector<String> resStringV = new Vector<String>(); + for (int i = 0; i < nl.getLength(); i++) { + Node n = nl.item(i); + if (n instanceof Text && "".equalsIgnoreCase(n.getNodeValue().trim())) continue; + String name = n.getNodeName(); + if (name.equals("VALUE")) { + resStringV.add((String) parseVALUE((Element) n).getValue()); + } else if (name.equals("VALUE.NULL")) { + resStringV.add(null); + } else if (NODENAME_HASH.containsKey(name)) { throw new CIMXMLParseException( + "VALUE.ARRAY element contains invalid child element " + name + "!"); } } - return new TypedValue(type, strA); + return new TypedValue(type, resStringV.toArray(new String[0])); } /** @@ -337,18 +346,27 @@ * @return CIMObjectPath[] * @throws CIMXMLParseException */ - @SuppressWarnings("null") public static CIMObjectPath[] parseVALUEREFARRAY(Element pValueRefArrayE) throws CIMXMLParseException { - // <! ELEMENT VALUE.REFARRAY (VALUE.REFERENCE*)> - Element[] valueRefElementA = searchNodes(pValueRefArrayE, "VALUE.REFERENCE"); - CIMObjectPath[] resA = new CIMObjectPath[valueRefElementA == null ? 0 - : valueRefElementA.length]; - for (int i = 0; i < resA.length; i++) { - Element valueRefE = valueRefElementA[i]; - resA[i] = parseVALUEREFERENCE(valueRefE); + // <! ELEMENT VALUE.REFARRAY (VALUE.REFERENCE|VALUE.NULL)*> + + // Process node list here, order of VALUE.REFERENCE/VALUE.NULL IS + // important + NodeList nl = pValueRefArrayE.getChildNodes(); + if (nl == null || nl.getLength() == 0) return new CIMObjectPath[0]; + Vector<CIMObjectPath> resObjectPathV = new Vector<CIMObjectPath>(); + for (int i = 0; i < nl.getLength(); i++) { + Node n = nl.item(i); + if (n instanceof Text && "".equalsIgnoreCase(n.getNodeValue().trim())) continue; + String name = n.getNodeName(); + if (name.equals("VALUE.REFERENCE")) { + resObjectPathV.add(parseVALUEREFERENCE((Element) n)); + } else if (name.equals("VALUE.NULL")) { + resObjectPathV.add(null); + } else if (NODENAME_HASH.containsKey(name)) { throw new CIMXMLParseException( + "VALUE.REFARRAY element contains invalid child element " + name + "!"); } } - return resA; + return resObjectPathV.toArray(new CIMObjectPath[0]); } /** @@ -1561,6 +1579,7 @@ private static TypedValue parseSingleValue(Element pElement, int pMask) throws CIMXMLParseException { + boolean foundSingleValue = false; String typeStr = attribute(pElement, "TYPE"); // ebak: there was an ESS fix in the base implementation if (typeStr == null) typeStr = attribute(pElement, "PARAMTYPE"); @@ -1573,18 +1592,20 @@ String valueStr = (String) tVal.getValue(); type = typeStr == null ? tVal.getType() : parseScalarTypeStr(typeStr); value = createJavaObject(type == null ? null : type.toString(), valueStr); + foundSingleValue = true; } } - if (type == null && (pMask & VALUEREF) > 0) { + if (!foundSingleValue && (pMask & VALUEREF) > 0) { // VALUE.REFERENCE Element valuereferenceE = (Element) searchFirstNode(pElement, "VALUE.REFERENCE"); if (valuereferenceE != null) { CIMObjectPath op = parseVALUEREFERENCE(valuereferenceE); value = op; type = new CIMDataType(op.getObjectName()); + foundSingleValue = true; } } - if (type == null && (pMask & VALUEA) > 0) { + if (!foundSingleValue && (pMask & VALUEA) > 0) { // VALUE.ARRAY Element valuearrayE = (Element) searchFirstNode(pElement, "VALUE.ARRAY"); if (valuearrayE != null) { @@ -1599,18 +1620,20 @@ } value = values; } + foundSingleValue = true; } } - if (type == null && (pMask & VALUEREFA) > 0) { + if (!foundSingleValue && (pMask & VALUEREFA) > 0) { // VALUE.REFARRAY Element valueRefArrayE = (Element) searchFirstNode(pElement, "VALUE.REFARRAY"); if (valueRefArrayE != null) { - type = parseArrayTypeStr(typeStr); + type = new CIMDataType("", 0); CIMObjectPath[] opA = parseVALUEREFARRAY(valueRefArrayE); value = opA; + foundSingleValue = true; } } - if (type == null) { + if (!foundSingleValue) { if (value instanceof Object[]) type = CIMDataType.STRING_ARRAY_T; else if (value != null) type = CIMDataType.STRING_T; else type = CIMDataType.STRING_T; // /throw new @@ -2465,18 +2488,16 @@ // VALUE.ARRAY sub elements if (searchNodes(pParamValueE, "VALUE.REFERENCE", 0, 1, false) != null || searchNodes(pParamValueE, "VALUE.REFARRAY", 0, 1, false) != null) { - TypedValue typedValue = parseSingleValue(pParamValueE, VALUEREF); + TypedValue typedValue = parseSingleValue(pParamValueE, VALUEREF | VALUEREFA); CIMDataType type = typedValue.getType(); Object value = typedValue.getValue(); if (type == null) throw new CIMXMLParseException("PARAMVALUE element type is null!"); - checkOtherNodes(pParamValueE, nodesPARAMVALUE); return new CIMArgument<Object>(name, type, value); } if (searchNodes(pParamValueE, "VALUE", 0, 1, false) != null || searchNodes(pParamValueE, "VALUE.ARRAY", 0, 1, false) != null || !hasNodes(pParamValueE)) { EmbObjHandler embObjHandler = new EmbObjHandler(pParamValueE); - checkOtherNodes(pParamValueE, nodesPARAMVALUE); return new CIMArgument<Object>(name, embObjHandler.getType(), embObjHandler.getValue()); } |