LoadBalancerBehaviour.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.behaviour.built_in.load_balance;
import org.openspcoop2.core.config.PortaApplicativa;
import org.openspcoop2.core.config.PortaApplicativaServizioApplicativo;
import org.openspcoop2.core.config.constants.StatoFunzionalita;
import org.openspcoop2.core.id.IDServizioApplicativo;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.pdd.core.CostantiPdD;
import org.openspcoop2.pdd.core.GestoreMessaggi;
import org.openspcoop2.pdd.core.behaviour.AbstractBehaviour;
import org.openspcoop2.pdd.core.behaviour.Behaviour;
import org.openspcoop2.pdd.core.behaviour.BehaviourEmitDiagnosticException;
import org.openspcoop2.pdd.core.behaviour.BehaviourException;
import org.openspcoop2.pdd.core.behaviour.BehaviourForwardTo;
import org.openspcoop2.pdd.core.behaviour.BehaviourForwardToFilter;
import org.openspcoop2.pdd.core.behaviour.BehaviourLoadBalancer;
import org.openspcoop2.pdd.core.behaviour.IBehaviour;
import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.state.IState;
import org.openspcoop2.protocol.sdk.state.RequestInfo;
/**
* LoadBalancerBehaviour
*
* @author Andrea Poli (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class LoadBalancerBehaviour extends AbstractBehaviour implements IBehaviour {
private IState state;
public LoadBalancerBehaviour(IState state) {
this.state = state;
}
@Override
public Behaviour behaviour(GestoreMessaggi gestoreMessaggioRichiesta, Busta busta,
PortaApplicativa pa, RequestInfo requestInfo) throws BehaviourException,BehaviourEmitDiagnosticException {
Behaviour behaviour = null;
try{
behaviour = new Behaviour();
OpenSPCoop2Message msg = null;
try {
msg = gestoreMessaggioRichiesta.getMessage();
}catch(Exception e) {
throw new BehaviourException(e.getMessage(), e);
}
ConfigurazioneLoadBalancer config = ConfigurazioneLoadBalancer.read(pa, msg, busta,
requestInfo, this.getPddContext(),
this.msgDiag, OpenSPCoop2Logger.getLoggerOpenSPCoopCore(), this.state);
if(config.getPool().isEmpty()) {
throw new BehaviourException("Nessun connettore selezionabile");
}
if(config.getConnectorSelected()==null || "".equals(config.getConnectorSelected())) {
throw new BehaviourException("Nessun connettore selezionato");
}
String nomeConnettore = config.getConnectorSelected();
for (PortaApplicativaServizioApplicativo servizioApplicativo : pa.getServizioApplicativoList()) {
if(servizioApplicativo.getDatiConnettore()==null || servizioApplicativo.getDatiConnettore().getStato()==null ||
StatoFunzionalita.ABILITATO.equals(servizioApplicativo.getDatiConnettore().getStato())) {
String nomeConnettoreSA = org.openspcoop2.pdd.core.behaviour.built_in.Costanti.NOME_CONNETTORE_DEFAULT;
if(servizioApplicativo.getDatiConnettore()!=null && servizioApplicativo.getDatiConnettore().getNome()!=null) {
nomeConnettoreSA = servizioApplicativo.getDatiConnettore().getNome();
}
if(nomeConnettore.equals(nomeConnettoreSA)) {
BehaviourForwardTo forwardTo = new BehaviourForwardTo();
BehaviourForwardToFilter filter = new BehaviourForwardToFilter();
forwardTo.setFilter(filter);
IDServizioApplicativo id = new IDServizioApplicativo();
id.setIdSoggettoProprietario(new IDSoggetto(busta.getTipoDestinatario(),busta.getDestinatario()));
id.setNome(servizioApplicativo.getNome());
filter.getAccessListServiziApplicativi().add(id);
behaviour.getForwardTo().add(forwardTo);
this.getPddContext().addObject(CostantiPdD.CONNETTORE_MULTIPLO_SELEZIONATO, servizioApplicativo.getNome());
BehaviourLoadBalancer c = new BehaviourLoadBalancer();
c.setLoadBalancerPool(config.getPool());
c.setConnectorName(nomeConnettore);
behaviour.setLoadBalancer(c);
break;
}
}
}
}
catch(BehaviourEmitDiagnosticException e){
throw e;
}
catch(BehaviourException e){
throw e;
}
return behaviour;
}
}