SDISbustamento.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.protocol.sdi.builder;
import java.util.Iterator;
import java.util.List;
import javax.xml.soap.AttachmentPart;
import javax.xml.soap.MimeHeaders;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPElement;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.message.OpenSPCoop2MessageFactory;
import org.openspcoop2.message.OpenSPCoop2SoapMessage;
import org.openspcoop2.message.exception.MessageException;
import org.openspcoop2.message.exception.MessageNotSupportedException;
import org.openspcoop2.message.soap.DumpSoapMessageUtils;
import org.openspcoop2.message.soap.SoapUtils;
import org.openspcoop2.message.soap.TunnelSoapUtils;
import org.openspcoop2.message.soap.mtom.MTOMUtilities;
import org.openspcoop2.message.utils.MessageUtilities;
import org.openspcoop2.protocol.sdi.config.SDIProperties;
import org.openspcoop2.protocol.sdi.constants.SDICostanti;
import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioRiceviNotifica;
import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioRicezioneFatture;
import org.openspcoop2.protocol.sdi.constants.SDICostantiServizioTrasmissioneFatture;
import org.openspcoop2.protocol.sdi.utils.SDIUtils;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.utils.Utilities;
import org.openspcoop2.utils.dch.MailcapActivationReader;
import org.openspcoop2.utils.io.Base64Utilities;
import org.openspcoop2.utils.transport.http.HttpConstants;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import it.gov.fatturapa.sdi.messaggi.v1_0.constants.TipiMessaggi;
import it.gov.fatturapa.sdi.ws.ricezione.v1_0.types.constants.EsitoNotificaType;
/**
* SDISbustamento
*
* @author Andrea Poli (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class SDISbustamento {
private SDIBustaBuilder bustaBuilder = null;
@SuppressWarnings("unused")
public SDISbustamento(SDIBustaBuilder bustaBuilder){
this.bustaBuilder = bustaBuilder;
}
public SOAPElement sbustamentoRisposta_ServizioSdIRiceviFile_AzioneRiceviFile(Busta busta,OpenSPCoop2Message msgParam) throws ProtocolException{
try{
OpenSPCoop2SoapMessage msg = msgParam.castAsSoap();
SOAPElement element = null;
SOAPBody soapBody = msg.getSOAPBody();
// estraggo header
element = SDIUtils.readHeader(msg);
// detach body
soapBody.removeContents();
// se sono presenti degli attachments li elimino
if(msg.countAttachments()>0){
msg.removeAllAttachments();
}
// imposto content type
msg.setContentType(MessageUtilities.getDefaultContentType(msg.getMessageType()));
return element;
}catch(Exception e){
throw new ProtocolException(e.getMessage(),e);
}
}
public SOAPElement sbustamentoRichiesta_ServizioRicezioneFatture_AzioneRiceviFatture(Busta busta,OpenSPCoop2Message msgParam) throws ProtocolException{
try{
OpenSPCoop2SoapMessage msg = msgParam.castAsSoap();
OpenSPCoop2MessageFactory messageFactory = msgParam.getFactory();
SOAPElement element = null;
Object ctxFatturaPA = msg.removeContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_FATTURA);
String versioneFattura = busta.getProperty(SDICostanti.SDI_BUSTA_EXT_VERSIONE_FATTURA_PA);
SOAPBody soapBody = msg.getSOAPBody();
// estraggo header
element = SDIUtils.readHeader(msg);
// Leggo fattura
byte [] xmlFattura = null;
boolean p7m = false;
if(ctxFatturaPA!=null){
//System.out.println("OTTIMIZZATO");
if(SDICostanti.SDI_VERSIONE_FATTURA_PA_10.equals(versioneFattura)){
it.gov.fatturapa.sdi.fatturapa.v1_0.FatturaElettronicaType fattura = (it.gov.fatturapa.sdi.fatturapa.v1_0.FatturaElettronicaType) ctxFatturaPA;
it.gov.fatturapa.sdi.fatturapa.v1_0.ObjectFactory of = new it.gov.fatturapa.sdi.fatturapa.v1_0.ObjectFactory();
it.gov.fatturapa.sdi.fatturapa.v1_0.utils.serializer.JaxbSerializer serializer = new it.gov.fatturapa.sdi.fatturapa.v1_0.utils.serializer.JaxbSerializer();
xmlFattura = serializer.toByteArray(of.createFatturaElettronica(fattura));
}
else if(SDICostanti.SDI_VERSIONE_FATTURA_PA_11.equals(versioneFattura)){
it.gov.fatturapa.sdi.fatturapa.v1_1.FatturaElettronicaType fattura = (it.gov.fatturapa.sdi.fatturapa.v1_1.FatturaElettronicaType) ctxFatturaPA;
it.gov.fatturapa.sdi.fatturapa.v1_1.ObjectFactory of = new it.gov.fatturapa.sdi.fatturapa.v1_1.ObjectFactory();
it.gov.fatturapa.sdi.fatturapa.v1_1.utils.serializer.JaxbSerializer serializer = new it.gov.fatturapa.sdi.fatturapa.v1_1.utils.serializer.JaxbSerializer();
xmlFattura = serializer.toByteArray(of.createFatturaElettronica(fattura));
}
else if(SDICostanti.SDI_VERSIONE_FATTURA_SEMPLIFICATA_10.equals(versioneFattura)){
it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_0.FatturaElettronicaType fattura = (it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_0.FatturaElettronicaType) ctxFatturaPA;
it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_0.ObjectFactory of = new it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_0.ObjectFactory();
it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_0.utils.serializer.JaxbSerializer serializer = new it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_0.utils.serializer.JaxbSerializer();
xmlFattura = serializer.toByteArray(of.createFatturaElettronicaSemplificata(fattura));
}
else{
it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_2.FatturaElettronicaType fattura = (it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_2.FatturaElettronicaType) ctxFatturaPA;
it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_2.ObjectFactory of = new it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_2.ObjectFactory();
it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_2.utils.serializer.JaxbSerializer serializer = new it.gov.agenziaentrate.ivaservizi.docs.xsd.fatture.v1_2.utils.serializer.JaxbSerializer();
xmlFattura = serializer.toByteArray(of.createFatturaElettronica(fattura));
}
}else{
//System.out.println("NON OTTIMIZZATO");
Element elementBody = SoapUtils.getNotEmptyFirstChildSOAPElement(soapBody);
List<Node> childs = SoapUtils.getNotEmptyChildNodes(messageFactory, elementBody, false);
for (int i = 0; i < childs.size(); i++) {
Node child = childs.get(i);
if(SDICostantiServizioRicezioneFatture.RICEVI_FATTURE_RICHIESTA_ELEMENT_FILE.equals(child.getLocalName())){
Element e = MTOMUtilities.getIfExistsXomReference(messageFactory, (Element)child);
if(e!=null){
//System.out.println("NON OTTIMIZZATO MTOM");
// mtom
AttachmentPart ap = this.getAttachmentPart(msg, e);
if(ap!=null) {
xmlFattura = Utilities.getAsByteArray(ap.getDataHandler().getInputStream());
}
}else{
//System.out.println("NON OTTIMIZZATO NO MTOM");
// no mtom
xmlFattura = Base64Utilities.decode(child.getTextContent());
}
}
}
// Se la fattura e' un P7M non e' un xml.
// Il formato viene compreso durante la validazione sintattica
Object formato = busta.getProperty(SDICostanti.SDI_BUSTA_EXT_FORMATO_ARCHIVIO_INVIO_FATTURA);
if(formato!=null && ((String)formato).equals(SDICostanti.SDI_TIPO_FATTURA_P7M) ){
p7m = true;
}
}
// detach body
soapBody.removeContents();
// se sono presenti degli attachments li elimino
if(msg.countAttachments()>0){
msg.removeAllAttachments();
}
// imposto content type
msg.setContentType(MessageUtilities.getDefaultContentType(msg.getMessageType()));
// add Fattura as body
if(p7m){
org.openspcoop2.utils.mime.MimeTypes mimeTypes = org.openspcoop2.utils.mime.MimeTypes.getInstance();
TunnelSoapUtils.
imbustamentoMessaggioConAttachment(msg,xmlFattura,HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP,
MailcapActivationReader.existsDataContentHandler(HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP),
mimeTypes.getMimeType(SDICostanti.SDI_TIPO_FATTURA_P7M), SDICostanti.SDI_PROTOCOL_NAMESPACE);
// Serve per forzare il tunnel SOAP che altrimenti non viene abilitato ('tunnel openspcoop2')
DumpSoapMessageUtils.dumpMessage(msg, true);
}else{
//soapBody.addChildElement(SoapUtils.getSoapFactory(msg.getMessageType()).createElement(this.xmlUtils.newElement(xmlFattura)));
// Bug Fix: OP-752
// USO Comunque il tunnel SOAP altrimenti l'xml viene modificato e la firma non e' piu' valida
// Uso esattamente il codice sopra utilizzando pero' come content type text/xml:
TunnelSoapUtils.
imbustamentoMessaggioConAttachment(msg,xmlFattura,HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP,
MailcapActivationReader.existsDataContentHandler(HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP),
HttpConstants.CONTENT_TYPE_TEXT_XML, SDICostanti.SDI_PROTOCOL_NAMESPACE);
// Serve per forzare il tunnel SOAP che altrimenti non viene abilitato ('tunnel openspcoop2')
DumpSoapMessageUtils.dumpMessage(msg, true);
}
return element;
}catch(Exception e){
throw new ProtocolException(e.getMessage(),e);
}
}
public SOAPElement sbustamentoRisposta_ServizioSdIRiceviNotifica_AzioneNotificaEsito(Busta busta,OpenSPCoop2Message msgParam) throws ProtocolException{
try{
OpenSPCoop2SoapMessage msg = msgParam.castAsSoap();
OpenSPCoop2MessageFactory messageFactory = msgParam.getFactory();
SOAPElement element = null;
Object ctxNotificaScartoEsitoCommittente = msg.removeContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_MESSAGGIO_SERVIZIO_SDI);
SOAPBody soapBody = msg.getSOAPBody();
// estraggo header
element = SDIUtils.readHeader(msg);
// Leggo se presente una notifica scarto esito committente
byte [] xmlNotificaScartoEsitoCommittente = null;
if(ctxNotificaScartoEsitoCommittente!=null){
//System.out.println("OTTIMIZZATO");
it.gov.fatturapa.sdi.messaggi.v1_0.ScartoEsitoCommittenteType scarto = (it.gov.fatturapa.sdi.messaggi.v1_0.ScartoEsitoCommittenteType) ctxNotificaScartoEsitoCommittente;
it.gov.fatturapa.sdi.messaggi.v1_0.ObjectFactory of = new it.gov.fatturapa.sdi.messaggi.v1_0.ObjectFactory();
it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbSerializer serializer = new it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbSerializer();
xmlNotificaScartoEsitoCommittente = serializer.toByteArray(of.createScartoEsitoCommittente(scarto));
}else{
//System.out.println("NON OTTIMIZZATO");
Element elementBody = SoapUtils.getNotEmptyFirstChildSOAPElement(soapBody);
List<Node> childs = SoapUtils.getNotEmptyChildNodes(messageFactory, elementBody, false);
for (int i = 0; i < childs.size(); i++) {
Node child = childs.get(i);
if(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO.equals(child.getLocalName())){
List<Node> elementScartoChilds = SoapUtils.getNotEmptyChildNodes(messageFactory, child, false);
if(elementScartoChilds!=null){
for (int j = 0; j < elementScartoChilds.size(); j++) {
Node scartoChild = elementScartoChilds.get(j);
if(SDICostantiServizioRiceviNotifica.NOTIFICA_ESITO_RISPOSTA_ELEMENT_SCARTO_ESITO_FILE.equals(scartoChild.getLocalName())){
Element e = MTOMUtilities.getIfExistsXomReference(messageFactory, (Element)scartoChild);
if(e!=null){
//System.out.println("NON OTTIMIZZATO MTOM");
// mtom
AttachmentPart ap = this.getAttachmentPart(msg, e);
if(ap!=null) {
xmlNotificaScartoEsitoCommittente = Utilities.getAsByteArray(ap.getDataHandler().getInputStream());
}
}else{
//System.out.println("NON OTTIMIZZATO NO MTOM");
// no mtom
xmlNotificaScartoEsitoCommittente = Base64Utilities.decode(scartoChild.getTextContent());
}
}
}
}
}
}
}
// detach body
soapBody.removeContents();
// se sono presenti degli attachments li elimino
if(msg.countAttachments()>0){
msg.removeAllAttachments();
}
// imposto content type
msg.setContentType(MessageUtilities.getDefaultContentType(msg.getMessageType()));
// se esiste uno scarto committente lo aggiungo come body
if(xmlNotificaScartoEsitoCommittente!=null){
//soapBody.addChildElement(SoapUtils.getSoapFactory(msg.getMessageType()).createElement(this.xmlUtils.newElement(xmlNotificaScartoEsitoCommittente)));
// Bug Fix: OP-752
// USO Comunque il tunnel SOAP altrimenti l'xml viene modificato e la firma non e' piu' valida
// Uso esattamente il codice sopra utilizzando pero' come content type text/xml:
TunnelSoapUtils.
imbustamentoMessaggioConAttachment(msg,xmlNotificaScartoEsitoCommittente,HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP,
MailcapActivationReader.existsDataContentHandler(HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP),
HttpConstants.CONTENT_TYPE_TEXT_XML, SDICostanti.SDI_PROTOCOL_NAMESPACE);
// Serve per forzare il tunnel SOAP che altrimenti non viene abilitato ('tunnel openspcoop2')
DumpSoapMessageUtils.dumpMessage(msg, true);
}
// se lo sdi ha restituito un esito non ok imposto 500 come codice di trasporto verso il client
String esitoNotifica = busta.getProperty(SDICostanti.SDI_BUSTA_EXT_ESITO_NOTIFICA);
// ES01 = NOTIFICA ACCETTATA
if(EsitoNotificaType.ES01.name().equals(esitoNotifica)){
msg.setForcedResponseCode("202");
}
else{
// ES00 = NOTIFICA NON ACCETTATA
if(EsitoNotificaType.ES00.name().equals(esitoNotifica)){
msg.setForcedResponseCode("200");
}
}
return element;
}catch(Exception e){
throw new ProtocolException(e.getMessage(),e);
}
}
public SOAPElement sbustamentoRichiesta_ServizioTrasmissioneFatture_Notifiche(TipiMessaggi tipoMessaggio, Busta busta,OpenSPCoop2Message msgParam) throws ProtocolException{
try{
OpenSPCoop2SoapMessage msg = msgParam.castAsSoap();
OpenSPCoop2MessageFactory messageFactory = msgParam.getFactory();
SOAPElement element = null;
Object ctxMessaggio = msg.removeContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_MESSAGGIO_SERVIZIO_SDI);
SOAPBody soapBody = msg.getSOAPBody();
// estraggo header
element = SDIUtils.readHeader(msg);
// Leggo fattura
byte [] xmlNotifica = null;
byte [] zip = null;
if(ctxMessaggio!=null){
//System.out.println("OTTIMIZZATO");
it.gov.fatturapa.sdi.messaggi.v1_0.ObjectFactory of = new it.gov.fatturapa.sdi.messaggi.v1_0.ObjectFactory();
it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbSerializer serializer = new it.gov.fatturapa.sdi.messaggi.v1_0.utils.serializer.JaxbSerializer();
switch (tipoMessaggio) {
case RC:
it.gov.fatturapa.sdi.messaggi.v1_0.RicevutaConsegnaType rc = (it.gov.fatturapa.sdi.messaggi.v1_0.RicevutaConsegnaType) ctxMessaggio;
xmlNotifica = serializer.toByteArray(of.createRicevutaConsegna(rc));
break;
case MC:
it.gov.fatturapa.sdi.messaggi.v1_0.NotificaMancataConsegnaType mc = (it.gov.fatturapa.sdi.messaggi.v1_0.NotificaMancataConsegnaType) ctxMessaggio;
xmlNotifica = serializer.toByteArray(of.createNotificaMancataConsegna(mc));
break;
case NS:
it.gov.fatturapa.sdi.messaggi.v1_0.NotificaScartoType ns = (it.gov.fatturapa.sdi.messaggi.v1_0.NotificaScartoType) ctxMessaggio;
xmlNotifica = serializer.toByteArray(of.createNotificaScarto(ns));
break;
case NE:
it.gov.fatturapa.sdi.messaggi.v1_0.NotificaEsitoType ne = (it.gov.fatturapa.sdi.messaggi.v1_0.NotificaEsitoType) ctxMessaggio;
xmlNotifica = serializer.toByteArray(of.createNotificaEsito(ne));
break;
case DT:
it.gov.fatturapa.sdi.messaggi.v1_0.NotificaDecorrenzaTerminiType dt = (it.gov.fatturapa.sdi.messaggi.v1_0.NotificaDecorrenzaTerminiType) ctxMessaggio;
xmlNotifica = serializer.toByteArray(of.createNotificaDecorrenzaTermini(dt));
break;
case AT:
it.gov.fatturapa.sdi.messaggi.v1_0.AttestazioneTrasmissioneFatturaType at = (it.gov.fatturapa.sdi.messaggi.v1_0.AttestazioneTrasmissioneFatturaType) ctxMessaggio;
xmlNotifica = serializer.toByteArray(of.createAttestazioneTrasmissioneFattura(at));
break;
default:
break;
}
}else{
if(TipiMessaggi.AT.equals(tipoMessaggio) && SDIProperties.getInstance(this.bustaBuilder.getLog()).isEnableAccessoMessaggi()){
Object oZip = msg.removeContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_AT_ARCHIVIO_ZIP);
if(oZip!=null){
zip = (byte[]) oZip;
}
else{
Object oXml = msg.removeContextProperty(SDICostanti.SDI_MESSAGE_CONTEXT_AT_ARCHIVIO_XML);
if(oXml!=null){
xmlNotifica = (byte[]) oXml;
}
else{
throw new Exception("Contenuto della notifica di Attestazione Trasmissione per Impossibilità di Recapito");
}
}
}
else{
//System.out.println("NON OTTIMIZZATO");
Element elementBody = SoapUtils.getNotEmptyFirstChildSOAPElement(soapBody);
List<Node> childs = SoapUtils.getNotEmptyChildNodes(messageFactory, elementBody, false);
for (int i = 0; i < childs.size(); i++) {
Node child = childs.get(i);
if(SDICostantiServizioTrasmissioneFatture.FILE_SDI_TYPE_CONSEGNA_RICHIESTA_ELEMENT_FILE.equals(child.getLocalName())){
Element e = MTOMUtilities.getIfExistsXomReference(messageFactory, (Element)child);
if(e!=null){
//System.out.println("NON OTTIMIZZATO MTOM");
// mtom
AttachmentPart ap = this.getAttachmentPart(msg, e);
if(ap!=null) {
xmlNotifica = Utilities.getAsByteArray(ap.getDataHandler().getInputStream());
}
}else{
//System.out.println("NON OTTIMIZZATO NO MTOM");
// no mtom
xmlNotifica = Base64Utilities.decode(child.getTextContent());
}
}
}
if(TipiMessaggi.AT.equals(tipoMessaggio)) {
// xmlNotifica contiene uno zip file poiche' non l'ho trattato
zip = xmlNotifica;
}
}
}
// detach body
soapBody.removeContents();
// se sono presenti degli attachments li elimino
if(msg.countAttachments()>0){
msg.removeAllAttachments();
}
// imposto content type
msg.setContentType(MessageUtilities.getDefaultContentType(msg.getMessageType()));
// add Fattura as body
if(zip!=null){
TunnelSoapUtils.
imbustamentoMessaggioConAttachment(msg,zip,HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP,
MailcapActivationReader.existsDataContentHandler(HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP),
HttpConstants.CONTENT_TYPE_ZIP, SDICostanti.SDI_PROTOCOL_NAMESPACE);
// Serve per forzare il tunnel SOAP che altrimenti non viene abilitato ('tunnel openspcoop2')
DumpSoapMessageUtils.dumpMessage(msg, true);
}else{
//soapBody.addChildElement(SoapUtils.getSoapFactory(msg.getMessageType()).createElement(this.xmlUtils.newElement(xmlNotifica)));
// Bug Fix: OP-752
// USO Comunque il tunnel SOAP altrimenti l'xml viene modificato e la firma non e' piu' valida
// Uso esattamente il codice sopra utilizzando pero' come content type text/xml:
TunnelSoapUtils.
imbustamentoMessaggioConAttachment(msg,xmlNotifica,HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP,
MailcapActivationReader.existsDataContentHandler(HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP),
HttpConstants.CONTENT_TYPE_TEXT_XML, SDICostanti.SDI_PROTOCOL_NAMESPACE);
// Serve per forzare il tunnel SOAP che altrimenti non viene abilitato ('tunnel openspcoop2')
DumpSoapMessageUtils.dumpMessage(msg, true);
}
return element;
}catch(Exception e){
throw new ProtocolException(e.getMessage(),e);
}
}
private AttachmentPart getAttachmentPart(OpenSPCoop2SoapMessage msg,Element e) throws MessageException, MessageNotSupportedException{
String contentId = MTOMUtilities.getCidXomReference(e);
MimeHeaders mhs = new MimeHeaders();
mhs.addHeader(HttpConstants.CONTENT_ID, contentId);
Iterator<?> itAttachments = msg.getAttachments(mhs);
if(itAttachments == null || itAttachments.hasNext()==false){
throw new MessageException("Found XOM Reference with attribute ["+
org.openspcoop2.message.soap.mtom.Costanti.XOP_INCLUDE_ATTRIBUTE_HREF+"]=["+contentId+"] but the message hasn't attachments");
}
AttachmentPart ap = null;
while (itAttachments.hasNext()) {
if(ap!=null){
throw new MessageException("Found XOM Reference with attribute ["+
org.openspcoop2.message.soap.mtom.Costanti.XOP_INCLUDE_ATTRIBUTE_HREF+"]=["+contentId+"] but exists more than one attachment with same id");
}
ap = (AttachmentPart) itAttachments.next();
}
return ap;
}
}