ConnettoreFILE.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.pdd.core.connettori;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.OutputStream;
- import java.util.ArrayList;
- import java.util.Enumeration;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import java.util.Properties;
- import java.util.Scanner;
- import org.apache.commons.lang.StringUtils;
- import org.openspcoop2.core.config.ResponseCachingConfigurazione;
- import org.openspcoop2.core.constants.CostantiConnettori;
- import org.openspcoop2.core.transazioni.constants.TipoMessaggio;
- import org.openspcoop2.message.OpenSPCoop2SoapMessage;
- import org.openspcoop2.message.constants.Costanti;
- import org.openspcoop2.message.constants.MessageType;
- import org.openspcoop2.message.soap.TunnelSoapUtils;
- import org.openspcoop2.pdd.core.dynamic.DynamicInfo;
- import org.openspcoop2.pdd.core.dynamic.DynamicUtils;
- import org.openspcoop2.pdd.mdb.ConsegnaContenutiApplicativi;
- import org.openspcoop2.utils.Utilities;
- import org.openspcoop2.utils.date.DateManager;
- import org.openspcoop2.utils.io.DumpByteArrayOutputStream;
- import org.openspcoop2.utils.resources.FileSystemUtilities;
- import org.openspcoop2.utils.transport.TransportUtils;
- import org.openspcoop2.utils.transport.http.HttpConstants;
- import org.openspcoop2.utils.transport.http.HttpUtilities;
- /**
- * Classe utilizzata per effettuare consegne di messaggi su file system
- *
- *
- * @author Poli Andrea (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class ConnettoreFILE extends ConnettoreBaseWithResponse {
- @Override
- public String getProtocollo() {
- return "FILE";
- }
-
- /* ******** F I E L D S P R I V A T I ******** */
- public ByteArrayOutputStream outByte = new ByteArrayOutputStream();
- /** File */
- private ConnettoreFile_outputConfig outputFile = null;
- private ConnettoreFile_outputConfig outputFileHeaders = null;
- private boolean outputFileAutoCreateParentDirectory = false;
- private boolean outputFileOverwriteIfExists = false;
- private boolean generateResponse = false;
- private File inputFile = null;
- private File inputFileHeaders = null;
- private boolean inputFileDeleteAfterRead = false;
- private Integer inputFileWaitTimeIfNotExists;
-
- private ByteArrayOutputStream boutFileOutputHeaders;
-
-
- /* Costruttori */
- public ConnettoreFILE(){
-
- }
-
-
- /* ******** METODI ******** */
- public String buildLocation(ConnettoreMsg request) throws ConnettoreException{
-
- this.properties = request.getConnectorProperties();
-
- // Costruisco Mappa per dynamic name
- // NOTA: Lasciare la costruzione qua, poiche' altrimenti la classe File lancia eccezioni se trova i threshold
- Map<String, Object> dynamicMap = this.buildDynamicMap(request);
-
- // OutputFile
- String tmp = this.getDynamicProperty(request.getTipoConnettore(), true, CostantiConnettori.CONNETTORE_FILE_REQUEST_OUTPUT_FILE, dynamicMap);
- File f = new File(tmp);
- String l = f.getAbsolutePath();
-
- // OutputFile-Headers
- tmp = this.getDynamicProperty(request.getTipoConnettore(), false, CostantiConnettori.CONNETTORE_FILE_REQUEST_OUTPUT_FILE_HEADERS, dynamicMap);
- if(tmp!=null){
- l = l + " [headers: "+(new File(tmp)).getAbsolutePath()+"]";
- }
-
- return l;
- }
-
- @Override
- protected boolean initializePreSend(ResponseCachingConfigurazione responseCachingConfig, ConnettoreMsg request) {
-
- if(this.initialize(request, true, responseCachingConfig)==false){
- return false;
- }
-
- return true;
-
- }
-
- @Override
- protected boolean send(ConnettoreMsg request) {
- // Lettura Parametri
- try{
-
- this.checkContentType = true;
- if(this.idModulo!=null){
- if(ConsegnaContenutiApplicativi.ID_MODULO.equals(this.idModulo)){
- this.checkContentType = this.openspcoopProperties.isControlloContentTypeAbilitatoRicezioneBuste();
- }else{
- this.checkContentType = this.openspcoopProperties.isControlloContentTypeAbilitatoRicezioneContenutiApplicativi();
- }
- }
-
-
- // Costruisco Mappa per dynamic name
- Map<String, Object> dynamicMap = new HashMap<>();
- DynamicInfo dInfo = new DynamicInfo(request, this.getPddContext());
- DynamicUtils.fillDynamicMap(this.logger.getLogger(),dynamicMap, dInfo);
-
-
- // Identificativo modulo
- this.idModulo = request.getIdModulo();
-
- // Context per invocazioni handler
- this.outRequestContext = request.getOutRequestContext();
- this.msgDiagnostico = request.getMsgDiagnostico();
-
-
- // analsi i parametri specifici per il connettore
-
- // OutputFile
- this.outputFile = readOutputConfig(request.getTipoConnettore(), true,
- CostantiConnettori.CONNETTORE_FILE_REQUEST_OUTPUT_FILE,
- CostantiConnettori.CONNETTORE_FILE_REQUEST_OUTPUT_FILE_PERMISSIONS);
- if(this.outputFile==null || this.outputFile.getOutputFile()==null){
- return false;
- }
-
- // OutputFileHeader
- this.outputFileHeaders = readOutputConfig(request.getTipoConnettore(), false,
- CostantiConnettori.CONNETTORE_FILE_REQUEST_OUTPUT_FILE_HEADERS,
- CostantiConnettori.CONNETTORE_FILE_REQUEST_OUTPUT_FILE_HEADERS_PERMISSIONS);
- // Location
- this.location = this.outputFile.getOutputFile().getAbsolutePath();
- if(this.outputFileHeaders!=null){
- this.location = this.location + " [headers: "+this.outputFileHeaders.getOutputFile().getAbsolutePath()+"]";
- }
-
- // AutoCreateDir
- this.outputFileAutoCreateParentDirectory = this.isBooleanProperty(request.getTipoConnettore(), false, CostantiConnettori.CONNETTORE_FILE_REQUEST_OUTPUT_AUTO_CREATE_DIR);
-
- // OverwriteFileIfExists
- this.outputFileOverwriteIfExists = this.isBooleanProperty(request.getTipoConnettore(), false, CostantiConnettori.CONNETTORE_FILE_REQUEST_OUTPUT_OVERWRITE_FILE);
-
- // GenerazioneRisposta
- this.generateResponse = this.isBooleanProperty(request.getTipoConnettore(), false, CostantiConnettori.CONNETTORE_FILE_RESPONSE_INPUT_MODE);
-
- if(this.generateResponse){
-
- // InputFile
- String tmp = this.getDynamicProperty(request.getTipoConnettore(), true, CostantiConnettori.CONNETTORE_FILE_RESPONSE_INPUT_FILE, dynamicMap);
- if(tmp==null){
- return false;
- }
- this.inputFile = new File(tmp);
-
- // InputFileHeader
- tmp = this.getDynamicProperty(request.getTipoConnettore(), false, CostantiConnettori.CONNETTORE_FILE_RESPONSE_INPUT_FILE_HEADERS, dynamicMap);
- if(tmp!=null){
- this.inputFileHeaders = new File(tmp);
- }
-
- // DeleteAfterRead
- this.inputFileDeleteAfterRead = this.isBooleanProperty(request.getTipoConnettore(), false, CostantiConnettori.CONNETTORE_FILE_RESPONSE_INPUT_FILE_DELETE_AFTER_READ);
-
- // inputFileWaitTimeIfNotExists
- this.inputFileWaitTimeIfNotExists = this.getIntegerProperty(request.getTipoConnettore(), false, CostantiConnettori.CONNETTORE_FILE_RESPONSE_INPUT_WAIT_TIME);
- }
-
- } catch(Exception e){
- this.eccezioneProcessamento = e;
- this.errore = "Errore avvenuto durante la consegna su FileSystem: "+this.readExceptionMessageFromException(e);
- this.logger.error("Errore avvenuto durante la consegna su FileSystem: "+this.readExceptionMessageFromException(e),e);
- return false;
- }
-
-
-
- // Gestione File
- int readConnectionTimeout = -1;
- boolean readConnectionTimeoutConfigurazioneGlobale = true;
- try{
- /* ------------ Request ------------- */
-
-
- // OutputFile
- this.checkOutputFile(this.outputFile, "Request");
-
- // OutputFile Headers
- if(this.outputFileHeaders!=null){
- this.checkOutputFile(this.outputFileHeaders, "Request-Headers");
- }
-
-
- // Tipologia di servizio
- MessageType requestMessageType = this.requestMsg.getMessageType();
- OpenSPCoop2SoapMessage soapMessageRequest = null;
- if(this.debug)
- this.logger.debug("Tipologia Servizio: "+this.requestMsg.getServiceBinding());
- if(this.isSoap){
- soapMessageRequest = this.requestMsg.castAsSoap();
- }
-
-
-
- // Alcune implementazioni richiedono di aggiornare il Content-Type
- this.requestMsg.updateContentType();
-
-
- // Properties per serializzazione header file
- this.boutFileOutputHeaders = new ByteArrayOutputStream();
-
-
- // Collezione header di trasporto per dump
- Map<String, List<String>> propertiesTrasportoDebug = null;
- if(this.isDumpBinarioRichiesta()) {
- propertiesTrasportoDebug = new HashMap<>();
- }
-
-
- // Impostazione Content-Type
- String contentTypeRichiesta = null;
- if(this.debug)
- this.logger.debug("Impostazione content type...");
- if(this.isSoap){
- if(this.sbustamentoSoap && soapMessageRequest.countAttachments()>0 && TunnelSoapUtils.isTunnelOpenSPCoopSoap(soapMessageRequest)){
- contentTypeRichiesta = TunnelSoapUtils.getContentTypeTunnelOpenSPCoopSoap(soapMessageRequest.getSOAPBody());
- }else{
- contentTypeRichiesta = this.requestMsg.getContentType();
- }
- if(contentTypeRichiesta==null){
- throw new Exception("Content-Type del messaggio da spedire non definito");
- }
- }
- else{
- contentTypeRichiesta = this.requestMsg.getContentType();
- // Content-Type non obbligatorio in REST
- }
- if(this.debug)
- this.logger.info("Impostazione Content-Type ["+contentTypeRichiesta+"]",false);
- if(contentTypeRichiesta!=null){
- setRequestHeader(HttpConstants.CONTENT_TYPE, contentTypeRichiesta, this.logger, propertiesTrasportoDebug);
- }
-
-
-
- // Impostazione timeout
- if(this.debug)
- this.logger.debug("Impostazione timeout...");
- if(this.properties.get(CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT)!=null){
- try{
- readConnectionTimeout = Integer.parseInt(this.properties.get(CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT));
- readConnectionTimeoutConfigurazioneGlobale = this.properties.containsKey(CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT_GLOBALE);
- }catch(Exception e){
- this.logger.error("Parametro "+CostantiConnettori.CONNETTORE_READ_CONNECTION_TIMEOUT+" errato",e);
- }
- }
- if(readConnectionTimeout==-1){
- readConnectionTimeout = HttpUtilities.HTTP_READ_CONNECTION_TIMEOUT;
- }
- if(this.debug)
- this.logger.info("Impostazione read timeout ["+readConnectionTimeout+"]",false);
-
-
-
- // Impostazione Proprieta del trasporto
- if(this.debug)
- this.logger.debug("Impostazione header di trasporto...");
- this.forwardHttpRequestHeader();
- if(this.propertiesTrasporto != null){
- Iterator<String> keys = this.propertiesTrasporto.keySet().iterator();
- while (keys.hasNext()) {
- String key = (String) keys.next();
- List<String> values = this.propertiesTrasporto.get(key);
- if(this.debug) {
- if(values!=null && !values.isEmpty()) {
- for (String value : values) {
- this.logger.info("Set Transport Header ["+key+"]=["+value+"]",false);
- }
- }
- }
-
- setRequestHeader(key, values, this.logger, propertiesTrasportoDebug);
- }
- }
-
-
-
-
-
- // Aggiunta del SoapAction Header in caso di richiesta SOAP
- // spostato sotto il forwardHeader per consentire alle trasformazioni di modificarla
- if(this.isSoap && this.sbustamentoSoap == false){
- if(this.debug)
- this.logger.debug("Impostazione soap action...");
- boolean existsTransportProperties = false;
- if(TransportUtils.containsKey(this.propertiesTrasporto, Costanti.SOAP11_MANDATORY_HEADER_HTTP_SOAP_ACTION)){
- this.soapAction = TransportUtils.getFirstValue(this.propertiesTrasporto, Costanti.SOAP11_MANDATORY_HEADER_HTTP_SOAP_ACTION);
- existsTransportProperties = (this.soapAction!=null);
- }
- if(!existsTransportProperties) {
- this.soapAction = soapMessageRequest.getSoapAction();
- }
- if(this.soapAction==null){
- this.soapAction="\"OpenSPCoop\"";
- }
- if(MessageType.SOAP_11.equals(this.requestMsg.getMessageType()) && !existsTransportProperties){
- // NOTA non quotare la soap action, per mantenere la trasparenza della PdD
- setRequestHeader(Costanti.SOAP11_MANDATORY_HEADER_HTTP_SOAP_ACTION,this.soapAction, this.logger, propertiesTrasportoDebug);
- }
- if(this.debug)
- this.logger.info("SOAP Action inviata ["+this.soapAction+"]",false);
- }
-
-
-
-
-
- // Spedizione byte
- boolean consumeRequestMessage = true;
- if(this.debug)
- this.logger.debug("Serializzazione ["+this.outputFile.getOutputFile().getAbsolutePath()+"] (consume-request-message:"+consumeRequestMessage+")...");
- OutputStream out = new FileOutputStream(this.outputFile.getOutputFile());
- if(this.isDumpBinarioRichiesta()) {
- DumpByteArrayOutputStream bout = new DumpByteArrayOutputStream(this.dumpBinario_soglia, this.dumpBinario_repositoryFile, this.idTransazione,
- TipoMessaggio.RICHIESTA_USCITA_DUMP_BINARIO.getValue());
- try {
- this.emitDiagnosticStartDumpBinarioRichiestaUscita();
-
- if(this.isSoap && this.sbustamentoSoap){
- this.logger.debug("Sbustamento...");
- TunnelSoapUtils.sbustamentoMessaggio(soapMessageRequest,bout);
- }else{
- this.requestMsg.writeTo(bout, consumeRequestMessage);
- }
- bout.flush();
- bout.close();
-
- if(bout.isSerializedOnFileSystem()) {
- try(FileInputStream fin = new FileInputStream(bout.getSerializedFile())) {
- Utilities.copy(fin, out);
- }
- }
- else {
- out.write(bout.toByteArray());
- }
-
- out.flush();
- out.close();
-
- this.dataRichiestaInoltrata = DateManager.getDate();
-
- this.dumpBinarioRichiestaUscita(bout, requestMessageType, contentTypeRichiesta, this.location, propertiesTrasportoDebug);
- }finally {
- try {
- bout.clearResources();
- }catch(Throwable t) {
- this.logger.error("Release resources failed: "+t.getMessage(),t);
- }
- }
- }else{
- if(this.isSoap && this.sbustamentoSoap){
- if(this.debug)
- this.logger.debug("Sbustamento...");
- TunnelSoapUtils.sbustamentoMessaggio(soapMessageRequest,out);
- }else{
- this.requestMsg.writeTo(out, consumeRequestMessage);
- }
-
- out.flush();
- out.close();
-
- this.dataRichiestaInoltrata = DateManager.getDate();
- }
- if(this.debug)
- this.logger.debug("Serializzazione ["+this.outputFile.getOutputFile().getAbsolutePath()+"] effettuata");
-
- if(this.outputFile.isPermission()) {
- if(this.debug)
- this.logger.debug("Modifica diritti del file ["+this.outputFile.getOutputFile().getAbsolutePath()+"] ("+this.outputFile.getPermissionAsString()+") ...");
- setPermission(this.outputFile);
- if(this.debug)
- this.logger.debug("Modifica diritti del file ["+this.outputFile.getOutputFile().getAbsolutePath()+"] ("+this.outputFile.getPermissionAsString()+") effettuata");
- }
-
-
- // Spedizione File Headers
- this.boutFileOutputHeaders.flush();
- this.boutFileOutputHeaders.close();
- if(this.outputFileHeaders!=null){
- if(this.debug)
- this.logger.debug("Serializzazione File Output Headers ["+this.outputFileHeaders.getOutputFile().getAbsolutePath()+"]...");
- out = new FileOutputStream(this.outputFileHeaders.getOutputFile());
- if(this.debug){
- ByteArrayOutputStream bout = new ByteArrayOutputStream();
- bout.write(this.boutFileOutputHeaders.toByteArray());
- bout.flush();
- bout.close();
- out.write(bout.toByteArray());
- this.logger.info("File Header Serializzato:\n"+bout.toString(),false);
- }else{
- out.write(this.boutFileOutputHeaders.toByteArray());
- }
- out.flush();
- out.close();
- if(this.debug)
- this.logger.debug("Serializzazione File Output Headers ["+this.outputFileHeaders.getOutputFile().getAbsolutePath()+"] effettuata");
-
- if(this.outputFileHeaders.isPermission()) {
- if(this.debug)
- this.logger.debug("Modifica diritti del file ["+this.outputFileHeaders.getOutputFile().getAbsolutePath()+"] ("+this.outputFileHeaders.getPermissionAsString()+") ...");
- setPermission(this.outputFileHeaders);
- if(this.debug)
- this.logger.debug("Modifica diritti del file ["+this.outputFileHeaders.getOutputFile().getAbsolutePath()+"] ("+this.outputFileHeaders.getPermissionAsString()+") effettuata");
- }
- }
-
-
-
-
- /* ------------ PostOutRequestHandler ------------- */
- this.postOutRequest();
-
-
-
-
- // return code
- this.codice = 200; // codice deve essere impostato prima delle invocazioni dei successivi metodi nel caso di gestione response, altrimenti cmq ho finito
-
-
- if(this.generateResponse){
-
-
- /* ------------ PreInResponseHandler ------------- */
- this.preInResponse();
-
- // Lettura risposta parametri NotifierInputStream per la risposta
- this.notifierInputStreamParams = null;
- if(this.preInResponseContext!=null){
- this.notifierInputStreamParams = this.preInResponseContext.getNotifierInputStreamParams();
- }
-
-
-
-
-
- /* ------------ Response ------------- */
-
- // InputFile
- this.checkInputFile(this.inputFile, "Response");
-
- // InputFile Header
- if(this.inputFileHeaders!=null){
- this.checkInputFile(this.inputFileHeaders, "Response-Headers");
- this.propertiesTrasportoRisposta = new HashMap<>();
- FileInputStream fin = new FileInputStream(this.inputFileHeaders);
- try{
- Properties pTmp = new Properties();
- pTmp.load(fin);
- if(pTmp.size()>0) {
- Enumeration<Object> en = pTmp.keys();
- while (en.hasMoreElements()) {
- Object oKey = (Object) en.nextElement();
- if(oKey instanceof String) {
- String key = (String) oKey;
- String value = pTmp.getProperty(key);
- TransportUtils.addHeader(this.propertiesTrasportoRisposta, key, value);
- }
- }
-
- }
- }
- catch(Exception e){
- throw new Exception("Input File (Response-Headers) ["+this.inputFileHeaders.getAbsolutePath()+"] with wrong format: "+e.getMessage(),e);
- }
- finally{
- try{
- if(fin!=null){
- fin.close();
- }
- }catch(Exception eClose){
- // close
- }
- }
- }
-
-
- // Dati Risposta
- if(this.debug)
- this.logger.debug("Analisi risposta...");
- if(this.propertiesTrasportoRisposta!=null && this.propertiesTrasportoRisposta.size()>0){
- this.tipoRisposta = TransportUtils.getFirstValue(this.propertiesTrasportoRisposta, HttpConstants.CONTENT_TYPE);
- }
- if(this.tipoRisposta==null || "".equals(this.tipoRisposta)) {
- this.tipoRisposta = contentTypeRichiesta;
- if(this.propertiesTrasportoRisposta==null) {
- this.propertiesTrasportoRisposta = new HashMap<>();
- }
- TransportUtils.setHeader(this.propertiesTrasportoRisposta, HttpConstants.CONTENT_TYPE, this.tipoRisposta);
- }
-
- // Parametri di imbustamento
- if(this.isSoap){
- this.imbustamentoConAttachment = false;
- if(this.propertiesTrasportoRisposta!=null && this.propertiesTrasportoRisposta.size()>0){
- if("true".equals(TransportUtils.getObjectAsString(this.propertiesTrasportoRisposta, this.openspcoopProperties.getTunnelSOAPKeyWord_headerTrasporto()))){
- this.imbustamentoConAttachment = true;
- }
- this.mimeTypeAttachment = TransportUtils.getFirstValue(this.propertiesTrasportoRisposta, this.openspcoopProperties.getTunnelSOAPKeyWordMimeType_headerTrasporto());
- if(this.mimeTypeAttachment==null)
- this.mimeTypeAttachment = HttpConstants.CONTENT_TYPE_OPENSPCOOP2_TUNNEL_SOAP;
- //System.out.println("IMB["+imbustamentoConAttachment+"] MIME["+mimeTypeAttachment+"]");
- }
- }
-
-
- // Gestione risposta
-
- this.isResponse = new FileInputStream(this.inputFile);
-
- this.normalizeInputStreamResponse(readConnectionTimeout, readConnectionTimeoutConfigurazioneGlobale);
-
- this.initCheckContentTypeConfiguration();
-
- if(this.isDumpBinarioRisposta()){
- this.dumpResponse(this.propertiesTrasportoRisposta);
- }
-
- if(this.isRest){
-
- if(this.doRestResponse()==false){
- return false;
- }
-
- }
- else{
-
- if(this.doSoapResponse()==false){
- return false;
- }
-
- }
-
- }
- if(this.debug)
- this.logger.info("Gestione consegna su file effettuata con successo",false);
-
- return true;
- } catch(Exception e){
- this.eccezioneProcessamento = e;
- String msgErrore = this.readExceptionMessageFromException(e);
- if(this.generateErrorWithConnectorPrefix) {
- this.errore = "Errore avvenuto durante la consegna su FileSystem: "+msgErrore;
- }
- else {
- this.errore = msgErrore;
- }
- this.logger.error("Errore avvenuto durante la consegna su FileSystem: "+msgErrore,e);
-
- /**this.processConnectionTimeoutException(connectionTimeout, e, msgErrore);*/
-
- this.processReadTimeoutException(readConnectionTimeout, readConnectionTimeoutConfigurazioneGlobale, e, msgErrore);
-
- return false;
- }
- }
-
- /**
- * Effettua la disconnessione
- */
- @Override
- public void disconnect() throws ConnettoreException{
- List<Throwable> listExceptionChiusura = new ArrayList<Throwable>();
- try{
-
- // Gestione finale
-
- if(this.isResponse!=null){
- if(this.debug && this.logger!=null)
- this.logger.debug("Chiusura inputStream ["+this.inputFile.getAbsolutePath()+"] ...");
- try{
- this.isResponse.close();
- if(this.debug && this.logger!=null)
- this.logger.debug("Chiusura inputStream ["+this.inputFile.getAbsolutePath()+"] effettuata con successo");
- }catch(Throwable e){
- if(this.logger!=null)
- this.logger.error("Chiusura inputStream ["+this.inputFile.getAbsolutePath()+"] non riuscita");
- listExceptionChiusura.add(e);
- }
- }
-
- if(this.inputFile!=null && this.inputFileDeleteAfterRead && this.inputFile.exists()){
- if(this.debug && this.logger!=null)
- this.logger.debug("Eliminazione File ["+this.inputFile.getAbsolutePath()+"] ...");
- if(this.inputFile.delete()){
- if(this.debug && this.logger!=null)
- this.logger.debug("Eliminazione File ["+this.inputFile.getAbsolutePath()+"] effettuata con successo");
- }
- else{
- if(this.logger!=null)
- this.logger.error("Eliminazione File ["+this.inputFile.getAbsolutePath()+"] non riuscita");
- }
- }
-
- // Gestione finale della connessione
- if(this.inputFileHeaders!=null && this.inputFileDeleteAfterRead && this.inputFileHeaders.exists()){
- if(this.debug && this.logger!=null)
- this.logger.debug("Eliminazione File ["+this.inputFileHeaders.getAbsolutePath()+"] ...");
- if(this.inputFileHeaders.delete()){
- if(this.debug && this.logger!=null)
- this.logger.debug("Eliminazione File ["+this.inputFileHeaders.getAbsolutePath()+"] effettuata con successo");
- }
- else{
- if(this.logger!=null)
- this.logger.error("Eliminazione File ["+this.inputFileHeaders.getAbsolutePath()+"] non riuscita");
- }
- }
-
-
- // super.disconnect (Per risorse base)
- try {
- super.disconnect();
- }catch(Throwable t) {
- this.logger.debug("Chiusura risorse fallita: "+t.getMessage(),t);
- listExceptionChiusura.add(t);
- }
-
- }catch(Exception e){
- throw new ConnettoreException("Chiusura non riuscita: "+e.getMessage(),e);
- }
-
- if(listExceptionChiusura!=null && !listExceptionChiusura.isEmpty()) {
- org.openspcoop2.utils.UtilsMultiException multiException = new org.openspcoop2.utils.UtilsMultiException(listExceptionChiusura.toArray(new Throwable[1]));
- throw new ConnettoreException("Chiusura connessione non riuscita: "+multiException.getMessage(),multiException);
- }
- }
-
- /**
- * Ritorna l'informazione su dove il connettore sta spedendo il messaggio
- *
- * @return location di inoltro del messaggio
- */
- @Override
- public String getLocation(){
- return this.location;
- }
- private void setRequestHeader(String key, String value, ConnettoreLogger logger, Map<String, List<String>> propertiesTrasportoDebug) throws Exception {
- List<String> list = new ArrayList<>();
- list.add(value);
- this.setRequestHeader(key, list, logger, propertiesTrasportoDebug);
- }
- private void setRequestHeader(String key, List<String> values, ConnettoreLogger logger, Map<String, List<String>> propertiesTrasportoDebug) throws Exception {
-
- if(this.debug) {
- if(values!=null && !values.isEmpty()) {
- for (String value : values) {
- this.logger.info("Set proprietà trasporto ["+key+"]=["+value+"]",false);
- }
- }
- }
- setRequestHeader(key, values, propertiesTrasportoDebug);
-
- }
-
- @Override
- protected void setRequestHeader(String key,List<String> values) throws Exception{
- if(values!=null && !values.isEmpty()) {
- for (String value : values) {
- this.boutFileOutputHeaders.write((key+"="+value+"\n").getBytes());
- }
- }
- }
-
-
- private void checkOutputFile(ConnettoreFile_outputConfig fileConfig, String tipo) throws Exception{
- File file = fileConfig.getOutputFile();
- if(this.debug){
- this.logger.debug("Check file output ("+tipo+") ["+file.getAbsolutePath()+"]...");
- }
- if(file.exists()){
- if(this.debug){
- this.logger.debug("File output ("+tipo+") ["+file.getAbsolutePath()+"] exists canRead["+file.canRead()+
- "] canWrite["+file.canWrite()+"] canExcute["+file.canExecute()+"] isDirectory["+
- file.isDirectory()+"] isFile["+file.isFile()+"] isHidden["+file.isHidden()+"]");
- }
- if(this.outputFileOverwriteIfExists==false){
- throw new Exception("Output File ("+tipo+") ["+file.getAbsolutePath()+"] already exists (overwrite not permitted)");
- }
- if(file.isFile()==false){
- throw new Exception("Output File ("+tipo+") ["+file.getAbsolutePath()+"] already exists with uncorrect type (is Directory?)");
- }
- if(file.canWrite()==false){
- throw new Exception("Output File ("+tipo+") ["+file.getAbsolutePath()+"] already exists (cannot rewrite)");
- }
- }
- if(this.debug){
- this.logger.debug("("+tipo+") Check parent directory ...");
- }
- if(file.getParentFile()!=null){
- if(this.debug){
- this.logger.debug("("+tipo+") Check parent directory ["+file.getParentFile().getAbsolutePath()+"] ...");
- }
- if(file.getParentFile().exists()==false){
- if(this.outputFileAutoCreateParentDirectory==false){
- throw new Exception("Parent Directory Output File ("+tipo+") ["+file.getParentFile().getAbsolutePath()+"] not exists (auto create not permitted)");
- }
- FileSystemUtilities.mkdirParentDirectory(file,
- fileConfig.getReadable(), fileConfig.getReadable_ownerOnly(),
- fileConfig.getWritable(), fileConfig.getWritable_ownerOnly(),
- fileConfig.getExecutable(), fileConfig.getExecutable_ownerOnly());
- }
- else{
- if(this.debug){
- this.logger.debug("Parent Directory Output File ("+tipo+") ["+file.getParentFile().getAbsolutePath()+"] exists canRead["+file.getParentFile().canRead()+
- "] canWrite["+file.getParentFile().canWrite()+"] canExcute["+file.getParentFile().canExecute()+"] isDirectory["+
- file.getParentFile().isDirectory()+"] isFile["+file.getParentFile().isFile()+"] isHidden["+file.getParentFile().isHidden()+"]");
- }
- if(file.getParentFile().isDirectory()==false){
- throw new Exception("Parent Directory Output File ("+tipo+") ["+file.getParentFile().getAbsolutePath()+"] already exists with uncorrect type (is File?)");
- }
- if(file.getParentFile().canWrite()==false){
- throw new Exception("Parent Directory Output File ("+tipo+") ["+file.getParentFile().getAbsolutePath()+"] already exists (cannot rewrite)");
- }
- }
- }
- }
-
- private void checkInputFile(File file, String tipo) throws Exception{
- if(this.debug){
- this.logger.debug("Check file input ("+tipo+") ["+file.getAbsolutePath()+"]...");
- }
- if(file.exists()){
- this._checkInputFile(file, tipo);
- }
- else{
-
- if(this.inputFileWaitTimeIfNotExists!=null && this.inputFileWaitTimeIfNotExists>0){
-
- int millisecond = this.inputFileWaitTimeIfNotExists;
- int tempoSingoloSleepMs = 250;
- if(millisecond>tempoSingoloSleepMs){
- int count = millisecond/tempoSingoloSleepMs;
- int resto = millisecond%tempoSingoloSleepMs;
- this.logger.info("Wait "+millisecond+"ms ...", false);
- for (int i = 0; i < count; i++) {
- Utilities.sleep(tempoSingoloSleepMs);
- if(file.exists()){
- break;
- }
- }
- if(!file.exists()){
- Utilities.sleep(resto);
- }
- this.logger.info("Wait "+millisecond+"ms terminated", false);
- }else{
- this.logger.info("Wait "+millisecond+"ms ...", false);
- Utilities.sleep(tempoSingoloSleepMs);
- this.logger.info("Wait "+millisecond+"ms terminated", false);
- }
-
- if(file.exists()){
- this._checkInputFile(file, tipo);
- }
- else{
- throw new Exception("Input File ("+tipo+") ["+file.getAbsolutePath()+"] not exists (wait "+millisecond+"ms)");
- }
- }
- else{
- throw new Exception("Input File ("+tipo+") ["+file.getAbsolutePath()+"] not exists");
- }
- }
- }
- private void _checkInputFile(File file, String tipo) throws Exception{
- if(this.debug){
- this.logger.debug("File input ("+tipo+") ["+file.getAbsolutePath()+"] exists canRead["+file.canRead()+
- "] canWrite["+file.canWrite()+"] canExcute["+file.canExecute()+"] isDirectory["+
- file.isDirectory()+"] isFile["+file.isFile()+"] isHidden["+file.isHidden()+"] lenght["+file.length()+"]");
- }
- if(file.isFile()==false){
- throw new Exception("Input File ("+tipo+") ["+file.getAbsolutePath()+"] with uncorrect type (is Directory?)");
- }
- if(file.canRead()==false){
- throw new Exception("Input File ("+tipo+") ["+file.getAbsolutePath()+"] cannot read");
- }
- if(file.length()<=0){
- throw new Exception("Input File ("+tipo+") ["+file.getAbsolutePath()+"] empty");
- }
- if(this.inputFileDeleteAfterRead){
- if(file.canWrite()==false){
- throw new Exception("Input File ("+tipo+") ["+file.getAbsolutePath()+"] cannot write (delete after read required)");
- }
- }
- }
- private ConnettoreFile_outputConfig readOutputConfig(String tipoConnettore,boolean required, String file, String permission) throws ConnettoreException {
- String tmp = this.getDynamicProperty(tipoConnettore, required, file, this.dynamicMap);
- if(tmp==null){
- return null;
- }
- ConnettoreFile_outputConfig c = new ConnettoreFile_outputConfig();
- c.setOutputFile(new File(tmp));
-
- String p = this.getDynamicProperty(tipoConnettore, false, permission, this.dynamicMap);
- if(p!=null) {
- validatePermission(p, c);
- }
- return c;
- }
-
- public static void validatePermission(String p, ConnettoreFile_outputConfig c) throws ConnettoreException {
- Scanner scanner = new Scanner(p);
- try {
- while (scanner.hasNextLine()) {
- String line = scanner.nextLine();
- if(line==null || line.trim().equals("") || line.trim().startsWith("#")) {
- continue;
- }
- _validateSinglePermission(line,c);
- }
- }finally {
- scanner.close();
- }
- }
-
- public static int getNumPermission(String p) throws ConnettoreException {
- Scanner scanner = new Scanner(p);
- int num = 0;
- try {
- while (scanner.hasNextLine()) {
- String line = scanner.nextLine();
- if(line==null || line.trim().equals("") || line.trim().startsWith("#")) {
- continue;
- }
- num++;
- }
- return num;
- }finally {
- scanner.close();
- }
- }
-
- public static final String PERMESSI_FORMATO = "[o/a]+/-rwx";
- private static void _validateSinglePermission(String p, ConnettoreFile_outputConfig config) throws ConnettoreException {
- String errorMsg = "Wrong permission format ("+p+"); expected "+PERMESSI_FORMATO;
- if(p==null || StringUtils.isEmpty(p) || (!p.contains("+") && !p.contains("-")) || p.length()<=1) {
- throw new ConnettoreException(errorMsg);
- }
-
- String permission = null;
- boolean add = false;
- Boolean owner = null;
- if(p.startsWith("+")) {
- permission = p.substring(1);
- add = true;
- }
- else if(p.startsWith("-")) {
- permission = p.substring(1);
- add = false;
- }
- else if(p.contains("+")) {
- add = true;
- int indexOf = p.indexOf("+");
- String ownerS = p.substring(0, indexOf);
- if(!"o".equals(ownerS) && !"a".equals(ownerS)) {
- throw new ConnettoreException(errorMsg);
- }
- if("o".equals(ownerS)) {
- owner = true;
- }
- else if("a".equals(ownerS)) {
- owner = false;
- }
- if(indexOf == (p.length()-1)) {
- throw new ConnettoreException(errorMsg);
- }
- permission = p.substring(indexOf+1, p.length());
- }
- else if(p.contains("-")) {
- add = false;
- int indexOf = p.indexOf("-");
- String ownerS = p.substring(0, indexOf);
- if(!"o".equals(ownerS) && !"a".equals(ownerS)) {
- throw new ConnettoreException(errorMsg);
- }
- if("o".equals(ownerS)) {
- owner = true;
- }
- else if("a".equals(ownerS)) {
- owner = false;
- }
- if(indexOf == (p.length()-1)) {
- throw new ConnettoreException(errorMsg);
- }
- permission = p.substring(indexOf+1, p.length());
- }
-
- if(permission!=null) {
- for (int i = 0; i < permission.length(); i++) {
- char c = permission.charAt(i);
- if(c == 'r' || c == 'R') {
- config.setReadable(add);
- if(owner!=null) {
- config.setReadable_ownerOnly(owner);
- }
- }
- else if(c == 'w' || c == 'W') {
- config.setWritable(add);
- if(owner!=null) {
- config.setWritable_ownerOnly(owner);
- }
- }
- else if(c == 'x' || c == 'X') {
- config.setExecutable(add);
- if(owner!=null) {
- config.setExecutable_ownerOnly(owner);
- }
- }
- else {
- throw new ConnettoreException(errorMsg);
- }
- }
- }
-
- }
-
- private void setPermission(ConnettoreFile_outputConfig config) throws ConnettoreException {
- if(config.getReadable()!=null) {
- if(config.getReadable_ownerOnly()!=null) {
- if(!config.getOutputFile().setReadable(config.getReadable(), config.getReadable_ownerOnly())) {
- // ignore
- }
- }
- else {
- if(!config.getOutputFile().setReadable(config.getReadable())) {
- // ignore
- }
- }
- }
- if(config.getWritable()!=null) {
- if(config.getWritable_ownerOnly()!=null) {
- if(!config.getOutputFile().setWritable(config.getWritable(), config.getWritable_ownerOnly())) {
- // ignore
- }
- }
- else {
- if(!config.getOutputFile().setWritable(config.getWritable())) {
- // ignore
- }
- }
- }
- if(config.getExecutable()!=null) {
- if(config.getExecutable_ownerOnly()!=null) {
- if(!config.getOutputFile().setExecutable(config.getExecutable(), config.getExecutable_ownerOnly())) {
- // ignore
- }
- }
- else {
- if(!config.getOutputFile().setExecutable(config.getExecutable())) {
- // ignore
- }
- }
- }
- }
- }