OpenSPCoop2DataContentHandler.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;
- import java.awt.datatransfer.DataFlavor;
- import java.io.ByteArrayOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import javax.activation.ActivationDataFlavor;
- import javax.activation.DataContentHandler;
- import javax.activation.DataSource;
- import org.openspcoop2.utils.io.Base64Utilities;
- import org.openspcoop2.utils.resources.Loader;
- import org.openspcoop2.utils.transport.http.HttpConstants;
- /**
- * DataContentHandler per la gestione degli attachments
- *
- *
- * @author Poli Andrea (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class OpenSPCoop2DataContentHandler implements DataContentHandler{
- public static final String OPENSPCOOP2_SIGNATURE = "===SIGNATURE=OPENSPCOOP2===";
-
- public OpenSPCoop2DataContentHandler(){}
- public static Object getContent(java.io.InputStream inputstream) throws IOException {
- try{
- ByteArrayOutputStream bout = new ByteArrayOutputStream();
- byte[] bRead = new byte[8094];
- int byteLetti = 0;
- while( (byteLetti =inputstream.read(bRead))!= -1 ){
- bout.write(bRead, 0, byteLetti);
- }
- bout.flush();
- bout.close();
-
- if(bout.size() <= OpenSPCoop2DataContentHandler.OPENSPCOOP2_SIGNATURE.length()){
- throw new Exception("OpenSPCoop2DataContentHandler Signature non presente (length is too small)");
- }
- boolean giaCodificato = true;
- String attach = bout.toString();
- for(int i=0; i<OpenSPCoop2DataContentHandler.OPENSPCOOP2_SIGNATURE.length(); i++){
- if( (attach.charAt(i)) != OpenSPCoop2DataContentHandler.OPENSPCOOP2_SIGNATURE.charAt(i) ){
- giaCodificato = false;
- break;
- }
- }
- if(giaCodificato==false){
- throw new Exception("OpenSPCoop2DataContentHandler Signature non presente");
- }else{
- attach = attach.substring(OpenSPCoop2DataContentHandler.OPENSPCOOP2_SIGNATURE.length(),attach.length());
- }
-
- OpenSPCoop2DataContentHandlerInputStream bin = new OpenSPCoop2DataContentHandlerInputStream(Base64Utilities.decode(attach));
- return bin;
- }catch(Exception e){
- throw new IOException("@@@ OpenSPCoop2DataContentHandler.getContent() error: "+e.getMessage());
- }
- }
-
- @Override
- public Object getContent(DataSource datasource) throws IOException{
- try{
- java.io.InputStream inputstream = datasource.getInputStream();
- return OpenSPCoop2DataContentHandler.getContent(inputstream);
- }catch(Exception e){
- throw new IOException("@@@ OpenSPCoop2DataContentHandler.getContent() error: "+e.getMessage());
- }
- }
- @Override
- public Object getTransferData(DataFlavor dataflavor, DataSource datasource)
- throws IOException
- {
- //logger.info("@@@ BinDataContentHandler.getTransferData: non implementato");
- return null;
- }
- @Override
- public DataFlavor[] getTransferDataFlavors()
- {
- DataFlavor adataflavor[] = new DataFlavor[1];
- try
- {
- adataflavor[0] = new ActivationDataFlavor(Loader.getInstance().forName("org.openspcoop2.message.OpenSPCoop2DataContentHandler"),
- HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP, "OpenSPCoop2AttachmentsTunnel");
- }
- catch(Exception exception) { }
- return adataflavor;
- }
- @Override
- public void writeTo(Object obj, String s, OutputStream outputstream)
- throws IOException
- {
- try{
- byte content[] = null;
- if(obj instanceof InputStream){
- InputStream inputstream = (InputStream) obj;
- ByteArrayOutputStream bout = new ByteArrayOutputStream();
- byte[] bRead = new byte[8094];
- int byteLetti = 0;
- while( (byteLetti =inputstream.read(bRead))!= -1 ){
- bout.write(bRead, 0, byteLetti);
- }
- bout.flush();
- bout.close();
- content = bout.toByteArray();
- }else{
- content = (byte[])obj;
- }
- // Deve essere codificato solo una volta!!
- boolean giaCodificato = true;
- if( !(content.length<OpenSPCoop2DataContentHandler.OPENSPCOOP2_SIGNATURE.length()+1) ){
- for(int i=0; i<OpenSPCoop2DataContentHandler.OPENSPCOOP2_SIGNATURE.length(); i++){
- if( ((char)content[i]) != OpenSPCoop2DataContentHandler.OPENSPCOOP2_SIGNATURE.charAt(i) ){
- giaCodificato = false;
- break;
- }
- }
- }
-
- if(giaCodificato){
- outputstream.write(content);
- }else{
- String encoded = OpenSPCoop2DataContentHandler.OPENSPCOOP2_SIGNATURE + Base64Utilities.encodeAsString(content);
- outputstream.write(encoded.getBytes());
- }
- }
- catch(Exception exception)
- {
- throw new IOException("@@@ OpenSPCoop2DataContentHandler.writeTo: Unable to run the Binary decoding on a stream " + exception.getMessage());
- }
- }
- }