/*
* Copyright (c) 2013 Red Hat, Inc. and/or its affiliates.
*
* 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:
* Brad Davis - bradsdavis@gmail.com - Initial API and implementation
*/
package org.jboss.windup.util.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.Set;
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 org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* XML stream reader which, after parsing, can tell which node appeared on which line.
*/
public class LocationAwareXmlReader
{
private static final SAXParserFactory factory = SAXParserFactory.newInstance();
private static final DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
static
{
factory.setNamespaceAware(true);
factory.setValidating(false);
factory.setXIncludeAware(false);
}
public static Document readXML(final InputStream is) throws IOException, SAXException
{
final Document doc;
SAXParser parser;
try
{
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
parser = factory.newSAXParser();
doc = docBuilder.newDocument();
}
catch (final ParserConfigurationException e)
{
throw new RuntimeException("Can't create SAX parser / DOM builder.", e);
}
final DefaultHandler handler = new LocationAwareContentHandler(doc);
parser.parse(is, handler);
return doc;
}
public static Integer getLineNumber(Node node)
{
return (Integer) node.getUserData(LocationAwareContentHandler.LINE_NUMBER_KEY_NAME);
}
public static Set<String> getNamespaces(Document doc)
{
return (Set<String>) doc.getUserData(LocationAwareContentHandler.NAMESPACE_KEY_NAME);
}
}