/* * JBoss, Home of Professional Open Source * Copyright 2011, Red Hat, Inc. and/or its affiliates, and individual * contributors by the @authors tag. See the copyright.txt in the * distribution for a full listing of individual contributors. * * 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. */ package org.jboss.solder.config.xml.parser; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jboss.solder.config.xml.util.XmlParseException; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.XMLReaderFactory; /** * Parser for xml configration, this class should only be used once and then * discarded * * @author Stuart Douglas <stuart@baileyroberts.com.au> */ public class ParserMain extends DefaultHandler { SaxNode parentNode = null; SaxNode currentNode = null; Locator locator; String currentText = ""; String document; List<Exception> errors; public SaxNode parse(InputSource inputSource, String fileUrl, List<Exception> errors) { this.errors = errors; document = fileUrl; try { XMLReader xr = XMLReaderFactory.createXMLReader(); xr.setContentHandler(this); xr.setErrorHandler(this); xr.parse(inputSource); return parentNode; } catch (SAXException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { currentText = currentText + new String(ch, start, length); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { Map<String, String> atmap = new HashMap<String, String>(); for (int i = 0; i < attributes.getLength(); ++i) { atmap.put(attributes.getLocalName(i), attributes.getValue(i)); } int pos = 0; if (locator != null) { pos = locator.getLineNumber(); } SaxNode node = new SaxNode(localName, uri, atmap, currentNode, document, pos); if (currentNode == null) { parentNode = node; } else { currentNode.addChild(node); } currentNode = node; currentText = ""; } @Override public void endElement(String uri, String localName, String qName) throws SAXException { currentNode.setInnerText(currentText); currentNode = currentNode.getParent(); currentText = ""; } @Override public void setDocumentLocator(Locator locator) { this.locator = locator; } @Override public void error(SAXParseException e) throws SAXException { errors.add(new XmlParseException(e, document, e.getLineNumber())); } @Override public void fatalError(SAXParseException e) throws SAXException { errors.add(new XmlParseException(e, document, e.getLineNumber())); } }