DBPropertiesUtils.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.mvc.properties.utils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.commons.lang.StringUtils;
import org.openspcoop2.core.byok.BYOKWrappedValue;
import org.openspcoop2.core.byok.IDriverBYOK;
import org.openspcoop2.core.commons.CoreException;
import org.openspcoop2.core.config.driver.db.DriverConfigurazioneDB_genericPropertiesDriver;
import org.openspcoop2.utils.sql.ISQLQueryObject;
import org.openspcoop2.utils.sql.SQLObjectFactory;
/**
* DBPropertiesUtils
*
* @author Poli Andrea (poli@link.it)
* @author $Author$
* @version $Rev$, $Date$
*/
public class DBPropertiesUtils {
private DBPropertiesUtils() {}
public static Map<String, String> readProperties(Connection con, String tipoDB, String nomeTabella, String nomeColonnaKey, String nomeColonnaValue, String nomeColonnaEncValue,
String nomeColonnaParent, Long idParent, IDriverBYOK driverBYOK) throws CoreException{
String methodName = "readProperties Tabella["+nomeTabella+"], NomeColonnaKey["+nomeColonnaKey+"], NomeColonnaValue["+nomeColonnaValue+"], nomeColonnaEncValue["+nomeColonnaEncValue+"], NomeColonnaParent["+nomeColonnaParent+"], IDParent["+idParent+"]";
Map<String, String> map = new HashMap<>();
PreparedStatement stmt = null;
ResultSet risultato = null;
try {
ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDB);
sqlQueryObject.addFromTable(nomeTabella);
sqlQueryObject.addSelectField(nomeTabella +"." + nomeColonnaKey);
sqlQueryObject.addSelectField(nomeTabella +"." + nomeColonnaValue);
sqlQueryObject.addSelectField(nomeTabella +"." + nomeColonnaEncValue);
sqlQueryObject.addWhereCondition(nomeTabella +"." + nomeColonnaParent +" = ?");
sqlQueryObject.addOrderBy(nomeTabella +"." + nomeColonnaKey);
sqlQueryObject.setSortType(true);
String queryString = sqlQueryObject.createSQLQuery();
stmt = con.prepareStatement(queryString);
int index = 1;
stmt.setLong(index++, idParent);
risultato = stmt.executeQuery();
while (risultato.next()) {
String key = risultato.getString(nomeColonnaKey);
String value = null;
String plainValue = risultato.getString(nomeColonnaValue);
String encValue = risultato.getString(nomeColonnaEncValue);
if(encValue!=null && StringUtils.isNotEmpty(encValue)) {
if(driverBYOK!=null) {
value = driverBYOK.unwrapAsString(encValue);
}
else {
value = encValue;
}
}
else {
value = plainValue;
}
map.put(key, value);
}
return map;
}catch(Exception e){
throw new CoreException(methodName + " error",e);
} finally {
//Chiudo statement and resultset
try{
if(risultato!=null) risultato.close();
}catch (Exception e) {
//ignore
}
try{
if(stmt!=null) stmt.close();
}catch (Exception e) {
//ignore
}
}
}
public static void writeProperties(Connection con, String tipoDB, Map<String, String> map, String nomeTabella, String nomeColonnaKey, String nomeColonnaValue, String nomeColonnaEncValue,
String nomeColonnaParent, Long idParent, IDriverBYOK driverBYOK, String tipoParent) throws CoreException{
String methodName = "writeProperties Tabella["+nomeTabella+"], NomeColonnaKey["+nomeColonnaKey+"], NomeColonnaValue["+nomeColonnaValue+"], nomeColonnaEncValue["+nomeColonnaEncValue+"], NomeColonnaParent["+nomeColonnaParent+"], IDParent["+idParent+"]";
PreparedStatement stmt = null;
if(idParent <=0){
throw new CoreException("IdParent non fornito");
}
try {
ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDB);
sqlQueryObject.addInsertTable(nomeTabella);
sqlQueryObject.addInsertField(nomeColonnaKey, "?");
sqlQueryObject.addInsertField(nomeColonnaValue, "?");
sqlQueryObject.addInsertField(nomeColonnaEncValue, "?");
sqlQueryObject.addInsertField(nomeColonnaParent, "?");
String queryString = sqlQueryObject.createSQLInsert();
for (String key : map.keySet()) {
stmt = con.prepareStatement(queryString);
int index = 1;
stmt.setString(index++, key);
String plainValue = map.get(key);
String encValue = null;
if(driverBYOK!=null && DriverConfigurazioneDB_genericPropertiesDriver.isConfidentialProperty(tipoParent, key)) {
BYOKWrappedValue byokValue = driverBYOK.wrap(plainValue);
if(byokValue!=null) {
encValue = byokValue.getWrappedValue();
plainValue = byokValue.getWrappedPlainValue();
}
}
stmt.setString(index++, plainValue);
stmt.setString(index++, encValue);
stmt.setLong(index++, idParent);
stmt.executeUpdate();
stmt.close();
}
}catch(Exception e){
throw new CoreException(methodName + " error",e);
} finally {
try{
if(stmt!=null) stmt.close();
}catch (Exception e) {
//ignore
}
}
}
public static void deleteProperties(Connection con, String tipoDB, String nomeTabella, String nomeColonnaParent, Long idParent) throws CoreException{
String methodName = "deleteProperties Tabella["+nomeTabella+"], NomeColonnaParent["+nomeColonnaParent+"], IDParent["+idParent+"]";
PreparedStatement stmt = null;
if(idParent <=0){
throw new CoreException("IdParent non fornito");
}
try {
ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDB);
sqlQueryObject.addDeleteTable(nomeTabella);
sqlQueryObject.addWhereCondition(nomeTabella +"." + nomeColonnaParent +" = ?");
sqlQueryObject.setANDLogicOperator(true);
String queryString = sqlQueryObject.createSQLDelete();
stmt = con.prepareStatement(queryString);
stmt.setLong(1, idParent);
stmt.executeUpdate();
stmt.close();
}catch(Exception e){
throw new CoreException(methodName + " error",e);
} finally {
try{
if(stmt!=null) stmt.close();
}catch (Exception e) {
//ignore
}
}
}
public static Map<String, String> toMap(Map<String, Properties> propertiesMap) throws Exception {
Map<String, String> map = null;
if(propertiesMap == null)
return map;
map = new HashMap<>();
for (String nomeProperties : propertiesMap.keySet()) {
Properties properties = propertiesMap.get(nomeProperties);
for (Object key : properties.keySet()) {
String keyAsString = (String) key;
String val = properties.getProperty(keyAsString);
if(!nomeProperties.equals(Costanti.NOME_MAPPA_PROPERTIES_DEFAULT)) {
keyAsString = nomeProperties + Costanti.KEY_PROPERTIES_CUSTOM_SEPARATOR + keyAsString;
}
map.put(keyAsString, val);
}
}
return map;
}
public static Map<String, Properties> toMultiMap(Map<String, String> dbMap) throws Exception {
List<String> nomiProperties = new ArrayList<>();
for (String key : dbMap.keySet()) {
String keyToAdd = key;
if(key.contains(Costanti.KEY_PROPERTIES_CUSTOM_SEPARATOR)) {
int idx = key.indexOf(Costanti.KEY_PROPERTIES_CUSTOM_SEPARATOR);
keyToAdd = key.substring(0,idx);
}
if(!nomiProperties.contains(keyToAdd))
nomiProperties.add(keyToAdd);
}
return toMultiMap(dbMap, nomiProperties);
}
public static Map<String, Properties> toMultiMap(Map<String, String> dbMap, List<String> nomiProperties) {
Map<String, Properties> map = null;
if(dbMap == null)
return map;
map = new HashMap<>();
for (String key : dbMap.keySet()) {
String value = dbMap.get(key);
String nomeProperties = Costanti.NOME_MAPPA_PROPERTIES_DEFAULT;
String startsWith = startsWith(nomiProperties, key);
// ho trovato una property da raggruppare
if(startsWith != null) {
nomeProperties = startsWith;
key = normalizePropertyName(nomeProperties, key);
}
Properties properties = map.remove(nomeProperties);
if(properties == null) {
properties = new Properties();
}
properties.put(key, value);
map.put(nomeProperties, properties);
}
return map;
}
public static String startsWith(List<String> nomiProperties, String key) {
if(nomiProperties != null && !nomiProperties.isEmpty()) {
for (String string : nomiProperties) {
if(key.startsWith(string+Costanti.KEY_PROPERTIES_CUSTOM_SEPARATOR))
return string;
}
}
return null;
}
public static String normalizePropertyName(String nomiProperties, String key) {
int prefixLength = nomiProperties.length() + Costanti.KEY_PROPERTIES_CUSTOM_SEPARATOR.length();
return key.substring(prefixLength);
}
}