00001
00002
00003 #ifndef DETDESCCNV_XMLCONDITIONCNV_H
00004 #define DETDESCCNV_XMLCONDITIONCNV_H
00005
00007 #include "DetDescCnv/XmlGenericCnv.h"
00008 #include "DetDesc/Condition.h"
00009
00010 #include "GaudiKernel/Converter.h"
00011
00012 #include <xercesc/dom/DOMNodeList.hpp>
00013
00015 class ISvcLocator;
00016 template <class TYPE> class CnvFactory;
00017
00018
00025 class XmlBaseConditionCnv : public XmlGenericCnv {
00026
00027 public:
00028
00033 virtual StatusCode initialize();
00034
00039 static const CLID& classID();
00040
00041 protected:
00042
00047 XmlBaseConditionCnv(ISvcLocator* svcs);
00048
00054 XmlBaseConditionCnv(ISvcLocator* svc, const CLID& clsID );
00055
00059 virtual ~XmlBaseConditionCnv();
00060
00064 virtual StatusCode fillObjRefs(IOpaqueAddress* pAddress,
00065 DataObject* pObject);
00066
00070 virtual StatusCode updateObjRefs(IOpaqueAddress* pAddress,
00071 DataObject* pObject);
00072
00079 virtual StatusCode i_createObj (xercesc::DOMElement* element,
00080 DataObject*& refpObject);
00081
00089 virtual StatusCode i_fillObj (xercesc::DOMElement* childElement,
00090 DataObject* refpObject,
00091 IOpaqueAddress* address);
00092
00103 virtual StatusCode i_fillSpecificObj (xercesc::DOMElement* childElement,
00104 Condition* refpObject,
00105 IOpaqueAddress* address) = 0;
00106
00107 private:
00108
00110 bool m_doGenericCnv;
00111
00112
00113 const XMLCh* specificString;
00114 const XMLCh* paramString;
00115 const XMLCh* paramVectorString;
00116 const XMLCh* mapString;
00117 const XMLCh* itemString;
00118
00119
00120 const XMLCh* typeString;
00121 const XMLCh* nameString;
00122 const XMLCh* commentString;
00123 const XMLCh* keytypeString;
00124 const XMLCh* valuetypeString;
00125 const XMLCh* keyString;
00126 const XMLCh* valueString;
00127
00128
00129 template <class T>
00130 inline T i_convert(const XMLCh *value){
00131 return (T)xmlSvc()->eval(i_convert<std::string>(value), false);
00132 }
00133
00134 template <class T>
00135 inline T i_convert(const std::string &value){
00136 return (T)xmlSvc()->eval(value, false);
00137 }
00138
00139 template <class T>
00140 inline T i_convertVect(XMLCh *value){
00141 std::vector<T> v;
00142 std::istringstream cstr(i_convert<std::string>(value));
00143 std::string itemval;
00144 while (cstr >> itemval) {
00145 v.push_back(i_convert<T>(itemval));
00146 }
00147 return v;
00148 }
00149
00150 template <class K, class V>
00151 std::map<K,V> i_makeMap(xercesc::DOMNodeList* entries){
00152 std::map<K,V> map;
00153 XMLSize_t i;
00154 for (i = 0; i < entries->getLength(); i++) {
00155 xercesc::DOMNode* entryNode = entries->item(i);
00156 if (entryNode->getNodeType() == xercesc::DOMNode::ELEMENT_NODE) {
00157 xercesc::DOMElement* entry = static_cast<xercesc::DOMElement*>(entryNode);
00158 map[i_convert<K>(entry->getAttribute(keyString))] =
00159 i_convert<V>(entry->getAttribute(valueString));
00160 }
00161 }
00162 return map;
00163 }
00164 };
00165
00166 template <> inline std::string XmlBaseConditionCnv::i_convert<std::string>(const XMLCh *value){
00167 return dom2Std(value);
00168 }
00169
00170 template <> inline std::string XmlBaseConditionCnv::i_convert<std::string>(const std::string &value){
00171 return value;
00172 }
00173
00174 #endif // DETDESCCNV_XMLCONDITIONCNV_H
00175