dataminer-invocation-model/src/main/java/org/gcube/data/analysis/dminvocation/DataMinerInvocationManager....

193 lines
6.3 KiB
Java
Raw Normal View History

/**
*
*/
package org.gcube.data.analysis.dminvocation;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.SchemaOutputResolver;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import org.eclipse.persistence.jaxb.MarshallerProperties;
import org.gcube.data.analysis.dminvocation.model.DataMinerInvocation;
import org.xml.sax.SAXException;
/**
* The Class DataMinerInvocationManager.
*
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
* Dec 4, 2018
*/
public class DataMinerInvocationManager {
/**
* Marshaling.
*
* @param dmInvocation the dm invocation
* @param mediaType the media type
* @return the byte array output stream
* @throws JAXBException the JAXB exception
* @throws SAXException
* @throws IOException
*/
public static ByteArrayOutputStream marshaling(DataMinerInvocation dmInvocation, MediaType mediaType) throws JAXBException, IOException, SAXException
{
JAXBContext jaxbContext = JAXBContext.newInstance(DataMinerInvocation.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller = generateAndSetSchema(jaxbMarshaller);
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
if(mediaType==null)
mediaType = MediaType.ApplicationXML;
switch (mediaType) {
case ApplicationJSON:
jaxbMarshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, Boolean.TRUE);
case ApplicationXML:
default:
jaxbMarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, mediaType.getMimeType());
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
jaxbMarshaller.marshal(dmInvocation, baos);
return baos;
}
/**
* Unmarshaling.
*
* @param dmInvocationXMLStream the dm invocation xml file
* @param mediaType the media type
* @return the data miner invocation
* @throws JAXBException the JAXB exception
* @throws IOException Signals that an I/O exception has occurred.
* @throws SAXException the SAX exception
*/
public static DataMinerInvocation unmarshaling(InputStream dmInvocationXMLStream, MediaType mediaType) throws JAXBException, IOException, SAXException
{
//unMarshalingCategories();
JAXBContext jaxbContext = JAXBContext.newInstance(DataMinerInvocation.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
jaxbUnmarshaller = generateAndSetSchema(jaxbUnmarshaller);
if(mediaType==null)
mediaType = MediaType.ApplicationXML;
switch (mediaType) {
case ApplicationJSON:
jaxbUnmarshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, Boolean.TRUE);
case ApplicationXML:
default:
jaxbUnmarshaller.setProperty(MarshallerProperties.MEDIA_TYPE, mediaType.getMimeType());
}
//We had written this file in marshalling example
return (DataMinerInvocation) jaxbUnmarshaller.unmarshal(dmInvocationXMLStream);
}
/**
* Generate and set schema.
*
* @param unmarshaller the unmarshaller
* @return the unmarshaller
* @throws JAXBException the JAXB exception
* @throws IOException Signals that an I/O exception has occurred.
* @throws SAXException the SAX exception
*/
private static Unmarshaller generateAndSetSchema(Unmarshaller unmarshaller) throws JAXBException, IOException, SAXException {
// generate schema
ByteArrayStreamOutputResolver schemaOutput = new ByteArrayStreamOutputResolver();
JAXBContext jaxbContext = JAXBContext.newInstance(DataMinerInvocation.class);
jaxbContext.generateSchema(schemaOutput);
// load schema
ByteArrayInputStream schemaInputStream = new ByteArrayInputStream(schemaOutput.getSchemaContent());
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new StreamSource(schemaInputStream));
// set schema on unmarshaller
unmarshaller.setSchema(schema);
return unmarshaller;
}
/**
* Generate and set schema.
*
* @param unmarshaller the unmarshaller
* @return the unmarshaller
* @throws JAXBException the JAXB exception
* @throws IOException Signals that an I/O exception has occurred.
* @throws SAXException the SAX exception
*/
private static Marshaller generateAndSetSchema(Marshaller marshaller) throws JAXBException, IOException, SAXException {
// generate schema
ByteArrayStreamOutputResolver schemaOutput = new ByteArrayStreamOutputResolver();
JAXBContext jaxbContext = JAXBContext.newInstance(DataMinerInvocation.class);
jaxbContext.generateSchema(schemaOutput);
// load schema
ByteArrayInputStream schemaInputStream = new ByteArrayInputStream(schemaOutput.getSchemaContent());
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = sf.newSchema(new StreamSource(schemaInputStream));
// set schema on unmarshaller
marshaller.setSchema(schema);
return marshaller;
}
/**
* The Class ByteArrayStreamOutputResolver.
*
* @author Francesco Mangiacrapa at ISTI-CNR (francesco.mangiacrapa@isti.cnr.it)
* Dec 7, 2018
*/
private static class ByteArrayStreamOutputResolver extends SchemaOutputResolver {
private ByteArrayOutputStream schemaOutputStream;
/* (non-Javadoc)
* @see javax.xml.bind.SchemaOutputResolver#createOutput(java.lang.String, java.lang.String)
*/
public Result createOutput(String namespaceURI, String suggestedFileName) throws IOException {
schemaOutputStream = new ByteArrayOutputStream();
StreamResult result = new StreamResult(schemaOutputStream);
// We generate single XSD, so generator will not use systemId property
// Nevertheless, it validates if it's not null.
result.setSystemId("");
return result;
}
/**
* Gets the schema content.
*
* @return the schema content
*/
public byte[] getSchemaContent() {
return schemaOutputStream.toByteArray();
}
}
}