XMLUtils.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 it.gov.spcoop.sica.wsbl.driver;
import it.cnipa.collprofiles.driver.XMLUtilsException;
import it.gov.spcoop.sica.wsbl.ConceptualBehavior;
import it.gov.spcoop.sica.wsbl.MessageBehavior;
import it.gov.spcoop.sica.wsbl.TransitionType;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.slf4j.Logger;
import org.openspcoop2.utils.xml.AbstractXMLUtils;
import org.openspcoop2.utils.xml.JaxbUtils;
import org.openspcoop2.utils.xml.ValidatoreXSD;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* Classe utilizzata per lavorare sul documento semiformale che contiene le informazioni eGov dei servizi di un accordo
*
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class XMLUtils {
/** Validatore XSD */
static ValidatoreXSD validatoreXSD = null;
public static synchronized ValidatoreXSD getValidatoreXSD(Logger log) throws Exception{
if(XMLUtils.validatoreXSD==null){
XMLUtils.validatoreXSD = new ValidatoreXSD(log,XMLUtils.class.getResourceAsStream("/WSBL_originale.xsd"));
}
return XMLUtils.validatoreXSD;
}
public static boolean validate(ConceptualBehavior conceptual,StringBuilder motivoErroreValidazione){
int size = motivoErroreValidazione.length();
// TODO
if(motivoErroreValidazione.length()!=size)
return false;
else
return true;
}
public static boolean validate(MessageBehavior conceptual,StringBuilder motivoErroreValidazione){
int size = motivoErroreValidazione.length();
// TODO
if(motivoErroreValidazione.length()!=size)
return false;
else
return true;
}
/* ----- Unmarshall ----- */
/**
* Ritorna la rappresentazione java
*
* @param m byte[]
* @return EgovDeclType
* @throws XMLUtilsException
*/
public static ConceptualBehavior getConceptualBehavior(Logger log,byte[] m) throws XMLUtilsException{
ByteArrayInputStream bin = null;
try{
bin = new ByteArrayInputStream(m);
return XMLUtils.getConceptualBehavior(log,bin);
}catch(Exception e){
throw new XMLUtilsException(e.getMessage(),e);
}finally{
try{
if(bin!=null)
bin.close();
}catch(Exception eClose){
// close
}
}
}
/**
* Ritorna la rappresentazione java
*
* @param m File
* @return EgovDeclType
* @throws XMLUtilsException
*/
public static ConceptualBehavior getConceptualBehavior(Logger log,File m) throws XMLUtilsException{
FileInputStream fin = null;
try{
fin = new FileInputStream(m);
return XMLUtils.getConceptualBehavior(log,fin);
}catch(Exception e){
throw new XMLUtilsException(e.getMessage(),e);
}finally{
try{
if(fin!=null)
fin.close();
}catch(Exception eClose){
// close
}
}
}
/**
* Ritorna la rappresentazione java
*
* @param m String
* @return EgovDeclType
* @throws XMLUtilsException
*/
public static ConceptualBehavior getConceptualBehavior(Logger log,String m) throws XMLUtilsException{
return XMLUtils.getConceptualBehavior(log,m.getBytes());
}
/**
* Ritorna la rappresentazione java
*
* @param m InputStream
* @return EgovDeclType
* @throws XMLUtilsException
*/
public static ConceptualBehavior getConceptualBehavior(Logger log,InputStream m) throws XMLUtilsException{
try{
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[]reads = new byte[1024];
int letti = 0;
while( (letti=m.read(reads)) != -1){
bout.write(reads, 0, letti);
}
bout.flush();
bout.close();
byte [] xml = XMLUtils.unescapeXMLConceptualBehaviorForClientSICA(bout.toString());
ByteArrayInputStream binValidazione = new ByteArrayInputStream(xml);
ValidatoreXSD validatoreXSD = XMLUtils.getValidatoreXSD(log);
validatoreXSD.valida(binValidazione);
ByteArrayInputStream binTrasformazione = new ByteArrayInputStream(xml);
return (ConceptualBehavior) JaxbUtils.xmlToObj(binTrasformazione, ConceptualBehavior.class);
}catch(Exception e){
throw new XMLUtilsException(e.getMessage(),e);
}
}
private static byte[] unescapeXMLConceptualBehaviorForClientSICA(String xml) throws Exception{
String xmlS = new String(xml);
xmlS = xmlS.replace("<wsbl:ConceptualBehavior","<ConceptualBehavior");
//xmlS = xmlS.replace("xmlns:wscp=\"http://spcoop.gov.it/sica/wscp\" xmlns","xmlns");
xmlS = xmlS.replace("xmlns:wsbl","xmlns");
xmlS = xmlS.replace("</wsbl:ConceptualBehavior","</ConceptualBehavior");
return xmlS.getBytes();
}
/* ----- Marshall Manifest dell'accordo di servizio ----- */
public static void generateConceptualBehavior(ConceptualBehavior manifest,File out) throws XMLUtilsException{
FileOutputStream fout = null;
try{
fout = new FileOutputStream(out);
byte[] xml = XMLUtils.escapeXMLConceptualBehaviorForClientSICA(manifest);
fout.write(xml);
fout.flush();
}catch(Exception e){
throw new XMLUtilsException(e.getMessage(),e);
}finally{
if(fout!=null){
try{
fout.close();
}catch(Exception e){
// close
}
}
}
}
public static void generateConceptualBehavior(ConceptualBehavior manifest,String fileName) throws XMLUtilsException{
XMLUtils.generateConceptualBehavior(manifest,new File(fileName));
}
public static byte[] generateConceptualBehavior(ConceptualBehavior manifest) throws XMLUtilsException{
try{
return XMLUtils.escapeXMLConceptualBehaviorForClientSICA(manifest);
}catch(Exception e){
throw new XMLUtilsException(e.getMessage(),e);
}
}
public static void generateConceptualBehavior(ConceptualBehavior manifest,OutputStream out) throws XMLUtilsException{
try{
byte[] xml = XMLUtils.escapeXMLConceptualBehaviorForClientSICA(manifest);
out.write(xml);
}catch(Exception e){
throw new XMLUtilsException(e.getMessage(),e);
}
}
private static byte[] escapeXMLConceptualBehaviorForClientSICA(ConceptualBehavior manifest) throws Exception{
StringBuilder risultatoValidazione = new StringBuilder();
if(XMLUtils.validate(manifest, risultatoValidazione)==false){
throw new Exception(risultatoValidazione.toString());
}
ByteArrayOutputStream bout = new ByteArrayOutputStream();
JaxbUtils.objToXml(bout, ConceptualBehavior.class, manifest);
String xml = bout.toString();
xml = xml.replace("<ConceptualBehavior", "<wsbl:ConceptualBehavior");
//xml = xml.replace("xmlns", "xmlns:wscp=\"http://spcoop.gov.it/sica/wscp\" xmlns");
xml = xml.replace("xmlns", "xmlns:wsbl");
xml = xml.replace("</ConceptualBehavior", "</wsbl:ConceptualBehavior");
return xml.getBytes();
}
public static boolean isConceptualBehavior(byte [] doc){
try{
AbstractXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;
Document docXML = xmlUtils.newDocument(doc);
Element elemXML = docXML.getDocumentElement();
//System.out.println("LOCAL["+Costanti.ROOT_LOCAL_NAME+"]vs["+elemXML.getLocalName()+"] NAMESPACE["+Costanti.TARGET_NAMESPACE+"]vs["+elemXML.getNamespaceURI()+"]");
if(Costanti.ROOT_CONCEPTUAL_LOCAL_NAME.equals(elemXML.getLocalName()) &&
Costanti.TARGET_NAMESPACE.equals(elemXML.getNamespaceURI()) ){
return true;
}
else{
return false;
}
}catch(Exception e){
//System.out.println("NON e' un DOCUMENTO VALIDO: "+e.getMessage());
return false;
}
}
public static String[] getOperazioniAsincrone(ConceptualBehavior wsblConcettuale) throws XMLUtilsException{
try{
String [] operationsAsincrone = new String[2];
String statoIniziale = null;
String statoFinale = null;
if(wsblConcettuale.getStates()==null){
throw new Exception("Non sono presenti stati nel documento WSBL ConceptualBehavior");
}else{
if(wsblConcettuale.getStates().getStateInitial()==null || wsblConcettuale.getStates().getStateInitial().getName()==null){
throw new Exception("Stato iniziale non presente nel documento WSBL ConceptualBehavior");
}
statoIniziale = wsblConcettuale.getStates().getStateInitial().getName();
if(wsblConcettuale.getStates().getStateFinal()==null || wsblConcettuale.getStates().getStateFinal().getName()==null){
throw new Exception("Stato finale non presente nel documento WSBL ConceptualBehavior");
}
statoFinale = wsblConcettuale.getStates().getStateFinal().getName();
}
if(wsblConcettuale.getTransitions()==null || wsblConcettuale.getTransitions().sizeTransitionList()<=0 ){
throw new Exception("Non sono presenti transizioni nel documento WSBL ConceptualBehavior");
}else{
for(int i=0; i<wsblConcettuale.getTransitions().sizeTransitionList(); i++){
TransitionType tr = wsblConcettuale.getTransitions().getTransition(i);
if(tr.getSource()==null){
throw new Exception("Presente una transizione con source non definita nel documento WSBL ConceptualBehavior");
}
if(tr.getTarget()==null){
throw new Exception("Presente una transizione con target non definito nel documento WSBL ConceptualBehavior");
}
if(tr.getSource().equals(statoIniziale)){
if(tr.getEvents()==null || tr.getEvents().sizeEventList()<=0){
throw new Exception("Presente una transizione senza eventi nel documento WSBL ConceptualBehavior");
}
operationsAsincrone[0] = tr.getEvents().getEvent(0).getName();
if(operationsAsincrone[0]==null){
throw new Exception("Presente una transizione con un evento senza nome nel documento WSBL ConceptualBehavior");
}
continue;
}
if(tr.getTarget().equals(statoFinale)){
if(tr.getEvents()==null || tr.getEvents().sizeEventList()<=0){
throw new Exception("Presente una transizione senza eventi nel documento WSBL ConceptualBehavior");
}
operationsAsincrone[1] = tr.getEvents().getEvent(0).getName();
if(operationsAsincrone[1]==null){
throw new Exception("Presente una transizione con un evento senza nome nel documento WSBL ConceptualBehavior");
}
continue;
}
}
if(operationsAsincrone[0]==null){
throw new Exception("Non e' stata trovata una transizione che possiede come source lo stato iniziale "+statoIniziale+" nel documento WSBL ConceptualBehavior");
}
if(operationsAsincrone[1]==null){
throw new Exception("Non e' stata trovata una transizione che possiede come target lo stato finale "+statoFinale+" nel documento WSBL ConceptualBehavior");
}
return operationsAsincrone;
}
}catch(Exception e){
throw new XMLUtilsException(e.getMessage(),e);
}
}
/* ----- Unmarshall ----- */
/**
* Ritorna la rappresentazione java
*
* @param m byte[]
* @return EgovDeclType
* @throws XMLUtilsException
*/
public static MessageBehavior getMessageBehavior(Logger log,byte[] m) throws XMLUtilsException{
ByteArrayInputStream bin = null;
try{
bin = new ByteArrayInputStream(m);
return XMLUtils.getMessageBehavior(log,bin);
}catch(Exception e){
throw new XMLUtilsException(e.getMessage(),e);
}finally{
try{
if(bin!=null)
bin.close();
}catch(Exception eClose){
// close
}
}
}
/**
* Ritorna la rappresentazione java
*
* @param m File
* @return EgovDeclType
* @throws XMLUtilsException
*/
public static MessageBehavior getMessageBehavior(Logger log,File m) throws XMLUtilsException{
FileInputStream fin = null;
try{
fin = new FileInputStream(m);
return XMLUtils.getMessageBehavior(log,fin);
}catch(Exception e){
throw new XMLUtilsException(e.getMessage(),e);
}finally{
try{
if(fin!=null)
fin.close();
}catch(Exception eClose){
// close
}
}
}
/**
* Ritorna la rappresentazione java
*
* @param m String
* @return EgovDeclType
* @throws XMLUtilsException
*/
public static MessageBehavior getMessageBehavior(Logger log,String m) throws XMLUtilsException{
return XMLUtils.getMessageBehavior(log,m.getBytes());
}
/**
* Ritorna la rappresentazione java
*
* @param m InputStream
* @return EgovDeclType
* @throws XMLUtilsException
*/
public static MessageBehavior getMessageBehavior(Logger log,InputStream m) throws XMLUtilsException{
try{
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[]reads = new byte[1024];
int letti = 0;
while( (letti=m.read(reads)) != -1){
bout.write(reads, 0, letti);
}
bout.flush();
bout.close();
byte [] xml = XMLUtils.unescapeXMLMessageBehaviorForClientSICA(bout.toString());
ByteArrayInputStream binValidazione = new ByteArrayInputStream(xml);
ValidatoreXSD validatoreXSD = XMLUtils.getValidatoreXSD(log);
validatoreXSD.valida(binValidazione);
ByteArrayInputStream binTrasformazione = new ByteArrayInputStream(xml);
return (MessageBehavior) JaxbUtils.xmlToObj(binTrasformazione, MessageBehavior.class);
}catch(Exception e){
throw new XMLUtilsException(e.getMessage(),e);
}
}
private static byte[] unescapeXMLMessageBehaviorForClientSICA(String xml) throws Exception{
String xmlS = new String(xml);
xmlS = xmlS.replace("<wsbl:MessageBehavior","<MessageBehavior");
//xmlS = xmlS.replace("xmlns:wscp=\"http://spcoop.gov.it/sica/wscp\" xmlns","xmlns");
xmlS = xmlS.replace("xmlns:wsbl","xmlns");
xmlS = xmlS.replace("</wsbl:MessageBehavior","</MessageBehavior");
return xmlS.getBytes();
}
/* ----- Marshall Manifest dell'accordo di servizio ----- */
public static void generateMessageBehavior(MessageBehavior manifest,File out) throws XMLUtilsException{
FileOutputStream fout = null;
try{
fout = new FileOutputStream(out);
byte[] xml = XMLUtils.escapeXMLMessageBehaviorForClientSICA(manifest);
fout.write(xml);
fout.flush();
}catch(Exception e){
throw new XMLUtilsException(e.getMessage(),e);
}finally{
if(fout!=null){
try{
fout.close();
}catch(Exception e){
// close
}
}
}
}
public static void generateMessageBehavior(MessageBehavior manifest,String fileName) throws XMLUtilsException{
XMLUtils.generateMessageBehavior(manifest,new File(fileName));
}
public static byte[] generateMessageBehavior(MessageBehavior manifest) throws XMLUtilsException{
try{
return XMLUtils.escapeXMLMessageBehaviorForClientSICA(manifest);
}catch(Exception e){
throw new XMLUtilsException(e.getMessage(),e);
}
}
public static void generateMessageBehavior(MessageBehavior manifest,OutputStream out) throws XMLUtilsException{
try{
byte[] xml = XMLUtils.escapeXMLMessageBehaviorForClientSICA(manifest);
out.write(xml);
}catch(Exception e){
throw new XMLUtilsException(e.getMessage(),e);
}
}
private static byte[] escapeXMLMessageBehaviorForClientSICA(MessageBehavior manifest) throws Exception{
StringBuilder risultatoValidazione = new StringBuilder();
if(XMLUtils.validate(manifest, risultatoValidazione)==false){
throw new Exception(risultatoValidazione.toString());
}
ByteArrayOutputStream bout = new ByteArrayOutputStream();
JaxbUtils.objToXml(bout, MessageBehavior.class, manifest);
String xml = bout.toString();
xml = xml.replace("<MessageBehavior", "<wsbl:MessageBehavior");
//xml = xml.replace("xmlns", "xmlns:wscp=\"http://spcoop.gov.it/sica/wscp\" xmlns");
xml = xml.replace("xmlns", "xmlns:wsbl");
xml = xml.replace("</MessageBehavior", "</wsbl:MessageBehavior");
return xml.getBytes();
}
public static boolean isMessageBehavior(byte [] doc){
try{
AbstractXMLUtils xmlUtils = org.openspcoop2.message.xml.MessageXMLUtils.DEFAULT;
Document docXML = xmlUtils.newDocument(doc);
Element elemXML = docXML.getDocumentElement();
//System.out.println("LOCAL["+Costanti.ROOT_LOCAL_NAME+"]vs["+elemXML.getLocalName()+"] NAMESPACE["+Costanti.TARGET_NAMESPACE+"]vs["+elemXML.getNamespaceURI()+"]");
if(Costanti.ROOT_MESSAGE_LOCAL_NAME.equals(elemXML.getLocalName()) &&
Costanti.TARGET_NAMESPACE.equals(elemXML.getNamespaceURI()) ){
return true;
}
else{
return false;
}
}catch(Exception e){
//System.out.println("NON e' un DOCUMENTO VALIDO: "+e.getMessage());
return false;
}
}
}