ServizioApplicativoContentBasedBehaviour.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.built_in;

  21. import org.openspcoop2.core.config.PortaApplicativa;
  22. import org.openspcoop2.core.config.Proprieta;
  23. import org.openspcoop2.core.id.IDPortaApplicativa;
  24. import org.openspcoop2.core.id.IDServizioApplicativo;
  25. import org.openspcoop2.core.id.IDSoggetto;
  26. import org.openspcoop2.message.OpenSPCoop2Message;
  27. import org.openspcoop2.message.OpenSPCoop2MessageFactory;
  28. import org.openspcoop2.message.OpenSPCoop2RestJsonMessage;
  29. import org.openspcoop2.message.OpenSPCoop2RestXmlMessage;
  30. import org.openspcoop2.message.OpenSPCoop2SoapMessage;
  31. import org.openspcoop2.message.constants.MessageType;
  32. import org.openspcoop2.message.constants.ServiceBinding;
  33. import org.openspcoop2.message.xml.XPathExpressionEngine;
  34. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  35. import org.openspcoop2.pdd.core.AbstractCore;
  36. import org.openspcoop2.pdd.core.GestoreMessaggi;
  37. import org.openspcoop2.pdd.core.GestoreMessaggiException;
  38. import org.openspcoop2.pdd.core.behaviour.Behaviour;
  39. import org.openspcoop2.pdd.core.behaviour.BehaviourEmitDiagnosticException;
  40. import org.openspcoop2.pdd.core.behaviour.BehaviourException;
  41. import org.openspcoop2.pdd.core.behaviour.BehaviourForwardTo;
  42. import org.openspcoop2.pdd.core.behaviour.BehaviourForwardToFilter;
  43. import org.openspcoop2.pdd.core.behaviour.IBehaviour;
  44. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  45. import org.openspcoop2.protocol.sdk.Busta;
  46. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  47. import org.openspcoop2.utils.xml.AbstractXPathExpressionEngine;
  48. import org.openspcoop2.utils.xml2json.JsonXmlPathExpressionEngine;
  49. import org.w3c.dom.Element;

  50. /**
  51.  * ServizioApplicativoBustaBehaviour
  52.  *
  53.  * @author Andrea Poli (apoli@link.it)
  54.  * @author $Author$
  55.  * @version $Rev$, $Date$
  56.  */
  57. public class ServizioApplicativoContentBasedBehaviour extends AbstractCore implements IBehaviour {

  58.     private static final String PATTERN_GENERICO = "pattern";
  59.     private static final String PATTERN_MODE_NOT_FOUND = "notFound";
  60.     private static final String PATTERN_MODE_PREFIX_SA_NAME = "prefix";
  61.     private static final String PATTERN_MODE_SUFFIX_SA_NAME = "suffix";
  62.     private static final String PATTERN_SA_DEFAULT = "saDefault";
  63.    
  64.     @Override
  65.     public Behaviour behaviour(GestoreMessaggi gestoreMessaggioRichiesta, Busta busta,
  66.             PortaApplicativa pa, RequestInfo requestInfo) throws BehaviourException,BehaviourEmitDiagnosticException {
  67.        
  68.         Behaviour behaviour = null;
  69.         BehaviourForwardTo forwardTo = null;
  70.         try{
  71.             behaviour = new Behaviour();
  72.             forwardTo = new BehaviourForwardTo();
  73.             behaviour.getForwardTo().add(forwardTo);
  74.            
  75.             if(busta==null) {
  76.                 throw new BehaviourException("Param busta is null");
  77.             }
  78.            
  79.             BehaviourForwardToFilter filter = new BehaviourForwardToFilter();
  80.             IDServizioApplicativo id = new IDServizioApplicativo();
  81.             id.setIdSoggettoProprietario(new IDSoggetto(busta.getTipoDestinatario(),busta.getDestinatario()));
  82.            
  83.             if(pa==null && requestInfo!=null && requestInfo.getProtocolContext()!=null) {
  84.                 String nomePA = requestInfo.getProtocolContext().getInterfaceName();
  85.                 IDPortaApplicativa idPA = new IDPortaApplicativa();
  86.                 idPA.setNome(nomePA);
  87.                 ConfigurazionePdDManager configPdDManager = ConfigurazionePdDManager.getInstance(gestoreMessaggioRichiesta.getOpenspcoopstate()!=null ? gestoreMessaggioRichiesta.getOpenspcoopstate().getStatoRichiesta() : null);
  88.                 pa = configPdDManager.getPortaApplicativaSafeMethod(idPA, requestInfo);
  89.             }
  90.            
  91.             String azione = null;
  92.             if(busta!=null) {
  93.                 azione = busta.getAzione();
  94.             }
  95.            
  96.             String pattern = null;
  97.             String patternDefault = null;
  98.             NotFoundMode notFoundMode = NotFoundMode.error;
  99.             String prefix = null;
  100.             String suffix = null;
  101.             String saDefault = null;
  102.             if(pa!=null && pa.sizeProprietaList()>0) {
  103.                 for (Proprieta proprietaPA : pa.getProprietaList()) {
  104.                     String nomeProprietaPA = proprietaPA.getNome().trim().toLowerCase();
  105.                     if(PATTERN_GENERICO.toLowerCase().equals(nomeProprietaPA)) {
  106.                         patternDefault = proprietaPA.getValore();
  107.                     }
  108.                     else if(azione!=null && azione.toLowerCase().equals(nomeProprietaPA)) {
  109.                         pattern = proprietaPA.getValore();
  110.                     }
  111.                     else if(PATTERN_MODE_NOT_FOUND.toLowerCase().equals(nomeProprietaPA)) {
  112.                         notFoundMode = NotFoundMode.valueOf(proprietaPA.getValore().toLowerCase());
  113.                     }
  114.                     else if(PATTERN_MODE_PREFIX_SA_NAME.toLowerCase().equals(nomeProprietaPA)) {
  115.                         prefix = proprietaPA.getValore();
  116.                     }
  117.                     else if(PATTERN_MODE_SUFFIX_SA_NAME.toLowerCase().equals(nomeProprietaPA)) {
  118.                         suffix = proprietaPA.getValore();
  119.                     }
  120.                     else if(PATTERN_SA_DEFAULT.toLowerCase().equals(nomeProprietaPA)) {
  121.                         saDefault = proprietaPA.getValore();
  122.                     }
  123.                 }
  124.             }
  125.            
  126.             boolean found = false;
  127.             if(pattern!=null || patternDefault!=null) {
  128.                
  129.                 Element element = null;
  130.                 String elementJson = null;
  131.                 OpenSPCoop2MessageFactory messageFactory = null;
  132.                 try{
  133.                     OpenSPCoop2Message message = gestoreMessaggioRichiesta.getMessage();
  134.                     messageFactory = message.getFactory();
  135.                     if(ServiceBinding.SOAP.equals(message.getServiceBinding())){
  136.                         OpenSPCoop2SoapMessage soapMessage = message.castAsSoap();
  137.                         element = soapMessage.getSOAPPart().getEnvelope();
  138.                     }
  139.                     else{
  140.                         if(MessageType.XML.equals(message.getMessageType())){
  141.                             OpenSPCoop2RestXmlMessage xml = message.castAsRestXml();
  142.                             element = xml.getContent();
  143.                         }
  144.                         else if(MessageType.JSON.equals(message.getMessageType())){
  145.                             OpenSPCoop2RestJsonMessage json = message.castAsRestJson();
  146.                             elementJson = json.getContent();
  147.                         }
  148.                     }
  149.                 }catch(Exception e){
  150.                     throw new GestoreMessaggiException(e.getMessage(),e);
  151.                 }
  152.                
  153.                 String patternUsed = pattern;
  154.                 if(patternUsed==null) {
  155.                     patternUsed = patternDefault;
  156.                 }
  157.                
  158.                 String saNome = null;
  159.                 try {
  160.                     if(element==null && elementJson==null){
  161.                         throw new Exception("Contenuto non disponibile su cui effettuare un match");
  162.                     }
  163.                     if(element!=null) {
  164.                         XPathExpressionEngine xPathEngine = new XPathExpressionEngine(messageFactory);
  165.                         saNome = AbstractXPathExpressionEngine.extractAndConvertResultAsString(element, xPathEngine, patternUsed, OpenSPCoop2Logger.getLoggerOpenSPCoopCore());
  166.                     }
  167.                     else {
  168.                         saNome = JsonXmlPathExpressionEngine.extractAndConvertResultAsString(elementJson, patternUsed, OpenSPCoop2Logger.getLoggerOpenSPCoopCore());
  169.                     }
  170.                     if(saNome==null) {
  171.                         throw new Exception("Nessun valore trovato");
  172.                     }
  173.                 }catch(Exception e) {
  174.                     String msgErrore = "Identificazione del Servizio Applicativo tramite pattern ["+patternUsed+"] fallita: "+e.getMessage();
  175.                     switch (notFoundMode) {
  176.                     case error:
  177.                         OpenSPCoop2Logger.getLoggerOpenSPCoopCore().error(msgErrore,e);
  178.                         throw new Exception(msgErrore);
  179.                     case warning:
  180.                         OpenSPCoop2Logger.getLoggerOpenSPCoopCore().error(msgErrore,e);
  181.                         break;
  182.                     case accept:
  183.                         OpenSPCoop2Logger.getLoggerOpenSPCoopCore().debug(msgErrore,e);
  184.                         break;
  185.                     }
  186.                    
  187.                 }
  188.                                
  189.                 if(saNome!=null) {
  190.                
  191.                     StringBuilder bf = new StringBuilder();
  192.                     if(prefix!=null) {
  193.                         bf.append(prefix);
  194.                     }
  195.                     bf.append(saNome);
  196.                     if(suffix!=null) {
  197.                         bf.append(suffix);
  198.                     }
  199.                     id.setNome(bf.toString());
  200.                     filter.getAccessListServiziApplicativi().add(id);
  201.                     forwardTo.setFilter(filter);
  202.                    
  203.                     found = true;
  204.                 }
  205.                    
  206.             }
  207.            
  208.             if(!found && saDefault!=null) {
  209.                
  210.                 id.setNome(saDefault);
  211.                 filter.getAccessListServiziApplicativi().add(id);
  212.                 forwardTo.setFilter(filter);
  213.                
  214.             }
  215.            
  216.         }catch(Exception e){
  217.             throw new BehaviourException(e.getMessage(),e);
  218.         }
  219.        
  220.        
  221.         return behaviour;
  222.     }

  223. }

  224. enum NotFoundMode{
  225.    
  226.     error, warning, accept
  227.    
  228. }