NodeSenderDB.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.pdd.core.node;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;

import org.slf4j.Logger;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.pdd.config.ClassNameProperties;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.core.AbstractCore;
import org.openspcoop2.pdd.core.GestoreMessaggi;
import org.openspcoop2.pdd.core.GestoreMessaggiException;
import org.openspcoop2.pdd.logger.MsgDiagnostico;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.openspcoop2.pdd.mdb.GenericMessage;
import org.openspcoop2.utils.TipiDatabase;
import org.openspcoop2.utils.jdbc.IJDBCAdapter;
import org.openspcoop2.utils.jdbc.JDBCAdapterFactory;
import org.openspcoop2.utils.resources.Loader;

/**
 * Classe utilizzata per la spedizione di messaggi contenuti nell'architettura di OpenSPCoop (versione JMS).
 *
 * @author Poli Andrea (apoli@link.it)
 * @author Tronci Fabio (tronci@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */

public class NodeSenderDB extends AbstractCore implements INodeSender{

	private static final String ID_MODULO= "NODE_SENDER_DB";

	/** adapterJDBC di OpenSPCoop di OpenSPCoop */
	private static IJDBCAdapter adapter=null;

	private static OpenSPCoop2Properties propertiesReader; 
	private static Logger log; 


	private static boolean isInitialized = false;

	private static synchronized void initStaticResources() throws NodeException{
		if (!NodeSenderDB.isInitialized) {
			try{

				NodeSenderDB.propertiesReader = OpenSPCoop2Properties.getInstance();
				NodeSenderDB.log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
				
				String jdbcAdapter = NodeSenderDB.propertiesReader.getRepositoryJDBCAdapter();
				if(NodeSenderDB.propertiesReader.getDatabaseType()!=null && TipiDatabase.DEFAULT.equals(jdbcAdapter)){
					NodeSenderDB.adapter = JDBCAdapterFactory.createJDBCAdapter(NodeSenderDB.propertiesReader.getDatabaseType());
				}
				else{
					//	initDBManager();
					ClassNameProperties classNameProperties = ClassNameProperties.getInstance();
					//		Ricerco connettore
					String adapterClass = classNameProperties.getJDBCAdapter(jdbcAdapter);
					if(adapterClass == null){
						NodeSenderDB.log.error("Inizializzione GestoreMessaggi non riuscita: AdapterClass non registrata ["+NodeSenderDB.propertiesReader.getRepositoryJDBCAdapter()+"]");
					}
					NodeSenderDB.adapter = (IJDBCAdapter) Loader.getInstance().newInstance(adapterClass);
				}
			}catch(Exception e){
				NodeSenderDB.log.error("Inizializzione GestoreMessaggi non riuscita: AdapterClass non trovata ["+NodeSenderDB.propertiesReader.getRepositoryJDBCAdapter()+"]:"+e.getMessage(),e);
				System.out.println("Inizializzazione NODESENDER FALLITA: " + e);
				return;
			}
			NodeSenderDB.isInitialized=true;
		}
	}
	
	private void init() throws NodeException{
		if (!NodeSenderDB.isInitialized) {
			initStaticResources();	
		}
	}




	/**
	 * Spedizione di un messaggio  
	 *
	 * @param msg Messaggio
	 * @param destinazione Modulo di destinazione del msg
	 * @param codicePorta Codice Porta per cui effettuare la receive
	 * @param idModulo Nodo destinatario per cui effettuare la ricezione. 
	 * @param idMessaggio Identificativo del messaggio
	 * 
	 */
	@Override
	public void send(Serializable msg, String destinazione, MsgDiagnostico msgDiag,
			IDSoggetto codicePorta, String idModulo, String idMessaggio, GestoreMessaggi gm) throws NodeException {

		if (!NodeSenderDB.isInitialized) try { init(); } catch (Exception e) {
			OpenSPCoop2Logger.getLoggerOpenSPCoopCore().error("Inizializzazione NODESENDER FALLITA",e);
			return;
		}

		MessaggioSerializzato messaggioSerializzato = new MessaggioSerializzato(idMessaggio, (GenericMessage) msg);

		//serializzao il messaggio:
		ByteArrayOutputStream bos = new ByteArrayOutputStream() ;
		byte[] msgByte;
		try {
			ObjectOutput out = new ObjectOutputStream(bos);
			out.writeObject(messaggioSerializzato);
			out.close();
			msgByte = bos.toByteArray();	
		} catch (IOException e) {
			NodeSenderDB.log.error(NodeSenderDB.ID_MODULO + " Serializzazione messaggio fallita: "+e.getMessage(),e);
			return;
		}

		try {
			gm.aggiungiMessaggioSerializzato(NodeSenderDB.adapter,msgByte);
		} catch (GestoreMessaggiException e) {
			throw new NodeException(e);
		}


		msgDiag.highDebug("ObjectMessage send (NOP operation).");
	}


}