1e62c1185bee05facc25d1d725434f517261d308bChris Lattner/*
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman * Licensed to the Apache Software Foundation (ASF) under one
301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell * or more contributor license agreements. See the NOTICE file
401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell * distributed with this work for additional information
501d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell * regarding copyright ownership. The ASF licenses this file
601d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell * to you under the Apache License, Version 2.0 (the  "License");
73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman * you may not use this file except in compliance with the License.
801d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell * You may obtain a copy of the License at
9e62c1185bee05facc25d1d725434f517261d308bChris Lattner *
1014d7c59491347a2f8f29e120fd75a4cad42f68e7Chris Lattner *     http://www.apache.org/licenses/LICENSE-2.0
1114d7c59491347a2f8f29e120fd75a4cad42f68e7Chris Lattner *
12e62c1185bee05facc25d1d725434f517261d308bChris Lattner * Unless required by applicable law or agreed to in writing, software
13e62c1185bee05facc25d1d725434f517261d308bChris Lattner * distributed under the License is distributed on an "AS IS" BASIS,
14e62c1185bee05facc25d1d725434f517261d308bChris Lattner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15e62c1185bee05facc25d1d725434f517261d308bChris Lattner * See the License for the specific language governing permissions and
16e62c1185bee05facc25d1d725434f517261d308bChris Lattner * limitations under the License.
17e62c1185bee05facc25d1d725434f517261d308bChris Lattner */
18e62c1185bee05facc25d1d725434f517261d308bChris Lattner/*
19e62c1185bee05facc25d1d725434f517261d308bChris Lattner * $Id: SerializerUtils.java 468642 2006-10-28 06:55:10Z minchau $
20e62c1185bee05facc25d1d725434f517261d308bChris Lattner */
21e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpackage org.apache.xalan.serialize;
22b5b3c6fc0147b2e59b45f7f2882c7c615bb765aeChris Lattner
23028936ada14335bb04f377d46a6261dc4c66dafdJohn Criswellimport javax.xml.transform.TransformerException;
24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekeimport org.apache.xalan.transformer.TransformerImpl;
267dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattnerimport org.apache.xml.dtm.DTM;
277cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerimport org.apache.xml.serializer.NamespaceMappings;
287cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerimport org.apache.xml.serializer.SerializationHandler;
297cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerimport org.apache.xpath.XPathContext;
307cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerimport org.apache.xpath.objects.XObject;
317cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattnerimport org.xml.sax.SAXException;
327cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
3340f71134b9fef0ca06c516f033cc9403394a913cChris Lattner/**
347cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner * Class that contains only static methods that are used to "serialize",
357cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner * these methods are used by Xalan and are not in org.apache.xml.serializer
367dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner * because they have dependancies on the packages org.apache.xpath or org.
371fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattner * apache.xml.dtm or org.apache.xalan.transformer. The package org.apache.xml.
38e62c1185bee05facc25d1d725434f517261d308bChris Lattner * serializer should not depend on Xalan or XSLTC.
39e62c1185bee05facc25d1d725434f517261d308bChris Lattner * @xsl.usage internal
40e62c1185bee05facc25d1d725434f517261d308bChris Lattner */
41e62c1185bee05facc25d1d725434f517261d308bChris Lattnerpublic class SerializerUtils
42e62c1185bee05facc25d1d725434f517261d308bChris Lattner{
43e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner
44e62c1185bee05facc25d1d725434f517261d308bChris Lattner    /**
45711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner     * Copy an DOM attribute to the created output element, executing
46e62c1185bee05facc25d1d725434f517261d308bChris Lattner     * attribute templates as need be, and processing the xsl:use
478e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner     * attribute.
48b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner     *
49b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner     * @param handler SerializationHandler to which the attributes are added.
50a1651900e1772b05afd2280308e9acc5a58cefb8Chris Lattner     * @param attr Attribute node to add to SerializationHandler.
51b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner     *
521dba7abdd77e19c230f0426825a5ae4879471dccChris Lattner     * @throws TransformerException
537cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner     */
547dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner    public static void addAttribute(SerializationHandler handler, int attr)
55e62c1185bee05facc25d1d725434f517261d308bChris Lattner        throws TransformerException
567dda395004eb962cef1c1554b1e8b2ad069760e0Chris Lattner    {
57e62c1185bee05facc25d1d725434f517261d308bChris Lattner
58e62c1185bee05facc25d1d725434f517261d308bChris Lattner        TransformerImpl transformer =
59e62c1185bee05facc25d1d725434f517261d308bChris Lattner            (TransformerImpl) handler.getTransformer();
60e62c1185bee05facc25d1d725434f517261d308bChris Lattner        DTM dtm = transformer.getXPathContext().getDTM(attr);
61e62c1185bee05facc25d1d725434f517261d308bChris Lattner
62e62c1185bee05facc25d1d725434f517261d308bChris Lattner        if (SerializerUtils.isDefinedNSDecl(handler, attr, dtm))
63e62c1185bee05facc25d1d725434f517261d308bChris Lattner            return;
64e62c1185bee05facc25d1d725434f517261d308bChris Lattner
657cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner        String ns = dtm.getNamespaceURI(attr);
667cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
677cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner        if (ns == null)
687cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner            ns = "";
697cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
707cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner        // %OPT% ...can I just store the node handle?
717cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner        try
727cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner        {
73e62c1185bee05facc25d1d725434f517261d308bChris Lattner            handler.addAttribute(
74e62c1185bee05facc25d1d725434f517261d308bChris Lattner                ns,
75e62c1185bee05facc25d1d725434f517261d308bChris Lattner                dtm.getLocalName(attr),
76e62c1185bee05facc25d1d725434f517261d308bChris Lattner                dtm.getNodeName(attr),
77e62c1185bee05facc25d1d725434f517261d308bChris Lattner                "CDATA",
78e62c1185bee05facc25d1d725434f517261d308bChris Lattner                dtm.getNodeValue(attr), false);
79711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner        }
80e3a1d054483d6e2551a43232f2c968fc7ce523f2Chris Lattner        catch (SAXException e)
81e62c1185bee05facc25d1d725434f517261d308bChris Lattner        {
82e62c1185bee05facc25d1d725434f517261d308bChris Lattner            // do something?
838e9a9774eb12b5242f74b8ac5b20e0a938ec9c53Chris Lattner        }
84b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner    } // end copyAttributeToTarget method
85b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner
86b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner    /**
87b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner     * Copy DOM attributes to the result element.
88b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner     *
89b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner     * @param src Source node with the attributes
90b45b3b3cd14faaf5a3ea5226af7e1e3cd653e6cbChris Lattner     *
91e62c1185bee05facc25d1d725434f517261d308bChris Lattner     * @throws TransformerException
927cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner     */
937cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    public static void addAttributes(SerializationHandler handler, int src)
947cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner        throws TransformerException
957cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    {
967cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
977cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner        TransformerImpl transformer =
987cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner            (TransformerImpl) handler.getTransformer();
997cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner        DTM dtm = transformer.getXPathContext().getDTM(src);
1007cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
10140f71134b9fef0ca06c516f033cc9403394a913cChris Lattner        for (int node = dtm.getFirstAttribute(src);
1027cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner            DTM.NULL != node;
103e62c1185bee05facc25d1d725434f517261d308bChris Lattner            node = dtm.getNextAttribute(node))
104e62c1185bee05facc25d1d725434f517261d308bChris Lattner        {
105e62c1185bee05facc25d1d725434f517261d308bChris Lattner            addAttribute(handler, node);
106e62c1185bee05facc25d1d725434f517261d308bChris Lattner        }
107e62c1185bee05facc25d1d725434f517261d308bChris Lattner    }
108e62c1185bee05facc25d1d725434f517261d308bChris Lattner
109e62c1185bee05facc25d1d725434f517261d308bChris Lattner    /**
11007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner     * Given a result tree fragment, walk the tree and
11107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner     * output it to the SerializationHandler.
11207278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner     *
1131fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattner     * @param obj Result tree fragment object
1141fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattner     * @param support XPath context for the result tree fragment
115ead87b671278379f92890fddd859a301bb68f462Reid Spencer     *
116ead87b671278379f92890fddd859a301bb68f462Reid Spencer     * @throws org.xml.sax.SAXException
117ead87b671278379f92890fddd859a301bb68f462Reid Spencer     */
118ead87b671278379f92890fddd859a301bb68f462Reid Spencer    public static void outputResultTreeFragment(
119ead87b671278379f92890fddd859a301bb68f462Reid Spencer        SerializationHandler handler,
120ead87b671278379f92890fddd859a301bb68f462Reid Spencer        XObject obj,
121ead87b671278379f92890fddd859a301bb68f462Reid Spencer        XPathContext support)
122ead87b671278379f92890fddd859a301bb68f462Reid Spencer        throws org.xml.sax.SAXException
123ead87b671278379f92890fddd859a301bb68f462Reid Spencer    {
124ead87b671278379f92890fddd859a301bb68f462Reid Spencer
125ead87b671278379f92890fddd859a301bb68f462Reid Spencer        int doc = obj.rtf();
126ead87b671278379f92890fddd859a301bb68f462Reid Spencer        DTM dtm = support.getDTM(doc);
127ead87b671278379f92890fddd859a301bb68f462Reid Spencer
128e62c1185bee05facc25d1d725434f517261d308bChris Lattner        if (null != dtm)
129e62c1185bee05facc25d1d725434f517261d308bChris Lattner        {
1307cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner            for (int n = dtm.getFirstChild(doc);
1317cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner                DTM.NULL != n;
1327cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner                n = dtm.getNextSibling(n))
1337cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner            {
134ead87b671278379f92890fddd859a301bb68f462Reid Spencer                handler.flushPending();
135ead87b671278379f92890fddd859a301bb68f462Reid Spencer
136ead87b671278379f92890fddd859a301bb68f462Reid Spencer                // I think. . . . This used to have a (true) arg
137ead87b671278379f92890fddd859a301bb68f462Reid Spencer                // to flush prefixes, will that cause problems ???
138ead87b671278379f92890fddd859a301bb68f462Reid Spencer                if (dtm.getNodeType(n) == DTM.ELEMENT_NODE
139ead87b671278379f92890fddd859a301bb68f462Reid Spencer                        && dtm.getNamespaceURI(n) == null)
140ead87b671278379f92890fddd859a301bb68f462Reid Spencer                    handler.startPrefixMapping("", "");
141ead87b671278379f92890fddd859a301bb68f462Reid Spencer                dtm.dispatchToEvents(n, handler);
142ead87b671278379f92890fddd859a301bb68f462Reid Spencer            }
143e62c1185bee05facc25d1d725434f517261d308bChris Lattner        }
144e62c1185bee05facc25d1d725434f517261d308bChris Lattner    }
14507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner
146234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman    /**
147234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman     * Copy <KBD>xmlns:</KBD> attributes in if not already in scope.
14807278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner     *
149e62c1185bee05facc25d1d725434f517261d308bChris Lattner     * As a quick hack to support ClonerToResultTree, this can also be used
150e62c1185bee05facc25d1d725434f517261d308bChris Lattner     * to copy an individual namespace node.
151e62c1185bee05facc25d1d725434f517261d308bChris Lattner     *
152e62c1185bee05facc25d1d725434f517261d308bChris Lattner     * @param src Source Node
153e62c1185bee05facc25d1d725434f517261d308bChris Lattner     * NEEDSDOC @param type
154e62c1185bee05facc25d1d725434f517261d308bChris Lattner     * NEEDSDOC @param dtm
155e62c1185bee05facc25d1d725434f517261d308bChris Lattner     *
156ead87b671278379f92890fddd859a301bb68f462Reid Spencer     * @throws TransformerException
157ead87b671278379f92890fddd859a301bb68f462Reid Spencer     */
158ead87b671278379f92890fddd859a301bb68f462Reid Spencer    public static void processNSDecls(
159ead87b671278379f92890fddd859a301bb68f462Reid Spencer        SerializationHandler handler,
160ead87b671278379f92890fddd859a301bb68f462Reid Spencer        int src,
161ead87b671278379f92890fddd859a301bb68f462Reid Spencer        int type,
162ead87b671278379f92890fddd859a301bb68f462Reid Spencer        DTM dtm)
163ead87b671278379f92890fddd859a301bb68f462Reid Spencer        throws TransformerException
164ead87b671278379f92890fddd859a301bb68f462Reid Spencer    {
165ead87b671278379f92890fddd859a301bb68f462Reid Spencer
166ead87b671278379f92890fddd859a301bb68f462Reid Spencer        try
167ead87b671278379f92890fddd859a301bb68f462Reid Spencer        {
168ead87b671278379f92890fddd859a301bb68f462Reid Spencer            if (type == DTM.ELEMENT_NODE)
169ead87b671278379f92890fddd859a301bb68f462Reid Spencer            {
170e62c1185bee05facc25d1d725434f517261d308bChris Lattner                for (int namespace = dtm.getFirstNamespaceNode(src, true);
171e62c1185bee05facc25d1d725434f517261d308bChris Lattner                    DTM.NULL != namespace;
1727cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner                    namespace = dtm.getNextNamespaceNode(src, namespace, true))
1737cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner                {
1747cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
1757cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner                    // String prefix = dtm.getPrefix(namespace);
176ead87b671278379f92890fddd859a301bb68f462Reid Spencer                    String prefix = dtm.getNodeNameX(namespace);
177ead87b671278379f92890fddd859a301bb68f462Reid Spencer                    String desturi = handler.getNamespaceURIFromPrefix(prefix);
1787cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner                    //            String desturi = getURI(prefix);
1797cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner                    String srcURI = dtm.getNodeValue(namespace);
180ead87b671278379f92890fddd859a301bb68f462Reid Spencer
181ead87b671278379f92890fddd859a301bb68f462Reid Spencer                    if (!srcURI.equalsIgnoreCase(desturi))
182ead87b671278379f92890fddd859a301bb68f462Reid Spencer                    {
183ead87b671278379f92890fddd859a301bb68f462Reid Spencer                        handler.startPrefixMapping(prefix, srcURI, false);
184ead87b671278379f92890fddd859a301bb68f462Reid Spencer                    }
185ead87b671278379f92890fddd859a301bb68f462Reid Spencer                }
186ead87b671278379f92890fddd859a301bb68f462Reid Spencer            }
187e62c1185bee05facc25d1d725434f517261d308bChris Lattner            else if (type == DTM.NAMESPACE_NODE)
188e62c1185bee05facc25d1d725434f517261d308bChris Lattner            {
18907278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner                String prefix = dtm.getNodeNameX(src);
19007278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner                // Brian M. - some changes here to get desturi
19107278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner                String desturi = handler.getNamespaceURIFromPrefix(prefix);
1921fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattner                String srcURI = dtm.getNodeValue(src);
1931fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattner
194ead87b671278379f92890fddd859a301bb68f462Reid Spencer                if (!srcURI.equalsIgnoreCase(desturi))
195ead87b671278379f92890fddd859a301bb68f462Reid Spencer                {
196ead87b671278379f92890fddd859a301bb68f462Reid Spencer                    handler.startPrefixMapping(prefix, srcURI, false);
197ead87b671278379f92890fddd859a301bb68f462Reid Spencer                }
198ead87b671278379f92890fddd859a301bb68f462Reid Spencer            }
199ead87b671278379f92890fddd859a301bb68f462Reid Spencer        }
200ead87b671278379f92890fddd859a301bb68f462Reid Spencer        catch (org.xml.sax.SAXException se)
201ead87b671278379f92890fddd859a301bb68f462Reid Spencer        {
202ead87b671278379f92890fddd859a301bb68f462Reid Spencer            throw new TransformerException(se);
203ead87b671278379f92890fddd859a301bb68f462Reid Spencer        }
204ead87b671278379f92890fddd859a301bb68f462Reid Spencer    }
205ead87b671278379f92890fddd859a301bb68f462Reid Spencer
206ead87b671278379f92890fddd859a301bb68f462Reid Spencer    /**
207ead87b671278379f92890fddd859a301bb68f462Reid Spencer     * Returns whether a namespace is defined
208e62c1185bee05facc25d1d725434f517261d308bChris Lattner     *
209e62c1185bee05facc25d1d725434f517261d308bChris Lattner     *
2107cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner     * @param attr Namespace attribute node
2117cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner     * @param dtm The DTM that owns attr.
2127cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner     *
2137cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner     * @return True if the namespace is already defined in
2147cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner     * list of namespaces
215ead87b671278379f92890fddd859a301bb68f462Reid Spencer     */
216ead87b671278379f92890fddd859a301bb68f462Reid Spencer    public static boolean isDefinedNSDecl(
217ead87b671278379f92890fddd859a301bb68f462Reid Spencer        SerializationHandler serializer,
218ead87b671278379f92890fddd859a301bb68f462Reid Spencer        int attr,
219ead87b671278379f92890fddd859a301bb68f462Reid Spencer        DTM dtm)
220ead87b671278379f92890fddd859a301bb68f462Reid Spencer    {
221ead87b671278379f92890fddd859a301bb68f462Reid Spencer
222ead87b671278379f92890fddd859a301bb68f462Reid Spencer        if (DTM.NAMESPACE_NODE == dtm.getNodeType(attr))
223ead87b671278379f92890fddd859a301bb68f462Reid Spencer        {
224e62c1185bee05facc25d1d725434f517261d308bChris Lattner
225e62c1185bee05facc25d1d725434f517261d308bChris Lattner            // String prefix = dtm.getPrefix(attr);
22607278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner            String prefix = dtm.getNodeNameX(attr);
22707278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner            String uri = serializer.getNamespaceURIFromPrefix(prefix);
2281fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattner            //      String uri = getURI(prefix);
2291fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattner
230ead87b671278379f92890fddd859a301bb68f462Reid Spencer            if ((null != uri) && uri.equals(dtm.getStringValue(attr)))
231ead87b671278379f92890fddd859a301bb68f462Reid Spencer                return true;
232ead87b671278379f92890fddd859a301bb68f462Reid Spencer        }
233ead87b671278379f92890fddd859a301bb68f462Reid Spencer
234ead87b671278379f92890fddd859a301bb68f462Reid Spencer        return false;
235ead87b671278379f92890fddd859a301bb68f462Reid Spencer    }
236711e5d96aa648ebe96b09483d0775f3b16283e3dChris Lattner
237ead87b671278379f92890fddd859a301bb68f462Reid Spencer    /**
238ead87b671278379f92890fddd859a301bb68f462Reid Spencer     * This function checks to make sure a given prefix is really
239ead87b671278379f92890fddd859a301bb68f462Reid Spencer     * declared.  It might not be, because it may be an excluded prefix.
240ead87b671278379f92890fddd859a301bb68f462Reid Spencer     * If it's not, it still needs to be declared at this point.
241ead87b671278379f92890fddd859a301bb68f462Reid Spencer     * TODO: This needs to be done at an earlier stage in the game... -sb
242ead87b671278379f92890fddd859a301bb68f462Reid Spencer     *
243ead87b671278379f92890fddd859a301bb68f462Reid Spencer     * NEEDSDOC @param dtm
244ead87b671278379f92890fddd859a301bb68f462Reid Spencer     * NEEDSDOC @param namespace
245e62c1185bee05facc25d1d725434f517261d308bChris Lattner     *
2467cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner     * @throws org.xml.sax.SAXException
2477cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner     */
2487cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner    public static void ensureNamespaceDeclDeclared(
2497cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner        SerializationHandler handler,
2507cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner        DTM dtm,
251ead87b671278379f92890fddd859a301bb68f462Reid Spencer        int namespace)
252ead87b671278379f92890fddd859a301bb68f462Reid Spencer        throws org.xml.sax.SAXException
253ead87b671278379f92890fddd859a301bb68f462Reid Spencer    {
2547cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner
255ead87b671278379f92890fddd859a301bb68f462Reid Spencer        String uri = dtm.getNodeValue(namespace);
256ead87b671278379f92890fddd859a301bb68f462Reid Spencer        String prefix = dtm.getNodeNameX(namespace);
257ead87b671278379f92890fddd859a301bb68f462Reid Spencer
258ead87b671278379f92890fddd859a301bb68f462Reid Spencer        if ((uri != null && uri.length() > 0) && (null != prefix))
259e62c1185bee05facc25d1d725434f517261d308bChris Lattner        {
260e62c1185bee05facc25d1d725434f517261d308bChris Lattner            String foundURI;
261234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman            NamespaceMappings ns = handler.getNamespaceMappings();
262234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman            if (ns != null)
263234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman            {
264234b3ec8795e0661af56aa1d1a978a41d80686c5Misha Brukman
26507278e48dc27d8ac64b5ff7ed6361536c2f38ea1Chris Lattner                foundURI = ns.lookupNamespace(prefix);
266e62c1185bee05facc25d1d725434f517261d308bChris Lattner                if ((null == foundURI) || !foundURI.equals(uri))
2677cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner                {
268e62c1185bee05facc25d1d725434f517261d308bChris Lattner                    handler.startPrefixMapping(prefix, uri, false);
2697cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner                }
270f1b36f9a71eb267f04b7bd3a32aca9bc69f71e97Chris Lattner            }
2717cf0ce4b8d122575c3348b5fa4947014c3d8432dChris Lattner        }
272f1b36f9a71eb267f04b7bd3a32aca9bc69f71e97Chris Lattner    }
273ead87b671278379f92890fddd859a301bb68f462Reid Spencer}
274ead87b671278379f92890fddd859a301bb68f462Reid Spencer