Refined ElementProxy/ElementExtensible interfaces to match Java.
[shibboleth/cpp-xmltooling.git] / xmltooling / AttributeExtensibleXMLObject.h
1 /*
2  *  Copyright 2001-2006 Internet2
3  * 
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
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 /**
18  * @file xmltooling/AttributeExtensibleXMLObject.h
19  * 
20  * An XMLObject that supports arbitrary attributes 
21  */
22
23 #ifndef __xmltooling_attrextxmlobj_h__
24 #define __xmltooling_attrextxmlobj_h__
25
26 #include <xmltooling/XMLObject.h>
27
28 #if defined (_MSC_VER)
29     #pragma warning( push )
30     #pragma warning( disable : 4250 4251 )
31 #endif
32
33 namespace xmltooling {
34
35     /**
36      * An XMLObject that supports arbitrary attributes.
37      */
38     class XMLTOOL_API AttributeExtensibleXMLObject : public virtual XMLObject
39     {
40     protected:
41         AttributeExtensibleXMLObject() {}
42         
43     public:
44         virtual ~AttributeExtensibleXMLObject() {}
45         
46         /**
47          * Gets the value of an XML attribute of the object.
48          * 
49          * @param   qualifiedName   qualified name of the attribute   
50          * @return the attribute value, or NULL
51          */
52         virtual const XMLCh* getAttribute(const QName& qualifiedName) const=0;
53         
54         /**
55          * Sets (or clears) an XML attribute of the object.
56          * 
57          * @param qualifiedName qualified name of the attribute   
58          * @param value         value to set, or NULL to clear
59          * @param ID            true iff the attribute is an XML ID
60          */
61         virtual void setAttribute(const QName& qualifiedName, const XMLCh* value, bool ID=false)=0;
62
63         /**
64          * Gets an immutable map of the extended XML attributes of the object.
65          * 
66          * This set is not guaranteed to (and generally will not) include
67          * attributes defined directly on the object's "type".
68          */
69         virtual const std::map<QName,XMLCh*>& getExtensionAttributes() const=0;
70         
71         /**
72          * Gets an immutable list of all the ID attributes currently registered.
73          * 
74          * @return list of all the ID attributes currently registered
75          */
76         static const std::set<QName>& getRegisteredIDAttributes() {
77             return m_idAttributeSet;
78         }
79         
80         /**
81          * Tests whether an XML attribute is registered as an XML ID.
82          * 
83          * @return true iff the attribute name matches a registered XML ID attribute 
84          */
85         static bool isRegisteredIDAttribute(const QName& name) {
86             return m_idAttributeSet.find(name)!=m_idAttributeSet.end();
87         }
88     
89         /**
90          * Registers a new attribute as being of XML ID type.
91          * 
92          * @param name the qualified attribute name
93          */
94         static void registerIDAttribute(const QName& name) {
95             m_idAttributeSet.insert(name);
96         }
97
98         /**
99          * Deregisters an ID attribute.
100          * 
101          * @param name the qualified attribute name
102          */
103         static void deregisterIDAttribute(const QName& name) {
104             m_idAttributeSet.erase(name);
105         }
106         
107         /**
108          * Deregisters all ID attributes.
109          */
110         static void deregisterIDAttributes() {
111             m_idAttributeSet.clear();
112         }
113
114     private:
115         /** Set of attributes to treat as XML IDs. */
116         static std::set<QName> m_idAttributeSet;
117     };
118     
119 };
120
121 #if defined (_MSC_VER)
122     #pragma warning( pop )
123 #endif
124
125 #endif /* __xmltooling_attrextxmlobj_h__ */