source: NonGTP/Xerces/xercesc/dom/impl/DOMNormalizer.hpp @ 188

Revision 188, 7.7 KB checked in by mattausch, 19 years ago (diff)

added xercesc to support

Line 
1#ifndef DOMNormalizer_HEADER_GUARD_
2#define DOMNormalizer_HEADER_GUARD_
3
4/*
5 * The Apache Software License, Version 1.1
6 *
7 * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
8 * reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 *
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 *
17 * 2. Redistributions in binary form must reproduce the above copyright
18 *    notice, this list of conditions and the following disclaimer in
19 *    the documentation and/or other materials provided with the
20 *    distribution.
21 *
22 * 3. The end-user documentation included with the redistribution,
23 *    if any, must include the following acknowledgment:
24 *       "This product includes software developed by the
25 *        Apache Software Foundation (http://www.apache.org/)."
26 *    Alternately, this acknowledgment may appear in the software itself,
27 *    if and wherever such third-party acknowledgments normally appear.
28 *
29 * 4. The names "Xerces" and "Apache Software Foundation" must
30 *    not be used to endorse or promote products derived from this
31 *    software without prior written permission. For written
32 *    permission, please contact apache\@apache.org.
33 *
34 * 5. Products derived from this software may not be called "Apache",
35 *    nor may "Apache" appear in their name, without prior written
36 *    permission of the Apache Software Foundation.
37 *
38 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
39 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
40 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
41 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
42 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
44 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
45 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
46 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
47 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
48 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
49 * SUCH DAMAGE.
50 * ====================================================================
51 *
52 * This software consists of voluntary contributions made by many
53 * individuals on behalf of the Apache Software Foundation, and was
54 * originally based on software copyright (c) 2001, International
55 * Business Machines, Inc., http://www.ibm.com .  For more information
56 * on the Apache Software Foundation, please see
57 * <http://www.apache.org/>.
58 */
59
60
61//
62//  This file is part of the internal implementation of the C++ XML DOM.
63//  It should NOT be included or used directly by application programs.
64//
65//  Applications should include the file <xercesc/dom/DOM.hpp> for the entire
66//  DOM API, or xercesc/dom/DOM*.hpp for individual DOM classes, where the class
67//  name is substituded for the *.
68//
69
70#include <xercesc/util/XercesDefs.hpp>
71#include <xercesc/util/RefHashTableOf.hpp>
72#include <xercesc/util/RefVectorOf.hpp>
73#include <xercesc/framework/XMLErrorCodes.hpp>
74
75
76XERCES_CPP_NAMESPACE_BEGIN
77
78class DOMConfigurationImpl;
79class DOMDocumentImpl;
80class DOMNode;
81class DOMElementImpl;
82class DOMAttr;
83class DOMNamedNodeMap;
84
85class DOMNormalizer : public XMemory {
86
87    //the following are the data structures maintain the stack of namespace information
88    class InScopeNamespaces : public XMemory {
89        class Scope : public XMemory {
90        public:
91            Scope(Scope *baseScopeWithBindings);
92            ~Scope();
93            void addOrChangeBinding(const XMLCh *prefix, const XMLCh *uri,
94                                    MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
95            const XMLCh* getUri(const XMLCh *prefix) const;
96            const XMLCh* getPrefix(const XMLCh* uri) const;
97            Scope *fBaseScopeWithBindings;
98
99        private:
100            RefHashTableOf<XMLCh> *fPrefixHash;
101            RefHashTableOf<XMLCh> *fUriHash;
102            // unimplemented
103            Scope ( const Scope& toCopy);
104            Scope& operator= (const Scope& other);
105        };
106
107    public:   
108        InScopeNamespaces(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
109        ~InScopeNamespaces();
110        void addOrChangeBinding(const XMLCh *prefix, const XMLCh *uri,
111                                MemoryManager* const manager  = XMLPlatformUtils::fgMemoryManager);
112        void addScope(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
113        void removeScope();
114        bool isValidBinding(const XMLCh* prefix, const XMLCh* uri) const;
115        const XMLCh* getOrDeclarePrefix(const XMLCh* uri);
116        const XMLCh* getPrefix(const XMLCh* uri) const;
117        const XMLCh* getUri(const XMLCh* prefix) const;
118        int size();
119
120    private:
121        RefVectorOf<Scope> *fScopes;
122        Scope *lastScopeWithBindings;
123        // unimplemented
124        InScopeNamespaces ( const InScopeNamespaces& toCopy);
125        InScopeNamespaces& operator= (const InScopeNamespaces& other);
126    };
127
128public:
129    DOMNormalizer(MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager);
130    ~DOMNormalizer();
131
132    /**
133     * Main entry method to normalize a document
134     */
135    void normalizeDocument(DOMDocumentImpl *doc);
136
137    // -----------------------------------------------------------------------
138    //  Notification that lazy data has been deleted
139    // -----------------------------------------------------------------------
140        static void reinitNormalizerMutex();
141        static void reinitMsgLoader();
142
143private:
144    // unimplemented
145    DOMNormalizer ( const DOMNormalizer& toCopy);
146    DOMNormalizer& operator= (const DOMNormalizer& other);
147
148    /**
149     * Recursively normalizes a node
150     */
151    DOMNode * normalizeNode(DOMNode *node) const;
152
153    /**
154     * Helper method that fixes up the namespace declarations according to the
155     * DOM Level 3 psydocode
156     */
157    void namespaceFixUp(DOMElementImpl *ele) const;
158
159    /**
160     * Converts an integer to an XMLCh - max 15 digits long.
161     */
162    const XMLCh * integerToXMLCh(unsigned int i) const;
163
164    /**
165     * Adds a namespace attribute or replaces the value of existing namespace
166     * attribute with the given prefix and value for URI.
167     * In case prefix is empty will add/update default namespace declaration.
168     */
169    void addOrChangeNamespaceDecl(const XMLCh* prefix, const XMLCh* uri, DOMElementImpl *element) const;
170   
171    /**
172     * Adds a custom namespace in the form "NSx" where x is an integer that
173     * has not yet used in the document
174     */
175    const XMLCh* addCustomNamespaceDecl(const XMLCh* uri, DOMElementImpl *element) const;
176
177
178    /**
179     * Report an error
180     */
181    void error(const XMLErrs::Codes code, const DOMNode *node) const;
182
183    //
184    // fDocument - the document we are operating on
185    //
186    // fDOMConfiguration - the configuration from the document
187    //
188    // fErrorHandler - the errorhandler to be used when reporting errors during normalization
189    //
190    // fNSScope - the data stucture that holds the prefix-uri information
191    //
192    // fNewNamespaceCount - the number of custom namespace declarations we have created
193    //
194    DOMDocumentImpl *fDocument;
195    DOMConfigurationImpl *fConfiguration;
196    DOMErrorHandler *fErrorHandler;
197    InScopeNamespaces *fNSScope;
198    unsigned int fNewNamespaceCount;
199    MemoryManager* fMemoryManager;
200};
201
202
203
204XERCES_CPP_NAMESPACE_END
205
206#endif
Note: See TracBrowser for help on using the repository browser.