Merge from the pain train
[official-gcc.git] / libjava / gnu / xml / dom / JAXPFactory.java
blob3602ef6b9abfe9ee15bca8559cdf79315e42e893
1 /* JAXPFactory.java --
2 Copyright (C) 2001 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
9 any later version.
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 USA.
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
24 combination.
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
38 package gnu.xml.dom;
40 import java.io.IOException;
42 import org.w3c.dom.Document;
43 import org.w3c.dom.DOMImplementation;
45 import org.xml.sax.EntityResolver;
46 import org.xml.sax.ErrorHandler;
47 import org.xml.sax.InputSource;
48 import org.xml.sax.XMLReader;
49 import org.xml.sax.SAXException;
50 import org.xml.sax.SAXParseException;
52 import javax.xml.parsers.DocumentBuilder;
53 import javax.xml.parsers.DocumentBuilderFactory;
54 import javax.xml.parsers.ParserConfigurationException;
55 import javax.xml.parsers.SAXParserFactory;
58 /**
59 * DOM bootstrapping API, for use with JAXP.
61 * @see Consumer
63 * @author David Brownell
65 public final class JAXPFactory
66 extends DocumentBuilderFactory
69 private static final String PROPERTY = "http://xml.org/sax/properties/";
70 private static final String FEATURE = "http://xml.org/sax/features/";
72 private SAXParserFactory pf;
74 /**
75 * Default constructor.
77 public JAXPFactory()
81 /**
82 * Constructs a JAXP document builder which uses the default
83 * JAXP SAX2 parser and the DOM implementation in this package.
85 public DocumentBuilder newDocumentBuilder()
86 throws ParserConfigurationException
88 if (pf == null)
90 // Force use of AElfred2 since not all JAXP parsers
91 // conform very well to the SAX2 API spec ...
92 pf = new gnu.xml.aelfred2.JAXPFactory();
93 // pf = SAXParserFactory.newInstance ();
96 // JAXP default: false
97 pf.setValidating(isValidating());
99 // FIXME: this namespace setup may cause errors in some
100 // conformant SAX2 parsers, which we CAN patch up by
101 // splicing a "NSFilter" stage up front ...
103 // JAXP default: false
104 pf.setNamespaceAware(isNamespaceAware());
108 // undo rude "namespace-prefixes=false" default
109 pf.setFeature(FEATURE + "namespace-prefixes", true);
111 return new JAXPBuilder(pf.newSAXParser().getXMLReader(), this);
113 catch (SAXException e)
115 String msg = "can't create JAXP DocumentBuilder: " + e.getMessage();
116 throw new ParserConfigurationException(msg);
120 /** There seems to be no useful specification for attribute names */
121 public void setAttribute(String name, Object value)
122 throws IllegalArgumentException
124 if ("http://java.sun.com/xml/jaxp/properties/schemaLanguage".equals(name))
126 // TODO
128 else
130 throw new IllegalArgumentException(name);
134 /** There seems to be no useful specification for attribute names */
135 public Object getAttribute(String name)
136 throws IllegalArgumentException
138 throw new IllegalArgumentException(name);
141 static final class JAXPBuilder
142 extends DocumentBuilder
143 implements ErrorHandler
146 private Consumer consumer;
147 private XMLReader producer;
148 private DomImpl impl;
150 JAXPBuilder(XMLReader parser, JAXPFactory factory)
151 throws ParserConfigurationException
153 impl = new DomImpl();
155 // set up consumer side
158 consumer = new Consumer();
160 catch (SAXException e)
162 throw new ParserConfigurationException(e.getMessage());
165 // JAXP defaults: true, noise nodes are good (bleech)
166 consumer.setHidingReferences(factory.isExpandEntityReferences());
167 consumer.setHidingComments(factory.isIgnoringComments());
168 consumer.setHidingWhitespace(factory.isIgnoringElementContentWhitespace());
169 consumer.setHidingCDATA(factory.isCoalescing());
171 // set up producer side
172 producer = parser;
173 producer.setContentHandler(consumer.getContentHandler());
174 producer.setDTDHandler(consumer.getDTDHandler());
178 String id;
180 // if validating, report validity errors, and default
181 // to treating them as fatal
182 if (factory.isValidating ())
184 producer.setFeature(FEATURE + "validation", true);
185 producer.setErrorHandler(this);
188 // always save prefix info, maybe do namespace processing
189 producer.setFeature(FEATURE + "namespace-prefixes", true);
190 producer.setFeature(FEATURE + "namespaces",
191 factory.isNamespaceAware());
193 // set important handlers
194 id = PROPERTY + "lexical-handler";
195 producer.setProperty(id, consumer.getProperty(id));
197 id = PROPERTY + "declaration-handler";
198 producer.setProperty(id, consumer.getProperty(id));
201 catch (SAXException e)
203 throw new ParserConfigurationException(e.getMessage());
207 public Document parse(InputSource source)
208 throws SAXException, IOException
210 producer.parse(source);
211 Document doc = consumer.getDocument();
212 // TODO inputEncoding
213 doc.setDocumentURI(source.getSystemId());
214 return doc;
217 public boolean isNamespaceAware()
221 return producer.getFeature(FEATURE + "namespaces");
223 catch (SAXException e)
225 // "can't happen"
226 throw new RuntimeException(e.getMessage());
230 public boolean isValidating()
234 return producer.getFeature(FEATURE + "validation");
236 catch (SAXException e)
238 // "can't happen"
239 throw new RuntimeException(e.getMessage());
243 public void setEntityResolver(EntityResolver resolver)
245 producer.setEntityResolver(resolver);
248 public void setErrorHandler(ErrorHandler handler)
250 producer.setErrorHandler(handler);
251 consumer.setErrorHandler(handler);
254 public DOMImplementation getDOMImplementation()
256 return impl;
259 public Document newDocument()
261 return new DomDocument();
264 // implementation of error handler that's used when validating
265 public void fatalError(SAXParseException e)
266 throws SAXException
268 throw e;
271 public void error(SAXParseException e)
272 throws SAXException
274 throw e;
277 public void warning(SAXParseException e)
278 throws SAXException
280 /* ignore */