JaxbUtils.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.utils.xml;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
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;
/**
* Utility per la gestione di xml tramite Jaxb
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class JaxbUtils {
private static Map<String, JAXBContext> mapJAXBContext = new ConcurrentHashMap<String, JAXBContext>();
private static synchronized void initJAXBContext(String packageName) throws JAXBException{
if(JaxbUtils.mapJAXBContext.containsKey(packageName)==false){
JaxbUtils.mapJAXBContext.put(packageName, JAXBContext.newInstance(packageName) );
}
}
private static JAXBContext getJAXBContext(String packageName) throws JAXBException{
if(JaxbUtils.mapJAXBContext.containsKey(packageName)==false){
JaxbUtils.initJAXBContext(packageName);
}
return JaxbUtils.mapJAXBContext.get(packageName);
}
/**
* Metodo che si occupa della generazione di un oggetto a partire da un file XML.
* Sono richiesti interattivamente i parametri che identificano il file XML.
*
* @param xmlFileName file XML
* @param classType Tipo di classe dell'oggetto da leggere
* @return L'oggetto letto dal file XML.
* @throws JAXBException
*/
public static Object xmlToObj(String xmlFileName,Class<?> classType)
throws java.io.FileNotFoundException, JAXBException{
JAXBContext jc = JaxbUtils.getJAXBContext(classType.getPackage().getName());
Unmarshaller uctx = jc.createUnmarshaller();
FileInputStream fis = new FileInputStream(xmlFileName);
Object objectRead = null;
try{
objectRead = uctx.unmarshal(fis);
}finally{
try{
fis.close();
}catch(Exception eis){
// close
}
}
if(objectRead instanceof JAXBElement<?>){
return ((JAXBElement<?>)objectRead).getValue();
}
else{
return objectRead;
}
}
/**
* Metodo che si occupa della generazione di un file XML a partire da un oggetto RegistroServizi.
* Sono richiesti interattivamente i parametri che identificano il file XML da generare.
*
* @param xmlFileName Nome del file XML da utilizzare
* @param classType Tipo di classe dell'oggetto da scrivere
* @param object Oggetto da Scrivere
* @throws JAXBException
*
*/
public static void objToXml(String xmlFileName,Class<?> classType,Object object)
throws java.io.FileNotFoundException, JAXBException{
JaxbUtils.objToXml(xmlFileName,classType,object,false);
}
public static void objToXml(String xmlFileName,Class<?> classType,Object object,boolean prettyDocument)
throws java.io.FileNotFoundException, JAXBException{
// Se esiste gia' lo sovrascrive
File file = new File(xmlFileName);
if(file.exists()){
if(!file.delete()) {
// ignore
}
}
JAXBContext jc = JaxbUtils.getJAXBContext(classType.getPackage().getName());
Marshaller uctx = jc.createMarshaller();
if(prettyDocument)
uctx.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
else
uctx.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE);
uctx.marshal(object, file);
}
/**
* Metodo che si occupa di generare un file a partire da un oggetto
*
* @param xmlFileName Nome del file XML da utilizzare
* @param object Oggetto da Scrivere
*
*/
public static void objToXml(String xmlFileName,byte[] object)
throws java.io.FileNotFoundException,IOException{
// Se esiste gia' lo sovrascrive
File file = new File(xmlFileName);
if(file.exists()){
if(!file.delete()) {
// ignore
}
}
FileOutputStream fileOut = new FileOutputStream(xmlFileName);
try{
fileOut.write(object);
fileOut.flush();
}catch(IOException e){
throw e;
}finally{
try{
fileOut.close();
}catch(Exception eis){}
}
}
/**
* Metodo che si occupa della generazione di un oggetto a partire da un file XML.
* Sono richiesti interattivamente i parametri che identificano il file XML.
*
* @param classType Tipo di classe dell'oggetto da leggere
* @return L'oggetto letto dal file XML.
* @throws JAXBException
*/
public static Object xmlToObj(InputStream i,Class<?> classType)
throws java.io.FileNotFoundException, JAXBException{
JAXBContext jc = JaxbUtils.getJAXBContext(classType.getPackage().getName());
Unmarshaller uctx = jc.createUnmarshaller();
Object objectRead = null;
try{
objectRead = uctx.unmarshal(i);
}finally{
try{
i.close();
}catch(Exception eis){}
}
if(objectRead instanceof JAXBElement<?>){
return ((JAXBElement<?>)objectRead).getValue();
}
else{
return objectRead;
}
}
/**
* Metodo che si occupa della generazione di un file XML a partire da un oggetto RegistroServizi.
* Sono richiesti interattivamente i parametri che identificano il file XML da generare.
*
* @param classType Tipo di classe dell'oggetto da scrivere
* @param object Oggetto da Scrivere
* @throws JAXBException
*
*/
public static void objToXml(OutputStream out,Class<?> classType,Object object)
throws java.io.FileNotFoundException, JAXBException{
JaxbUtils.objToXml(out,classType,object,false);
}
public static void objToXml(OutputStream out,Class<?> classType,Object object,boolean prettyDocument)
throws java.io.FileNotFoundException, JAXBException{
JaxbUtils.objToXml(out,classType,object,prettyDocument,false);
}
public static void objToXml(OutputStream out,Class<?> classType,Object object,boolean prettyDocument, boolean omitXmlDeclaration)
throws java.io.FileNotFoundException, JAXBException{
JAXBContext jc = JaxbUtils.getJAXBContext(classType.getPackage().getName());
Marshaller uctx = jc.createMarshaller();
if(prettyDocument)
uctx.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
else
uctx.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.FALSE);
if(omitXmlDeclaration)
uctx.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
uctx.marshal(object, out);
}
}