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