DumpAttachment.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.message.utils;

import java.io.ByteArrayOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.openspcoop2.utils.UtilsException;
import org.openspcoop2.utils.digest.DigestEncoding;
import org.openspcoop2.utils.transport.TransportUtils;

/**
 * Allegato
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class DumpAttachment implements Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private String contentId;
	private String contentLocation;
	private String contentType;
	private Map<String, List<String>> headers = new HashMap<>();
	
	private String errorContentNotSerializable;
	private transient ByteArrayOutputStream content;
	private StringBuilder printableContent;
	
	public String getContentId() {
		return this.contentId;
	}
	public void setContentId(String contentId) {
		this.contentId = contentId;
	}
	public String getContentLocation() {
		return this.contentLocation;
	}
	public void setContentLocation(String contentLocation) {
		this.contentLocation = contentLocation;
	}
	public String getContentType() {
		return this.contentType;
	}
	public void setContentType(String contentType) {
		this.contentType = contentType;
	}
	public String getErrorContentNotSerializable() {
		return this.errorContentNotSerializable;
	}
	public void setErrorContentNotSerializable(String errorContentNotSerializable) {
		this.errorContentNotSerializable = errorContentNotSerializable;
	}
	public long getContentLength() {
		if(this.content!=null) {
			return this.content.size();
		}
		return 0;
	}
	public byte[] getContent() {
		if(this.content!=null) {
			return this.content.toByteArray();
		}
		return null;
	}
	private static String getTestoVisualizzabile(byte [] b,StringBuilder stringBuffer) {
		 try{
			 // 1024 = 1K
			 // Visualizzo al massimo 50K (per i log)
			 int max = 50 * 1024;
			 stringBuffer.append(org.openspcoop2.utils.Utilities.convertToPrintableText(b, max));
			 return null;	
		 }catch(Exception e){
			 return e.getMessage();
		 }

	 }
	public String getContentAsString(boolean ifPrintableContent) {
		if(this.content!=null) {
			if(ifPrintableContent) {
				if(this.printableContent!=null) {
					return this.printableContent.toString();
				}
				else {
					this.printableContent = new StringBuilder();
					String errore = getTestoVisualizzabile(this.content.toByteArray(),this.printableContent);
					if(errore!=null) {
						this.printableContent = new StringBuilder();
						this.printableContent.append(errore);
					}
					return this.printableContent.toString();
				}
			}
			else {
				return this.content.toString();
			}
		}
		return null;
	}
	public void setContent(ByteArrayOutputStream content) {
		this.content = content;
	}
	
	public String getContentBase64Digest(String algorithm) throws UtilsException{
		return getContentDigest(algorithm, DigestEncoding.BASE64, false);
	}
	public String getContentBase64Digest(String algorithm, String rfc3230) throws UtilsException{
		// // per invocazioni dinamiche
		boolean v = false;
		try {
			v = Boolean.valueOf(rfc3230);
		}catch(Exception e) {
			throw new UtilsException("Uncorrect boolean value '"+rfc3230+"': "+e.getMessage(),e);
		}
		return getContentBase64Digest(algorithm, v);
	}
	public String getContentBase64Digest(String algorithm, boolean rfc3230) throws UtilsException{
		return getContentDigest(algorithm, DigestEncoding.BASE64, rfc3230);
	}
	
	public String getContentHexDigest(String algorithm) throws UtilsException{
		return getContentDigest(algorithm, DigestEncoding.HEX, false);
	}
	public String getContentHexDigest(String algorithm, String rfc3230) throws UtilsException{
		// // per invocazioni dinamiche
		boolean v = false;
		try {
			v = Boolean.valueOf(rfc3230);
		}catch(Exception e) {
			throw new UtilsException("Uncorrect boolean value '"+rfc3230+"': "+e.getMessage(),e);
		}
		return getContentHexDigest(algorithm, v);
	}
	public String getContentHexDigest(String algorithm, boolean rfc3230) throws UtilsException{
		return getContentDigest(algorithm, DigestEncoding.HEX, rfc3230);
	}
	
	public String getContentDigest(String algorithm, String digestEncodingParam) throws UtilsException{
		return getContentDigest(algorithm, digestEncodingParam, false);
	}
	public String getContentDigest(String algorithm, DigestEncoding digestEncoding) throws UtilsException{
		return getContentDigest(algorithm, digestEncoding, false);
	}
	public String getContentDigest(String algorithm, String digestEncodingParam, String rfc3230) throws UtilsException{
		// // per invocazioni dinamiche
		boolean v = false;
		try {
			v = Boolean.valueOf(rfc3230);
		}catch(Exception e) {
			throw new UtilsException("Uncorrect boolean value '"+rfc3230+"': "+e.getMessage(),e);
		}
		return getContentDigest(algorithm, digestEncodingParam, v);
	}
	public String getContentDigest(String algorithm, String digestEncodingParam,
			boolean rfc3230 // aggiunge prefisso algoritmo=
			) throws UtilsException{
		DigestEncoding digestEncoding = null;
		try {
			digestEncoding = DigestEncoding.valueOf(digestEncodingParam);
		}catch(Throwable t) {
			throw new UtilsException("DigestEncoding '"+digestEncodingParam+"' unsupported");
		}
		return getContentDigest(algorithm, digestEncoding, rfc3230);
	}
	public String getContentDigest(String algorithm, DigestEncoding digestEncoding, String rfc3230) throws UtilsException{
		// // per invocazioni dinamiche
		boolean v = false;
		try {
			v = Boolean.valueOf(rfc3230);
		}catch(Exception e) {
			throw new UtilsException("Uncorrect boolean value '"+rfc3230+"': "+e.getMessage(),e);
		}
		return getContentDigest(algorithm, digestEncoding, v);
	}
	public String getContentDigest(String algorithm, DigestEncoding digestEncoding,
			boolean rfc3230 // aggiunge prefisso algoritmo=
			) throws UtilsException{
		byte[] content = getContent();
		if(content==null) {
			throw new UtilsException("Content null");
		}
		return org.openspcoop2.utils.digest.DigestUtils.getDigestValue(content, algorithm, digestEncoding, rfc3230);
	}
	
	@Deprecated
	public Map<String, String> getHeaders() {
		return TransportUtils.convertToMapSingleValue(this.headers);
	}
	public Map<String, List<String>> getHeadersValues() {
		return this.headers;
	}

	@Deprecated
	public void setHeaders(Map<String, String> headers) {
		this.headers = TransportUtils.convertToMapListValues(headers);
	}
	public void setHeadersValues(Map<String, List<String>> headers) {
		this.headers = headers;
	}
}