|
/*
|
|
* Copyright (C) 2007 ETH Zurich
|
|
*
|
|
* This file is part of Fosstrak (www.fosstrak.org).
|
|
*
|
|
* Fosstrak is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License version 2.1, as published by the Free Software Foundation.
|
|
*
|
|
* Fosstrak is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with Fosstrak; if not, write to the Free
|
|
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
* Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
package org.fosstrak.epcis.utils;
|
|
|
|
import java.io.IOException;
|
|
import java.io.InputStream;
|
|
import java.io.OutputStream;
|
|
import java.io.Reader;
|
|
import java.io.StringWriter;
|
|
|
|
import javax.xml.bind.JAXBContext;
|
|
import javax.xml.bind.JAXBElement;
|
|
import javax.xml.bind.JAXBException;
|
|
import javax.xml.bind.Marshaller;
|
|
import javax.xml.bind.Unmarshaller;
|
|
import javax.xml.parsers.DocumentBuilder;
|
|
import javax.xml.parsers.DocumentBuilderFactory;
|
|
import javax.xml.parsers.ParserConfigurationException;
|
|
|
|
import org.fosstrak.epcis.model.EPCISQueryDocumentType;
|
|
import org.fosstrak.epcis.model.ObjectFactory;
|
|
import org.fosstrak.epcis.model.QueryResults;
|
|
import org.w3c.dom.Document;
|
|
|
|
/**
|
|
* Parses the XML representation of an EPCIS query results into a QueryResults
|
|
* object for use with axis.
|
|
*
|
|
* @author Marco Steybe
|
|
*/
|
|
public final class QueryResultsParser {
|
|
|
|
private static ObjectFactory factory = new ObjectFactory();
|
|
|
|
/**
|
|
* Empty default constructor. Utility classes should not have public
|
|
* constructors.
|
|
*/
|
|
private QueryResultsParser() {
|
|
}
|
|
|
|
/**
|
|
* A helper method to parse and convert the XML representation of an EPCIS
|
|
* query results into a QueryResults object.
|
|
*
|
|
* @param xml
|
|
* The InputStream containing the XML representation of a
|
|
* QueryResults object.
|
|
* @return The parsed QueryResults object.
|
|
* @throws IOException
|
|
* If an error de-serializing the InputStream occurred.
|
|
*/
|
|
public static QueryResults parseResults(final InputStream xml) throws IOException {
|
|
// de-serialize the XML
|
|
try {
|
|
JAXBContext context = JAXBContext.newInstance(QueryResults.class);
|
|
Unmarshaller unmarshaller = context.createUnmarshaller();
|
|
// setting schema to null will turn XML validation off
|
|
// unmarshaller.setSchema(null);
|
|
JAXBElement<?> results = (JAXBElement<?>) unmarshaller.unmarshal(xml);
|
|
return (QueryResults) results.getValue();
|
|
} catch (JAXBException e) {
|
|
// wrap JAXBException into IOException to keep the interface
|
|
// JAXB-free
|
|
IOException ioe = new IOException(e.getMessage());
|
|
ioe.setStackTrace(e.getStackTrace());
|
|
throw ioe;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* A helper method to parse and convert the XML representation of an EPCIS
|
|
* query document into an QueryResults object.
|
|
*
|
|
* @param xml
|
|
* The Reader containing the XML representation of an
|
|
* EPCISQueryDocumentType object.
|
|
* @return The parsed QueryResults object.
|
|
* @throws IOException
|
|
* If an error de-serializing the InputStream occurred.
|
|
*/
|
|
public static QueryResults parseQueryDocResults(final Reader r) throws IOException {
|
|
// de-serialize the XML
|
|
try {
|
|
JAXBContext context = JAXBContext.newInstance(EPCISQueryDocumentType.class);
|
|
Unmarshaller unmarshaller = context.createUnmarshaller();
|
|
JAXBElement<?> results = (JAXBElement<?>) unmarshaller.unmarshal(r);
|
|
EPCISQueryDocumentType doc = (EPCISQueryDocumentType) results.getValue();
|
|
return doc.getEPCISBody().getQueryResults();
|
|
} catch (JAXBException e) {
|
|
// wrap JAXBException into IOException to keep the interface
|
|
// JAXB-free
|
|
IOException ioe = new IOException(e.getMessage());
|
|
ioe.setStackTrace(e.getStackTrace());
|
|
throw ioe;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Marshals the given QueryResults object to its XML representations and
|
|
* serializes it to the given OutputStream. Use as follows for printing a
|
|
* QueryResults instance to standard output:
|
|
*
|
|
* <pre>
|
|
* QueryResults results = ...
|
|
* QueryResultsParser.queryResultsToXml(results, System.out);
|
|
* </pre>
|
|
*
|
|
* @param results
|
|
* The QueryResults object to marshal into XML.
|
|
* @param out
|
|
* The OutputStream to which the XML representation will be
|
|
* written to.
|
|
* @throws IOException
|
|
* If an error marshaling the QueryResults object occurred.
|
|
*/
|
|
public static void queryResultsToXml(final QueryResults results, OutputStream out) throws IOException {
|
|
// serialize the response
|
|
try {
|
|
JAXBElement<QueryResults> item = factory.createQueryResults(results);
|
|
JAXBContext context = JAXBContext.newInstance(QueryResults.class);
|
|
Marshaller marshaller = context.createMarshaller();
|
|
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
|
|
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
|
|
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
|
|
marshaller.marshal(item, out);
|
|
} catch (JAXBException e) {
|
|
IOException ioe = new IOException(e.getMessage());
|
|
ioe.setStackTrace(e.getStackTrace());
|
|
throw ioe;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Marshals the given QueryResults object to its XML representations and
|
|
* returns it as a String.
|
|
*
|
|
* @param results
|
|
* The QueryResults object to marshal into XML.
|
|
* @param out
|
|
* The OutputStream to which the XML representation will be
|
|
* written to.
|
|
* @throws IOException
|
|
* If an error marshaling the QueryResults object occurred.
|
|
*/
|
|
public static String queryResultsToXml(final QueryResults results) throws IOException {
|
|
// serialize the response
|
|
try {
|
|
StringWriter writer = new StringWriter();
|
|
JAXBElement<QueryResults> item = factory.createQueryResults(results);
|
|
JAXBContext context = JAXBContext.newInstance(QueryResults.class);
|
|
Marshaller marshaller = context.createMarshaller();
|
|
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
|
|
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
|
|
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
|
|
marshaller.marshal(item, writer);
|
|
return writer.toString();
|
|
} catch (JAXBException e) {
|
|
IOException ioe = new IOException(e.getMessage());
|
|
ioe.setStackTrace(e.getStackTrace());
|
|
throw ioe;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Marshals the given QueryResults object to its XML representation and
|
|
* returns a DOM Document of it.
|
|
*
|
|
* @param results
|
|
* The QueryResults object to marshal into XML.
|
|
* @param out
|
|
* The OutputStream to which the XML representation will be
|
|
* written to.
|
|
* @throws IOException
|
|
* If an error marshaling the QueryResults object occurred.
|
|
*/
|
|
public static Document queryResultsToDocument(final QueryResults results) throws IOException {
|
|
// serialize the response
|
|
try {
|
|
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
|
|
dbf.setNamespaceAware(true);
|
|
DocumentBuilder db = dbf.newDocumentBuilder();
|
|
Document doc = db.newDocument();
|
|
JAXBElement<QueryResults> item = factory.createQueryResults(results);
|
|
JAXBContext context = JAXBContext.newInstance(QueryResults.class);
|
|
Marshaller marshaller = context.createMarshaller();
|
|
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
|
|
marshaller.marshal(item, doc);
|
|
return doc;
|
|
} catch (JAXBException e) {
|
|
IOException ioe = new IOException(e.getMessage());
|
|
ioe.setStackTrace(e.getStackTrace());
|
|
throw ioe;
|
|
} catch (ParserConfigurationException e) {
|
|
IOException ioe = new IOException(e.getMessage());
|
|
ioe.setStackTrace(e.getStackTrace());
|
|
throw ioe;
|
|
}
|
|
}
|
|
}
|