ConnectorUtils.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.services.connector;

  21. import java.io.IOException;
  22. import java.util.Enumeration;

  23. import javax.servlet.http.HttpServletRequest;
  24. import javax.servlet.http.HttpServletResponse;

  25. import org.apache.commons.lang.StringEscapeUtils;
  26. import org.openspcoop2.message.config.ServiceBindingConfiguration;
  27. import org.openspcoop2.message.constants.MessageType;
  28. import org.openspcoop2.message.constants.ServiceBinding;
  29. import org.openspcoop2.message.exception.MessageException;
  30. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  31. import org.openspcoop2.pdd.core.CostantiPdD;
  32. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  33. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  34. import org.openspcoop2.protocol.engine.URLProtocolContextImpl;
  35. import org.openspcoop2.protocol.manifest.Context;
  36. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  37. import org.openspcoop2.protocol.sdk.ProtocolException;
  38. import org.openspcoop2.protocol.sdk.config.IProtocolConfiguration;
  39. import org.openspcoop2.protocol.sdk.constants.IDService;
  40. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  41. import org.openspcoop2.protocol.sdk.state.URLProtocolContext;
  42. import org.openspcoop2.utils.LoggerWrapperFactory;
  43. import org.openspcoop2.utils.resources.MapReader;
  44. import org.openspcoop2.utils.transport.http.ContentTypeUtilities;
  45. import org.openspcoop2.utils.transport.http.HttpConstants;
  46. import org.openspcoop2.utils.transport.http.HttpRequestMethod;
  47. import org.slf4j.Logger;

  48. /**
  49.  * ConnectorUtils
  50.  *
  51.  * @author Poli Andrea (apoli@link.it)
  52.  * @author $Author$
  53.  * @version $Rev$, $Date$
  54.  */
  55. public class ConnectorUtils {

  56.     public static Logger getErrorLog(){
  57.         Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
  58.         if(log == null){
  59.             log = LoggerWrapperFactory.getLogger(ConnectorUtils.class);
  60.         }
  61.         return log;
  62.     }
  63.    
  64.     public static RequestInfo getRequestInfo(IProtocolFactory<?> pf,URLProtocolContext protocolContext) throws ProtocolException, MessageException{
  65.        
  66.         OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
  67.         IProtocolConfiguration pc = pf.createProtocolConfiguration();
  68.        
  69.         ServiceBindingConfiguration bindingConfig = pc.getDefaultServiceBindingConfiguration(protocolContext);
  70.         ServiceBinding integrationServiceBinding = bindingConfig.getDefaultBinding();
  71.        
  72.         ServiceBinding protocolServiceBinding = pc.getProtocolServiceBinding(integrationServiceBinding, protocolContext);
  73.                
  74.         ServiceBinding serviceBindingDaUtilizzare = integrationServiceBinding;
  75.         boolean pa = false;
  76.         if(protocolContext.isPortaApplicativaService()) {
  77.             serviceBindingDaUtilizzare = protocolServiceBinding;
  78.             pa = true;
  79.         }
  80.        
  81.         String ct = null;
  82.         try {
  83.             ct = protocolContext.getContentType();
  84.             if(ct!=null && !"".equals(ct)) {
  85.                 //(new ContentType(ct)).getBaseType();
  86.                 ContentTypeUtilities.validateContentType(ct);
  87.             }
  88.         }catch(Throwable e) {
  89.             // valido content type ricevuto; eventuale tipo non correto verrĂ  segnalato in seguito
  90.             ct = null;
  91.         }
  92.        
  93.         MessageType requestMessageType = bindingConfig.getRequestMessageType(serviceBindingDaUtilizzare,
  94.                 protocolContext, ct);
  95.        
  96.         RequestInfo requestInfo = new RequestInfo();
  97.         requestInfo.setProtocolContext(protocolContext);
  98.         requestInfo.setProtocolFactory(pf);
  99.         if(pa){
  100.             requestInfo.setProtocolRequestMessageType(requestMessageType);
  101.         }
  102.         else{
  103.             requestInfo.setIntegrationRequestMessageType(requestMessageType);
  104.         }
  105.         requestInfo.setProtocolServiceBinding(protocolServiceBinding);
  106.         requestInfo.setIntegrationServiceBinding(integrationServiceBinding);
  107.         requestInfo.setBindingConfig(bindingConfig);
  108.         requestInfo.setIdentitaPdD(op2Properties!=null ? op2Properties.getIdentitaPortaDefault(pf.getProtocol(), requestInfo) : null );
  109.        
  110.         return requestInfo;
  111.     }
  112.    
  113.     public static String getMessageHttpMethodNotSupported(HttpRequestMethod method){
  114.         return ConnectorCostanti.MESSAGE_METHOD_HTTP_NOT_SUPPORTED.replace(ConnectorCostanti.KEYWORD_METHOD_HTTP, method.name());
  115.     }
  116.    
  117.     public static String getMessageServiceBindingNotSupported(ServiceBinding serviceBinding){
  118.         return ConnectorCostanti.MESSAGE_SERVICE_BINDING_NOT_SUPPORTED.replace(ConnectorCostanti.KEYWORD_SERVICE_BINDING, serviceBinding.name());
  119.     }
  120.    
  121.     private static StringBuilder getPrefixCode(IDService idService) {
  122.        
  123.         Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
  124.         if(log==null){
  125.             log = OpenSPCoop2Logger.getLoggerOpenSPCoopConsole();
  126.         }
  127.         if(log==null){
  128.             log = LoggerWrapperFactory.getLogger(ConnectorUtils.class);
  129.         }
  130.        
  131.         StringBuilder bf = new StringBuilder();
  132.         try{
  133.             bf.append(idService.getCode()).append(ConnectorCostanti.SEPARATOR_CODE);
  134.         }catch(Exception e){
  135.             log.error(e.getMessage(),e);
  136.             bf = new StringBuilder();
  137.             bf.append(ConnectorCostanti.ID_ERRORE_GENERICO);
  138.         }
  139.         return bf;
  140.     }
  141.    
  142.     public static String getFullCodeGovWayNotInitialized(IDService idService) {
  143.         StringBuilder bf = getPrefixCode(idService);
  144.         bf.append(ConnectorCostanti.GOVWAY_NOT_INITIALIZED);
  145.         return bf.toString();
  146.     }
  147.    
  148.     public static String getFullCodeProtocolUnsupported(IDService idService) {
  149.         StringBuilder bf = getPrefixCode(idService);
  150.         bf.append(ConnectorCostanti.CODE_PROTOCOL_NOT_SUPPORTED);
  151.         return bf.toString();
  152.     }
  153.    
  154.     public static String getFullCodeWsdlUnsupported(IDService idService) {
  155.         StringBuilder bf = getPrefixCode(idService);
  156.         bf.append(ConnectorCostanti.CODE_WSDL_UNSUPPORTED);
  157.         return bf.toString();
  158.     }
  159.     public static String getFullCodeWsdlNotDefined(IDService idService) {
  160.         StringBuilder bf = getPrefixCode(idService);
  161.         bf.append(ConnectorCostanti.CODE_WSDL_NOT_DEFINED);
  162.         return bf.toString();
  163.     }
  164.    
  165.     public static String getFullCodeEngineFilter(IDService idService) {
  166.         StringBuilder bf = getPrefixCode(idService);
  167.         bf.append(ConnectorCostanti.CODE_ENGINE_FILTER);
  168.         return bf.toString();
  169.     }
  170.    
  171.     public static String getFullCodeFunctionUnsupported(IDService idService) {
  172.         StringBuilder bf = getPrefixCode(idService);
  173.         bf.append(ConnectorCostanti.CODE_FUNCTION_UNSUPPORTED);
  174.         return bf.toString();
  175.     }
  176.    
  177.     public static String getFullCodeHttpMethodNotSupported(IDService idService, HttpRequestMethod method) {
  178.         StringBuilder bf = getPrefixCode(idService);
  179.         switch (method) {
  180.         case GET:
  181.             bf.append(ConnectorCostanti.CODE_HTTP_METHOD_GET_UNSUPPORTED);
  182.             break;
  183.         case POST:
  184.             bf.append(ConnectorCostanti.CODE_HTTP_METHOD_POST_UNSUPPORTED);
  185.             break;
  186.         case PUT:
  187.             bf.append(ConnectorCostanti.CODE_HTTP_METHOD_PUT_UNSUPPORTED);
  188.             break;
  189.         case HEAD:
  190.             bf.append(ConnectorCostanti.CODE_HTTP_METHOD_HEAD_UNSUPPORTED);
  191.             break;
  192.         case DELETE:
  193.             bf.append(ConnectorCostanti.CODE_HTTP_METHOD_DELETE_UNSUPPORTED);
  194.             break;
  195.         case OPTIONS:
  196.             bf.append(ConnectorCostanti.CODE_HTTP_METHOD_OPTIONS_UNSUPPORTED);
  197.             break;
  198.         case TRACE:
  199.             bf.append(ConnectorCostanti.CODE_HTTP_METHOD_TRACE_UNSUPPORTED);
  200.             break;
  201.         case PATCH:
  202.             bf.append(ConnectorCostanti.CODE_HTTP_METHOD_PATCH_UNSUPPORTED);
  203.             break;
  204.         case LINK:
  205.             bf.append(ConnectorCostanti.CODE_HTTP_METHOD_LINK_UNSUPPORTED);
  206.             break;
  207.         case UNLINK:
  208.             bf.append(ConnectorCostanti.CODE_HTTP_METHOD_UNLINK_UNSUPPORTED);
  209.             break;
  210.         }
  211.         return bf.toString();
  212.     }
  213.    
  214.     public static String getFullCodeServiceBindingNotSupported(IDService idService, ServiceBinding serviceBinding) {
  215.         StringBuilder bf = getPrefixCode(idService);
  216.         switch (serviceBinding) {
  217.         case SOAP:
  218.             bf.append(ConnectorCostanti.CODE_SERVICE_BINDING_SOAP_UNSUPPORTED);
  219.             break;
  220.         case REST:
  221.             bf.append(ConnectorCostanti.CODE_SERVICE_BINDING_REST_UNSUPPORTED);
  222.             break;
  223.         }
  224.         return bf.toString();
  225.     }
  226.    
  227.    
  228.     public static String generateError404Message(String code){
  229.         return "GovWay-"+code;
  230.     }
  231.    
  232.     public static void generateErrorMessage(IDService idService, HttpRequestMethod httpMethod,
  233.             HttpServletRequest req, HttpServletResponse res, String msgErrore, boolean erroreGenerale, boolean htmlMessage) throws IOException{
  234.         generateErrorMessage(idService, httpMethod, req, res, msgErrore, erroreGenerale, htmlMessage, null);
  235.     }
  236.     public static void generateErrorMessage(IDService idService, HttpRequestMethod httpMethod,
  237.             HttpServletRequest req, StringBuilder log, String msgErrore, boolean erroreGenerale, boolean htmlMessage) throws IOException{
  238.         generateErrorMessage(idService, httpMethod, req, null, msgErrore, erroreGenerale, htmlMessage, log);
  239.     }
  240.     private static void generateErrorMessage(IDService idService, HttpRequestMethod httpMethod,
  241.             HttpServletRequest req, HttpServletResponse response, String msgErrore, boolean erroreGenerale, boolean htmlMessage, StringBuilder log) throws IOException{
  242.        
  243.         Logger logCore = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
  244.         OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
  245.        
  246.        
  247.        
  248.         // versione
  249.         String versione = CostantiPdD.OPENSPCOOP2_PRODUCT_VERSION;
  250.         if(op2Properties!=null){
  251.             versione = op2Properties.getPddDetailsForServices();
  252.         }
  253.         if(htmlMessage){
  254.             versione = StringEscapeUtils.escapeHtml(versione);
  255.             if(response!=null)
  256.                 response.setContentType(HttpConstants.CONTENT_TYPE_HTML);
  257.         }
  258.         else{
  259.             if(response!=null)
  260.                 response.setContentType(HttpConstants.CONTENT_TYPE_PLAIN);
  261.         }

  262.        
  263.         // produzione Body
  264.         boolean doBody = !HttpRequestMethod.HEAD.equals(httpMethod);
  265.         if(!doBody){
  266.             if(log!=null){
  267.                 log.append(CostantiPdD.HEADER_HTTP_X_PDD).append("=").append(versione);
  268.                 log.append(CostantiPdD.HEADER_HTTP_X_PDD_DETAILS).append("=").append(msgErrore);
  269.             }
  270.             else{
  271.                 response.setHeader(CostantiPdD.HEADER_HTTP_X_PDD, versione);
  272.                 response.setHeader(CostantiPdD.HEADER_HTTP_X_PDD_DETAILS, msgErrore);
  273.                 response.setContentLength(0);
  274.             }
  275.             return;
  276.         }
  277.        
  278.         StringBuilder risposta = new StringBuilder();
  279.         risposta.append("<html>\n");
  280.         risposta.append("<head>\n");
  281.         risposta.append("<title>"+versione+"</title>\n");
  282.         risposta.append("</head>\n");
  283.         risposta.append("<body>\n");
  284.        
  285.         risposta.append("<h1>"+versione+"</h1>\n");
  286.            
  287.         // url
  288.         String function = null;
  289.         String parameters = null;
  290.         try{
  291.             URLProtocolContext protocolContext = new URLProtocolContextImpl(req, logCore, true, (op2Properties!=null ? op2Properties.getCustomContexts() : null));
  292.             String url = protocolContext.getUrlInvocazione_formBased();
  293.             if(url.endsWith("?wsdl=")){
  294.                 // richiesta di un wsdl
  295.                 url = url.substring(0, url.length()-"=".length());
  296.             }
  297.             if(htmlMessage){
  298.                 url = StringEscapeUtils.escapeHtml( url );
  299.             }
  300.             risposta.append("<p>" +url+"</p>\n");
  301.             function = protocolContext.getFunction();
  302.             parameters = protocolContext.getFunctionParameters();
  303.         }catch(Exception e){
  304.             if(logCore==null){
  305.                 LoggerWrapperFactory.getLogger(ConnectorUtils.class).error(e.getMessage(),e);
  306.             }else{
  307.                 logCore.error(e.getMessage(),e);
  308.             }
  309.             String context = req.getContextPath();
  310.             if(htmlMessage){
  311.                 context = StringEscapeUtils.escapeHtml( context );
  312.             }
  313.             risposta.append("<p>" +context+"</p>\n");
  314.         }

  315.         // errore
  316.         String errore = msgErrore;
  317.         if(htmlMessage){
  318.             errore = StringEscapeUtils.escapeHtml(errore);
  319.         }
  320.         risposta.append("<p>"+errore+"</p>\n");
  321.        
  322.        
  323.         // other infos
  324.         switch (idService) {
  325.         case PORTA_DELEGATA:
  326.             risposta.append("<i>Servizio utilizzabile per l'invocazione delle fruizioni esposte dall'API Gateway GovWay</i><br/><br/>\n");
  327.             break;
  328.         case PORTA_APPLICATIVA:
  329.             risposta.append("<i>Servizio utilizzabile per l'invocazione delle erogazioni esposte dall'API Gateway GovWay</i><br/><br/>\n");
  330.             break;
  331.         case PORTA_DELEGATA_XML_TO_SOAP:
  332.             risposta.append("<i>Servizio utilizzabile per l'invocazione delle fruizioni esposte dall'API Gateway GovWay, con messaggi xml non imbustati nel protocollo SOAP</i><br/><br/>\n");
  333.             break;
  334.         case INTEGRATION_MANAGER_SOAP:
  335.             if(parameters==null){
  336.                 risposta.append("<i>Servizio IntegrationManager</i><br/><br/>\n");
  337.             }
  338.             else if( (function+"/"+parameters).equals(URLProtocolContext.IntegrationManager_FUNCTION_PD) ){
  339.                 risposta.append("<i>Servizio utilizzabile per l'invocazione delle fruizioni esposte dall'API Gateway GovWay</i><br/><br/>\n");
  340.             }
  341.             else if( (function+"/"+parameters).startsWith(URLProtocolContext.IntegrationManager_FUNCTION_PD+"/") ){
  342.                 risposta.append("<i>Servizio utilizzabile per l'invocazione delle fruizioni esposte dall'API Gateway GovWay</i><br/><br/>\n");
  343.             }
  344.             else if( (function+"/"+parameters).equals(URLProtocolContext.IntegrationManager_FUNCTION_MessageBox) ){
  345.                 risposta.append("<i>Servizio utilizzabile per accedere alla MessageBox esposta dall'API Gateway GovWay</i><br/><br/>\n");
  346.             }
  347.             else if( (function+"/"+parameters).startsWith(URLProtocolContext.IntegrationManager_FUNCTION_MessageBox+"/") ){
  348.                 risposta.append("<i>Servizio utilizzabile per accedere alla MessageBox esposta dall'API Gateway GovWay</i><br/><br/>\n");
  349.             }
  350.             else{
  351.                 risposta.append("<i>Servizio IntegrationManager dell'API Gateway GovWay</i><br/><br/>\n");
  352.             }
  353.             break;
  354.         case CHECK_PDD:
  355.             risposta.append("<i>Servizio utilizzabile per comprendere lo stato di funzionamento dell'API Gateway GovWay</i><br/><br/>\n");
  356.             break;
  357.         case PROXY:
  358.             risposta.append("<i>Servizio utilizzato in installazioni container dell'API Gateway GovWay</i><br/><br/>\n");
  359.             break;
  360.         default:
  361.             if(htmlMessage){
  362.                 // use as
  363.                 String useAs = "Use as http[s]://<server>"+ req.getContextPath()+"/<protocol-context>/<service>[/...]";
  364.                 useAs = StringEscapeUtils.escapeHtml(useAs);
  365.                 risposta.append("<i>"+useAs+"</i><br/>\n");
  366.             }
  367.                
  368.             // protocolli
  369.             try{
  370.                 MapReader<String, IProtocolFactory<?>> prots = ProtocolFactoryManager.getInstance().getProtocolFactories();
  371.                 if(prots.size()<=0){
  372.                     risposta.append("<i>ERROR: No protocol installed</i><br/>\n");
  373.                 }
  374.                 else{
  375.                     StringBuilder bfProtocols = new StringBuilder();
  376.                     Enumeration<String> keys = prots.keys();
  377.                     while (keys.hasMoreElements()) {
  378.                         String key = (String) keys.nextElement();
  379.                         IProtocolFactory<?> pf = prots.get(key);
  380.                         if(pf.getManifest().getWeb().getEmptyContext()!=null && pf.getManifest().getWeb().getEmptyContext().isEnabled()){
  381.                             if(bfProtocols.length()>0){
  382.                                 bfProtocols.append(", ");
  383.                             }
  384.                             bfProtocols.append("\"\" (protocol:"+key+")");
  385.                         }
  386.                         if(pf.getManifest().getWeb().sizeContextList()>0){
  387.                             for (Context context : pf.getManifest().getWeb().getContextList()) {
  388.                                 if(bfProtocols.length()>0){
  389.                                     bfProtocols.append(", ");
  390.                                 }
  391.                                 bfProtocols.append(context.getName()+" (protocol:"+key+")");
  392.                             }
  393.                         }
  394.                     }
  395.                     String enabledProtocols = "Enabled protocol-contexts: "+bfProtocols.toString();
  396.                     if(htmlMessage){
  397.                         enabledProtocols = StringEscapeUtils.escapeHtml(enabledProtocols);
  398.                     }
  399.                     risposta.append("<i>"+enabledProtocols+"</i><br/>\n");
  400.                 }
  401.             }catch(Exception e){
  402.                 if(logCore==null){
  403.                     LoggerWrapperFactory.getLogger(ConnectorUtils.class).error(e.getMessage(),e);
  404.                 }else{
  405.                     logCore.error(e.getMessage(),e);
  406.                 }
  407.                 risposta.append("<i>ERROR: No protocol installed</i><br/>\n");
  408.             }
  409.            
  410.             if(htmlMessage){
  411.                 // servizi
  412.                 risposta.append("<i>Enabled services: in, out, out/xml2soap, check, IntegrationManager</i><br/><br/>\n");
  413.            
  414.                 // web site
  415.                 risposta.append("<i>Official website: https://govway.org</i><br/><br/>\n");
  416.             }
  417.             break;
  418.         }

  419.            
  420.         risposta.append("</body>\n");
  421.         risposta.append("</html>\n");
  422.         if(log!=null){
  423.             log.append(risposta.toString());
  424.         }else{
  425.             response.getOutputStream().write(risposta.toString().getBytes());
  426.         }
  427.     }
  428.    
  429.    
  430. }