/* * @(#)XMLUtils.java 1.5 04/06/07 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ package java.util; import java.io.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import org.w3c.dom.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.*; import javax.xml.transform.stream.*; /** * A class used to aid in Properties load and save in XML. Keeping this * code outside of Properties helps reduce the number of classes loaded * when Properties is loaded. * * @version 1.9, 01/23/03 * @author Michael McCloskey * @since 1.3 */ class XMLUtils { // XML loading and saving methods for Properties // The required DTD URI for exported properties private static final String PROPS_DTD_URI = "http://java.sun.com/dtd/properties.dtd"; private static final String PROPS_DTD = "" + "" + ""+ "" + "" + "" + ""; /** * Version number for the format of exported properties files. */ private static final String EXTERNAL_XML_VERSION = "1.0"; static void load(Properties props, InputStream in) throws IOException, InvalidPropertiesFormatException { Document doc = null; try { doc = getLoadingDoc(in); } catch (SAXException saxe) { throw new InvalidPropertiesFormatException(saxe); } Element propertiesElement = (Element)doc.getChildNodes().item(1); String xmlVersion = propertiesElement.getAttribute("version"); if (xmlVersion.compareTo(EXTERNAL_XML_VERSION) > 0) throw new InvalidPropertiesFormatException( "Exported Properties file format version " + xmlVersion + " is not supported. This java installation can read" + " versions " + EXTERNAL_XML_VERSION + " or older. You" + " may need to install a newer version of JDK."); importProperties(props, propertiesElement); } static Document getLoadingDoc(InputStream in) throws SAXException, IOException { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); dbf.setIgnoringElementContentWhitespace(true); dbf.setValidating(true); dbf.setCoalescing(true); dbf.setIgnoringComments(true); try { DocumentBuilder db = dbf.newDocumentBuilder(); db.setEntityResolver(new Resolver()); db.setErrorHandler(new EH()); InputSource is = new InputSource(in); return db.parse(is); } catch (ParserConfigurationException x) { throw new Error(x); } } static void importProperties(Properties props, Element propertiesElement) { NodeList entries = propertiesElement.getChildNodes(); int numEntries = entries.getLength(); int start = numEntries > 0 && entries.item(0).getNodeName().equals("comment") ? 1 : 0; for (int i=start; i