AzioniUtils.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.protocol.engine.utils;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.core.id.IDServizio;
import org.openspcoop2.core.registry.AccordoServizioParteComune;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.Operation;
import org.openspcoop2.core.registry.PortType;
import org.openspcoop2.core.registry.ProtocolProperty;
import org.openspcoop2.core.registry.Resource;
import org.openspcoop2.core.registry.beans.AccordoServizioParteComuneSintetico;
import org.openspcoop2.core.registry.beans.PortTypeSintetico;
import org.openspcoop2.core.registry.driver.IDServizioFactory;
import org.slf4j.Logger;


/**
 * AzioniUtils
 *
 * @author Poli Andrea (apoli@link.it)
 * @author $Author$
 * @version $Rev$, $Date$
 */
public class AzioniUtils {

	public static List<String> getAzioni(AccordoServizioParteSpecifica asps,AccordoServizioParteComuneSintetico aspc, 
			boolean addTrattinoSelezioneNonEffettuata, boolean throwException, List<String> filtraAzioniUtilizzate,
			String DEFAULT_VALUE_AZIONE_RISORSA_NON_SELEZIONATA, Logger log) throws DriverConfigurazioneException{
		String nomeMetodo = "getAzioni";
		try {
			// Prendo le azioni associate al servizio
			List<String> azioniList = null;
			try {
				if(aspc!=null) {
					org.openspcoop2.core.registry.constants.ServiceBinding sb = aspc.getServiceBinding();
					switch (sb) {
					case SOAP:
						if (asps != null) {
							
							IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromAccordo(asps);
							
							if(asps.getPortType()!=null){
								// Bisogna prendere le operations del port type
								PortTypeSintetico pt = null;
								for (int i = 0; i < aspc.getPortType().size(); i++) {
									if(aspc.getPortType().get(i).getNome().equals(asps.getPortType())){
										pt = aspc.getPortType().get(i);
										break;
									}
								}
								if(pt==null){
									throw new Exception("Servizio ["+idServizio.toString()+"] possiede il port type ["+asps.getPortType()+"] che non risulta essere registrato nell'accordo di servizio ["+asps.getAccordoServizioParteComune()+"]");
								}
								if(pt.getAzione().size()>0){
									azioniList = new ArrayList<>();
									for (int i = 0; i < pt.getAzione().size(); i++) {
										if(filtraAzioniUtilizzate==null || !filtraAzioniUtilizzate.contains(pt.getAzione().get(i).getNome())) {
											azioniList.add(pt.getAzione().get(i).getNome());
										}
									}
								}
							}else{
								if(aspc.getAzione().size()>0){
									azioniList = new ArrayList<>();
									for (int i = 0; i < aspc.getAzione().size(); i++) {
										if(filtraAzioniUtilizzate==null || !filtraAzioniUtilizzate.contains(aspc.getAzione().get(i).getNome())) {
											azioniList.add(aspc.getAzione().get(i).getNome());
										}
									}
								}
							}				
						}
						break;

					case REST:
						if(aspc.getResource().size()>0){
							azioniList = new ArrayList<>();
							for (int i = 0; i < aspc.getResource().size(); i++) {
								if(filtraAzioniUtilizzate==null || !filtraAzioniUtilizzate.contains(aspc.getResource().get(i).getNome())) {
									azioniList.add(aspc.getResource().get(i).getNome());
								}
							}
						}
						break;
					}
					
				}
			} catch (Exception e) {
				if(throwException) {
					throw e;
				}
			}
			
			List<String> azioniListReturn = null;
			if(azioniList!=null && azioniList.size()>0) {
				Collections.sort(azioniList);
				
				azioniListReturn = new ArrayList<>();
				if(addTrattinoSelezioneNonEffettuata) {
					azioniListReturn.add(DEFAULT_VALUE_AZIONE_RISORSA_NON_SELEZIONATA);
				}
				azioniListReturn.addAll(azioniList);
			}
				
			return azioniListReturn;
			
		} catch (Exception e) {
			log.error("["+nomeMetodo + "] Exception :" + e.getMessage(), e);
			throw new DriverConfigurazioneException("[" + nomeMetodo + "] Error :" + e.getMessage(),e);
		}
		
	}
	
