ProtocolPropertiesUtils.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.sdk.properties;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.id.IDSoggetto;
import org.openspcoop2.core.registry.AccordoServizioParteSpecifica;
import org.openspcoop2.core.registry.Fruitore;
import org.openspcoop2.core.registry.ProtocolProperty;
import org.openspcoop2.core.tracciamento.Proprieta;
import org.openspcoop2.protocol.sdk.ProtocolException;
import org.openspcoop2.protocol.sdk.constants.ConsoleItemValueType;
import org.openspcoop2.protocol.sdk.constants.ConsoleOperationType;
import org.openspcoop2.utils.BooleanNullable;

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

	public static void setDefaultValue(List<BaseConsoleItem> consoleItems, AbstractProperty<?> property) throws ProtocolException{
		if(property ==null)
			return;

		for (BaseConsoleItem consoleItem : consoleItems) {
			if(consoleItem.getId().equals(property.getId()))
				setDefaultValue(consoleItem, property);
		}
	}

	public static void setDefaultValue(List<BaseConsoleItem> consoleItems, ProtocolProperty property){
		if(property ==null)
			return;

		for (BaseConsoleItem consoleItem : consoleItems) {
			if(consoleItem.getId().equals(property.getName()) && consoleItem instanceof AbstractConsoleItem<?>){
				if(consoleItem instanceof StringConsoleItem){
					((StringConsoleItem) consoleItem).setDefaultValue(property.getValue());
				}
				else if(consoleItem instanceof NumberConsoleItem){
					Long numberValue = property.getNumberValue();
					((NumberConsoleItem) consoleItem).setDefaultValue(numberValue);
				}
				else if(consoleItem instanceof BinaryConsoleItem){
					byte[] byteFile = property.getByteFile();
					((BinaryConsoleItem) consoleItem).setFileName(property.getFile());
					((BinaryConsoleItem) consoleItem).setDefaultValue(byteFile);
				}else if(consoleItem instanceof BooleanConsoleItem){
					Boolean booleanValue = property.getBooleanValue();
					((BooleanConsoleItem) consoleItem).setDefaultValue(booleanValue);
				}

			}
		}
	}
	
	public static List<String> getListFromMultiSelectValue(String value) {
		List<String> l = new ArrayList<>();
		if(value.contains(",")) {
			l = Arrays.asList(value.split(","));
		}
		else {
			l.add(value);
		}
		return l;
	}
	
	public static String getValueMultiSelect(String []list) {
		return getValueMultiSelect(Arrays.asList(list));
	}
	public static String getValueMultiSelect(List<String> list) {
		StringBuilder bf = new StringBuilder();
		for (String s : list) {
			if(bf.length()>0) {
				bf.append(",");
			}
			bf.append(s);
		}
		return bf.toString();
	}
	public static void setDefaultValueMultiSelect(List<String> list, StringConsoleItem item) {
		item.setDefaultValue(getValueMultiSelect(list));
	}
	

	public static BaseConsoleItem getBaseConsoleItem(List<BaseConsoleItem> consoleItems, AbstractProperty<?> property){
		if(property ==null)
			return null;

		String propertyId = property.getId();
		return getBaseConsoleItem(consoleItems, propertyId);
	}

	public static BaseConsoleItem getBaseConsoleItem(List<BaseConsoleItem> consoleItems, String propertyId){
		if(propertyId ==null)
			return null;

		for (BaseConsoleItem consoleItem : consoleItems) {
			if(consoleItem.getId().equals(propertyId))
				return consoleItem;
		}
		return null;
	}

	public static AbstractConsoleItem<?> getAbstractConsoleItem(List<BaseConsoleItem> consoleItems, AbstractProperty<?> property){
		if(property ==null)
			return null;

		String propertyId = property.getId();
		return getAbstractConsoleItem(consoleItems, propertyId);
	}

	public static AbstractConsoleItem<?> getAbstractConsoleItem(List<BaseConsoleItem> consoleItems, ProtocolProperty property){
		if(property ==null)
			return null;

		String propertyId = property.getName();
		return getAbstractConsoleItem(consoleItems, propertyId);
	}

	public static AbstractConsoleItem<?> getAbstractConsoleItem(List<BaseConsoleItem> consoleItems, String propertyId){
		if(propertyId ==null)
			return null;

		for (BaseConsoleItem consoleItem : consoleItems) {
			if(consoleItem.getId().equals(propertyId) && consoleItem instanceof AbstractConsoleItem<?>)
				return (AbstractConsoleItem<?>) consoleItem;
		}
		return null;
	}

	public static AbstractProperty<?> getAbstractPropertyById(ProtocolProperties protocolProperties, String propertyId){
		if(propertyId ==null)
			return null;

		for (int i = 0; i < protocolProperties.sizeProperties(); i++) {
			AbstractProperty<?> property = protocolProperties.getProperty(i);

			if(property.getId().equals(propertyId))
				return property;
		}

		return null;
	}

	public static void setDefaultValue(BaseConsoleItem item, AbstractProperty<?> property) throws ProtocolException{
		Object defaultValue = null;
		try{
			if(item instanceof AbstractConsoleItem<?> && property != null){
				defaultValue = property.getValue();
				if(item instanceof StringConsoleItem){
					StringProperty sp = (StringProperty) property;
					((StringConsoleItem) item).setDefaultValue(sp.getValue());
				}
				else if(item instanceof NumberConsoleItem){
					NumberProperty np = (NumberProperty) property;
					((NumberConsoleItem) item).setDefaultValue(np.getValue());
				}
				else if(item instanceof BinaryConsoleItem){
					BinaryProperty bp = (BinaryProperty) property;
					((BinaryConsoleItem) item).setFileId(bp.getFileId());
					((BinaryConsoleItem) item).setFileName(bp.getFileName());
					((BinaryConsoleItem) item).setDefaultValue(bp.getValue());
				}else if(item instanceof BooleanConsoleItem){
					BooleanProperty bolP = (BooleanProperty) property;
					((BooleanConsoleItem) item).setDefaultValue(bolP.getValue()); 
				}
			}
		}catch(Exception e){
			String defaultValueClassName = defaultValue != null ?  defaultValue.getClass().getName() : "Default Value Null";
			throw new ProtocolException("Impossibile assegnare un valore di tipo ["+defaultValueClassName+"] all'item ["+item.getId()+"]");
		}
	}
	public static ConsoleItemValueType getConsoleItemValueType(BaseConsoleItem item){
		if(item instanceof AbstractConsoleItem<?>){
			if(item instanceof StringConsoleItem){
				return ConsoleItemValueType.STRING;
			}
			else if(item instanceof NumberConsoleItem){
				return ConsoleItemValueType.NUMBER;
			}
			else if(item instanceof BooleanConsoleItem){ 
				return ConsoleItemValueType.BOOLEAN;
			}
			else if(item instanceof BinaryConsoleItem){
				return ConsoleItemValueType.BINARY;
			}
		}
		return null;
	}


	public static List<ProtocolProperty> toProtocolPropertiesRegistry (ProtocolProperties protocolProperties, ConsoleOperationType consoleOperationType, List<ProtocolProperty> oldProtocolPropertyList){
		List<ProtocolProperty> lstProtocolProperty = new ArrayList<>();


		for (int i = 0; i < protocolProperties.sizeProperties(); i++) {
			AbstractProperty<?> property = protocolProperties.getProperty(i);

			ProtocolProperty prop = new ProtocolProperty();

			prop.setName(property.getId());
			boolean add = false;

			if(property instanceof StringProperty){
				StringProperty sp = (StringProperty) property;
				if(StringUtils.isNotEmpty(sp.getValue())) {
					prop.setValue(sp.getValue());
				}
				/**if(StringUtils.isNotEmpty(sp.getValue()))*/
				// aggiungo sempre per cercare proprieta' non valorizzate nelle search
				add = true;
			} else if(property instanceof NumberProperty){
				NumberProperty np = (NumberProperty) property;
				if(np.getValue() != null) {
					prop.setNumberValue(np.getValue());
				}
				/**if(np.getValue() != null)*/
				// aggiungo sempre per cercare proprieta' non valorizzate nelle search
				add = true;
			} else if(property instanceof BinaryProperty){
				BinaryProperty bp = (BinaryProperty) property;
				if(consoleOperationType.equals(ConsoleOperationType.ADD) || bp.getValue()!=null){
					prop.setByteFile(bp.getValue());
					prop.setFile(bp.getFileName());
					if(bp.getValue() != null && bp.getValue().length > 0)
						add = true;
				}else {
					// caso change non si puo' modificare un binary quindi riporto il valore che ho trovato sul db a inizio change
					for (ProtocolProperty protocolProperty : oldProtocolPropertyList) {
						if(property.getId().equals(protocolProperty.getName())){
							
							if(bp.isClearContent()) {
								prop.setByteFile(null);
								prop.setFile(null);
								add = true;
							}
							else {
								prop.setByteFile(protocolProperty.getByteFile());
								prop.setFile(protocolProperty.getFile());
								if(protocolProperty.getByteFile() != null && protocolProperty.getByteFile().length > 0){
									add = true;
								}
							}
							
							break;
						}
					}
				}

			} else if(property instanceof BooleanProperty){
				BooleanProperty bp = (BooleanProperty) property;
				prop.setBooleanValue(bp.getValue() != null ? bp.getValue() : false);
				/**if(bp.getValue() != null)*/
				// aggiungo sempre per cercare proprieta' non valorizzate nelle search
				add = true;
			}   

			if(add)
				lstProtocolProperty.add(prop);
		}

		return lstProtocolProperty;
	}
	public static List<org.openspcoop2.core.config.ProtocolProperty> toProtocolPropertiesConfig (ProtocolProperties protocolProperties, ConsoleOperationType consoleOperationType, List<org.openspcoop2.core.config.ProtocolProperty> oldProtocolPropertyList){
		List<org.openspcoop2.core.config.ProtocolProperty> lstProtocolProperty = new ArrayList<>();


		for (int i = 0; i < protocolProperties.sizeProperties(); i++) {
			AbstractProperty<?> property = protocolProperties.getProperty(i);

			org.openspcoop2.core.config.ProtocolProperty prop = new org.openspcoop2.core.config.ProtocolProperty();

			prop.setName(property.getId());
			boolean add = false;

			if(property instanceof StringProperty){
				StringProperty sp = (StringProperty) property;
				if(StringUtils.isNotEmpty(sp.getValue())) {
					prop.setValue(sp.getValue());
				}
				/**if(StringUtils.isNotEmpty(sp.getValue()))*/
				// aggiungo sempre per cercare proprieta' non valorizzate nelle search
				add = true;
			} else if(property instanceof NumberProperty){
				NumberProperty np = (NumberProperty) property;
				if(np.getValue() != null) {
					prop.setNumberValue(np.getValue());
				}
				/**if(np.getValue() != null)*/
				// aggiungo sempre per cercare proprieta' non valorizzate nelle search
				add = true;
			} else if(property instanceof BinaryProperty){
				BinaryProperty bp = (BinaryProperty) property;
				if(consoleOperationType.equals(ConsoleOperationType.ADD) || bp.getValue()!=null){
					prop.setByteFile(bp.getValue());
					prop.setFile(bp.getFileName());
					if(bp.getValue() != null && bp.getValue().length > 0)
						add = true;
				}else {
					// caso change non si puo' modificare un binary quindi riporto il valore che ho trovato sul db a inizio change
					for (org.openspcoop2.core.config.ProtocolProperty protocolProperty : oldProtocolPropertyList) {
						if(property.getId().equals(protocolProperty.getName())){
							
							if(bp.isClearContent()) {
								prop.setByteFile(null);
								prop.setFile(null);
								add = true;
							}
							else {
								prop.setByteFile(protocolProperty.getByteFile());
								prop.setFile(protocolProperty.getFile());
								if(protocolProperty.getByteFile() != null && protocolProperty.getByteFile().length > 0){
									add = true;
								}
							}
							
							break;
						}
					}
				}

			} else if(property instanceof BooleanProperty){
				BooleanProperty bp = (BooleanProperty) property;
				prop.setBooleanValue(bp.getValue() != null && bp.getValue());
				/**if(bp.getValue() != null)*/
				// aggiungo sempre per cercare proprieta' non valorizzate nelle search
				add = true;
			}   

			if(add)
				lstProtocolProperty.add(prop);
		}

		return lstProtocolProperty;
	}

	public static void mergeProtocolPropertiesRegistry (ProtocolProperties protocolProperties, List<ProtocolProperty> listaProtocolPropertiesDaDB, ConsoleOperationType consoleOperationType){
		
		if(consoleOperationType!=null) {
			// nop
		}
		
		for (int i = 0; i < protocolProperties.sizeProperties(); i++) {
			AbstractProperty<?> property = protocolProperties.getProperty(i);

			for (ProtocolProperty protocolProperty : listaProtocolPropertiesDaDB) {
				if(property.getId().equals(protocolProperty.getName())){
					if(property instanceof StringProperty){
						StringProperty sp = (StringProperty) property;
						sp.setValue(protocolProperty.getValue());
					} else if(property instanceof NumberProperty){
						NumberProperty np = (NumberProperty) property;
						np.setValue(protocolProperty.getNumberValue());
					} else if(property instanceof BinaryProperty){
						BinaryProperty bp = (BinaryProperty) property;
						bp.setValue(protocolProperty.getByteFile());
						bp.setFileName(protocolProperty.getFile());
					} else if(property instanceof BooleanProperty){
						BooleanProperty bp = (BooleanProperty) property;
						bp.setValue(protocolProperty.getBooleanValue());
					}
					break;
				}
			}
		}
	}
	public static void mergeProtocolPropertiesConfig (ProtocolProperties protocolProperties, List<org.openspcoop2.core.config.ProtocolProperty> listaProtocolPropertiesDaDB, ConsoleOperationType consoleOperationType){
		
		if(consoleOperationType!=null) {
			// nop
		}
		
		for (int i = 0; i < protocolProperties.sizeProperties(); i++) {
			AbstractProperty<?> property = protocolProperties.getProperty(i);

			for (org.openspcoop2.core.config.ProtocolProperty protocolProperty : listaProtocolPropertiesDaDB) {
				if(property.getId().equals(protocolProperty.getName())){
					if(property instanceof StringProperty){
						StringProperty sp = (StringProperty) property;
						sp.setValue(protocolProperty.getValue());
					} else if(property instanceof NumberProperty){
						NumberProperty np = (NumberProperty) property;
						np.setValue(protocolProperty.getNumberValue());
					} else if(property instanceof BinaryProperty){
						BinaryProperty bp = (BinaryProperty) property;
						bp.setValue(protocolProperty.getByteFile());
						bp.setFileName(protocolProperty.getFile());
					} else if(property instanceof BooleanProperty){
						BooleanProperty bp = (BooleanProperty) property;
						bp.setValue(protocolProperty.getBooleanValue());
					}
					break;
				}
			}
		}
	}

	public static ProtocolProperty getProtocolPropertyRegistry (String propertyId , List<ProtocolProperty> listaProtocolPropertiesDaDB){
		if(listaProtocolPropertiesDaDB == null || propertyId == null)
			return null;
		
		for (ProtocolProperty protocolProperty : listaProtocolPropertiesDaDB) {
			if(propertyId.equals(protocolProperty.getName())){
				return protocolProperty;
			}
		}
		
		return null;
	}
	public static org.openspcoop2.core.config.ProtocolProperty getProtocolPropertyConfig (String propertyId , List<org.openspcoop2.core.config.ProtocolProperty> listaProtocolPropertiesDaDB){
		if(listaProtocolPropertiesDaDB == null || propertyId == null)
			return null;
		
		for (org.openspcoop2.core.config.ProtocolProperty protocolProperty : listaProtocolPropertiesDaDB) {
			if(propertyId.equals(protocolProperty.getName())){
				return protocolProperty;
			}
		}
		
		return null;
	}


	
	
	public static String getRequiredStringValuePropertyRegistry(List<ProtocolProperty> list, String propertyName) throws ProtocolException{
		String value = getStringValuePropertyRegistry(list, propertyName, true);
		if(value==null){
			throw new ProtocolException("Property ["+propertyName+"] with null value?");
		}
		return value;
	}
	public static String getOptionalStringValuePropertyRegistry(List<ProtocolProperty> list, String propertyName) throws ProtocolException{
		String value = getStringValuePropertyRegistry(list, propertyName, false);
		return value;
	}
	private static String getStringValuePropertyRegistry(List<ProtocolProperty> list, String propertyName, boolean throwNotFoundException) throws ProtocolException{
		
		ProtocolProperty pp = getProtocolPropertyRegistry(list, propertyName, throwNotFoundException);
		if(pp!=null){
			return pp.getValue();
		}
		if(throwNotFoundException){
			throw new ProtocolException("Property ["+propertyName+"] not found");
		}
		else{
			return null;
		}
		
	}
	public static String getRequiredStringValuePropertyConfig(List<org.openspcoop2.core.config.ProtocolProperty> list, String propertyName) throws ProtocolException{
		String value = getStringValuePropertyConfig(list, propertyName, true);
		if(value==null){
			throw new ProtocolException("Property ["+propertyName+"] with null value?");
		}
		return value;
	}
	public static String getOptionalStringValuePropertyConfig(List<org.openspcoop2.core.config.ProtocolProperty> list, String propertyName) throws ProtocolException{
		String value = getStringValuePropertyConfig(list, propertyName, false);
		return value;
	}
	private static String getStringValuePropertyConfig(List<org.openspcoop2.core.config.ProtocolProperty> list, String propertyName, boolean throwNotFoundException) throws ProtocolException{
		
		org.openspcoop2.core.config.ProtocolProperty pp = getProtocolPropertyConfig(list, propertyName, throwNotFoundException);
		if(pp!=null){
			return pp.getValue();
		}
		if(throwNotFoundException){
			throw new ProtocolException("Property ["+propertyName+"] not found");
		}
		else{
			return null;
		}
		
	}
	
	public static byte[] getRequiredBinaryValuePropertyRegistry(List<ProtocolProperty> list, String propertyName) throws ProtocolException{
		byte[] value = getBinaryValuePropertyRegistry(list, propertyName, true);
		if(value==null){
			throw new ProtocolException("Property ["+propertyName+"] with null value?");
		}
		return value;
	}
	public static byte[] getOptionalBinaryValuePropertyRegistry(List<ProtocolProperty> list, String propertyName) throws ProtocolException{
		byte[] value = getBinaryValuePropertyRegistry(list, propertyName, false);
		return value;
	}
	private static byte[] getBinaryValuePropertyRegistry(List<ProtocolProperty> list, String propertyName, boolean throwNotFoundException) throws ProtocolException{
		
		ProtocolProperty pp = getProtocolPropertyRegistry(list, propertyName, throwNotFoundException);
		if(pp!=null){
			return pp.getByteFile();
		}
		if(throwNotFoundException){
			throw new ProtocolException("Property ["+propertyName+"] not found");
		}
		else{
			return null;
		}
		
	}
	public static byte[] getRequiredBinaryValuePropertyConfig(List<org.openspcoop2.core.config.ProtocolProperty> list, String propertyName) throws ProtocolException{
		byte[] value = getBinaryValuePropertyConfig(list, propertyName, true);
		if(value==null){
			throw new ProtocolException("Property ["+propertyName+"] with null value?");
		}
		return value;
	}
	public static byte[] getOptionalBinaryValuePropertyConfig(List<org.openspcoop2.core.config.ProtocolProperty> list, String propertyName) throws ProtocolException{
		byte[] value = getBinaryValuePropertyConfig(list, propertyName, false);
		return value;
	}
	private static byte[] getBinaryValuePropertyConfig(List<org.openspcoop2.core.config.ProtocolProperty> list, String propertyName, boolean throwNotFoundException) throws ProtocolException{
		
		org.openspcoop2.core.config.ProtocolProperty pp = getProtocolPropertyConfig(list, propertyName, throwNotFoundException);
		if(pp!=null){
			return pp.getByteFile();
		}
		if(throwNotFoundException){
			throw new ProtocolException("Property ["+propertyName+"] not found");
		}
		else{
			return null;
		}
		
	}
	
	public static BooleanNullable getOptionalBooleanValuePropertyRegistry(List<ProtocolProperty> list, String propertyName) throws ProtocolException{
		
		ProtocolProperty pp = getProtocolPropertyRegistry(list, propertyName, false);
		if(pp!=null && pp.getBooleanValue()!=null){
			return pp.getBooleanValue() ? BooleanNullable.TRUE() : BooleanNullable.FALSE();
		}
		return BooleanNullable.NULL();
		
	}
	public static BooleanNullable getOptionalBooleanValuePropertyConfig(List<org.openspcoop2.core.config.ProtocolProperty> list, String propertyName) throws ProtocolException{
		
		org.openspcoop2.core.config.ProtocolProperty pp = getProtocolPropertyConfig(list, propertyName, false);
		if(pp!=null && pp.getBooleanValue()!=null){
			return pp.getBooleanValue() ? BooleanNullable.TRUE() : BooleanNullable.FALSE();
		}
		return BooleanNullable.NULL();
		
	}
	public static boolean getBooleanValuePropertyRegistry(List<ProtocolProperty> list, String propertyName, boolean throwNotFoundException) throws ProtocolException{
		
		ProtocolProperty pp = getProtocolPropertyRegistry(list, propertyName, throwNotFoundException);
		if(pp!=null){
			return pp.getBooleanValue()!=null ? pp.getBooleanValue() : false;
		}
		if(throwNotFoundException){
			throw new ProtocolException("Property ["+propertyName+"] not found");
		}
		else{
			return false;
		}
		
	}
	public static boolean getBooleanValuePropertyConfig(List<org.openspcoop2.core.config.ProtocolProperty> list, String propertyName, boolean throwNotFoundException) throws ProtocolException{
		
		org.openspcoop2.core.config.ProtocolProperty pp = getProtocolPropertyConfig(list, propertyName, throwNotFoundException);
		if(pp!=null){
			return pp.getBooleanValue()!=null ? pp.getBooleanValue() : false;
		}
		if(throwNotFoundException){
			throw new ProtocolException("Property ["+propertyName+"] not found");
		}
		else{
			return false;
		}
		
	}
	
	
	public static Long getRequiredNumberValuePropertyRegistry(List<ProtocolProperty> list, String propertyName, boolean greatherThanZero) throws ProtocolException{
		Long value = getNumberValuePropertyRegistry(list, propertyName, true, greatherThanZero);
		if(value==null){
			throw new ProtocolException("Property ["+propertyName+"] with null value?");
		}
		return value;
	}
	public static Long getOptionalNumberValuePropertyRegistry(List<ProtocolProperty> list, String propertyName, boolean greatherThanZero) throws ProtocolException{
		Long value = getNumberValuePropertyRegistry(list, propertyName, false, greatherThanZero);
		return value;
	}
	private static Long getNumberValuePropertyRegistry(List<ProtocolProperty> list, String propertyName, boolean throwNotFoundException, boolean greatherThanZero) throws ProtocolException{
		
		ProtocolProperty pp = getProtocolPropertyRegistry(list, propertyName, throwNotFoundException);
		if(pp!=null){
			Long value = pp.getNumberValue();
			if(value!=null && greatherThanZero) {
				if(value <=0) {
					throw new ProtocolException("Property ["+propertyName+"] must be greatherThanZero");
				}
			}
			return value;
		}
		if(throwNotFoundException){
			throw new ProtocolException("Property ["+propertyName+"] not found");
		}
		else{
			return null;
		}
		
	}
	public static Long getRequiredNumberValuePropertyConfig(List<org.openspcoop2.core.config.ProtocolProperty> list, String propertyName) throws ProtocolException{
		Long value = getNumberValuePropertyConfig(list, propertyName, true);
		if(value==null){
			throw new ProtocolException("Property ["+propertyName+"] with null value?");
		}
		return value;
	}
	public static Long getOptionalNumberValuePropertyConfig(List<org.openspcoop2.core.config.ProtocolProperty> list, String propertyName) throws ProtocolException{
		Long value = getNumberValuePropertyConfig(list, propertyName, false);
		return value;
	}
	private static Long getNumberValuePropertyConfig(List<org.openspcoop2.core.config.ProtocolProperty> list, String propertyName, boolean throwNotFoundException) throws ProtocolException{
		
		org.openspcoop2.core.config.ProtocolProperty pp = getProtocolPropertyConfig(list, propertyName, throwNotFoundException);
		if(pp!=null){
			return pp.getNumberValue();
		}
		if(throwNotFoundException){
			throw new ProtocolException("Property ["+propertyName+"] not found");
		}
		else{
			return null;
		}
		
	}
	
	
	public static ProtocolProperty getProtocolPropertyRegistry(List<ProtocolProperty> list, String propertyName, boolean throwNotFoundException) throws ProtocolException{
		
		if(list==null || list.size()<=0){
			return null;
		}
		for (ProtocolProperty protocolProperty : list) {
			if(propertyName.equals(protocolProperty.getName())){
				return protocolProperty;
			}
		}
		
		if(throwNotFoundException){
			throw new ProtocolException("Property ["+propertyName+"] not found");
		}
		else{
			return null;
		}
	}
	public static org.openspcoop2.core.config.ProtocolProperty getProtocolPropertyConfig(List<org.openspcoop2.core.config.ProtocolProperty> list, String propertyName, boolean throwNotFoundException) throws ProtocolException{
		
		if(list==null || list.size()<=0){
			return null;
		}
		for (org.openspcoop2.core.config.ProtocolProperty protocolProperty : list) {
			if(propertyName.equals(protocolProperty.getName())){
				return protocolProperty;
			}
		}
		
		if(throwNotFoundException){
			throw new ProtocolException("Property ["+propertyName+"] not found");
		}
		else{
			return null;
		}
	}
	public static Proprieta getProtocolPropertySDK(List<Proprieta> list, String propertyName, boolean throwNotFoundException) throws ProtocolException{
		
		if(list==null || list.size()<=0){
			return null;
		}
		for (Proprieta protocolProperty : list) {
			if(propertyName.equals(protocolProperty.getNome())){
				return protocolProperty;
			}
		}
		
		if(throwNotFoundException){
			throw new ProtocolException("Property ["+propertyName+"] not found");
		}
		else{
			return null;
		}
	}
	
	public static List<ProtocolProperty> getProtocolProperties(boolean fruizione, IDSoggetto soggettoFruitore, AccordoServizioParteSpecifica asps) throws ProtocolException {
		List<ProtocolProperty> listProtocolProperties = null;
		Fruitore fruitore = null;
		if(fruizione) {
			fruitore = getFruitore(soggettoFruitore, asps);
			listProtocolProperties = fruitore.getProtocolPropertyList();
		}
		else {
			listProtocolProperties = asps.getProtocolPropertyList();
		}
		return listProtocolProperties;
	}
	
	public static Fruitore getFruitore(IDSoggetto soggettoFruitore, AccordoServizioParteSpecifica asps) throws ProtocolException {
		if(soggettoFruitore==null) {
			throw new ProtocolException("Fruitore non fornito");
		}
		Fruitore fruitore = null;
		boolean find = false;
		for (Fruitore fruitoreCheck : asps.getFruitoreList()) {
			if(fruitoreCheck.getTipo().equals(soggettoFruitore.getTipo()) && fruitoreCheck.getNome().equals(soggettoFruitore.getNome())) {
				fruitore = fruitoreCheck;
				find = true;
				break;
			}
		}
		if(!find) {
			throw new ProtocolException("Fruitore '"+soggettoFruitore+"' non registrato come fruitore dell'accordo parte specifica");
		}
		return fruitore;
	}
}