blob: bfde00fd9398c5a4b2b676b8add5139af8946388 [file] [log] [blame]
/**
* Copyright (c) 2002-2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM - Initial API and implementation
*/
package org.eclipse.xsd.util;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import org.xml.sax.EntityResolver;
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.ext.LexicalHandler;
/**
* This class provides a default implementation of JAXPConfiguration interface. It creates
* and configures SAX parser, DOM parser and transformer using options needed by XSD implementation.
*/
public class DefaultJAXPConfiguration implements JAXPConfiguration
{
public Transformer createTransformer(String encoding) throws TransformerException
{
TransformerFactory transformerFactory = TransformerFactory.newInstance();
try
{
transformerFactory.setAttribute("indent-number", 2);
}
catch (IllegalArgumentException exception)
{
// Ignore
}
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
// Unless a width is set, there will be only line breaks but no indentation.
// The IBM JDK and the Sun JDK don't agree on the property name,
// so we set them both.
//
transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
if (encoding != null)
{
transformer.setOutputProperty(OutputKeys.ENCODING, encoding);
}
return transformer;
}
/**
* Creates a SAXParser and sets some default options.
*/
public SAXParser createSAXParser(LexicalHandler lexicalHandler) throws ParserConfigurationException, SAXException
{
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
saxParserFactory.setNamespaceAware(true);
saxParserFactory.setValidating(false);
saxParserFactory.setFeature("http://xml.org/sax/features/namespace-prefixes", true);
SAXParser saxParser = saxParserFactory.newSAXParser();
saxParser.setProperty("http://xml.org/sax/properties/lexical-handler", lexicalHandler);
return saxParser;
}
/**
* Creates a DocumentBuilder and sets some default options.
* If features or properties are available, these features and properties are set on the documentBuilder.
*/
public DocumentBuilder createDocumentBuilder(ErrorHandler errorHandler) throws ParserConfigurationException
{
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
documentBuilderFactory.setValidating(false);
try
{
documentBuilderFactory.setAttribute("http://apache.org/xml/features/dom/defer-node-expansion", Boolean.FALSE);
}
catch (IllegalArgumentException e)
{
// do nothing
}
DocumentBuilder parser = documentBuilderFactory.newDocumentBuilder();
parser.setEntityResolver(createEntityResolver());
parser.setErrorHandler(errorHandler);
return parser;
}
public EntityResolver createEntityResolver()
{
return XSDResourceImpl.createEntityResolver();
}
}