2 * Copyright 2001-2007 Internet2
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 * DOM-based property set implementation.
24 #include "util/DOMPropertySet.h"
27 #include <xmltooling/util/NDC.h>
28 #include <xmltooling/util/XMLConstants.h>
30 using namespace shibsp;
31 using namespace xmltooling;
32 using namespace xercesc;
35 DOMPropertySet::~DOMPropertySet()
37 for (map<string,pair<char*,const XMLCh*> >::iterator i=m_map.begin(); i!=m_map.end(); i++)
38 XMLString::release(&(i->second.first));
39 for_each(m_nested.begin(),m_nested.end(),cleanup_pair<string,DOMPropertySet>());
42 void DOMPropertySet::load(
45 DOMNodeFilter* filter,
46 const std::map<std::string,std::string>* remapper
56 log = &Category::getInstance(SHIBSP_LOGCAT".PropertySet");
58 // Process each attribute as a property.
59 DOMNamedNodeMap* attrs=m_root->getAttributes();
60 for (XMLSize_t i=0; i<attrs->getLength(); i++) {
61 DOMNode* a=attrs->item(i);
62 if (!XMLString::compareString(a->getNamespaceURI(),xmlconstants::XMLNS_NS))
64 char* val=XMLString::transcode(a->getNodeValue());
66 auto_ptr_char ns(a->getNamespaceURI());
67 auto_ptr_char name(a->getLocalName());
68 const char* realname=name.get();
69 map<string,string>::const_iterator remap;
71 remap=remapper->find(realname);
72 if (remap!=remapper->end()) {
73 log->warn("remapping property (%s) to (%s)",realname,remap->second.c_str());
74 realname=remap->second.c_str();
78 if (remapper && (remap=remapper->find(ns.get()))!=remapper->end())
79 m_map[string("{") + remap->second.c_str() + '}' + realname]=pair<char*,const XMLCh*>(val,a->getNodeValue());
81 m_map[string("{") + ns.get() + '}' + realname]=pair<char*,const XMLCh*>(val,a->getNodeValue());
82 log->debug("added property {%s}%s (%s)",ns.get(),realname,val);
85 m_map[realname]=pair<char*,const XMLCh*>(val,a->getNodeValue());
86 log->debug("added property %s (%s)",realname,val);
91 // Process non-excluded elements as nested sets.
92 DOMTreeWalker* walker=
93 static_cast<DOMDocumentTraversal*>(
94 m_root->getOwnerDocument())->createTreeWalker(const_cast<DOMElement*>(m_root),DOMNodeFilter::SHOW_ELEMENT,filter,false
96 e=static_cast<DOMElement*>(walker->firstChild());
98 auto_ptr_char ns(e->getNamespaceURI());
99 auto_ptr_char name(e->getLocalName());
100 const char* realname=name.get();
101 map<string,string>::const_iterator remap;
103 remap=remapper->find(realname);
104 if (remap!=remapper->end()) {
105 log->warn("remapping property set (%s) to (%s)",realname,remap->second.c_str());
106 realname=remap->second.c_str();
111 if (remapper && (remap=remapper->find(ns.get()))!=remapper->end())
112 key=string("{") + remap->second.c_str() + '}' + realname;
114 key=string("{") + ns.get() + '}' + realname;
118 if (m_nested.find(key)!=m_nested.end())
119 log->warn("load() skipping duplicate property set: %s",key.c_str());
121 DOMPropertySet* set=new DOMPropertySet();
122 set->load(e,log,filter,remapper);
124 log->debug("added nested property set: %s",key.c_str());
126 e=static_cast<DOMElement*>(walker->nextSibling());
131 pair<bool,bool> DOMPropertySet::getBool(const char* name, const char* ns) const
133 map<string,pair<char*,const XMLCh*> >::const_iterator i;
136 i=m_map.find(string("{") + ns + '}' + name);
141 return make_pair(true,(!strcmp(i->second.first,"true") || !strcmp(i->second.first,"1")));
143 return m_parent->getBool(name,ns);
144 return make_pair(false,false);
147 pair<bool,const char*> DOMPropertySet::getString(const char* name, const char* ns) const
149 pair<bool,const char*> ret(false,NULL);
150 map<string,pair<char*,const XMLCh*> >::const_iterator i;
153 i=m_map.find(string("{") + ns + '}' + name);
158 return pair<bool,const char*>(true,i->second.first);
160 return m_parent->getString(name,ns);
161 return pair<bool,const char*>(false,NULL);
164 pair<bool,const XMLCh*> DOMPropertySet::getXMLString(const char* name, const char* ns) const
166 map<string,pair<char*,const XMLCh*> >::const_iterator i;
169 i=m_map.find(string("{") + ns + '}' + name);
174 return make_pair(true,i->second.second);
176 return m_parent->getXMLString(name,ns);
177 return pair<bool,const XMLCh*>(false,NULL);
180 pair<bool,unsigned int> DOMPropertySet::getUnsignedInt(const char* name, const char* ns) const
182 map<string,pair<char*,const XMLCh*> >::const_iterator i;
185 i=m_map.find(string("{") + ns + '}' + name);
190 return pair<bool,unsigned int>(true,strtol(i->second.first,NULL,10));
192 return m_parent->getUnsignedInt(name,ns);
193 return pair<bool,unsigned int>(false,0);
196 pair<bool,int> DOMPropertySet::getInt(const char* name, const char* ns) const
198 map<string,pair<char*,const XMLCh*> >::const_iterator i;
201 i=m_map.find(string("{") + ns + '}' + name);
206 return pair<bool,int>(true,atoi(i->second.first));
208 return m_parent->getInt(name,ns);
209 return pair<bool,int>(false,0);
212 void DOMPropertySet::getAll(std::map<std::string,const char*>& properties) const
215 m_parent->getAll(properties);
216 for (map< string,pair<char*,const XMLCh*> >::const_iterator i = m_map.begin(); i != m_map.end(); ++i)
217 properties[i->first] = i->second.first;
220 const PropertySet* DOMPropertySet::getPropertySet(const char* name, const char* ns) const
222 map<string,DOMPropertySet*>::const_iterator i;
225 i=m_nested.find(string("{") + ns + '}' + name);
227 i=m_nested.find(name);
229 return (i!=m_nested.end()) ? i->second : (m_parent ? m_parent->getPropertySet(name,ns) : NULL);