/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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: DOMBuilderContentHandlerFactory.java 679326 2008-07-24 09:35:34Z vhennebert $ */

package org.apache.fop.util;

import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.dom.DOMResult;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;

ContentHandlerFactory which constructs ContentHandlers that build DOM Documents.
/** * ContentHandlerFactory which constructs ContentHandlers that build DOM Documents. */
public class DOMBuilderContentHandlerFactory implements ContentHandlerFactory { private static SAXTransformerFactory tFactory = (SAXTransformerFactory)SAXTransformerFactory.newInstance(); private String namespaceURI; private DOMImplementation domImplementation;
Main Constructor
Params:
  • namespaceURI – the main namespace URI for the DOM to be parsed
  • domImplementation – the DOMImplementation to use for build the DOM
/** * Main Constructor * @param namespaceURI the main namespace URI for the DOM to be parsed * @param domImplementation the DOMImplementation to use for build the DOM */
public DOMBuilderContentHandlerFactory(String namespaceURI, DOMImplementation domImplementation) { this.namespaceURI = namespaceURI; this.domImplementation = domImplementation; }
{@inheritDoc}
/** {@inheritDoc} */
public String[] getSupportedNamespaces() { return new String[] {namespaceURI}; }
{@inheritDoc}
/** {@inheritDoc} */
public ContentHandler createContentHandler() throws SAXException { return new Handler(); } private class Handler extends DelegatingContentHandler implements ContentHandlerFactory.ObjectSource { private Document doc; private ObjectBuiltListener obListener; public Handler() throws SAXException { super(); } public Document getDocument() { return this.doc; }
{@inheritDoc}
/** * {@inheritDoc} */
public Object getObject() { return getDocument(); }
{@inheritDoc}
/** * {@inheritDoc} */
public void setObjectBuiltListener(ObjectBuiltListener listener) { this.obListener = listener; }
{@inheritDoc}
/** * {@inheritDoc} */
public void startDocument() throws SAXException { //Suppress startDocument() call if doc has not been set, yet. It will be done later. if (doc != null) { super.startDocument(); } }
{@inheritDoc}
/** * {@inheritDoc} */
public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { if (doc == null) { TransformerHandler handler; try { handler = tFactory.newTransformerHandler(); } catch (TransformerConfigurationException e) { throw new SAXException("Error creating a new TransformerHandler", e); } doc = domImplementation.createDocument(namespaceURI, qName, null); //It's easier to work with an empty document, so remove the root element doc.removeChild(doc.getDocumentElement()); handler.setResult(new DOMResult(doc)); setDelegateContentHandler(handler); setDelegateLexicalHandler(handler); setDelegateDTDHandler(handler); handler.startDocument(); } super.startElement(uri, localName, qName, atts); }
{@inheritDoc}
/** * {@inheritDoc} */
public void endDocument() throws SAXException { super.endDocument(); if (obListener != null) { obListener.notifyObjectBuilt(getObject()); } } } }