00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00036 #include "OW_config.h"
00037 #include "OW_XMLQualifier.hpp"
00038 #include "OW_CIMFlavor.hpp"
00039 #include "OW_CIMScope.hpp"
00040 #include "OW_CIMQualifierType.hpp"
00041 #include "OW_CIMDataType.hpp"
00042 #include "OW_CIMValue.hpp"
00043 #include "OW_XMLCIMFactory.hpp"
00044 #include "OW_CIMException.hpp"
00045 #include "OW_CIMXMLParser.hpp"
00046 #include "OW_CIMName.hpp"
00047
00048 namespace OW_NAMESPACE
00049 {
00050
00051 namespace XMLQualifier
00052 {
00053
00054 void
00055 processQualifierDecl(CIMXMLParser& parser,
00056 CIMQualifierType& cimQualifier)
00057 {
00058 if (!parser.tokenIsId(CIMXMLParser::E_QUALIFIER_DECLARATION))
00059 {
00060 OW_THROWCIMMSG(CIMException::INVALID_PARAMETER, "Expected but did not find <QUALIFIER.DECLARATION>");
00061 }
00062 CIMName superClassName;
00063 CIMName inClassName;
00064 CIMName qualName = parser.mustGetAttribute(CIMXMLParser::A_NAME);
00065 cimQualifier.setName(qualName);
00066 String qualType = parser.mustGetAttribute(CIMXMLParser::A_TYPE);
00067 CIMDataType dt = CIMDataType::getDataType(qualType);
00068 String qualISARRAY = parser.getAttribute(CIMXMLParser::A_ISARRAY);
00069 if (qualISARRAY.equalsIgnoreCase("true"))
00070 {
00071 String qualArraySize = parser.getAttribute(CIMXMLParser::A_ARRAYSIZE);
00072 if (!qualArraySize.empty())
00073 {
00074 try
00075 {
00076 dt.setToArrayType(qualArraySize.toInt32());
00077 }
00078 catch (const StringConversionException&)
00079 {
00080 OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00081 "Invalid array size");
00082 }
00083 }
00084 else
00085 {
00086 dt.setToArrayType(-1);
00087 }
00088 }
00089 cimQualifier.setDataType(dt);
00090 String qualFlavor = parser.getAttribute("OVERRIDABLE");
00091 if (qualFlavor.equalsIgnoreCase("false"))
00092 {
00093 cimQualifier.addFlavor(CIMFlavor(CIMFlavor::DISABLEOVERRIDE));
00094 }
00095 else
00096 {
00097 cimQualifier.addFlavor(CIMFlavor(CIMFlavor::ENABLEOVERRIDE));
00098 }
00099 qualFlavor = parser.getAttribute("TOSUBCLASS");
00100 if (qualFlavor.equalsIgnoreCase("false"))
00101 {
00102 cimQualifier.addFlavor(CIMFlavor(CIMFlavor::RESTRICTED));
00103 }
00104 else
00105 {
00106 cimQualifier.addFlavor(CIMFlavor(CIMFlavor::TOSUBCLASS));
00107 }
00108
00109
00110
00111
00112
00113 qualFlavor = parser.getAttribute("TRANSLATABLE");
00114 if (qualFlavor.equalsIgnoreCase("true"))
00115 {
00116 cimQualifier.addFlavor(CIMFlavor(CIMFlavor::TRANSLATE));
00117 }
00118 parser.getNextTag();
00119 if (parser.tokenIsId(CIMXMLParser::E_SCOPE))
00120 {
00121
00122 processScope(parser,cimQualifier,"CLASS",CIMScope::CLASS);
00123 processScope(parser,cimQualifier,"ASSOCIATION",CIMScope::ASSOCIATION);
00124 processScope(parser,cimQualifier,"REFERENCE",CIMScope::REFERENCE);
00125 processScope(parser,cimQualifier,"PROPERTY",CIMScope::PROPERTY);
00126 processScope(parser,cimQualifier,"METHOD",CIMScope::METHOD);
00127 processScope(parser,cimQualifier,"PARAMETER",CIMScope::PARAMETER);
00128 processScope(parser,cimQualifier,"INDICATION",CIMScope::INDICATION);
00129 if (cimQualifier.hasScope(CIMScope::CLASS) &&
00130 cimQualifier.hasScope(CIMScope::ASSOCIATION) &&
00131 cimQualifier.hasScope(CIMScope::REFERENCE) &&
00132 cimQualifier.hasScope(CIMScope::PROPERTY) &&
00133 cimQualifier.hasScope(CIMScope::METHOD) &&
00134 cimQualifier.hasScope(CIMScope::PARAMETER) &&
00135 cimQualifier.hasScope(CIMScope::INDICATION))
00136 {
00137 cimQualifier.addScope(CIMScope::ANY);
00138 }
00139 parser.mustGetNextTag();
00140 parser.mustGetEndTag();
00141 }
00142 else
00143 {
00144
00145
00146
00147 cimQualifier.addScope(CIMScope::ANY);
00148 }
00149 if (parser.tokenIsId(CIMXMLParser::E_VALUE) ||
00150 parser.tokenIsId(CIMXMLParser::E_VALUE_ARRAY))
00151 {
00152
00153 CIMValue val = XMLCIMFactory::createValue(parser,qualType, XMLCIMFactory::E_VALUE_NOT_EMBEDDED_OBJECT);
00154 cimQualifier.setDefaultValue(val);
00155 }
00156 parser.mustGetEndTag();
00157 }
00159 void
00160 processScope(CIMXMLParser& parser,
00161 CIMQualifierType& cqt, const char* attrName,
00162 CIMScope::Scope scopeValue)
00163 {
00164 String scope = parser.getAttribute(attrName);
00165 if (scope.empty())
00166 {
00167 return;
00168 }
00169
00170 if (scope.equalsIgnoreCase("true"))
00171 {
00172 cqt.addScope(CIMScope(scopeValue));
00173 }
00174 else if (!scope.equalsIgnoreCase("false"))
00175 {
00176 OW_THROWCIM(CIMException::FAILED);
00177 }
00178 }
00180 String
00181 getQualifierName(CIMXMLParser& parser)
00182 {
00183 if (!parser.tokenIsId(CIMXMLParser::E_IPARAMVALUE))
00184 {
00185 OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00186 "Expected IPARAMVALUE to lead into QualifierName");
00187 }
00188 String propertyName = parser.mustGetAttribute(CIMXMLParser::A_NAME);
00189 if (!propertyName.equalsIgnoreCase(CIMXMLParser::P_QualifierName))
00190 {
00191 OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00192 "Cannot find qualifier name");
00193 }
00194 parser.getChild();
00195 if (!parser.tokenIsId(CIMXMLParser::E_VALUE))
00196 {
00197 OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00198 "Cannot find value for qualifier name");
00199 }
00200 parser.mustGetNext();
00201 if (!parser.isData())
00202 {
00203 OW_THROWCIMMSG(CIMException::INVALID_PARAMETER,
00204 "Cannot find value for qualifier name");
00205 }
00206 String name = parser.getData();
00207 parser.mustGetNextTag();
00208 parser.mustGetEndTag();
00209 return name;
00210 }
00211
00212 }
00213 }
00214