Utilities.java
/*
* GovWay - A customizable API Gateway
* https://govway.org
*
* Copyright (c) 2005-2024 Link.it srl (https://link.it).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3, as published by
* the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openspcoop2.pdd.core;
import org.openspcoop2.core.id.IDAccordo;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.Resource;
import org.openspcoop2.core.registry.driver.IDAccordoFactory;
import org.openspcoop2.message.OpenSPCoop2Message;
import org.openspcoop2.message.OpenSPCoop2MessageFactory;
import org.openspcoop2.message.constants.MessageRole;
import org.openspcoop2.pdd.config.ClassNameProperties;
import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
import org.openspcoop2.pdd.services.connector.ConnectorException;
import org.openspcoop2.protocol.registry.RegistroServiziManager;
import org.openspcoop2.protocol.sdk.Busta;
import org.openspcoop2.protocol.sdk.IProtocolFactory;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.Trasmissione;
import org.openspcoop2.protocol.sdk.state.IState;
import org.openspcoop2.protocol.sdk.state.RequestInfo;
import org.openspcoop2.utils.date.DateEngineType;
import org.openspcoop2.utils.id.IDUtilities;
import org.openspcoop2.utils.resources.Loader;
import org.openspcoop2.utils.rest.api.ApiOperation;
import org.openspcoop2.utils.transport.http.HttpRequestMethod;
import org.slf4j.Logger;
/**
* Utilities PdD
*
* @author Poli Andrea (apoli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class Utilities {
public static void refreshIdentificativiPorta(Busta busta,IDSoggetto idSoggettoDefault,RegistroServiziManager registroServiziManager,IProtocolFactory<?> protocolFactory, RequestInfo requestInfo){
if(busta==null) {
return;
}
if(busta.getMittente()!=null && busta.getTipoMittente()!=null && busta.getIdentificativoPortaMittente()==null){
try{
if(idSoggettoDefault.getTipo().equals(busta.getTipoMittente()) &&
idSoggettoDefault.getNome().equals(busta.getMittente())){
busta.setIdentificativoPortaMittente(idSoggettoDefault.getCodicePorta());
}
else{
busta.setIdentificativoPortaMittente(registroServiziManager.getDominio(new IDSoggetto(busta.getTipoMittente(), busta.getMittente()), null, protocolFactory, requestInfo));
}
}catch(Exception e){}
}
if(busta.getDestinatario()!=null && busta.getTipoDestinatario()!=null && busta.getIdentificativoPortaDestinatario()==null){
try{
if(idSoggettoDefault.getTipo().equals(busta.getTipoDestinatario()) &&
idSoggettoDefault.getNome().equals(busta.getDestinatario())){
busta.setIdentificativoPortaDestinatario(idSoggettoDefault.getCodicePorta());
}
else{
busta.setIdentificativoPortaDestinatario(registroServiziManager.getDominio(new IDSoggetto(busta.getTipoDestinatario(), busta.getDestinatario()), null, protocolFactory, requestInfo));
}
}catch(Exception e){}
}
for (int i = 0; i < busta.sizeListaTrasmissioni(); i++) {
Trasmissione tr = busta.getTrasmissione(i);
if(tr.getOrigine()!=null && tr.getTipoOrigine()!=null && tr.getIdentificativoPortaOrigine()==null){
try{
if(idSoggettoDefault.getTipo().equals(tr.getTipoOrigine()) &&
idSoggettoDefault.getNome().equals(tr.getOrigine())){
tr.setIdentificativoPortaOrigine(idSoggettoDefault.getCodicePorta());
}
else{
tr.setIdentificativoPortaOrigine(registroServiziManager.getDominio(new IDSoggetto(tr.getTipoOrigine(), tr.getOrigine()), null, protocolFactory, requestInfo));
}
}catch(Exception e){}
}
if(tr.getDestinazione()!=null && tr.getTipoDestinazione()!=null && tr.getIdentificativoPortaDestinazione()==null){
try{
if(idSoggettoDefault.getTipo().equals(tr.getTipoDestinazione()) &&
idSoggettoDefault.getNome().equals(tr.getDestinazione())){
tr.setIdentificativoPortaDestinazione(idSoggettoDefault.getCodicePorta());
}
else{
tr.setIdentificativoPortaDestinazione(registroServiziManager.getDominio(new IDSoggetto(tr.getTipoDestinazione(), tr.getDestinazione()), null, protocolFactory, requestInfo));
}
}catch(Exception e){}
}
}
}
private static OpenSPCoop2MessageFactory _factory = OpenSPCoop2MessageFactory.getDefaultMessageFactory();
public static OpenSPCoop2MessageFactory getOpenspcoop2MessageFactory(Logger log, RequestInfo requestInfo, MessageRole role) throws ConnectorException{
return getOpenspcoop2MessageFactory(log, null, requestInfo, role);
}
public static OpenSPCoop2MessageFactory getOpenspcoop2MessageFactory(Logger log, OpenSPCoop2Message requestMessage, RequestInfo requestInfo, MessageRole role) throws ConnectorException{
OpenSPCoop2MessageFactory useFactory = _factory;
if(requestMessage!=null && requestMessage.getFactory()!=null) {
useFactory = requestMessage.getFactory();
}
else {
if(requestInfo!=null && requestInfo.getMessageFactory()!=null) {
String classNameMessageFactory = ClassNameProperties.getInstance().getOpenSPCoop2MessageFactory(requestInfo.getMessageFactory());
if(classNameMessageFactory==null) {
throw new ConnectorException("MessageFactory '"+requestInfo.getMessageFactory()+"' not found");
}
try {
useFactory = (OpenSPCoop2MessageFactory) Loader.getInstance().newInstance(classNameMessageFactory);
}catch(Exception e){
throw new ConnectorException(e.getMessage(),e);
}
}
}
log.debug("MessageEngineFactory ["+role+"] ["+useFactory.getClass().getName()+"]");
return useFactory;
}
public static String generateIDDateTime(String format, int syncMs, String clusterIdSeparator, boolean clusterIdAsPrefix) throws ProtocolException {
return _generateIDDateTime(IDUtilities.generateDateTime(format, syncMs), clusterIdSeparator, clusterIdAsPrefix);
}
public static String generateIDDateTime(DateEngineType type, String format, int syncMs, String clusterIdSeparator, boolean clusterIdAsPrefix) throws ProtocolException {
return _generateIDDateTime(IDUtilities.generateDateTime(type, format, syncMs), clusterIdSeparator, clusterIdAsPrefix);
}
public static String generateIDDateTime_ISO_8601_TZ(String format, int syncMs, String clusterIdSeparator, boolean clusterIdAsPrefix) throws ProtocolException {
return _generateIDDateTime(IDUtilities.generateDateTime_ISO_8601_TZ(format, syncMs), clusterIdSeparator, clusterIdAsPrefix);
}
public static String generateIDDateTime_ISO_8601_TZ(DateEngineType type, String format, int syncMs, String clusterIdSeparator, boolean clusterIdAsPrefix) throws ProtocolException {
return _generateIDDateTime(IDUtilities.generateDateTime_ISO_8601_TZ(type, format, syncMs), clusterIdSeparator, clusterIdAsPrefix);
}
private static String _generateIDDateTime(String timeId, String clusterIdSeparator, boolean clusterIdAsPrefix) throws ProtocolException {
Integer prefix = null;
String prefixSop2 = OpenSPCoop2Properties.getInstance().getClusterIdNumerico();
if(prefixSop2!=null) {
prefix = Integer.valueOf(prefixSop2);
}
String prefixS = "00";
if(prefix!=null) {
if(prefix<10) {
prefixS = "0"+prefix.intValue();
}
else {
prefixS = ""+prefix.intValue();
}
}
if(clusterIdAsPrefix) {
return prefixS + clusterIdSeparator + timeId;
}
else {
return timeId + clusterIdSeparator + prefixS;
}
}
/* *********** INDIVIDUAZIONE RISORSA REST ************ */
private static final String SPECIAL = "*";
public static String [] parseResourceRest(String element) {
String check = element.toLowerCase();
String checkMethod = SPECIAL+" ";
if(check.startsWith(checkMethod) && check.length()>checkMethod.length()) {
String [] tmp = new String[2];
tmp[0] = SPECIAL;
tmp[1] = check.substring(checkMethod.length());
return tmp;
}
HttpRequestMethod [] methods = HttpRequestMethod.values();
if(methods!=null && methods.length>0) {
for (HttpRequestMethod httpRequestMethod : methods) {
checkMethod = httpRequestMethod.name().toLowerCase()+" ";
if(check.startsWith(checkMethod) && check.length()>checkMethod.length()) {
String [] tmp = new String[2];
tmp[0] = httpRequestMethod.name();
tmp[1] = check.substring(checkMethod.length());
return tmp;
}
}
}
return null;
}
public static boolean isRestResourceMatch(String [] parseResourceRest, Resource restResource) {
boolean isResourceRest = false;
String metodo = parseResourceRest[0];
String path = parseResourceRest[1];
if(SPECIAL.equals(metodo) ||
(restResource.getMethod()!=null && metodo.toLowerCase().equals(restResource.getMethod().name().toLowerCase())) ||
(restResource.getMethod()==null) // qualsiasi
) {
if(path.equals(SPECIAL)) {
isResourceRest = true;
}
else if(restResource.getPath()!=null){
String resourcePathNormalized = ApiOperation.normalizePath(restResource.getPath());
resourcePathNormalized = resourcePathNormalized.trim().toLowerCase();
path = ApiOperation.normalizePath(path);
path = path.trim().toLowerCase();
if(path.endsWith(SPECIAL)) {
String prefix = path.substring(0, path.length()-1);
if(resourcePathNormalized.startsWith(prefix)) {
isResourceRest = true;
}
}
else if(path.equals(resourcePathNormalized)) {
isResourceRest = true;
}
}
}
return isResourceRest;
}
public static Resource getRestResource(Logger log, IState state, IDServizio idServizio, RequestInfo requestInfo) {
if(idServizio!=null && idServizio.getAzione()!=null && !"".equals(idServizio.getAzione())) {
RegistroServiziManager registroServiziManager = RegistroServiziManager.getInstance(state);
try {
AccordoServizioParteSpecifica asps = registroServiziManager.getAccordoServizioParteSpecifica(idServizio, null, false, requestInfo);
if(asps.getAccordoServizioParteComune()!=null && !"".equals(asps.getAccordoServizioParteComune())) {
IDAccordo idAccordo = IDAccordoFactory.getInstance().getIDAccordoFromUri(asps.getAccordoServizioParteComune());
AccordoServizioParteComune as = registroServiziManager.getAccordoServizioParteComune(idAccordo, null, false, false, requestInfo);
for (Resource resourceCheck : as.getResourceList()) {
if(resourceCheck.getNome().equals(idServizio.getAzione())){
return resourceCheck;
}
}
}
}catch(Throwable e) {
log.error(e.getMessage(),e);
}
}
return null;
}
}