DriverConfigurazioneDB_genericPropertiesDriver.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.core.config.driver.db;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.byok.IDriverBYOK;
import org.openspcoop2.core.commons.Filtri;
import org.openspcoop2.core.commons.ISearch;
import org.openspcoop2.core.commons.SearchUtils;
import org.openspcoop2.core.config.GenericProperties;
import org.openspcoop2.core.config.Property;
import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
import org.openspcoop2.core.constants.CostantiDB;
import org.openspcoop2.core.constants.CostantiProprieta;
import org.openspcoop2.utils.jdbc.JDBCUtilities;
import org.openspcoop2.utils.sql.ISQLQueryObject;
import org.openspcoop2.utils.sql.SQLObjectFactory;
/**
* DriverConfigurazioneDB_genericPropertiesDriver
*
*
* @author Sandra Giangrandi (sandra@link.it)
* @author Stefano Corallo (corallo@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class DriverConfigurazioneDB_genericPropertiesDriver {
private static Map<String, List<String>> propertiesConfidentials = new HashMap<>();
static {
propertiesConfidentials.put(CostantiProprieta.TOKEN_VALIDATION_ID, CostantiProprieta.getTokenValidationProperties());
propertiesConfidentials.put(CostantiProprieta.TOKEN_NEGOZIAZIONE_ID, CostantiProprieta.getTokenRetrieveProperties());
propertiesConfidentials.put(CostantiProprieta.ATTRIBUTE_AUTHORITY_ID, CostantiProprieta.getAttributeAuthorityProperties());
List<String> messageSecurityIds = CostantiProprieta.getMessageSecurityIds();
if(messageSecurityIds!=null && !messageSecurityIds.isEmpty()) {
for (String id : messageSecurityIds) {
propertiesConfidentials.put(id, CostantiProprieta.getMessageSecurityProperties(id));
}
}
}
public static void addConfidentialProperty(String tipo, String nome){
List<String> l = propertiesConfidentials.computeIfAbsent(tipo, k -> new ArrayList<>());
if(!l.contains(nome)) {
l.add(nome);
}
}
public static boolean isConfidentialProperty(String tipo, String nome) {
if(tipo==null || nome==null) {
return false;
}
List<String> l = propertiesConfidentials.get(tipo);
if(l!=null) {
return isConfidentialProperty(l, nome);
}
return false;
}
private static boolean isConfidentialProperty(List<String> l, String nome) {
if(l.isEmpty()) {
return false;
}
if(l.contains(nome)) {
return true;
}
if(nome.contains(CostantiProprieta.KEY_PROPERTIES_CUSTOM_SEPARATOR)) {
return isConfidentialPropertyCustomSeparator(l, nome);
}
else if(nome.contains(CostantiProprieta.KEY_PROPERTIES_DEFAULT_SEPARATOR)) {
return isConfidentialPropertyDefaultSeparator(l, nome);
}
return false;
}
private static boolean isConfidentialPropertyCustomSeparator(List<String> l, String nome) {
String [] tmp = nome.split(CostantiProprieta.KEY_PROPERTIES_CUSTOM_SEPARATOR);
if(tmp!=null && tmp.length>1 && tmp[1]!=null){
for (String s : l) {
if(tmp[1].equals(s)) {
return true;
}
}
}
return false;
}
private static boolean isConfidentialPropertyDefaultSeparator(List<String> l, String nome) {
String [] tmp = nome.split(CostantiProprieta.KEY_PROPERTIES_DEFAULT_SEPARATOR);
if(tmp!=null && tmp.length>1 && tmp[1]!=null){
for (String s : l) {
if(tmp[1].equals(s)) {
return true;
}
}
}
return false;
}
private DriverConfigurazioneDB driver = null;
private DriverConfigurazioneDBUtils utilsDriver = null;
protected DriverConfigurazioneDB_genericPropertiesDriver(DriverConfigurazioneDB driver) {
this.driver = driver;
this.utilsDriver = new DriverConfigurazioneDBUtils(driver);
}
/**
* Restituisce le proprieta' generiche di una tipologia utilizzate dalla PdD
*
* @return proprieta' generiche
*
*/
protected List<GenericProperties> getGenericProperties() throws DriverConfigurazioneException,DriverConfigurazioneNotFound{
return getGenericProperties(null);
}
/**
* Restituisce le proprieta' generiche utilizzate dalla PdD
*
* @return proprieta' generiche
*
*/
protected List<GenericProperties> getGenericProperties(String tipologia) throws DriverConfigurazioneException,DriverConfigurazioneNotFound{
List<String> listTipologia = new ArrayList<>();
if(tipologia!=null) {
listTipologia.add(tipologia);
}
return getGenericProperties(listTipologia, null, null,true, null);
}
protected GenericProperties getGenericProperties(String tipologia, String name) throws DriverConfigurazioneException,DriverConfigurazioneNotFound{
List<String> listTipologia = new ArrayList<>();
if(tipologia!=null) {
listTipologia.add(tipologia);
}
List<GenericProperties> l = getGenericProperties(listTipologia, null, null,true, name);
if(l==null || l.isEmpty()) {
throw new DriverConfigurazioneNotFound("[getGenericProperties] Configurazione Generic Properties non presenti con tipologia '"+tipologia+"' e nome '"+name+"'");
}
else if(l.size()>1) {
throw new DriverConfigurazioneException("[getGenericProperties] Trovata più di una collezione di proprietà con tipologia '"+tipologia+"' e nome '"+name+"'");
}
return l.get(0);
}
/**
* Restituisce le proprieta' generiche utilizzate dalla PdD
*
* @return proprieta' generiche
*
*/
protected List<GenericProperties> getGenericProperties(List<String> tipologia, Integer idLista, ISearch ricerca, boolean throwNotFoundException) throws DriverConfigurazioneException,DriverConfigurazioneNotFound{
return getGenericProperties(tipologia, idLista, ricerca, throwNotFoundException, null);
}
private List<GenericProperties> getGenericProperties(List<String> tipologia, Integer idLista, ISearch ricerca, boolean throwNotFoundException, String nomeEsatto) throws DriverConfigurazioneException,DriverConfigurazioneNotFound{
Connection con = null;
PreparedStatement stm = null;
ResultSet rs = null;
Integer offset = null;
Integer limit =null;
String search = "";
String filterTipoTokenPolicy = null;
if(idLista != null && ricerca != null) {
limit = ricerca.getPageSize(idLista);
offset = ricerca.getIndexIniziale(idLista);
search = (org.openspcoop2.core.constants.Costanti.SESSION_ATTRIBUTE_VALUE_RICERCA_UNDEFINED.equals(ricerca.getSearchString(idLista)) ? "" : ricerca.getSearchString(idLista));
filterTipoTokenPolicy = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_TIPO_TOKEN_POLICY);
this.driver.logDebug("search : " + search);
this.driver.logDebug("filterTipoTokenPolicy : " + filterTipoTokenPolicy);
}
String sqlQuery = "";
if (this.driver.atomica) {
try {
con = this.driver.getConnectionFromDatasource("getGenericProperties");
} catch (Exception e) {
throw new DriverConfigurazioneException("[getGenericProperties] Exception accedendo al datasource :" + e.getMessage(),e);
}
} else
con = this.driver.globalConnection;
this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);
List<Long> listIdLong = new ArrayList<>();
try {
ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
sqlQueryObject.addFromTable(CostantiDB.CONFIG_GENERIC_PROPERTIES);
sqlQueryObject.addSelectCountField("*", "cont");
if(tipologia!=null && !tipologia.isEmpty()) {
sqlQueryObject.addWhereINCondition("tipologia", true, tipologia.toArray(new String[1]));
}
if(filterTipoTokenPolicy!=null && !"".equals(filterTipoTokenPolicy)) {
sqlQueryObject.addWhereCondition("tipo=?");
}
if(nomeEsatto!=null) {
sqlQueryObject.addWhereCondition("nome=?");
}
if (!search.equals("")) {
//query con search
sqlQueryObject.addWhereLikeCondition("nome", search, true, true);
}
sqlQueryObject.setANDLogicOperator(true);
sqlQuery = sqlQueryObject.createSQLQuery();
stm = con.prepareStatement(sqlQuery);
int index = 1;
if(filterTipoTokenPolicy!=null && !"".equals(filterTipoTokenPolicy)) {
stm.setString(index++, filterTipoTokenPolicy);
}
if(nomeEsatto!=null) {
stm.setString(index++, nomeEsatto);
}
rs = stm.executeQuery();
if (rs.next() && ricerca != null)
ricerca.setNumEntries(idLista,rs.getInt(1));
rs.close();
stm.close();
// ricavo le entries
if (limit!= null && limit == 0) // con limit
limit = ISQLQueryObject.LIMIT_DEFAULT_VALUE;
sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
sqlQueryObject.addFromTable(CostantiDB.CONFIG_GENERIC_PROPERTIES);
sqlQueryObject.addSelectField("id");
sqlQueryObject.addSelectField("nome");
if(tipologia!=null && !tipologia.isEmpty()) {
sqlQueryObject.addWhereINCondition("tipologia", true, tipologia.toArray(new String[1]));
}
if(filterTipoTokenPolicy!=null && !"".equals(filterTipoTokenPolicy)) {
sqlQueryObject.addWhereCondition("tipo=?");
}
if(nomeEsatto!=null) {
sqlQueryObject.addWhereCondition("nome=?");
}
if (!search.equals("")) {
//query con search
sqlQueryObject.addWhereLikeCondition("nome", search, true, true);
}
sqlQueryObject.setANDLogicOperator(true);
sqlQueryObject.addOrderBy("nome");
sqlQueryObject.setSortType(true);
if(limit!= null)
sqlQueryObject.setLimit(limit);
if(offset != null)
sqlQueryObject.setOffset(offset);
sqlQuery = sqlQueryObject.createSQLQuery();
stm = con.prepareStatement(sqlQuery);
index = 1;
if(filterTipoTokenPolicy!=null && !"".equals(filterTipoTokenPolicy)) {
stm.setString(index++, filterTipoTokenPolicy);
}
if(nomeEsatto!=null) {
stm.setString(index++, nomeEsatto);
}
rs = stm.executeQuery();
while(rs.next()){
long idP = rs.getLong("id");
listIdLong.add(idP);
}
rs.close();
stm.close();
} catch (SQLException se) {
throw new DriverConfigurazioneException("[getGenericProperties] SqlException: " + se.getMessage(),se);
}catch (Exception se) {
throw new DriverConfigurazioneException("[getGenericProperties] Exception: " + se.getMessage(),se);
} finally {
JDBCUtilities.closeResources(rs, stm);
this.driver.closeConnection(con);
}
List<GenericProperties> genericPropertiesList = new ArrayList<>();
if(!listIdLong.isEmpty()) {
for (Long id : listIdLong) {
genericPropertiesList.add(this.getGenericProperties(id));
}
}
if((genericPropertiesList==null || genericPropertiesList.isEmpty()) && throwNotFoundException)
throw new DriverConfigurazioneNotFound("Generic Properties non presenti");
return genericPropertiesList;
}
protected void createGenericProperties(GenericProperties genericProperties) throws DriverConfigurazioneException{
Connection con = null;
boolean error = false;
if (this.driver.atomica) {
try {
con = this.driver.getConnectionFromDatasource("createGenericProperties");
con.setAutoCommit(false);
} catch (Exception e) {
throw new DriverConfigurazioneException("[DriverConfigurazioneDB::createGenericProperties] Exception accedendo al datasource :" + e.getMessage(),e);
}
} else
con = this.driver.globalConnection;
this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);
try {
this.driver.logDebug("CRUDGenericPropertiesPdD type = 1");
DriverConfigurazioneDB_configLIB.CRUDGenericProperties(1, genericProperties, con, this.driver.getDriverWrapBYOK());
} catch (Exception qe) {
error = true;
throw new DriverConfigurazioneException("[DriverConfigurazioneDB::createGenericProperties] Errore durante la createSystemPropertiesPdD : " + qe.getMessage(),qe);
} finally {
this.driver.closeConnection(error,con);
}
}
/**
* Aggiorna le informazioni sulle proprieta' generiche della PdD
*
* @param genericProperties
* @throws DriverConfigurazioneException
*/
protected void updateGenericProperties(GenericProperties genericProperties) throws DriverConfigurazioneException{
Connection con = null;
boolean error = false;
if (this.driver.atomica) {
try {
con = this.driver.getConnectionFromDatasource("updateGenericProperties");
con.setAutoCommit(false);
} catch (Exception e) {
throw new DriverConfigurazioneException("[DriverConfigurazioneDB::updateGenericProperties] Exception accedendo al datasource :" + e.getMessage(),e);
}
} else
con = this.driver.globalConnection;
this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);
try {
this.driver.logDebug("updateGenericProperties type = 2");
DriverConfigurazioneDB_configLIB.CRUDGenericProperties(2, genericProperties, con, this.driver.getDriverWrapBYOK());
} catch (Exception qe) {
error = true;
throw new DriverConfigurazioneException("[DriverConfigurazioneDB::updateGenericProperties] Errore durante la updateSystemPropertiesPdD : " + qe.getMessage(),qe);
} finally {
this.driver.closeConnection(error,con);
}
}
/**
* Elimina le informazioni sulle proprieta' generiche della PdD
*
* @param genericProperties
* @throws DriverConfigurazioneException
*/
protected void deleteGenericProperties(GenericProperties genericProperties) throws DriverConfigurazioneException{
Connection con = null;
boolean error = false;
if (this.driver.atomica) {
try {
con = this.driver.getConnectionFromDatasource("deleteGenericProperties");
con.setAutoCommit(false);
} catch (Exception e) {
throw new DriverConfigurazioneException("[DriverConfigurazioneDB::deleteGenericProperties] Exception accedendo al datasource :" + e.getMessage(),e);
}
} else
con = this.driver.globalConnection;
this.driver.logDebug("operazione this.driver.atomica = " + this.driver.atomica);
try {
this.driver.logDebug("deleteGenericProperties type = 3");
DriverConfigurazioneDB_configLIB.CRUDGenericProperties(3, genericProperties, con, this.driver.getDriverWrapBYOK());
} catch (Exception qe) {
error = true;
throw new DriverConfigurazioneException("[DriverConfigurazioneDB::deleteGenericProperties] Errore durante la deleteSystemPropertiesPdD : " + qe.getMessage(),qe);
} finally {
this.driver.closeConnection(error,con);
}
}
protected GenericProperties getGenericProperties(long idGenericProperties) throws DriverConfigurazioneException,DriverConfigurazioneNotFound{
Connection con = null;
PreparedStatement stm = null;
ResultSet rs = null;
PreparedStatement stm2 = null;
ResultSet rs2 = null;
String sqlQuery = "";
if (this.driver.atomica) {
try {
con = this.driver.getConnectionFromDatasource("getGenericProperties");
} catch (Exception e) {
throw new DriverConfigurazioneException("[getGenericProperties] Exception accedendo al datasource :" + e.getMessage(),e);
}
} else
con = this.driver.globalConnection;
this.driver.logDebug("operazione this.atomica = " + this.driver.atomica);
try {
GenericProperties genericProperties = null;
ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
sqlQueryObject.addFromTable(CostantiDB.CONFIG_GENERIC_PROPERTIES);
sqlQueryObject.addSelectField("*");
sqlQueryObject.addWhereCondition("id=?");
sqlQuery = sqlQueryObject.createSQLQuery();
stm = con.prepareStatement(sqlQuery);
stm.setLong(1, idGenericProperties);
rs = stm.executeQuery();
if(rs.next()){
genericProperties = new GenericProperties();
genericProperties.setNome(rs.getString("nome"));
genericProperties.setDescrizione(rs.getString("descrizione"));
genericProperties.setTipologia(rs.getString("tipologia"));
genericProperties.setTipo(rs.getString("tipo"));
// Proprieta Oggetto
genericProperties.setProprietaOggetto(this.utilsDriver.readProprietaOggetto(rs,false));
long idP = rs.getLong("id");
genericProperties.setId(idP);
//prendo le proprieta
sqlQueryObject = SQLObjectFactory.createSQLQueryObject(this.driver.tipoDB);
sqlQueryObject.addFromTable(CostantiDB.CONFIG_GENERIC_PROPERTY);
sqlQueryObject.addSelectField("*");
sqlQueryObject.addWhereCondition("id_props = ?");
sqlQuery = sqlQueryObject.createSQLQuery();
stm2 = con.prepareStatement(sqlQuery);
stm2.setLong(1, idP);
rs2 = stm2.executeQuery();
Property genericProperty = null;
while(rs2.next())
{
genericProperty = new Property();
//proprieta
genericProperty.setId(rs2.getLong("id"));
genericProperty.setNome(rs2.getString("nome"));
String plainValue = rs2.getString("valore");
String encValue = rs2.getString("enc_value");
if(encValue!=null && StringUtils.isNotEmpty(encValue)) {
IDriverBYOK driverBYOK = this.driver.getDriverUnwrapBYOK();
if(driverBYOK!=null) {
genericProperty.setValore(driverBYOK.unwrapAsString(encValue));
}
else {
genericProperty.setValore(encValue);
}
}
else {
genericProperty.setValore(plainValue);
}
genericProperties.addProperty(genericProperty);
}
rs2.close();
stm2.close();
}
rs.close();
stm.close();
if(genericProperties==null )
throw new DriverConfigurazioneNotFound("Generic Properties non presenti");
return genericProperties;
} catch (SQLException se) {
throw new DriverConfigurazioneException("[getGenericProperties] SqlException: " + se.getMessage(),se);
}catch (DriverConfigurazioneNotFound e) {
throw new DriverConfigurazioneNotFound(e);
}catch (Exception se) {
throw new DriverConfigurazioneException("[getGenericProperties] Exception: " + se.getMessage(),se);
} finally {
//Chiudo statement and resultset
JDBCUtilities.closeResources(rs2, stm2);
JDBCUtilities.closeResources(rs, stm);
this.driver.closeConnection(con);
}
}
}