ConditionalUtils.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */
  20. package org.openspcoop2.pdd.core.behaviour.conditional;

  21. import java.io.ByteArrayOutputStream;
  22. import java.util.ArrayList;
  23. import java.util.HashMap;
  24. import java.util.List;
  25. import java.util.Map;

  26. import javax.servlet.http.HttpServletRequest;

  27. import org.apache.commons.lang.StringUtils;
  28. import org.openspcoop2.core.commons.ModalitaIdentificazione;
  29. import org.openspcoop2.core.config.PortaApplicativa;
  30. import org.openspcoop2.core.config.PortaApplicativaServizioApplicativo;
  31. import org.openspcoop2.core.config.Proprieta;
  32. import org.openspcoop2.core.config.constants.StatoFunzionalita;
  33. import org.openspcoop2.core.config.constants.TipoBehaviour;
  34. import org.openspcoop2.core.id.IDPortaApplicativa;
  35. import org.openspcoop2.core.id.IDServizio;
  36. import org.openspcoop2.core.registry.Resource;
  37. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  38. import org.openspcoop2.message.OpenSPCoop2Message;
  39. import org.openspcoop2.message.constants.MessageType;
  40. import org.openspcoop2.message.constants.ServiceBinding;
  41. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  42. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  43. import org.openspcoop2.pdd.core.CostantiPdD;
  44. import org.openspcoop2.pdd.core.PdDContext;
  45. import org.openspcoop2.pdd.core.Utilities;
  46. import org.openspcoop2.pdd.core.behaviour.BehaviourEmitDiagnosticException;
  47. import org.openspcoop2.pdd.core.behaviour.BehaviourException;
  48. import org.openspcoop2.pdd.core.behaviour.BehaviourPropertiesUtils;
  49. import org.openspcoop2.pdd.core.dynamic.DynamicUtils;
  50. import org.openspcoop2.pdd.core.dynamic.ErrorHandler;
  51. import org.openspcoop2.pdd.core.dynamic.MessageContent;
  52. import org.openspcoop2.pdd.core.dynamic.Template;
  53. import org.openspcoop2.pdd.logger.MsgDiagnosticiProperties;
  54. import org.openspcoop2.pdd.logger.MsgDiagnostico;
  55. import org.openspcoop2.pdd.services.connector.FormUrlEncodedHttpServletRequest;
  56. import org.openspcoop2.protocol.sdk.Busta;
  57. import org.openspcoop2.protocol.sdk.constants.IntegrationFunctionError;
  58. import org.openspcoop2.protocol.sdk.state.IState;
  59. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  60. import org.openspcoop2.utils.regexp.RegExpNotFoundException;
  61. import org.openspcoop2.utils.regexp.RegularExpressionEngine;
  62. import org.openspcoop2.utils.transport.TransportUtils;
  63. import org.openspcoop2.utils.transport.http.HttpServletTransportRequestContext;
  64. import org.openspcoop2.utils.xml.AbstractXPathExpressionEngine;
  65. import org.openspcoop2.utils.xml2json.JsonXmlPathExpressionEngine;
  66. import org.slf4j.Logger;

  67. /**
  68.  * ConditionalUtils
  69.  *
  70.  * @author Andrea Poli (apoli@link.it)
  71.  * @author $Author$
  72.  * @version $Rev$, $Date$
  73.  */
  74. public class ConditionalUtils  {
  75.    
  76.     public static ConditionalFilterResult filter(PortaApplicativa pa, OpenSPCoop2Message message, Busta busta,
  77.             RequestInfo requestInfo, PdDContext pddContext,
  78.             MsgDiagnostico msgDiag, Logger log,
  79.             TipoBehaviour behaviourType,
  80.             IState state) throws BehaviourException, BehaviourEmitDiagnosticException {
  81.        
  82.         if(isConfigurazioneCondizionale(pa, log)==false) {
  83.             return null; // non vi è da fare alcun filtro condizionale
  84.         }
  85.        
  86.         ConditionalFilterResult result = new ConditionalFilterResult();
  87.        
  88.         ConfigurazioneCondizionale config = read(pa, log);
  89.        
  90.        
  91.         String nomeRegola = null;
  92.         TipoSelettore tipoSelettore = null;
  93.         String patternSelettore = null;
  94.         String prefixSelettore = null;
  95.         String suffixSelettore = null;
  96.         String staticInfo = null;
  97.         if(busta.getAzione()!=null && !"".equals(busta.getAzione())) {
  98.             ConfigurazioneSelettoreCondizioneRegola regola = null;
  99.            
  100.             Resource restResource = null;
  101.             if(message!=null && ServiceBinding.REST.equals(message.getServiceBinding()) &&
  102.                     StringUtils.isNotEmpty(busta.getTipoDestinatario()) && StringUtils.isNotEmpty(busta.getDestinatario()) &&
  103.                     StringUtils.isNotEmpty(busta.getTipoServizio()) && StringUtils.isNotEmpty(busta.getServizio()) && busta.getVersioneServizio()!=null ) {
  104.                 IDServizio idServizio = null;
  105.                 try {
  106.                     idServizio = IDServizioFactory.getInstance().getIDServizioFromValues(busta.getTipoServizio(), busta.getServizio(),
  107.                             busta.getTipoDestinatario(), busta.getDestinatario(),
  108.                             busta.getVersioneServizio());
  109.                     idServizio.setAzione(busta.getAzione());
  110.                 }catch(Throwable t) {}
  111.                 if(idServizio!=null) {
  112.                     restResource = Utilities.getRestResource(log, state, idServizio, requestInfo);
  113.                 }
  114.             }
  115.            
  116.             try {
  117.                 regola = config.getRegolaByOperazione(busta.getAzione(), restResource);
  118.             }catch(Exception e) {
  119.                 throw new BehaviourException(e.getMessage(),e);
  120.             }
  121.             if(regola!=null) {
  122.                 nomeRegola = regola.getRegola();
  123.                 tipoSelettore = regola.getTipoSelettore();
  124.                 patternSelettore = regola.getPattern();
  125.                 prefixSelettore = regola.getPrefix();
  126.                 suffixSelettore = regola.getSuffix();
  127.                 staticInfo = regola.getStaticInfo();
  128.                 result.setRegola(regola.getRegola());
  129.             }
  130.         }
  131.         if(tipoSelettore==null) {
  132.             nomeRegola = null;
  133.             ConfigurazioneSelettoreCondizione c = config.getDefaultConfig();
  134.             tipoSelettore = c.getTipoSelettore();
  135.             patternSelettore = c.getPattern();
  136.             prefixSelettore = c.getPrefix();
  137.             suffixSelettore = c.getSuffix();
  138.         }
  139.        
  140.         result.setByFilter(config.isByFilter());
  141.        
  142.         String condition = null;
  143.         String nomeConnettoreDaUsare = null;
  144.         if(staticInfo!=null && !"".equals(staticInfo)) {
  145.             condition = staticInfo;
  146.             msgDiag.addKeyword(CostantiPdD.KEY_TIPO_SELETTORE, ModalitaIdentificazione.STATIC.getLabel());
  147.             msgDiag.addKeyword(CostantiPdD.KEY_PATTERN_SELETTORE, ""); // per eliminare @@ dove non serve
  148.         }
  149.         else {
  150.             String pattern = "";
  151.             try {
  152.                 msgDiag.addKeyword(CostantiPdD.KEY_TIPO_SELETTORE, tipoSelettore.getValue());
  153.                 msgDiag.addKeyword(CostantiPdD.KEY_PATTERN_SELETTORE, pattern); // per eliminare @@ dove non serve
  154.                
  155.                 Map<String, List<String>> pTrasporto = null;
  156.                 String urlInvocazione = null;
  157.                 Map<String, List<String>> pQuery = null;
  158.                 Map<String, List<String>> pForm = null;
  159.                 if(requestInfo!=null && requestInfo.getProtocolContext()!=null) {
  160.                     pTrasporto = requestInfo.getProtocolContext().getHeaders();
  161.                     urlInvocazione = requestInfo.getProtocolContext().getUrlInvocazione_formBased();
  162.                     pQuery = requestInfo.getProtocolContext().getParameters();
  163.                     if(requestInfo.getProtocolContext() instanceof HttpServletTransportRequestContext) {
  164.                         HttpServletTransportRequestContext httpServletContext = (HttpServletTransportRequestContext) requestInfo.getProtocolContext();
  165.                         HttpServletRequest httpServletRequest = httpServletContext.getHttpServletRequest();
  166.                         if(httpServletRequest!=null && httpServletRequest instanceof FormUrlEncodedHttpServletRequest) {
  167.                             FormUrlEncodedHttpServletRequest formServlet = (FormUrlEncodedHttpServletRequest) httpServletRequest;
  168.                             if(formServlet.getFormUrlEncodedParametersValues()!=null &&
  169.                                     !formServlet.getFormUrlEncodedParametersValues().isEmpty()) {
  170.                                 pForm = formServlet.getFormUrlEncodedParametersValues();
  171.                             }
  172.                         }
  173.                     }
  174.                 }
  175.                 MessageContent messageContent = null;
  176.                 boolean bufferMessage_readOnly =  OpenSPCoop2Properties.getInstance().isReadByPathBufferEnabled();
  177.                 if(TipoSelettore.CONTENT_BASED.equals(tipoSelettore) || tipoSelettore.isTemplate()) {
  178.                     if(ServiceBinding.SOAP.equals(message.getServiceBinding())){
  179.                         messageContent = new MessageContent(message.castAsSoap(), bufferMessage_readOnly, pddContext);
  180.                     }
  181.                     else{
  182.                         if(MessageType.XML.equals(message.getMessageType())){
  183.                             messageContent = new MessageContent(message.castAsRestXml(), bufferMessage_readOnly, pddContext);
  184.                         }
  185.                         else if(MessageType.JSON.equals(message.getMessageType())){
  186.                             messageContent = new MessageContent(message.castAsRestJson(), bufferMessage_readOnly, pddContext);
  187.                         }
  188.                         else{
  189.                             if(TipoSelettore.CONTENT_BASED.equals(tipoSelettore)
  190.                                     // Nei template potrei utilizzare gli header o altre informazioni che non entrano nel merito del contenuto //|| tipoSelettore.isTemplate()
  191.                                     ) {
  192.                                 throw new Exception("Selettore '"+tipoSelettore.getValue()+"' non supportato per il message-type '"+message.getMessageType()+"'");
  193.                             }
  194.                         }
  195.                     }
  196.                 }
  197.                
  198.                 switch (tipoSelettore) {
  199.                
  200.                 case HEADER_BASED:
  201.                     pattern = " (Header HTTP: "+patternSelettore+")";
  202.                     msgDiag.addKeyword(CostantiPdD.KEY_PATTERN_SELETTORE, pattern);
  203.                     condition = TransportUtils.getFirstValue(pTrasporto, patternSelettore);
  204.                     if(condition==null) {
  205.                         throw new Exception("header non presente");
  206.                     }
  207.                     break;
  208.                    
  209.                 case URLBASED:
  210.                     pattern = " (Espressione Regolare: "+patternSelettore+")";
  211.                     msgDiag.addKeyword(CostantiPdD.KEY_PATTERN_SELETTORE, pattern);
  212.                     try{
  213.                         condition = RegularExpressionEngine.getStringMatchPattern(urlInvocazione, patternSelettore);
  214.                     }catch(RegExpNotFoundException notFound){}
  215.                     break;
  216.                    
  217.                 case FORM_BASED:
  218.                     pattern = " (Parametro URL: "+patternSelettore+")";
  219.                     msgDiag.addKeyword(CostantiPdD.KEY_PATTERN_SELETTORE, pattern);
  220.                     condition = TransportUtils.getFirstValue(pQuery, patternSelettore);
  221.                     if(condition==null) {
  222.                         throw new Exception("parametro della url non presente");
  223.                     }
  224.                     break;
  225.                    
  226.                 case CONTENT_BASED:
  227.                     AbstractXPathExpressionEngine xPathEngine = null;
  228.                     if(messageContent==null) {
  229.                         throw new Exception("messaggio non presente");
  230.                     }
  231.                     if(messageContent.isXml()) {
  232.                         pattern = " (xPath: "+patternSelettore+")";
  233.                         msgDiag.addKeyword(CostantiPdD.KEY_PATTERN_SELETTORE, pattern);
  234.                         xPathEngine = new org.openspcoop2.message.xml.XPathExpressionEngine(message.getFactory());
  235.                         condition = AbstractXPathExpressionEngine.extractAndConvertResultAsString(messageContent.getElement(), xPathEngine, patternSelettore,  log);
  236.                     }
  237.                     else {
  238.                         pattern = " (jsonPath: "+patternSelettore+")";
  239.                         msgDiag.addKeyword(CostantiPdD.KEY_PATTERN_SELETTORE, pattern);
  240.                         condition = JsonXmlPathExpressionEngine.extractAndConvertResultAsString(messageContent.getElementJson(), patternSelettore, log);
  241.                     }
  242.                     break;
  243.                    
  244.                 case INDIRIZZO_IP:
  245.                     if(pddContext!=null && pddContext.containsKey(org.openspcoop2.core.constants.Costanti.CLIENT_IP_REMOTE_ADDRESS)) {
  246.                         condition = (String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.CLIENT_IP_REMOTE_ADDRESS);
  247.                     }
  248.                     break;
  249.                    
  250.                 case INDIRIZZO_IP_FORWARDED:
  251.                     if(pddContext!=null && pddContext.containsKey(org.openspcoop2.core.constants.Costanti.CLIENT_IP_TRANSPORT_ADDRESS)) {
  252.                         condition = (String) pddContext.getObject(org.openspcoop2.core.constants.Costanti.CLIENT_IP_TRANSPORT_ADDRESS);
  253.                     }
  254.                     break;
  255.                    
  256.                 case SOAPACTION_BASED:
  257.                     if(ServiceBinding.SOAP.equals(message.getServiceBinding())){
  258.                         condition = message.castAsSoap().getSoapAction();
  259.                         if(condition!=null) {
  260.                             condition = condition.trim();
  261.                             if(condition.startsWith("\"") && condition.length()>1){
  262.                                 condition = condition.substring(1);
  263.                             }
  264.                             if(condition.endsWith("\"")  && condition.length()>1){
  265.                                 condition = condition.substring(0, (condition.length()-1));
  266.                             }
  267.                         }
  268.                     }
  269.                     break;
  270.                    
  271.                 case TEMPLATE:
  272.                     if(patternSelettore.length()<50) {
  273.                         pattern = " ("+patternSelettore+")";
  274.                     }
  275.                     else {
  276.                         pattern = "";
  277.                     }
  278.                     msgDiag.addKeyword(CostantiPdD.KEY_PATTERN_SELETTORE, pattern);
  279.                     Map<String, Object> dynamicMap = new HashMap<>();
  280.                     ErrorHandler errorHandler = new ErrorHandler();
  281.                     DynamicUtils.fillDynamicMapRequest(log, dynamicMap, pddContext, urlInvocazione,
  282.                             message,
  283.                             messageContent,
  284.                             busta,
  285.                             pTrasporto,
  286.                             pQuery,
  287.                             pForm,
  288.                             errorHandler);
  289.                     condition = DynamicUtils.convertDynamicPropertyValue("ConditionalConfig.gwt", patternSelettore, dynamicMap, pddContext);
  290.                     if(condition!=null) {
  291.                         condition = ConditionalUtils.normalizeTemplateResult(condition);
  292.                     }
  293.                     break;
  294.                    
  295.                 case FREEMARKER_TEMPLATE:
  296.                     if(patternSelettore.length()<50) {
  297.                         pattern = " ("+patternSelettore+")";
  298.                     }
  299.                     else {
  300.                         pattern = "";
  301.                     }
  302.                     msgDiag.addKeyword(CostantiPdD.KEY_PATTERN_SELETTORE, pattern);
  303.                     dynamicMap = new HashMap<>();
  304.                     errorHandler = new ErrorHandler();
  305.                     DynamicUtils.fillDynamicMapRequest(log, dynamicMap, pddContext, urlInvocazione,
  306.                             message,
  307.                             messageContent,
  308.                             busta,
  309.                             pTrasporto,
  310.                             pQuery,
  311.                             pForm,
  312.                             errorHandler);
  313.                     ByteArrayOutputStream bout = new ByteArrayOutputStream();
  314.                     ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance(state);
  315.                     IDPortaApplicativa idPA = new IDPortaApplicativa();
  316.                     idPA.setNome(pa.getNome());
  317.                     Template template = configurazionePdDManager.getTemplateConnettoreMultiploCondizionale(idPA, nomeRegola, patternSelettore.getBytes(), requestInfo);
  318.                     DynamicUtils.convertFreeMarkerTemplate(template, dynamicMap, bout);
  319.                     bout.flush();
  320.                     bout.close();
  321.                     condition = bout.toString();
  322.                     if(condition!=null) {
  323.                         condition = ConditionalUtils.normalizeTemplateResult(condition);
  324.                     }
  325.                     break;
  326.                    
  327.                 case VELOCITY_TEMPLATE:
  328.                     if(patternSelettore.length()<50) {
  329.                         pattern = " ("+patternSelettore+")";
  330.                     }
  331.                     else {
  332.                         pattern = "";
  333.                     }
  334.                     msgDiag.addKeyword(CostantiPdD.KEY_PATTERN_SELETTORE, pattern);
  335.                     dynamicMap = new HashMap<>();
  336.                     errorHandler = new ErrorHandler();
  337.                     DynamicUtils.fillDynamicMapRequest(log, dynamicMap, pddContext, urlInvocazione,
  338.                             message,
  339.                             messageContent,
  340.                             busta,
  341.                             pTrasporto,
  342.                             pQuery,
  343.                             pForm,
  344.                             errorHandler);
  345.                     bout = new ByteArrayOutputStream();
  346.                     configurazionePdDManager = ConfigurazionePdDManager.getInstance(state);
  347.                     idPA = new IDPortaApplicativa();
  348.                     idPA.setNome(pa.getNome());
  349.                     template = configurazionePdDManager.getTemplateConnettoreMultiploCondizionale(idPA, nomeRegola, patternSelettore.getBytes(), requestInfo);
  350.                     DynamicUtils.convertVelocityTemplate(template, dynamicMap, bout);
  351.                     bout.flush();
  352.                     bout.close();
  353.                     condition = bout.toString();
  354.                     if(condition!=null) {
  355.                         condition = ConditionalUtils.normalizeTemplateResult(condition);
  356.                     }
  357.                     break;
  358.                 }
  359.            
  360.                 if(condition==null || "".equals(condition)) {
  361.                     throw new Exception("Nessuna condizione estratta");
  362.                 }
  363.                 else {
  364.                     msgDiag.addKeyword(CostantiPdD.KEY_CONDIZIONE_CONNETTORE, condition);
  365.                    
  366.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  367.                             "connettoriMultipli.consegnaCondizionale.identificazioneRiuscita");
  368.                 }
  369.                
  370.             }catch(Exception e) {
  371.                
  372.                 msgDiag.addKeyword(CostantiPdD.KEY_ERRORE_PROCESSAMENTO, e.getMessage());
  373.                
  374.                 if(config.getCondizioneNonIdentificata().isAbortTransaction()) {
  375.                     BehaviourEmitDiagnosticException be = new BehaviourEmitDiagnosticException(msgDiag, MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  376.                             "connettoriMultipli.consegnaCondizionale.identificazioneFallita.error", e);
  377.                     be.setIntegrationFunctionError(IntegrationFunctionError.CONNECTOR_NOT_FOUND);
  378.                     throw be;
  379.                 }
  380.                 else {
  381.                     if(config.getCondizioneNonIdentificata().isEmitDiagnosticError()) {
  382.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  383.                                 "connettoriMultipli.consegnaCondizionale.identificazioneFallita.error");
  384.                     }
  385.                     else if(config.getCondizioneNonIdentificata().isEmitDiagnosticInfo()) {
  386.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  387.                                 "connettoriMultipli.consegnaCondizionale.identificazioneFallita.info");
  388.                     }
  389.                    
  390.                     if(TipoBehaviour.CONSEGNA_LOAD_BALANCE.equals(behaviourType)) {
  391.                         // li usero tutti senza filtro sulla condizionalità
  392.                        
  393.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  394.                                 "connettoriMultipli.consegnaCondizionale.loadBalancer.tuttiConnettori");
  395.                        
  396.                         result.setListServiziApplicativi(getAllEnabled(pa.getServizioApplicativoList()));
  397.                         return result;
  398.                     }
  399.                    
  400.                     // se arrivo qua, sicuramente non sono in load balance mode
  401.                     nomeConnettoreDaUsare = config.getCondizioneNonIdentificata().getNomeConnettore();
  402.                     if(nomeConnettoreDaUsare==null || "".equals(nomeConnettoreDaUsare)) {
  403.                        
  404.                         if(TipoBehaviour.CONSEGNA_MULTIPLA.equals(behaviourType)) {
  405.                            
  406.                             msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  407.                                     "connettoriMultipli.consegnaCondizionale.tuttiConnettori");
  408.                            
  409.                             result.setListServiziApplicativi(getAllEnabled(pa.getServizioApplicativoList()));
  410.                             return result;
  411.                         }
  412.                         else if(TipoBehaviour.CONSEGNA_CONDIZIONALE.equals(behaviourType)) {
  413.                             // non può succedere
  414.                             throw new BehaviourException("Connettore da utilizzare in caso di identificazione fallita non indicato");
  415.                         }
  416.                         else if(TipoBehaviour.CONSEGNA_CON_NOTIFICHE.equals(behaviourType)) {
  417.                            
  418.                             msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  419.                                     "connettoriMultipli.consegnaCondizionale.tuttiConnettori");
  420.                            
  421.                             result.setListServiziApplicativi(getAllEnabled(pa.getServizioApplicativoList()));
  422.                             return result;
  423.                         }
  424.                                                
  425.                     }
  426.                     else if(TipoBehaviour.CONSEGNA_CON_NOTIFICHE.equals(behaviourType) &&
  427.                             Costanti.CONDITIONAL_NOME_CONNETTORE_VALORE_NESSUNO.equals(nomeConnettoreDaUsare)) {
  428.                                                    
  429.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  430.                                 "connettoriMultipli.consegnaCondizionale.nessunConnettore");
  431.                        
  432.                         result.setListServiziApplicativi(new ArrayList<>());
  433.                         return result;
  434.                                                
  435.                     }
  436.                    
  437.                     result.setListServiziApplicativi(filter(pa.getServizioApplicativoList(),false,nomeConnettoreDaUsare));
  438.                     if(result.getListServiziApplicativi().isEmpty()) {
  439.                         throw new BehaviourException("Connettore '"+nomeConnettoreDaUsare+"' indicato, da utilizzare in caso di identificazione fallita, non esistente");
  440.                     }
  441.                    
  442.                     msgDiag.addKeyword(CostantiPdD.KEY_NOME_CONNETTORE, nomeConnettoreDaUsare);
  443.                     if(TipoBehaviour.CONSEGNA_CON_NOTIFICHE.equals(behaviourType)) {
  444.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  445.                                 "connettoriMultipli.consegnaCondizionale.connettoreNotificaDefault");
  446.                     }
  447.                     else {
  448.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  449.                                 "connettoriMultipli.consegnaCondizionale.connettoreDefault");
  450.                     }
  451.                    
  452.                     return result;
  453.                 }
  454.             }
  455.         }
  456.        
  457.         String conditionFinal = condition;
  458.         if(prefixSelettore!=null) {
  459.             conditionFinal = prefixSelettore+conditionFinal;
  460.         }
  461.         if(suffixSelettore!=null) {
  462.             conditionFinal = conditionFinal+suffixSelettore;
  463.         }
  464.         result.setCondition(conditionFinal);
  465.         msgDiag.addKeyword(CostantiPdD.KEY_CONDIZIONE_CONNETTORE, conditionFinal);
  466.        
  467.         List<PortaApplicativaServizioApplicativo> l = filter(pa.getServizioApplicativoList(), config.isByFilter(), conditionFinal);
  468.         if(!l.isEmpty()) {
  469.            
  470.             if(TipoBehaviour.CONSEGNA_CONDIZIONALE.equals(behaviourType)) {
  471.                 if(l.size()>1) {
  472.                     BehaviourEmitDiagnosticException be = new BehaviourEmitDiagnosticException(msgDiag, MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  473.                             "connettoriMultipli.servizioSincrono.consegnaVersoNServiziApplicativi");
  474.                     be.setIntegrationFunctionError(IntegrationFunctionError.CONNECTOR_NOT_FOUND);
  475.                     throw be;
  476.                 }
  477.             }
  478.            
  479.             result.setListServiziApplicativi(l);
  480.             return result;
  481.         }
  482.         else {
  483.             if(config.getNessunConnettoreTrovato().isAbortTransaction()) {
  484.                 if(config.isByFilter()) {
  485.                     BehaviourEmitDiagnosticException be = new BehaviourEmitDiagnosticException(msgDiag, MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  486.                             "connettoriMultipli.consegnaCondizionale.connettoreNonEsistente.filtro.error");
  487.                     be.setIntegrationFunctionError(IntegrationFunctionError.CONNECTOR_NOT_FOUND);
  488.                     throw be;
  489.                 }
  490.                 else {
  491.                     BehaviourEmitDiagnosticException be = new BehaviourEmitDiagnosticException(msgDiag, MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  492.                             "connettoriMultipli.consegnaCondizionale.connettoreNonEsistente.nomeConnettore.error");
  493.                     be.setIntegrationFunctionError(IntegrationFunctionError.CONNECTOR_NOT_FOUND);
  494.                     throw be;
  495.                 }
  496.             }
  497.             else {
  498.                 if(config.getNessunConnettoreTrovato().isEmitDiagnosticError()) {
  499.                     if(config.isByFilter()) {
  500.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  501.                                 "connettoriMultipli.consegnaCondizionale.connettoreNonEsistente.filtro.error");
  502.                     }
  503.                     else {
  504.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  505.                                 "connettoriMultipli.consegnaCondizionale.connettoreNonEsistente.nomeConnettore.error");
  506.                     }
  507.                 }
  508.                 else if(config.getNessunConnettoreTrovato().isEmitDiagnosticInfo()) {
  509.                     if(config.isByFilter()) {
  510.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  511.                                 "connettoriMultipli.consegnaCondizionale.connettoreNonEsistente.filtro.info");
  512.                     }
  513.                     else {
  514.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  515.                                 "connettoriMultipli.consegnaCondizionale.connettoreNonEsistente.nomeConnettore.info");
  516.                     }
  517.                 }
  518.                
  519.                 if(TipoBehaviour.CONSEGNA_LOAD_BALANCE.equals(behaviourType)) {
  520.                     // li usero tutti senza filtro sulla condizionalità
  521.                    
  522.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  523.                             "connettoriMultipli.consegnaCondizionale.loadBalancer.tuttiConnettori");
  524.                    
  525.                     result.setListServiziApplicativi(getAllEnabled(pa.getServizioApplicativoList()));
  526.                     return result;
  527.                 }
  528.                
  529.                 // se arrivo qua, sicuramente non sono in load balance mode
  530.                 nomeConnettoreDaUsare = config.getNessunConnettoreTrovato().getNomeConnettore();
  531.                 if(nomeConnettoreDaUsare==null || "".equals(nomeConnettoreDaUsare)) {
  532.                    
  533.                     if(TipoBehaviour.CONSEGNA_MULTIPLA.equals(behaviourType)) {
  534.                        
  535.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  536.                                 "connettoriMultipli.consegnaCondizionale.nessunConnettoreIdentificato.tuttiConnettori");
  537.                        
  538.                         result.setListServiziApplicativi(getAllEnabled(pa.getServizioApplicativoList()));
  539.                         return result;
  540.                     }
  541.                     else if(TipoBehaviour.CONSEGNA_CONDIZIONALE.equals(behaviourType)) {
  542.                         // non può succedere
  543.                         throw new BehaviourException("Connettore da utilizzare in caso di identificazione del connettore fallita non indicato");
  544.                     }
  545.                     else if(TipoBehaviour.CONSEGNA_CON_NOTIFICHE.equals(behaviourType)) {
  546.                        
  547.                         msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  548.                                 "connettoriMultipli.consegnaCondizionale.nessunConnettoreIdentificato.tuttiConnettoriNotifica");
  549.                        
  550.                         result.setListServiziApplicativi(getAllEnabled(pa.getServizioApplicativoList()));
  551.                         return result;
  552.                     }
  553.                                            
  554.                 }
  555.                 else if(TipoBehaviour.CONSEGNA_CON_NOTIFICHE.equals(behaviourType) &&
  556.                         Costanti.CONDITIONAL_NOME_CONNETTORE_VALORE_NESSUNO.equals(nomeConnettoreDaUsare)) {
  557.                                                
  558.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  559.                             "connettoriMultipli.consegnaCondizionale.nessunConnettoreIdentificato");
  560.                    
  561.                     result.setListServiziApplicativi(new ArrayList<>());
  562.                     return result;
  563.                                            
  564.                 }
  565.                
  566.                 result.setListServiziApplicativi(filter(pa.getServizioApplicativoList(),false,nomeConnettoreDaUsare));
  567.                 if(result.getListServiziApplicativi().isEmpty()) {
  568.                     throw new BehaviourException("Connettore '"+nomeConnettoreDaUsare+"' indicato, da utilizzare in caso di identificazione condizionale fallita, non esistente");
  569.                 }
  570.                
  571.                 msgDiag.addKeyword(CostantiPdD.KEY_NOME_CONNETTORE, nomeConnettoreDaUsare);
  572.                 if(TipoBehaviour.CONSEGNA_CON_NOTIFICHE.equals(behaviourType)) {
  573.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  574.                             "connettoriMultipli.consegnaCondizionale.nessunConnettoreIdentificato.connettoreNotificaDefault");
  575.                 }
  576.                 else {
  577.                     msgDiag.logPersonalizzato(MsgDiagnosticiProperties.MSG_DIAG_CONSEGNA_CONTENUTI_APPLICATIVI,
  578.                             "connettoriMultipli.consegnaCondizionale.nessunConnettoreIdentificato.connettoreDefault");
  579.                 }
  580.                
  581.                 return result;
  582.             }
  583.            
  584.         }
  585.        
  586.     }
  587.     private static List<PortaApplicativaServizioApplicativo> filter(List<PortaApplicativaServizioApplicativo> listPASA, boolean filter, String condition){
  588.         List<PortaApplicativaServizioApplicativo> l = new ArrayList<>();
  589.         for (PortaApplicativaServizioApplicativo portaApplicativaServizioApplicativo : listPASA) {
  590.            
  591.             if(portaApplicativaServizioApplicativo.getDatiConnettore()==null || portaApplicativaServizioApplicativo.getDatiConnettore().getStato()==null ||
  592.                     StatoFunzionalita.ABILITATO.equals(portaApplicativaServizioApplicativo.getDatiConnettore().getStato())) {
  593.            
  594.                 if(filter) {
  595.                     if(portaApplicativaServizioApplicativo.getDatiConnettore()!=null) {
  596.                         if(portaApplicativaServizioApplicativo.getDatiConnettore().getFiltroList()!=null &&
  597.                                 portaApplicativaServizioApplicativo.getDatiConnettore().getFiltroList().contains(condition)) {
  598.                             l.add(portaApplicativaServizioApplicativo);
  599.                         }
  600.                     }
  601.                 }
  602.                 else {
  603.                     String nomeConnettore = org.openspcoop2.pdd.core.behaviour.built_in.Costanti.NOME_CONNETTORE_DEFAULT;
  604.                     if(portaApplicativaServizioApplicativo.getDatiConnettore()!=null &&
  605.                             portaApplicativaServizioApplicativo.getDatiConnettore().getNome()!=null) {
  606.                         nomeConnettore = portaApplicativaServizioApplicativo.getDatiConnettore().getNome();
  607.                     }
  608.                              
  609.                     if(condition.equals(nomeConnettore)) {
  610.                         l.add(portaApplicativaServizioApplicativo);
  611.                     }
  612.                 }
  613.                
  614.             }
  615.         }
  616.         return l;
  617.     }
  618.     private static List<PortaApplicativaServizioApplicativo> getAllEnabled(List<PortaApplicativaServizioApplicativo> listPASA){
  619.        
  620.         List<PortaApplicativaServizioApplicativo> l = new ArrayList<>();
  621.        
  622.         for (PortaApplicativaServizioApplicativo servizioApplicativo : listPASA) {
  623.            
  624.             if(servizioApplicativo.getDatiConnettore()==null || servizioApplicativo.getDatiConnettore().getStato()==null ||
  625.                     StatoFunzionalita.ABILITATO.equals(servizioApplicativo.getDatiConnettore().getStato())) {
  626.                 l.add(servizioApplicativo);
  627.             }
  628.            
  629.         }
  630.        
  631.         return l;
  632.        
  633.     }
  634.    
  635.     public static String normalizeTemplateResult(String condition) {
  636.         if(condition!=null) {
  637.             condition = condition.trim();
  638.             if(condition.startsWith("\n") && condition.length()>1) {
  639.                 condition = condition.substring(1);
  640.             }
  641.             if(condition.endsWith("\n") && condition.length()>1) {
  642.                 condition = condition.substring(0, condition.length()-1);
  643.             }
  644.         }
  645.         return condition;
  646.     }
  647.    
  648.     public static boolean isConfigurazioneCondizionale(PortaApplicativa pa, Logger log) {
  649.         if(pa.getBehaviour()==null || pa.getBehaviour().sizeProprietaList()<=0) {
  650.             return false;
  651.         }
  652.         String type = null;
  653.         for (Proprieta p : pa.getBehaviour().getProprietaList()) {
  654.             if(Costanti.CONDITIONAL_ENABLED.equals(p.getNome())) {
  655.                 type = p.getValore();
  656.                 break;
  657.             }
  658.         }
  659.         if(type==null) {
  660.             return false;
  661.         }
  662.         return "true".equals(type);
  663.     }
  664.    
  665.     public static boolean isConfigurazioneCondizionaleByFilter(PortaApplicativa pa, Logger log) {
  666.         if(pa.getBehaviour()==null || pa.getBehaviour().sizeProprietaList()<=0) {
  667.             return false;
  668.         }
  669.         String type = null;
  670.         String byFilter = null;
  671.         for (Proprieta p : pa.getBehaviour().getProprietaList()) {
  672.             if(Costanti.CONDITIONAL_ENABLED.equals(p.getNome())) {
  673.                 type = p.getValore();
  674.             }
  675.             else if(Costanti.CONDITIONAL_BY_FILTER.equals(p.getNome())) {
  676.                 byFilter = p.getValore();
  677.             }
  678.         }
  679.         if(type==null || byFilter==null) {
  680.             return false;
  681.         }
  682.         return "true".equals(type) && "true".equals(byFilter);
  683.     }
  684.    
  685.     public static ConfigurazioneCondizionale read(PortaApplicativa pa, Logger log) throws BehaviourException {
  686.         ConfigurazioneCondizionale config = new ConfigurazioneCondizionale();
  687.         if(pa.getBehaviour()==null || pa.getBehaviour().sizeProprietaList()<=0) {
  688.             throw new BehaviourException("Configurazione condizionale non disponibile");
  689.         }
  690.        
  691.         ConfigurazioneSelettoreCondizione selettoreConfigurazioneDefault = new ConfigurazioneSelettoreCondizione();
  692.         config.setDefaultConfig(selettoreConfigurazioneDefault);
  693.        
  694.         IdentificazioneFallitaConfigurazione condizioneNonIdentificata = new IdentificazioneFallitaConfigurazione();
  695.         config.setCondizioneNonIdentificata(condizioneNonIdentificata);
  696.        
  697.         IdentificazioneFallitaConfigurazione nessunConnettoreTrovato = new IdentificazioneFallitaConfigurazione();
  698.         config.setNessunConnettoreTrovato(nessunConnettoreTrovato);
  699.        
  700.         List<String> idRegole = new ArrayList<>();
  701.        
  702.         for (Proprieta p : pa.getBehaviour().getProprietaList()) {
  703.            
  704.             String nome = p.getNome();
  705.             String valore = p.getValore().trim();
  706.            
  707.             try {
  708.                 if(Costanti.CONDITIONAL_BY_FILTER.equals(nome)) {
  709.                     config.setByFilter("true".equals(valore));
  710.                 }
  711.                
  712.                 else if(Costanti.CONDITIONAL_TIPO_SELETTORE.equals(nome)) {
  713.                     selettoreConfigurazioneDefault.setTipoSelettore(TipoSelettore.toEnumConstant(valore, true));
  714.                 }
  715.                 else if(Costanti.CONDITIONAL_PATTERN.equals(nome)) {
  716.                     selettoreConfigurazioneDefault.setPattern(valore);
  717.                 }
  718.                 else if(Costanti.CONDITIONAL_PREFIX.equals(nome)) {
  719.                     selettoreConfigurazioneDefault.setPrefix(valore);
  720.                 }
  721.                 else if(Costanti.CONDITIONAL_SUFFIX.equals(nome)) {
  722.                     selettoreConfigurazioneDefault.setSuffix(valore);
  723.                 }
  724.                
  725.                 else if(nome.startsWith(Costanti.CONDITIONAL_RULE) && nome.endsWith(Costanti.CONDITIONAL_RULE_NAME) ) {
  726.                     String idRegola = nome.substring(Costanti.CONDITIONAL_RULE.length(), (nome.length()-Costanti.CONDITIONAL_RULE_NAME.length()));
  727.                     idRegole.add(idRegola);
  728.                 }
  729.                
  730.                 else if((Costanti.CONDITIONAL_CONDIZIONE_NON_IDENTIFICATA+Costanti.CONDITIONAL_ABORT_TRANSACTION).equals(nome)) {
  731.                     condizioneNonIdentificata.setAbortTransaction("true".equals(valore));
  732.                 }
  733.                 else if((Costanti.CONDITIONAL_CONDIZIONE_NON_IDENTIFICATA+Costanti.CONDITIONAL_EMIT_DIAGNOSTIC_INFO).equals(nome)) {
  734.                     condizioneNonIdentificata.setEmitDiagnosticInfo("true".equals(valore));
  735.                 }
  736.                 else if((Costanti.CONDITIONAL_CONDIZIONE_NON_IDENTIFICATA+Costanti.CONDITIONAL_EMIT_DIAGNOSTIC_ERROR).equals(nome)) {
  737.                     condizioneNonIdentificata.setEmitDiagnosticError("true".equals(valore));
  738.                 }
  739.                 else if((Costanti.CONDITIONAL_CONDIZIONE_NON_IDENTIFICATA+Costanti.CONDITIONAL_NOME_CONNETTORE).equals(nome)) {
  740.                     condizioneNonIdentificata.setNomeConnettore(valore);
  741.                 }
  742.                
  743.                 else if((Costanti.CONDITIONAL_NESSUN_CONNETTORE_TROVATO+Costanti.CONDITIONAL_ABORT_TRANSACTION).equals(nome)) {
  744.                     nessunConnettoreTrovato.setAbortTransaction("true".equals(valore));
  745.                 }
  746.                 else if((Costanti.CONDITIONAL_NESSUN_CONNETTORE_TROVATO+Costanti.CONDITIONAL_EMIT_DIAGNOSTIC_INFO).equals(nome)) {
  747.                     nessunConnettoreTrovato.setEmitDiagnosticInfo("true".equals(valore));
  748.                 }
  749.                 else if((Costanti.CONDITIONAL_NESSUN_CONNETTORE_TROVATO+Costanti.CONDITIONAL_EMIT_DIAGNOSTIC_ERROR).equals(nome)) {
  750.                     nessunConnettoreTrovato.setEmitDiagnosticError("true".equals(valore));
  751.                 }
  752.                 else if((Costanti.CONDITIONAL_NESSUN_CONNETTORE_TROVATO+Costanti.CONDITIONAL_NOME_CONNETTORE).equals(nome)) {
  753.                     nessunConnettoreTrovato.setNomeConnettore(valore);
  754.                 }
  755.             }catch(Exception e) {
  756.                 throw new BehaviourException("Configurazione condizionale non corretta (proprietà:"+p.getNome()+" valore:'"+p.getValore()+"'): "+e.getMessage(),e);
  757.             }
  758.            
  759.         }
  760.        
  761.         if(!idRegole.isEmpty()) {
  762.             for (String idRegola : idRegole) {
  763.                
  764.                 String prefixGruppo = Costanti.CONDITIONAL_RULE+idRegola;
  765.                 String prefixGruppoConUnderscore = prefixGruppo+"_";
  766.                 ConfigurazioneSelettoreCondizioneRegola selettoreConfigurazioneRegola = new ConfigurazioneSelettoreCondizioneRegola();
  767.                
  768.                 for (Proprieta p : pa.getBehaviour().getProprietaList()) {
  769.                    
  770.                     String nome = p.getNome();
  771.                     String valore = p.getValore().trim();
  772.                    
  773.                     try {
  774.                         if((prefixGruppo+Costanti.CONDITIONAL_RULE_NAME).equals(nome)) {
  775.                             selettoreConfigurazioneRegola.setRegola(valore);
  776.                         }
  777.                         else if((prefixGruppoConUnderscore+Costanti.CONDITIONAL_RULE_PATTERN_OPERAZIONE).equals(nome)) {
  778.                             selettoreConfigurazioneRegola.setPatternOperazione(valore);
  779.                         }
  780.                         else if((prefixGruppoConUnderscore+Costanti.CONDITIONAL_RULE_STATIC_INFO).equals(nome)) {
  781.                             selettoreConfigurazioneRegola.setStaticInfo(valore);
  782.                         }
  783.                        
  784.                         else if((prefixGruppoConUnderscore+Costanti.CONDITIONAL_TIPO_SELETTORE).equals(nome)) {
  785.                             selettoreConfigurazioneRegola.setTipoSelettore(TipoSelettore.toEnumConstant(valore, true));
  786.                         }
  787.                         else if((prefixGruppoConUnderscore+Costanti.CONDITIONAL_PATTERN).equals(nome)) {
  788.                             selettoreConfigurazioneRegola.setPattern(valore);
  789.                         }
  790.                         else if((prefixGruppoConUnderscore+Costanti.CONDITIONAL_PREFIX).equals(nome)) {
  791.                             selettoreConfigurazioneRegola.setPrefix(valore);
  792.                         }
  793.                         else if((prefixGruppoConUnderscore+Costanti.CONDITIONAL_SUFFIX).equals(nome)) {
  794.                             selettoreConfigurazioneRegola.setSuffix(valore);
  795.                         }
  796.                     }catch(Exception e) {
  797.                         throw new BehaviourException("Configurazione condizionale non corretta (proprietà:"+p.getNome()+" valore:'"+p.getValore()+"'): "+e.getMessage(),e);
  798.                     }                  
  799.                    
  800.                 }
  801.                
  802.                 config.addRegola(selettoreConfigurazioneRegola);
  803.                
  804.             }
  805.         }
  806.        

  807.         return config;
  808.     }
  809.    

  810.     public static void save(PortaApplicativa pa, ConfigurazioneCondizionale configurazione) throws BehaviourException {
  811.        
  812.         if(pa.getBehaviour()==null) {
  813.             throw new BehaviourException("Configurazione behaviour non abilitata");
  814.         }
  815.         if(configurazione==null) {
  816.             throw new BehaviourException("Configurazione condizionale non fornita");
  817.         }
  818.         BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),Costanti.CONDITIONAL_ENABLED, true+"");
  819.        
  820.         BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),Costanti.CONDITIONAL_BY_FILTER, configurazione.isByFilter()+"");
  821.                
  822.         if(configurazione.getDefaultConfig()==null) {
  823.             throw new BehaviourException("Configurazione selettore condizione di default non fornita");
  824.         }
  825.         BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),Costanti.CONDITIONAL_TIPO_SELETTORE, configurazione.getDefaultConfig().getTipoSelettore().getValue());
  826.         if(StringUtils.isNotEmpty(configurazione.getDefaultConfig().getPattern())) {
  827.             BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),Costanti.CONDITIONAL_PATTERN, configurazione.getDefaultConfig().getPattern());
  828.         }else {
  829.             BehaviourPropertiesUtils.removeProprieta(pa.getBehaviour(),Costanti.CONDITIONAL_PATTERN);
  830.         }
  831.         if(StringUtils.isNotEmpty(configurazione.getDefaultConfig().getPrefix())) {
  832.             BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),Costanti.CONDITIONAL_PREFIX, configurazione.getDefaultConfig().getPrefix());
  833.         }else {
  834.             BehaviourPropertiesUtils.removeProprieta(pa.getBehaviour(),Costanti.CONDITIONAL_PREFIX);
  835.         }
  836.         if(StringUtils.isNotEmpty(configurazione.getDefaultConfig().getSuffix())) {
  837.             BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),Costanti.CONDITIONAL_SUFFIX, configurazione.getDefaultConfig().getSuffix());
  838.         }else {
  839.             BehaviourPropertiesUtils.removeProprieta(pa.getBehaviour(),Costanti.CONDITIONAL_SUFFIX);
  840.         }
  841.        
  842.         List<String> listProprietaDaRimuovere = new ArrayList<>();
  843.         for (Proprieta p : pa.getBehaviour().getProprietaList()) {
  844.             if(p.getNome().startsWith(Costanti.CONDITIONAL_RULE)) {
  845.                 listProprietaDaRimuovere.add(p.getNome());
  846.             }
  847.         }
  848.         if(!listProprietaDaRimuovere.isEmpty()) {
  849.             for (String propertyName : listProprietaDaRimuovere) {
  850.                 BehaviourPropertiesUtils.removeProprieta(pa.getBehaviour(), propertyName);
  851.             }
  852.         }
  853.         if(configurazione.getRegoleOrdinate()!=null && !configurazione.getRegoleOrdinate().isEmpty()) {
  854.             int indexRegola = 1;
  855.             for (String nomeRegola : configurazione.getRegoleOrdinate()) {
  856.                
  857.                 String prefixRegola = Costanti.CONDITIONAL_RULE+indexRegola;
  858.                 BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(prefixRegola+Costanti.CONDITIONAL_RULE_NAME),nomeRegola);
  859.                
  860.                 ConfigurazioneSelettoreCondizioneRegola regola = configurazione.getRegola(nomeRegola);
  861.                
  862.                 BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(prefixRegola+"_"+Costanti.CONDITIONAL_RULE_PATTERN_OPERAZIONE),regola.getPatternOperazione());
  863.                 if(StringUtils.isNotEmpty(regola.getStaticInfo())) {
  864.                     BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(prefixRegola+"_"+Costanti.CONDITIONAL_RULE_STATIC_INFO),regola.getStaticInfo());
  865.                 }
  866.                
  867.                 if(regola.getTipoSelettore()!=null) {
  868.                     BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(prefixRegola+"_"+Costanti.CONDITIONAL_TIPO_SELETTORE),regola.getTipoSelettore().getValue());
  869.                 }
  870.                 if(StringUtils.isNotEmpty(regola.getPattern())) {
  871.                     BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(prefixRegola+"_"+Costanti.CONDITIONAL_PATTERN),regola.getPattern());
  872.                 }
  873.                 if(StringUtils.isNotEmpty(regola.getPrefix())) {
  874.                     BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(prefixRegola+"_"+Costanti.CONDITIONAL_PREFIX),regola.getPrefix());
  875.                 }
  876.                 if(StringUtils.isNotEmpty(regola.getSuffix())) {
  877.                     BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(prefixRegola+"_"+Costanti.CONDITIONAL_SUFFIX), regola.getSuffix());
  878.                 }
  879.                
  880.                 indexRegola++;
  881.             }
  882.         }
  883.        
  884.         if(configurazione.getCondizioneNonIdentificata()==null) {
  885.             throw new BehaviourException("Configurazione 'condizione non identificata' non fornita");
  886.         }
  887.         BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(Costanti.CONDITIONAL_CONDIZIONE_NON_IDENTIFICATA+Costanti.CONDITIONAL_ABORT_TRANSACTION),
  888.                 configurazione.getCondizioneNonIdentificata().isAbortTransaction()+"");
  889.         BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(Costanti.CONDITIONAL_CONDIZIONE_NON_IDENTIFICATA+Costanti.CONDITIONAL_EMIT_DIAGNOSTIC_INFO),
  890.                 configurazione.getCondizioneNonIdentificata().isEmitDiagnosticInfo()+"");
  891.         BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(Costanti.CONDITIONAL_CONDIZIONE_NON_IDENTIFICATA+Costanti.CONDITIONAL_EMIT_DIAGNOSTIC_ERROR),
  892.                 configurazione.getCondizioneNonIdentificata().isEmitDiagnosticError()+"");
  893.         if(StringUtils.isNotEmpty(configurazione.getCondizioneNonIdentificata().getNomeConnettore())) {
  894.             BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(Costanti.CONDITIONAL_CONDIZIONE_NON_IDENTIFICATA+Costanti.CONDITIONAL_NOME_CONNETTORE),
  895.                     configurazione.getCondizioneNonIdentificata().getNomeConnettore());
  896.         }
  897.        
  898.         if(configurazione.getNessunConnettoreTrovato()==null) {
  899.             throw new BehaviourException("Configurazione 'nessun connettore trovato' non fornita");
  900.         }
  901.         BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(Costanti.CONDITIONAL_NESSUN_CONNETTORE_TROVATO+Costanti.CONDITIONAL_ABORT_TRANSACTION),
  902.                 configurazione.getNessunConnettoreTrovato().isAbortTransaction()+"");
  903.         BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(Costanti.CONDITIONAL_NESSUN_CONNETTORE_TROVATO+Costanti.CONDITIONAL_EMIT_DIAGNOSTIC_INFO),
  904.                 configurazione.getNessunConnettoreTrovato().isEmitDiagnosticInfo()+"");
  905.         BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(Costanti.CONDITIONAL_NESSUN_CONNETTORE_TROVATO+Costanti.CONDITIONAL_EMIT_DIAGNOSTIC_ERROR),
  906.                 configurazione.getNessunConnettoreTrovato().isEmitDiagnosticError()+"");
  907.         if(StringUtils.isNotEmpty(configurazione.getNessunConnettoreTrovato().getNomeConnettore())) {
  908.             BehaviourPropertiesUtils.addProprieta(pa.getBehaviour(),(Costanti.CONDITIONAL_NESSUN_CONNETTORE_TROVATO+Costanti.CONDITIONAL_NOME_CONNETTORE),
  909.                     configurazione.getNessunConnettoreTrovato().getNomeConnettore());
  910.         }
  911.     }
  912.    
  913. }