DumpSoapMessageUtils.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 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.message.soap;
- import java.io.ByteArrayOutputStream;
- import java.io.InputStream;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import javax.activation.DataHandler;
- import javax.xml.soap.AttachmentPart;
- import javax.xml.soap.SOAPPart;
- import org.openspcoop2.message.OpenSPCoop2SoapMessage;
- import org.openspcoop2.message.exception.MessageException;
- import org.openspcoop2.message.utils.DumpAttachment;
- import org.openspcoop2.message.utils.DumpMessaggio;
- import org.openspcoop2.message.utils.DumpMessaggioConfig;
- import org.openspcoop2.message.utils.DumpMessaggioMultipartInfo;
- import org.openspcoop2.message.xml.MessageXMLUtils;
- import org.openspcoop2.utils.UtilsMultiException;
- import org.openspcoop2.utils.dch.MailcapActivationReader;
- import org.openspcoop2.utils.transport.http.HttpConstants;
- /**
- * DumpSoapMessageUtils
- *
- *
- * @author Poli Andrea (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class DumpSoapMessageUtils {
- public static DumpMessaggio dumpMessage(OpenSPCoop2SoapMessage msg,boolean dumpAllAttachments) throws MessageException{
- return dumpMessage(msg, new DumpMessaggioConfig(), dumpAllAttachments);
- }
- public static DumpMessaggio dumpMessage(OpenSPCoop2SoapMessage msg,
- DumpMessaggioConfig config,
- boolean dumpAllAttachments) throws MessageException{
- try{
- DumpMessaggio dumpMessaggio = new DumpMessaggio();
- dumpMessaggio.setMessageType(msg.getMessageType());
- dumpMessaggio.setContentType(msg.getContentType());
-
- Map<String, List<String>> pTrasporto = null;
- if(msg.getTransportRequestContext()!=null) {
- if(msg.getTransportRequestContext().getHeaders()!=null &&
- msg.getTransportRequestContext().getHeaders().size()>0){
- if(config.isDumpHeaders()) {
- pTrasporto = msg.getTransportRequestContext().getHeaders();
- }
- }
- }
- else if(msg.getTransportResponseContext()!=null) {
- if(msg.getTransportResponseContext().getHeaders()!=null &&
- msg.getTransportResponseContext().getHeaders().size()>0){
- if(config.isDumpHeaders()) {
- pTrasporto = msg.getTransportResponseContext().getHeaders();
- }
- }
- }
- if(config.isDumpHeaders() && pTrasporto!=null) {
- Iterator<String> keys = pTrasporto.keySet().iterator();
- while (keys.hasNext()) {
- String key = (String) keys.next();
- if(key!=null){
- List<String> values = pTrasporto.get(key);
- dumpMessaggio.getHeadersValues().put(key, values);
- }
- }
- }
-
- boolean msgWithAttachments = msg.countAttachments()>0;
-
- if(config.isDumpBody()) {
-
- SOAPPart soapPart = msg.getSOAPPart();
-
- DumpMessaggioMultipartInfo multipartInfoBody = null;
- if(msgWithAttachments) {
-
- Iterator<?> itM = soapPart.getAllMimeHeaders();
- if(itM!=null) {
- while(itM.hasNext()) {
- Object keyO = itM.next();
- if(keyO instanceof javax.xml.soap.MimeHeader) {
- javax.xml.soap.MimeHeader mh = (javax.xml.soap.MimeHeader) keyO;
- String key = mh.getName();
-
- if(!HttpConstants.CONTENT_ID.equalsIgnoreCase(key) &&
- !HttpConstants.CONTENT_LOCATION.equalsIgnoreCase(key) &&
- !HttpConstants.CONTENT_TYPE.equalsIgnoreCase(key) &&
- !config.isDumpMultipartHeaders()) {
- continue;
- }
-
- List<String> l = new ArrayList<>();
- String [] values = soapPart.getMimeHeader(key);
- if(values!=null && values.length>0) {
- for (String value : values) {
- l.add(value);
- }
- }
- else {
- l.add(mh.getValue());
- }
-
- if(!l.isEmpty()) {
- if(multipartInfoBody==null) {
- multipartInfoBody = new DumpMessaggioMultipartInfo();
- }
-
- if(HttpConstants.CONTENT_ID.equalsIgnoreCase(key)) {
- multipartInfoBody.setContentId(l.get(0));
- }
- else if(HttpConstants.CONTENT_LOCATION.equalsIgnoreCase(key)) {
- multipartInfoBody.setContentLocation(l.get(0));
- }
- else if(HttpConstants.CONTENT_TYPE.equalsIgnoreCase(key)) {
- multipartInfoBody.setContentType(l.get(0));
- }
-
- if(config.isDumpMultipartHeaders()) {
- multipartInfoBody.getHeadersValues().put(key, l);
- }
- }
-
- }
- }
- }
-
- }
- if(multipartInfoBody!=null) {
- dumpMessaggio.setMultipartInfoBody(multipartInfoBody);
- }
-
- ByteArrayOutputStream bout = new ByteArrayOutputStream();
- bout.write(msg.getAsByte(soapPart.getEnvelope(),false));
- bout.flush();
- bout.close();
- dumpMessaggio.setBody(bout);
- }
-
- if(config.isDumpAttachments()) {
-
- java.util.Iterator<?> it = msg.getAttachments();
- while(it.hasNext()){
- AttachmentPart ap =
- (AttachmentPart) it.next();
- DumpAttachment dumpAttach = new DumpAttachment();
-
- dumpAttach.setContentId(ap.getContentId());
- dumpAttach.setContentLocation(ap.getContentLocation());
- dumpAttach.setContentType(ap.getContentType());
-
- if(config.isDumpMultipartHeaders()) {
- Iterator<?> itM = ap.getAllMimeHeaders();
- if(itM!=null) {
- while(itM.hasNext()) {
- Object keyO = itM.next();
- if(keyO instanceof javax.xml.soap.MimeHeader) {
- javax.xml.soap.MimeHeader mh = (javax.xml.soap.MimeHeader) keyO;
- String key = mh.getName();
-
- List<String> l = new ArrayList<>();
- String [] values = ap.getMimeHeader(key);
- if(values!=null && values.length>0) {
- for (String value : values) {
- l.add(value);
- }
- }
- else {
- l.add(mh.getValue());
- }
-
- if(!l.isEmpty()) {
- dumpAttach.getHeadersValues().put(key, l);
- }
- }
- }
- }
- }
-
- ByteArrayOutputStream boutAttach = null;
- if(dumpAllAttachments){
- boutAttach = (ByteArrayOutputStream) _dumpAttachment(msg, ap, true);
- }else{
- Object o = _dumpAttachment(msg, ap, false);
- if(o == null){
- dumpAttach.setErrorContentNotSerializable("Contenuto attachment non recuperato??");
- }
- else if(o instanceof String){
- boutAttach = new ByteArrayOutputStream();
- boutAttach.write(((String)o).getBytes());
- boutAttach.flush();
- boutAttach.close();
- }
- else if(o instanceof java.io.ByteArrayOutputStream){
- boutAttach = (java.io.ByteArrayOutputStream) o;
- }
- else{
- dumpAttach.setErrorContentNotSerializable("Contenuto attachment non è visualizzabile, tipo: "+o.getClass().getName());
- }
- }
- dumpAttach.setContent(boutAttach);
-
- if(dumpMessaggio.getAttachments()==null) {
- dumpMessaggio.setAttachments(new ArrayList<>());
- }
- dumpMessaggio.getAttachments().add(dumpAttach);
- }
-
- }
-
- return dumpMessaggio;
- }catch(Exception e){
- throw new MessageException(e.getMessage(),e);
- }
- }
-
- public static String dumpMessageAsString(DumpMessaggio msg, boolean dumpAllAttachments) throws MessageException{
- return dumpMessageAsString(msg, new DumpMessaggioConfig(),dumpAllAttachments);
- }
- public static String dumpMessageAsString(DumpMessaggio msg,
- DumpMessaggioConfig config, boolean dumpAllAttachments) throws MessageException{
- try{
- StringBuilder out = new StringBuilder(msg.toString(config,dumpAllAttachments));
- return out.toString();
- }catch(Exception e){
- throw new MessageException(e.getMessage(),e);
- }
- }
-
- public static String dumpMessageAsString(OpenSPCoop2SoapMessage msg,
- boolean dumpAllAttachments) throws MessageException{
- return dumpMessageAsString(msg, new DumpMessaggioConfig(), dumpAllAttachments);
- }
- public static String dumpMessageAsString(OpenSPCoop2SoapMessage msg,
- DumpMessaggioConfig config,
- boolean dumpAllAttachments) throws MessageException{
- try{
- StringBuilder out = new StringBuilder();
-
- Map<String, List<String>> pTrasporto = null;
- if(msg.getTransportRequestContext()!=null) {
- if(msg.getTransportRequestContext().getHeaders()!=null &&
- msg.getTransportRequestContext().getHeaders().size()>0){
- if(config.isDumpHeaders()) {
- pTrasporto = msg.getTransportRequestContext().getHeaders();
- }
- }
- }
- else if(msg.getTransportResponseContext()!=null) {
- if(msg.getTransportResponseContext().getHeaders()!=null &&
- msg.getTransportResponseContext().getHeaders().size()>0){
- if(config.isDumpHeaders()) {
- pTrasporto = msg.getTransportResponseContext().getHeaders();
- }
- }
- }
- if(config.isDumpHeaders()) {
- out.append("------ Header di trasporto ------\n");
- if(pTrasporto!=null && pTrasporto.size()>0) {
- Iterator<String> keys = pTrasporto.keySet().iterator();
- while (keys.hasNext()) {
- String key = (String) keys.next();
- if(key!=null){
- List<String> values = pTrasporto.get(key);
- if(values!=null && !values.isEmpty()) {
- for (String value : values) {
- out.append("- "+key+": "+value+"\n");
- }
- }
- }
- }
- }
- else {
- out.append("Non presenti\n");
- }
- }
-
- boolean msgWithAttachments = msg.countAttachments()>0;
-
- if(config.isDumpBody()) {
- out.append("------ SOAPEnvelope (ContentType: "+msg.getContentType()+") (MessageType: "+msg.getMessageType()+") ------\n");
-
- SOAPPart soapPart = msg.getSOAPPart();
-
- if(msgWithAttachments) {
-
- Map<String, List<String>> mime = new HashMap<>();
- Iterator<?> itM = soapPart.getAllMimeHeaders();
- if(itM!=null) {
- while(itM.hasNext()) {
- Object keyO = itM.next();
- if(keyO instanceof String) {
- String key = (String) keyO;
-
- if(!HttpConstants.CONTENT_ID.equalsIgnoreCase(key) &&
- !HttpConstants.CONTENT_LOCATION.equalsIgnoreCase(key) &&
- !HttpConstants.CONTENT_TYPE.equalsIgnoreCase(key) &&
- !config.isDumpMultipartHeaders()) {
- continue;
- }
-
- List<String> l = new ArrayList<>();
- String [] values = soapPart.getMimeHeader(key);
- if(values!=null && values.length>0) {
- for (String value : values) {
- l.add(value);
- }
- }
-
- if(!l.isEmpty()) {
- if(HttpConstants.CONTENT_ID.equalsIgnoreCase(key)) {
- mime.put(key, l);
- }
- else if(HttpConstants.CONTENT_LOCATION.equalsIgnoreCase(key)) {
- mime.put(key, l);
- }
- else if(HttpConstants.CONTENT_TYPE.equalsIgnoreCase(key)) {
- mime.put(key, l);
- }
- else if(config.isDumpMultipartHeaders()) {
- mime.put(key, l);
- }
- }
- }
- }
- }
-
- if(mime.size()>0) {
- out.append("\n*** MimePart Header ***\n");
- Iterator<String> it = mime.keySet().iterator();
- while (it.hasNext()) {
- String key = (String) it.next();
- List<String> l = mime.get(key);
- if(l!=null && !l.isEmpty()) {
- for (String v : l) {
- out.append("- "+key+": "+v+"\n");
- }
- }
- }
- }
-
- }
-
- out.append("\n");
-
- out.append(msg.getAsString(soapPart.getEnvelope(),false));
- }
-
- if(config.isDumpAttachments()) {
- java.util.Iterator<?> it = msg.getAttachments();
- int index = 1;
- while(it.hasNext()){
- AttachmentPart ap =
- (AttachmentPart) it.next();
- out.append("\n------ Attachment-"+index+" ------\n");
-
- out.append("\n*** MimePart Header ***\n");
- if(ap.getContentId()!=null) {
- out.append("- "+HttpConstants.CONTENT_ID+": "+ap.getContentId()+"\n");
- }
- if(ap.getContentLocation()!=null) {
- out.append("- "+HttpConstants.CONTENT_LOCATION+": "+ap.getContentLocation()+"\n");
- }
- if(ap.getContentType()!=null) {
- out.append("- "+HttpConstants.CONTENT_LOCATION+": "+ap.getContentType()+"\n");
- }
- if(config.isDumpMultipartHeaders()) {
- Iterator<?> itM = ap.getAllMimeHeaders();
- if(itM!=null) {
- while(itM.hasNext()) {
- Object keyO = itM.next();
- if(keyO instanceof String) {
- String key = (String) keyO;
- if(HttpConstants.CONTENT_ID.equalsIgnoreCase(key) ||
- HttpConstants.CONTENT_LOCATION.equalsIgnoreCase(key) ||
- HttpConstants.CONTENT_TYPE.equalsIgnoreCase(key)) {
- continue;
- }
- String [] values = ap.getMimeHeader(key);
- if(values!=null && values.length>0) {
- for (String value : values) {
- out.append("- "+key+": "+value+"\n");
- }
- }
- }
- }
- }
- }
- out.append("\n");
-
- if(dumpAllAttachments){
- out.append(DumpSoapMessageUtils.dumpAttachment(msg, ap));
- }else{
- //Object o = ap.getContent(); NON FUNZIONA CON TOMCAT
- Object o = ap.getDataHandler().getContent();
- //System.out.println("["+o.getClass().getName()+"])"+ap.getContentType()+"(");
- if(HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP.equals(ap.getContentType())){
- // reimposto handler
- DumpSoapMessageUtils.rebuildAttachmentAsByteArray(msg, ap);
- }
-
- if(o instanceof String){
- out.append((String)o);
- }else{
- out.append("Contenuto attachments non è visualizzabile, tipo: "+o.getClass().getName());
- }
- }
- index++;
- }
- }
- return out.toString();
- }catch(Exception e){
- throw new MessageException(e.getMessage(),e);
- }
- }
-
- public static String dumpAttachment(OpenSPCoop2SoapMessage msg,AttachmentPart ap) throws MessageException{
- Object o = _dumpAttachment(msg, ap, false);
- // Metodo sopra non torna mai null, segnalato da sonarqube
- /*if(o == null){
- throw new MessageException("Dump error (return null reference)");
- }*/
- if(o instanceof String){
- return (String) o;
- }
- else if(o instanceof java.io.ByteArrayOutputStream){
- java.io.ByteArrayOutputStream bout = null;
- try{
- bout = (java.io.ByteArrayOutputStream) o;
- return bout.toString();
- }finally{
- try{
- if(bout!=null){
- bout.close();
- }
- }catch(Exception eClose){
- // close
- }
- }
- }
- else{
- throw new MessageException("Dump error (return type "+o.getClass().getName()+" unknown)");
- }
- }
- public static byte[] dumpAttachmentAsByteArray(OpenSPCoop2SoapMessage msg,AttachmentPart ap) throws MessageException{
- Object o = _dumpAttachment(msg, ap, false);
- // Metodo sopra non torna mai null, segnalato da sonarqube
- /*if(o == null){
- throw new MessageException("Dump error (return null reference)");
- }*/
- if(o instanceof String){
- return ((String) o).getBytes();
- }
- else if(o instanceof java.io.ByteArrayOutputStream){
- java.io.ByteArrayOutputStream bout = null;
- try{
- bout = (java.io.ByteArrayOutputStream) o;
- return bout.toByteArray();
- }finally{
- try{
- if(bout!=null){
- bout.close();
- }
- }catch(Exception eClose){
- // close
- }
- }
- }
- else{
- throw new MessageException("Dump error (return type "+o.getClass().getName()+" unknown)");
- }
- }
-
- private static Object _dumpAttachment(OpenSPCoop2SoapMessage msg,AttachmentPart ap, boolean forceReturnAsByteArrayOutputStream) throws MessageException{
- try{
- java.io.ByteArrayOutputStream bout = null;
- //Object o = ap.getContent(); NON FUNZIONA CON TOMCAT
- //java.io.InputStream inputDH = dh.getInputStream(); NON FUNZIONA CON JBOSS7 e JAVA7 e imbustamentoSOAP con GestioneManifest e rootElementMaggioreUno (tipo: application/octet-stream)
- Object o = ap.getDataHandler().getContent();
- String s = null;
- boolean forceRebuildDataHandler = false;
- if(o!=null){
- if(o instanceof byte[]){
- byte[] b = (byte[]) o;
- bout = new ByteArrayOutputStream();
- bout.write(b);
- bout.flush();
- bout.close();
- }
- else if(o instanceof InputStream){
- InputStream is = (InputStream) o;
- bout = new java.io.ByteArrayOutputStream();
- byte [] readB = new byte[8192];
- int readByte = 0;
- while((readByte = is.read(readB))!= -1)
- bout.write(readB,0,readByte);
- is.close();
- bout.flush();
- bout.close();
- }
- else if(o instanceof String){
- s = (String) o;
- bout = new ByteArrayOutputStream();
- bout.write(s.getBytes());
- bout.flush();
- bout.close();
- }
- else{
- // Provo con codiceOriginale ma in jboss non funziona sempre
- try {
- javax.activation.DataHandler dh= ap.getDataHandler();
- java.io.InputStream inputDH = dh.getInputStream();
- bout = new java.io.ByteArrayOutputStream();
- byte [] readB = new byte[8192];
- int readByte = 0;
- while((readByte = inputDH.read(readB))!= -1)
- bout.write(readB,0,readByte);
- inputDH.close();
- bout.flush();
- bout.close();
- }catch(Exception e) {
- if(o instanceof javax.xml.transform.dom.DOMSource) {
- try {
- javax.xml.transform.dom.DOMSource domSource = (javax.xml.transform.dom.DOMSource) o;
- bout = new ByteArrayOutputStream();
- bout.write(MessageXMLUtils.getInstance(msg.getFactory()).toByteArray(domSource.getNode()));
- bout.flush();
- bout.close();
- forceRebuildDataHandler = true;
- }catch(Exception eInternal) {
- throw new UtilsMultiException(e, eInternal);
- }
- }
- else {
- throw e;
- }
- }
- }
- }
- else{
- // Provo con codiceOriginale ma in jboss non funziona sempre
- javax.activation.DataHandler dh= ap.getDataHandler();
- java.io.InputStream inputDH = dh.getInputStream();
- bout = new java.io.ByteArrayOutputStream();
- byte [] readB = new byte[8192];
- int readByte = 0;
- while((readByte = inputDH.read(readB))!= -1)
- bout.write(readB,0,readByte);
- inputDH.close();
- bout.flush();
- bout.close();
- }
- // Per non perdere quanto letto
- if(HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP.equals(ap.getContentType())){
- // reimposto handler
- DumpSoapMessageUtils.rebuildAttachmentAsByteArray(msg, ap);
- }
- else if(forceRebuildDataHandler){
- // reimposto handler
- DumpSoapMessageUtils.rebuildDataHandlerAttachment(msg, ap, bout);
- }
- else if(MailcapActivationReader.existsDataContentHandler(ap.getContentType())){
- //ap.setDataHandler(new javax.activation.DataHandler(bout.toByteArray(),ap.getContentType()));
- // In axiom l'update del data handler non funziona
- if(ap.getContentType()!=null && ap.getContentType().startsWith(HttpConstants.CONTENT_TYPE_PLAIN)){
- if(s!=null){
- msg.updateAttachmentPart(ap, s, ap.getContentType());
- }
- else{
- msg.updateAttachmentPart(ap, bout.toString(),ap.getContentType());
- }
- }else{
- msg.updateAttachmentPart(ap, bout.toByteArray(),ap.getContentType());
- }
- }
- if(s!=null){
- if(forceReturnAsByteArrayOutputStream) {
- return bout;
- }
- else {
- return s;
- }
- }else{
- return bout;
- }
- }catch(Exception e){
- throw new MessageException(e.getMessage(),e);
- }
- }
-
- private static void rebuildAttachmentAsByteArray(OpenSPCoop2SoapMessage msg,AttachmentPart ap) throws MessageException{
- try{
- javax.activation.DataHandler dh= ap.getDataHandler();
- java.io.InputStream inputDH = dh.getInputStream();
- java.io.ByteArrayOutputStream bout = new java.io.ByteArrayOutputStream();
- byte [] readB = new byte[8192];
- int readByte = 0;
- while((readByte = inputDH.read(readB))!= -1)
- bout.write(readB,0,readByte);
- inputDH.close();
- bout.flush();
- bout.close();
- //ap.setDataHandler(new javax.activation.DataHandler(bout.toByteArray(),ap.getContentType()));
- // In axiom l'update del data handler non funziona
- msg.updateAttachmentPart(ap, bout.toByteArray(),ap.getContentType());
- }catch(Exception e){
- throw new MessageException(e.getMessage(),e);
- }
- }
-
- private static void rebuildDataHandlerAttachment(OpenSPCoop2SoapMessage msg,AttachmentPart ap, ByteArrayOutputStream boutAlreadyRead) throws MessageException{
- try{
- //ap.setDataHandler(new javax.activation.DataHandler(bout.toByteArray(),ap.getContentType()));
- // In axiom l'update del data handler non funziona
- msg.updateAttachmentPart(ap, new DataHandler(boutAlreadyRead.toByteArray(),ap.getContentType()));
- }catch(Exception e){
- throw new MessageException(e.getMessage(),e);
- }
- }
- }