	public static Map<String,String> getMapAzioni(AccordoServizioParteSpecifica asps,AccordoServizioParteComuneSintetico aspc, 
			boolean addTrattinoSelezioneNonEffettuata, boolean throwException, List<String> filtraAzioniUtilizzate, 
			boolean sortByLabel, boolean sortFirstByPath, // per soap questi due parametri sono  ininfluenti
			String DEFAULT_VALUE_AZIONE_RISORSA_NON_SELEZIONATA, String DEFAULT_LABEL_AZIONE_RISORSA_NON_SELEZIONATA, Logger log
			) throws DriverConfigurazioneException{
		String nomeMetodo = "getAzioni";
		try {
			// Prendo le azioni associate al servizio
			Map<String,String> azioniMap = null; // <id,label>
			List<String> sortList = null;
			Map<String,String> sortMap = null; // <sort,id>
			try {
				if(aspc!=null) {
					org.openspcoop2.core.registry.constants.ServiceBinding sb = aspc.getServiceBinding();
					switch (sb) {
					case SOAP:
						if (asps != null) {
							
							IDServizio idServizio = IDServizioFactory.getInstance().getIDServizioFromAccordo(asps);
							
							if(asps.getPortType()!=null){
								// Bisogna prendere le operations del port type
								PortTypeSintetico pt = null;
								for (int i = 0; i < aspc.getPortType().size(); i++) {
									if(aspc.getPortType().get(i).getNome().equals(asps.getPortType())){
										pt = aspc.getPortType().get(i);
										break;
									}
								}
								if(pt==null){
									throw new Exception("Servizio ["+idServizio.toString()+"] possiede il port type ["+asps.getPortType()+"] che non risulta essere registrato nell'accordo di servizio ["+asps.getAccordoServizioParteComune()+"]");
								}
								if(pt.getAzione().size()>0){
									azioniMap = new HashMap<>();
									sortList = new ArrayList<>();
									for (int i = 0; i < pt.getAzione().size(); i++) {
										if(filtraAzioniUtilizzate==null || !filtraAzioniUtilizzate.contains(pt.getAzione().get(i).getNome())) {
											sortList.add(pt.getAzione().get(i).getNome());
											azioniMap.put(pt.getAzione().get(i).getNome(),pt.getAzione().get(i).getNome());
										}
									}
								}
							}else{
								if(aspc.getAzione().size()>0){
									azioniMap = new HashMap<>();
									sortList = new ArrayList<>();
									for (int i = 0; i < aspc.getAzione().size(); i++) {
										if(filtraAzioniUtilizzate==null || !filtraAzioniUtilizzate.contains(aspc.getAzione().get(i).getNome())) {
											sortList.add(aspc.getAzione().get(i).getNome());
											azioniMap.put(aspc.getAzione().get(i).getNome(),aspc.getAzione().get(i).getNome());
										}
									}
								}
							}				
						}
						break;

					case REST:
						if(aspc.getResource().size()>0){
							azioniMap = new HashMap<>();
							sortList = new ArrayList<>();
							if(sortByLabel) {
								sortMap = new HashMap<>();
							}
							for (int i = 0; i < aspc.getResource().size(); i++) {
								if(filtraAzioniUtilizzate==null || !filtraAzioniUtilizzate.contains(aspc.getResource().get(i).getNome())) {
									if(sortByLabel) {
										String sortLabelId = null;
										if(!sortFirstByPath) {
											sortLabelId = NamingUtils.getLabelResource(aspc.getResource().get(i));
										}
										else {
											String path = aspc.getResource().get(i).getPath()!=null ? aspc.getResource().get(i).getPath() : CostantiDB.API_RESOURCE_PATH_ALL_VALUE;
											String method = aspc.getResource().get(i).getMethod()!=null ? aspc.getResource().get(i).getMethod().getValue() : CostantiDB.API_RESOURCE_HTTP_METHOD_ALL_VALUE;
											sortLabelId = path+" "+method;
										}
										sortList.add(sortLabelId);
										sortMap.put(sortLabelId, aspc.getResource().get(i).getNome());
									}
									else {
										sortList.add(aspc.getResource().get(i).getNome());
									}
									azioniMap.put(aspc.getResource().get(i).getNome(),NamingUtils.getLabelResource(aspc.getResource().get(i)));
								}
							}
						}
						break;
					}
					
				}
			} catch (Exception e) {
				if(throwException) {
					throw e;
				}
			}
			
			Map<String, String> mapAzioniReturn = new LinkedHashMap<String, String>();
			if(sortList!=null && sortList.size()>0) {
				Collections.sort(sortList);
				
				if(addTrattinoSelezioneNonEffettuata) {
					mapAzioniReturn.put(DEFAULT_VALUE_AZIONE_RISORSA_NON_SELEZIONATA,DEFAULT_LABEL_AZIONE_RISORSA_NON_SELEZIONATA);
				}
				
				if(sortMap!=null) {
					for (String idSort : sortList) { 
						String id  = sortMap.get(idSort);
						mapAzioniReturn.put(id, azioniMap.get(id));
					}
				}
				else {
					for (String id : sortList) { // nelle sortList ci sono gli id
						mapAzioniReturn.put(id, azioniMap.get(id));
					}
				}
			}
				
			return mapAzioniReturn;
			
		} catch (Exception e) {
			log.error("[ControlStationCore::" + nomeMetodo + "] Exception :" + e.getMessage(), e);
			throw new DriverConfigurazioneException("[ControlStationCore::" + nomeMetodo + "] Error :" + e.getMessage(),e);
		}
	}
	
	public static Map<String,String> getAzioniConLabel(AccordoServizioParteSpecifica asps,AccordoServizioParteComuneSintetico aspc, 
			boolean addTrattinoSelezioneNonEffettuata, boolean throwException, List<String> filtraAzioniUtilizzate,
			String defaultValueAzioneRisorsaNonSelezionata, String defaultLabelAzioneRisorsaNonSelezionata, Logger log) throws DriverConfigurazioneException {
		return getMapAzioni(asps, aspc, addTrattinoSelezioneNonEffettuata, throwException, filtraAzioniUtilizzate,
				true, true,
				defaultValueAzioneRisorsaNonSelezionata, defaultLabelAzioneRisorsaNonSelezionata, log);
	}
	
	
	
	public static String getProtocolPropertyStringValue(AccordoServizioParteComune aspc, String idPortType, String idAzione, String propertyName) {
		if(idPortType!=null) {
			for (PortType pt : aspc.getPortTypeList()) {
				if(pt.getNome().equals(idPortType)) {
					for (Operation op : pt.getAzioneList()) {
						if(op.getNome().equals(idAzione)) {
							for (ProtocolProperty pp : op.getProtocolPropertyList()) {
								if(pp.getName().equals(propertyName)) {
									return pp.getValue();
								}
							}
							break;
						}
					}
					break;
				}
			}
		}
		else {
			for (Resource resource : aspc.getResourceList()) {
				if(resource.getNome().equals(idAzione)) {
					for (ProtocolProperty pp : resource.getProtocolPropertyList()) {
						if(pp.getName().equals(propertyName)) {
							return pp.getValue();
						}
					}
					break;
				}
			}
		}
		return null;
	}
	
}