/*
* JBoss, Home of Professional Open Source
* Copyright 2015, 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.as.quickstart.xml;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Alternative;
import javax.inject.Inject;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.DefaultHandler;
/**
* Implementation of parser based on JAXP DOM(W3C).
*
* @author baranowb
*
*/
@RequestScoped
@Alternative
public class SAXXMLParser extends XMLParser {
private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd");
// Inject instance of error holder
@Inject
private Errors errorHolder;
private SAXParser parser;
private SAXHandler saxHandler;
SAXXMLParser() throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(false);
this.parser = factory.newSAXParser();
this.saxHandler = new SAXHandler();
}
@Override
public List<Book> parseInternal(InputStream is) throws Exception {
this.parser.parse(is, this.saxHandler);
return this.saxHandler.catalog;
}
private class SAXHandler extends DefaultHandler {
private List<Book> catalog;
private Book book;
private String currentElementValue;
@Override
public void startDocument() throws SAXException {
System.out.println("Parsing the document using the SAXXMLParser!");
this.catalog = new ArrayList<>();
this.book = null;
super.startDocument();
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equals("book")) {
this.book = new Book();
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equals("book")) {
this.catalog.add(this.book);
this.book = null;
} else if (qName.equals("author")) {
this.book.setAuthor(this.currentElementValue);
} else if (qName.equals("title")) {
this.book.setTitle(this.currentElementValue);
} else if (qName.equals("genre")) {
this.book.setGenre(this.currentElementValue);
} else if (qName.equals("price")) {
this.book.setPrice(Float.parseFloat(this.currentElementValue));
} else if (qName.equals("publish_date")) {
Date d;
try {
d = DATE_FORMATTER.parse(this.currentElementValue);
this.book.setPublishDate(d);
} catch (ParseException e) {
throw new RuntimeException(e);
}
} else if (qName.equals("description")) {
this.book.setDescription(this.currentElementValue);
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
this.currentElementValue = new String(ch, start, length);
}
@Override
public void warning(SAXParseException e) throws SAXException {
errorHolder.addErrorMessage("warning", e);
super.warning(e);
}
@Override
public void error(SAXParseException e) throws SAXException {
errorHolder.addErrorMessage("error", e);
super.error(e);
}
@Override
public void fatalError(SAXParseException e) throws SAXException {
errorHolder.addErrorMessage("fatal error", e);
super.fatalError(e);
}
}
}