blob: 93d18e5145c02a48dbcf50c9f7a98217c8c3baad [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 Standards for Technology in Automotive Retail
* 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:
* David Carver - STAR - bug 224197 - initial API and implementation
* based on work from Apache Xalan 2.7.0
*******************************************************************************/
/*
* Copyright 1999-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* $Id: TrAXFilter.java,v 1.2 2008/03/28 02:38:16 dacarver Exp $
*/
package org.eclipse.wst.xsl.core.internal.compiler.xslt10.transformer;
import java.io.IOException;
import javax.xml.XMLConstants;
import javax.xml.transform.ErrorListener;
import javax.xml.transform.Templates;
import javax.xml.transform.TransformerConfigurationException;
import org.apache.xalan.res.XSLMessages;
import org.apache.xalan.res.XSLTErrorResources;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLFilterImpl;
import org.xml.sax.helpers.XMLReaderFactory;
public class TrAXFilter extends XMLFilterImpl {
private Templates m_templates;
private TransformerImpl m_transformer;
/**
* Construct an empty XML filter, with no parent.
*
* <p>
* This filter will have no parent: you must assign a parent before you
* start a parse or do any configuration with setFeature or setProperty.
* </p>
*
* @see org.xml.sax.XMLReader#setFeature
* @see org.xml.sax.XMLReader#setProperty
*/
public TrAXFilter(Templates templates)
throws TransformerConfigurationException {
m_templates = templates;
m_transformer = (TransformerImpl) templates.newTransformer();
}
/**
* Return the Transformer object used for this XML filter.
*/
public TransformerImpl getTransformer() {
return m_transformer;
}
/**
* Set the parent reader.
*
* <p>
* This is the {@link org.xml.sax.XMLReader XMLReader} from which this
* filter will obtain its events and to which it will pass its configuration
* requests. The parent may itself be another filter.
* </p>
*
* <p>
* If there is no parent reader set, any attempt to parse or to set or get a
* feature or property will fail.
* </p>
*
* @param parent
* The parent XML reader.
* @throws java.lang.NullPointerException
* If the parent is null.
*/
@Override
public void setParent(XMLReader parent) {
super.setParent(parent);
if (null != parent.getContentHandler())
this.setContentHandler(parent.getContentHandler());
// Not really sure if we should do this here, but
// it seems safer in case someone calls parse() on
// the parent.
setupParse();
}
/**
* Parse a document.
*
* @param input
* The input source for the document entity.
* @throws org.xml.sax.SAXException
* Any SAX exception, possibly wrapping another exception.
* @throws java.io.IOException
* An IO exception from the parser, possibly from a byte stream
* or character stream supplied by the application.
* @see org.xml.sax.XMLReader#parse(org.xml.sax.InputSource)
*/
@Override
public void parse(InputSource input) throws org.xml.sax.SAXException,
IOException {
if (null == getParent()) {
XMLReader reader = null;
// Use JAXP1.1 ( if possible )
try {
javax.xml.parsers.SAXParserFactory factory = javax.xml.parsers.SAXParserFactory
.newInstance();
factory.setNamespaceAware(true);
if (m_transformer.getStylesheet().isSecureProcessing()) {
try {
factory.setFeature(
XMLConstants.FEATURE_SECURE_PROCESSING, true);
} catch (org.xml.sax.SAXException se) {
}
}
javax.xml.parsers.SAXParser jaxpParser = factory.newSAXParser();
reader = jaxpParser.getXMLReader();
} catch (javax.xml.parsers.ParserConfigurationException ex) {
throw new org.xml.sax.SAXException(ex);
} catch (javax.xml.parsers.FactoryConfigurationError ex1) {
throw new org.xml.sax.SAXException(ex1.toString());
} catch (NoSuchMethodError ex2) {
} catch (AbstractMethodError ame) {
}
XMLReader parent;
if (reader == null)
parent = XMLReaderFactory.createXMLReader();
else
parent = reader;
try {
parent.setFeature(
"http://xml.org/sax/features/namespace-prefixes", true);
} catch (org.xml.sax.SAXException se) {
}
// setParent calls setupParse...
setParent(parent);
} else {
// Make sure everything is set up.
setupParse();
}
if (null == m_transformer.getContentHandler()) {
throw new org.xml.sax.SAXException(XSLMessages.createMessage(
XSLTErrorResources.ER_CANNOT_CALL_PARSE, null)); // "parse
// can
// not
// be
// called
// if
// the
// ContentHandler
// has
// not
// been
// set!");
}
getParent().parse(input);
Exception e = m_transformer.getExceptionThrown();
if (null != e) {
if (e instanceof org.xml.sax.SAXException)
throw (org.xml.sax.SAXException) e;
else
throw new org.xml.sax.SAXException(e);
}
}
/**
* Parse a document.
*
* @param systemId
* The system identifier as a fully-qualified URI.
* @throws org.xml.sax.SAXException
* Any SAX exception, possibly wrapping another exception.
* @throws java.io.IOException
* An IO exception from the parser, possibly from a byte stream
* or character stream supplied by the application.
* @see org.xml.sax.XMLReader#parse(java.lang.String)
*/
@Override
public void parse(String systemId) throws org.xml.sax.SAXException,
IOException {
parse(new InputSource(systemId));
}
/**
* Set up before a parse.
*
* <p>
* Before every parse, check whether the parent is non-null, and re-register
* the filter for all of the events.
* </p>
*/
private void setupParse() {
XMLReader p = getParent();
if (p == null) {
throw new NullPointerException(XSLMessages.createMessage(
XSLTErrorResources.ER_NO_PARENT_FOR_FILTER, null)); // "No
// parent
// for
// filter");
}
ContentHandler ch = m_transformer.getInputContentHandler();
// if(ch instanceof SourceTreeHandler)
// ((SourceTreeHandler)ch).setUseMultiThreading(true);
p.setContentHandler(ch);
p.setEntityResolver(this);
p.setDTDHandler(this);
p.setErrorHandler(this);
}
/**
* Set the content event handler.
*
* @param handler
* The new content handler.
* @throws java.lang.NullPointerException
* If the handler is null.
* @see org.xml.sax.XMLReader#setContentHandler
*/
@Override
public void setContentHandler(ContentHandler handler) {
m_transformer.setContentHandler(handler);
// super.setContentHandler(m_transformer.getResultTreeHandler());
}
public void setErrorListener(ErrorListener handler) {
m_transformer.setErrorListener(handler);
}
}