ConnectorUtils.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 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.services.connector;
- import java.io.IOException;
- import java.util.Enumeration;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.commons.lang.StringEscapeUtils;
- import org.openspcoop2.message.config.ServiceBindingConfiguration;
- import org.openspcoop2.message.constants.MessageType;
- import org.openspcoop2.message.constants.ServiceBinding;
- import org.openspcoop2.message.exception.MessageException;
- import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
- import org.openspcoop2.pdd.core.CostantiPdD;
- import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
- import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
- import org.openspcoop2.protocol.engine.URLProtocolContextImpl;
- import org.openspcoop2.protocol.manifest.Context;
- import org.openspcoop2.protocol.sdk.IProtocolFactory;
- import org.openspcoop2.protocol.sdk.ProtocolException;
- import org.openspcoop2.protocol.sdk.config.IProtocolConfiguration;
- import org.openspcoop2.protocol.sdk.constants.IDService;
- import org.openspcoop2.protocol.sdk.state.RequestInfo;
- import org.openspcoop2.protocol.sdk.state.URLProtocolContext;
- import org.openspcoop2.utils.LoggerWrapperFactory;
- import org.openspcoop2.utils.resources.MapReader;
- import org.openspcoop2.utils.transport.http.ContentTypeUtilities;
- import org.openspcoop2.utils.transport.http.HttpConstants;
- import org.openspcoop2.utils.transport.http.HttpRequestMethod;
- import org.slf4j.Logger;
- /**
- * ConnectorUtils
- *
- * @author Poli Andrea (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class ConnectorUtils {
- public static Logger getErrorLog(){
- Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
- if(log == null){
- log = LoggerWrapperFactory.getLogger(ConnectorUtils.class);
- }
- return log;
- }
-
- public static RequestInfo getRequestInfo(IProtocolFactory<?> pf,URLProtocolContext protocolContext) throws ProtocolException, MessageException{
-
- OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
- IProtocolConfiguration pc = pf.createProtocolConfiguration();
-
- ServiceBindingConfiguration bindingConfig = pc.getDefaultServiceBindingConfiguration(protocolContext);
- ServiceBinding integrationServiceBinding = bindingConfig.getDefaultBinding();
-
- ServiceBinding protocolServiceBinding = pc.getProtocolServiceBinding(integrationServiceBinding, protocolContext);
-
- ServiceBinding serviceBindingDaUtilizzare = integrationServiceBinding;
- boolean pa = false;
- if(protocolContext.isPortaApplicativaService()) {
- serviceBindingDaUtilizzare = protocolServiceBinding;
- pa = true;
- }
-
- String ct = null;
- try {
- ct = protocolContext.getContentType();
- if(ct!=null && !"".equals(ct)) {
- //(new ContentType(ct)).getBaseType();
- ContentTypeUtilities.validateContentType(ct);
- }
- }catch(Throwable e) {
- // valido content type ricevuto; eventuale tipo non correto verrĂ segnalato in seguito
- ct = null;
- }
-
- MessageType requestMessageType = bindingConfig.getRequestMessageType(serviceBindingDaUtilizzare,
- protocolContext, ct);
-
- RequestInfo requestInfo = new RequestInfo();
- requestInfo.setProtocolContext(protocolContext);
- requestInfo.setProtocolFactory(pf);
- if(pa){
- requestInfo.setProtocolRequestMessageType(requestMessageType);
- }
- else{
- requestInfo.setIntegrationRequestMessageType(requestMessageType);
- }
- requestInfo.setProtocolServiceBinding(protocolServiceBinding);
- requestInfo.setIntegrationServiceBinding(integrationServiceBinding);
- requestInfo.setBindingConfig(bindingConfig);
- requestInfo.setIdentitaPdD(op2Properties!=null ? op2Properties.getIdentitaPortaDefault(pf.getProtocol(), requestInfo) : null );
-
- return requestInfo;
- }
-
- public static String getMessageHttpMethodNotSupported(HttpRequestMethod method){
- return ConnectorCostanti.MESSAGE_METHOD_HTTP_NOT_SUPPORTED.replace(ConnectorCostanti.KEYWORD_METHOD_HTTP, method.name());
- }
-
- public static String getMessageServiceBindingNotSupported(ServiceBinding serviceBinding){
- return ConnectorCostanti.MESSAGE_SERVICE_BINDING_NOT_SUPPORTED.replace(ConnectorCostanti.KEYWORD_SERVICE_BINDING, serviceBinding.name());
- }
-
- private static StringBuilder getPrefixCode(IDService idService) {
-
- Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
- if(log==null){
- log = OpenSPCoop2Logger.getLoggerOpenSPCoopConsole();
- }
- if(log==null){
- log = LoggerWrapperFactory.getLogger(ConnectorUtils.class);
- }
-
- StringBuilder bf = new StringBuilder();
- try{
- bf.append(idService.getCode()).append(ConnectorCostanti.SEPARATOR_CODE);
- }catch(Exception e){
- log.error(e.getMessage(),e);
- bf = new StringBuilder();
- bf.append(ConnectorCostanti.ID_ERRORE_GENERICO);
- }
- return bf;
- }
-
- public static String getFullCodeGovWayNotInitialized(IDService idService) {
- StringBuilder bf = getPrefixCode(idService);
- bf.append(ConnectorCostanti.GOVWAY_NOT_INITIALIZED);
- return bf.toString();
- }
-
- public static String getFullCodeProtocolUnsupported(IDService idService) {
- StringBuilder bf = getPrefixCode(idService);
- bf.append(ConnectorCostanti.CODE_PROTOCOL_NOT_SUPPORTED);
- return bf.toString();
- }
-
- public static String getFullCodeWsdlUnsupported(IDService idService) {
- StringBuilder bf = getPrefixCode(idService);
- bf.append(ConnectorCostanti.CODE_WSDL_UNSUPPORTED);
- return bf.toString();
- }
- public static String getFullCodeWsdlNotDefined(IDService idService) {
- StringBuilder bf = getPrefixCode(idService);
- bf.append(ConnectorCostanti.CODE_WSDL_NOT_DEFINED);
- return bf.toString();
- }
-
- public static String getFullCodeEngineFilter(IDService idService) {
- StringBuilder bf = getPrefixCode(idService);
- bf.append(ConnectorCostanti.CODE_ENGINE_FILTER);
- return bf.toString();
- }
-
- public static String getFullCodeFunctionUnsupported(IDService idService) {
- StringBuilder bf = getPrefixCode(idService);
- bf.append(ConnectorCostanti.CODE_FUNCTION_UNSUPPORTED);
- return bf.toString();
- }
-
- public static String getFullCodeHttpMethodNotSupported(IDService idService, HttpRequestMethod method) {
- StringBuilder bf = getPrefixCode(idService);
- switch (method) {
- case GET:
- bf.append(ConnectorCostanti.CODE_HTTP_METHOD_GET_UNSUPPORTED);
- break;
- case POST:
- bf.append(ConnectorCostanti.CODE_HTTP_METHOD_POST_UNSUPPORTED);
- break;
- case PUT:
- bf.append(ConnectorCostanti.CODE_HTTP_METHOD_PUT_UNSUPPORTED);
- break;
- case HEAD:
- bf.append(ConnectorCostanti.CODE_HTTP_METHOD_HEAD_UNSUPPORTED);
- break;
- case DELETE:
- bf.append(ConnectorCostanti.CODE_HTTP_METHOD_DELETE_UNSUPPORTED);
- break;
- case OPTIONS:
- bf.append(ConnectorCostanti.CODE_HTTP_METHOD_OPTIONS_UNSUPPORTED);
- break;
- case TRACE:
- bf.append(ConnectorCostanti.CODE_HTTP_METHOD_TRACE_UNSUPPORTED);
- break;
- case PATCH:
- bf.append(ConnectorCostanti.CODE_HTTP_METHOD_PATCH_UNSUPPORTED);
- break;
- case LINK:
- bf.append(ConnectorCostanti.CODE_HTTP_METHOD_LINK_UNSUPPORTED);
- break;
- case UNLINK:
- bf.append(ConnectorCostanti.CODE_HTTP_METHOD_UNLINK_UNSUPPORTED);
- break;
- }
- return bf.toString();
- }
-
- public static String getFullCodeServiceBindingNotSupported(IDService idService, ServiceBinding serviceBinding) {
- StringBuilder bf = getPrefixCode(idService);
- switch (serviceBinding) {
- case SOAP:
- bf.append(ConnectorCostanti.CODE_SERVICE_BINDING_SOAP_UNSUPPORTED);
- break;
- case REST:
- bf.append(ConnectorCostanti.CODE_SERVICE_BINDING_REST_UNSUPPORTED);
- break;
- }
- return bf.toString();
- }
-
-
- public static String generateError404Message(String code){
- return "GovWay-"+code;
- }
-
- public static void generateErrorMessage(IDService idService, HttpRequestMethod httpMethod,
- HttpServletRequest req, HttpServletResponse res, String msgErrore, boolean erroreGenerale, boolean htmlMessage) throws IOException{
- generateErrorMessage(idService, httpMethod, req, res, msgErrore, erroreGenerale, htmlMessage, null);
- }
- public static void generateErrorMessage(IDService idService, HttpRequestMethod httpMethod,
- HttpServletRequest req, StringBuilder log, String msgErrore, boolean erroreGenerale, boolean htmlMessage) throws IOException{
- generateErrorMessage(idService, httpMethod, req, null, msgErrore, erroreGenerale, htmlMessage, log);
- }
- private static void generateErrorMessage(IDService idService, HttpRequestMethod httpMethod,
- HttpServletRequest req, HttpServletResponse response, String msgErrore, boolean erroreGenerale, boolean htmlMessage, StringBuilder log) throws IOException{
-
- Logger logCore = OpenSPCoop2Logger.getLoggerOpenSPCoopCore();
- OpenSPCoop2Properties op2Properties = OpenSPCoop2Properties.getInstance();
-
-
-
- // versione
- String versione = CostantiPdD.OPENSPCOOP2_PRODUCT_VERSION;
- if(op2Properties!=null){
- versione = op2Properties.getPddDetailsForServices();
- }
- if(htmlMessage){
- versione = StringEscapeUtils.escapeHtml(versione);
- if(response!=null)
- response.setContentType(HttpConstants.CONTENT_TYPE_HTML);
- }
- else{
- if(response!=null)
- response.setContentType(HttpConstants.CONTENT_TYPE_PLAIN);
- }
-
- // produzione Body
- boolean doBody = !HttpRequestMethod.HEAD.equals(httpMethod);
- if(!doBody){
- if(log!=null){
- log.append(CostantiPdD.HEADER_HTTP_X_PDD).append("=").append(versione);
- log.append(CostantiPdD.HEADER_HTTP_X_PDD_DETAILS).append("=").append(msgErrore);
- }
- else{
- response.setHeader(CostantiPdD.HEADER_HTTP_X_PDD, versione);
- response.setHeader(CostantiPdD.HEADER_HTTP_X_PDD_DETAILS, msgErrore);
- response.setContentLength(0);
- }
- return;
- }
-
- StringBuilder risposta = new StringBuilder();
- risposta.append("<html>\n");
- risposta.append("<head>\n");
- risposta.append("<title>"+versione+"</title>\n");
- risposta.append("</head>\n");
- risposta.append("<body>\n");
-
- risposta.append("<h1>"+versione+"</h1>\n");
-
- // url
- String function = null;
- String parameters = null;
- try{
- URLProtocolContext protocolContext = new URLProtocolContextImpl(req, logCore, true, (op2Properties!=null ? op2Properties.getCustomContexts() : null));
- String url = protocolContext.getUrlInvocazione_formBased();
- if(url.endsWith("?wsdl=")){
- // richiesta di un wsdl
- url = url.substring(0, url.length()-"=".length());
- }
- if(htmlMessage){
- url = StringEscapeUtils.escapeHtml( url );
- }
- risposta.append("<p>" +url+"</p>\n");
- function = protocolContext.getFunction();
- parameters = protocolContext.getFunctionParameters();
- }catch(Exception e){
- if(logCore==null){
- LoggerWrapperFactory.getLogger(ConnectorUtils.class).error(e.getMessage(),e);
- }else{
- logCore.error(e.getMessage(),e);
- }
- String context = req.getContextPath();
- if(htmlMessage){
- context = StringEscapeUtils.escapeHtml( context );
- }
- risposta.append("<p>" +context+"</p>\n");
- }
- // errore
- String errore = msgErrore;
- if(htmlMessage){
- errore = StringEscapeUtils.escapeHtml(errore);
- }
- risposta.append("<p>"+errore+"</p>\n");
-
-
- // other infos
- switch (idService) {
- case PORTA_DELEGATA:
- risposta.append("<i>Servizio utilizzabile per l'invocazione delle fruizioni esposte dall'API Gateway GovWay</i><br/><br/>\n");
- break;
- case PORTA_APPLICATIVA:
- risposta.append("<i>Servizio utilizzabile per l'invocazione delle erogazioni esposte dall'API Gateway GovWay</i><br/><br/>\n");
- break;
- case PORTA_DELEGATA_XML_TO_SOAP:
- 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");
- break;
- case INTEGRATION_MANAGER_SOAP:
- if(parameters==null){
- risposta.append("<i>Servizio IntegrationManager</i><br/><br/>\n");
- }
- else if( (function+"/"+parameters).equals(URLProtocolContext.IntegrationManager_FUNCTION_PD) ){
- risposta.append("<i>Servizio utilizzabile per l'invocazione delle fruizioni esposte dall'API Gateway GovWay</i><br/><br/>\n");
- }
- else if( (function+"/"+parameters).startsWith(URLProtocolContext.IntegrationManager_FUNCTION_PD+"/") ){
- risposta.append("<i>Servizio utilizzabile per l'invocazione delle fruizioni esposte dall'API Gateway GovWay</i><br/><br/>\n");
- }
- else if( (function+"/"+parameters).equals(URLProtocolContext.IntegrationManager_FUNCTION_MessageBox) ){
- risposta.append("<i>Servizio utilizzabile per accedere alla MessageBox esposta dall'API Gateway GovWay</i><br/><br/>\n");
- }
- else if( (function+"/"+parameters).startsWith(URLProtocolContext.IntegrationManager_FUNCTION_MessageBox+"/") ){
- risposta.append("<i>Servizio utilizzabile per accedere alla MessageBox esposta dall'API Gateway GovWay</i><br/><br/>\n");
- }
- else{
- risposta.append("<i>Servizio IntegrationManager dell'API Gateway GovWay</i><br/><br/>\n");
- }
- break;
- case CHECK_PDD:
- risposta.append("<i>Servizio utilizzabile per comprendere lo stato di funzionamento dell'API Gateway GovWay</i><br/><br/>\n");
- break;
- case PROXY:
- risposta.append("<i>Servizio utilizzato in installazioni container dell'API Gateway GovWay</i><br/><br/>\n");
- break;
- default:
- if(htmlMessage){
- // use as
- String useAs = "Use as http[s]://<server>"+ req.getContextPath()+"/<protocol-context>/<service>[/...]";
- useAs = StringEscapeUtils.escapeHtml(useAs);
- risposta.append("<i>"+useAs+"</i><br/>\n");
- }
-
- // protocolli
- try{
- MapReader<String, IProtocolFactory<?>> prots = ProtocolFactoryManager.getInstance().getProtocolFactories();
- if(prots.size()<=0){
- risposta.append("<i>ERROR: No protocol installed</i><br/>\n");
- }
- else{
- StringBuilder bfProtocols = new StringBuilder();
- Enumeration<String> keys = prots.keys();
- while (keys.hasMoreElements()) {
- String key = (String) keys.nextElement();
- IProtocolFactory<?> pf = prots.get(key);
- if(pf.getManifest().getWeb().getEmptyContext()!=null && pf.getManifest().getWeb().getEmptyContext().isEnabled()){
- if(bfProtocols.length()>0){
- bfProtocols.append(", ");
- }
- bfProtocols.append("\"\" (protocol:"+key+")");
- }
- if(pf.getManifest().getWeb().sizeContextList()>0){
- for (Context context : pf.getManifest().getWeb().getContextList()) {
- if(bfProtocols.length()>0){
- bfProtocols.append(", ");
- }
- bfProtocols.append(context.getName()+" (protocol:"+key+")");
- }
- }
- }
- String enabledProtocols = "Enabled protocol-contexts: "+bfProtocols.toString();
- if(htmlMessage){
- enabledProtocols = StringEscapeUtils.escapeHtml(enabledProtocols);
- }
- risposta.append("<i>"+enabledProtocols+"</i><br/>\n");
- }
- }catch(Exception e){
- if(logCore==null){
- LoggerWrapperFactory.getLogger(ConnectorUtils.class).error(e.getMessage(),e);
- }else{
- logCore.error(e.getMessage(),e);
- }
- risposta.append("<i>ERROR: No protocol installed</i><br/>\n");
- }
-
- if(htmlMessage){
- // servizi
- risposta.append("<i>Enabled services: in, out, out/xml2soap, check, IntegrationManager</i><br/><br/>\n");
-
- // web site
- risposta.append("<i>Official website: https://govway.org</i><br/><br/>\n");
- }
- break;
- }
-
- risposta.append("</body>\n");
- risposta.append("</html>\n");
- if(log!=null){
- log.append(risposta.toString());
- }else{
- response.getOutputStream().write(risposta.toString().getBytes());
- }
- }
-
-
- }