RemoteStoreProviderDriverUtils.java

  1. /*
  2.  * GovWay - A customizable API Gateway
  3.  * https://govway.org
  4.  *
  5.  * Copyright (c) 2005-2025 Link.it srl (https://link.it).
  6.  *
  7.  * This program is free software: you can redistribute it and/or modify
  8.  * it under the terms of the GNU General Public License version 3, as published by
  9.  * the Free Software Foundation.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  18.  *
  19.  */

  20. package org.openspcoop2.pdd.core.keystore;

  21. import java.sql.Connection;
  22. import java.sql.PreparedStatement;
  23. import java.sql.ResultSet;
  24. import java.sql.SQLException;
  25. import java.sql.Timestamp;
  26. import java.util.ArrayList;
  27. import java.util.Date;
  28. import java.util.List;

  29. import org.openspcoop2.core.commons.Filtri;
  30. import org.openspcoop2.core.commons.ISearch;
  31. import org.openspcoop2.core.commons.Liste;
  32. import org.openspcoop2.core.commons.SearchUtils;
  33. import org.openspcoop2.core.config.driver.db.DriverConfigurazioneDB;
  34. import org.openspcoop2.core.constants.CostantiDB;
  35. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  36. import org.openspcoop2.pdd.config.PDNDConfigUtilities;
  37. import org.openspcoop2.pdd.config.PDNDResolver;
  38. import org.openspcoop2.utils.TipiDatabase;
  39. import org.openspcoop2.utils.UtilsException;
  40. import org.openspcoop2.utils.certificate.remote.RemoteStoreClientInfo;
  41. import org.openspcoop2.utils.certificate.remote.RemoteStoreConfig;
  42. import org.openspcoop2.utils.date.DateManager;
  43. import org.openspcoop2.utils.date.DateUtils;
  44. import org.openspcoop2.utils.jdbc.CustomKeyGeneratorObject;
  45. import org.openspcoop2.utils.jdbc.IJDBCAdapter;
  46. import org.openspcoop2.utils.jdbc.InsertAndGeneratedKey;
  47. import org.openspcoop2.utils.jdbc.InsertAndGeneratedKeyJDBCType;
  48. import org.openspcoop2.utils.jdbc.InsertAndGeneratedKeyObject;
  49. import org.openspcoop2.utils.jdbc.JDBCAdapterFactory;
  50. import org.openspcoop2.utils.jdbc.JDBCUtilities;
  51. import org.openspcoop2.utils.json.JsonPathExpressionEngine;
  52. import org.openspcoop2.utils.sql.ISQLQueryObject;
  53. import org.openspcoop2.utils.sql.LikeConfig;
  54. import org.openspcoop2.utils.sql.SQLObjectFactory;
  55. import org.openspcoop2.utils.sql.SQLQueryObjectException;
  56. import org.slf4j.Logger;

  57. /**
  58.  * RemoteStoreProviderDriverUtils
  59.  *
  60.  * @author Poli Andrea (apoli@link.it)
  61.  * @author $Author$
  62.  * @version $Rev$, $Date$
  63.  */
  64. public class RemoteStoreProviderDriverUtils {
  65.    
  66.     private RemoteStoreProviderDriverUtils() {}

  67.     private static final String COLUMN_ID = "id";
  68.     private static final String COLUMN_NOME = "nome";
  69.     private static final String COLUMN_DATA_REGISTRAZIONE = "data_registrazione";
  70.     private static final String COLUMN_DATA_AGGIORNAMENTO = "data_aggiornamento";
  71.     private static final String COLUMN_LAST_EVENT = "last_event";
  72.    
  73.     private static final String COLUMN_ID_REMOTE_STORE = "id_remote_store";
  74.     private static final String COLUMN_KID = "kid";
  75.     private static final String COLUMN_KEY = "content_key";
  76.    
  77.     private static final String COLUMN_CLIENT_ID = "client_id";
  78.     private static final String COLUMN_CLIENT_DETAILS = "client_details";
  79.     private static final String COLUMN_ORGANIZATION_DETAILS = "organization_details";
  80.     private static final String COLUMN_CLIENT_DATA_AGGIORNAMENTO = "client_data_aggiornamento";
  81.    
  82.     private static final String SUFFIX_NOT_FOUND = " not found";
  83.    
  84.     public static long registerIfNotExistsRemoteStore(DriverConfigurazioneDB driverConfigurazioneDB, RemoteStoreConfig remoteStoreConfig) throws KeystoreException {
  85.         long idRemoteStore = getIdRemoteStore(driverConfigurazioneDB, remoteStoreConfig);
  86.         if(idRemoteStore<=0) {
  87.             return createRemoteStore(driverConfigurazioneDB, remoteStoreConfig);
  88.         }
  89.         return idRemoteStore;
  90.     }
  91.     public static long registerIfNotExistsRemoteStore(Connection con, String tipoDatabase, RemoteStoreConfig remoteStoreConfig) throws KeystoreException {
  92.         long idRemoteStore = getIdRemoteStore(con, tipoDatabase, remoteStoreConfig);
  93.         if(idRemoteStore<=0) {
  94.             return createRemoteStore(con, tipoDatabase, remoteStoreConfig);
  95.         }
  96.         return idRemoteStore;
  97.     }
  98.    
  99.     public static long createRemoteStore(DriverConfigurazioneDB driverConfigurazioneDB, RemoteStoreConfig remoteStoreConfig) throws KeystoreException {
  100.        
  101.         Connection con = null;
  102.         try {
  103.             con = driverConfigurazioneDB.getConnection("createRemoteStore");
  104.             return createRemoteStore(con, driverConfigurazioneDB.getTipoDB(), remoteStoreConfig);
  105.         }
  106.         catch(Exception e) {
  107.             throw new KeystoreException(e.getMessage(),e);
  108.         }
  109.         finally {
  110.             driverConfigurazioneDB.releaseConnection(con);
  111.         }
  112.        
  113.     }
  114.     public static long createRemoteStore(Connection con, String tipoDatabase, RemoteStoreConfig remoteStoreConfig) throws KeystoreException {
  115.        
  116.         try {
  117.             String remoteStoreName = RemoteStoreProviderDriver.getRemoteStoreConfigName(remoteStoreConfig);
  118.            
  119.             Timestamp now = DateManager.getTimestamp();
  120.            
  121.             List<InsertAndGeneratedKeyObject> listInsertAndGeneratedKeyObject = new ArrayList<>();
  122.             listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(COLUMN_NOME, remoteStoreName, InsertAndGeneratedKeyJDBCType.STRING) );
  123.             listInsertAndGeneratedKeyObject.add( new InsertAndGeneratedKeyObject(COLUMN_DATA_AGGIORNAMENTO, now, InsertAndGeneratedKeyJDBCType.TIMESTAMP) );
  124.            
  125.             long idRemoteStore = InsertAndGeneratedKey.insertAndReturnGeneratedKey(con, TipiDatabase.toEnumConstant(tipoDatabase),
  126.                     new CustomKeyGeneratorObject(CostantiDB.REMOTE_STORE, CostantiDB.REMOTE_STORE_COLUMN_ID,
  127.                             CostantiDB.REMOTE_STORE_SEQUENCE, CostantiDB.REMOTE_STORE_TABLE_FOR_ID),
  128.                     listInsertAndGeneratedKeyObject.toArray(new InsertAndGeneratedKeyObject[1]));
  129.             if(idRemoteStore<=0){
  130.                 throw new KeystoreException("ID (RemoteStore) autoincrementale non ottenuto");
  131.             }
  132.             return idRemoteStore;
  133.         }
  134.         catch(Exception e) {
  135.             throw new KeystoreException(e.getMessage(),e);
  136.         }
  137.        
  138.     }
  139.    
  140.     public static long getIdRemoteStore(DriverConfigurazioneDB driverConfigurazioneDB, RemoteStoreConfig remoteStoreConfig) throws KeystoreException {
  141.         Connection con = null;
  142.         try {
  143.             con = driverConfigurazioneDB.getConnection("getIdRemoteStore");
  144.             return getIdRemoteStore(con, driverConfigurazioneDB.getTipoDB(), remoteStoreConfig);
  145.         }
  146.         catch(Exception e) {
  147.             throw new KeystoreException(e.getMessage(),e);
  148.         }
  149.         finally {
  150.             driverConfigurazioneDB.releaseConnection(con);
  151.         }
  152.     }
  153.     public static long getIdRemoteStore(Connection con, String tipoDatabase, RemoteStoreConfig remoteStoreConfig) throws KeystoreException {
  154.        
  155.         PreparedStatement selectStmt = null;
  156.         ResultSet selectRS = null;
  157.         long idRemoteStore = -1;
  158.         try {
  159.             String remoteStoreName = RemoteStoreProviderDriver.getRemoteStoreConfigName(remoteStoreConfig);
  160.            
  161.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDatabase);
  162.             sqlQueryObject.addFromTable(CostantiDB.REMOTE_STORE);
  163.             sqlQueryObject.addSelectField(COLUMN_ID);
  164.             sqlQueryObject.addWhereCondition(COLUMN_NOME+"=?");
  165.             sqlQueryObject.setANDLogicOperator(true);
  166.             String sqlQuery = sqlQueryObject.createSQLQuery();
  167.             selectStmt = con.prepareStatement(sqlQuery);
  168.             selectStmt.setString(1, remoteStoreName);
  169.             selectRS = selectStmt.executeQuery();
  170.             if(selectRS.next()) {
  171.                 idRemoteStore = selectRS.getLong(COLUMN_ID);
  172.             }
  173.         }
  174.         catch(Exception e) {
  175.             throw new KeystoreException(e.getMessage(),e);
  176.         }
  177.         finally {
  178.            
  179.             JDBCUtilities.closeResources(selectRS, selectStmt);
  180.         }
  181.        
  182.         return idRemoteStore;
  183.     }
  184.    
  185.    
  186.    
  187.    
  188.     public static RemoteStore getRemoteStore(DriverConfigurazioneDB driverConfigurazioneDB, RemoteStoreConfig remoteStoreConfig, boolean throwExceptionNotFound) throws KeystoreException {
  189.         Connection con = null;
  190.         try {
  191.             con = driverConfigurazioneDB.getConnection("getRemoteStore");
  192.             return getRemoteStore(con, driverConfigurazioneDB.getTipoDB(), remoteStoreConfig, throwExceptionNotFound);
  193.         }
  194.         catch(Exception e) {
  195.             throw new KeystoreException(e.getMessage(),e);
  196.         }
  197.         finally {
  198.             driverConfigurazioneDB.releaseConnection(con);
  199.         }
  200.     }
  201.     public static RemoteStore getRemoteStore(Connection con, String tipoDatabase, RemoteStoreConfig remoteStoreConfig, boolean throwExceptionNotFound) throws KeystoreException {
  202.        
  203.         PreparedStatement selectStmt = null;
  204.         ResultSet selectRS = null;
  205.         RemoteStore remoteStore = null;
  206.         try {
  207.             String remoteStoreName = RemoteStoreProviderDriver.getRemoteStoreConfigName(remoteStoreConfig);
  208.            
  209.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDatabase);
  210.             sqlQueryObject.addFromTable(CostantiDB.REMOTE_STORE);
  211.             sqlQueryObject.addSelectField("*");
  212.             sqlQueryObject.addWhereCondition(COLUMN_NOME+"=?");
  213.             sqlQueryObject.setANDLogicOperator(true);
  214.             String sqlQuery = sqlQueryObject.createSQLQuery();
  215.             selectStmt = con.prepareStatement(sqlQuery);
  216.             selectStmt.setString(1, remoteStoreName);
  217.             selectRS = selectStmt.executeQuery();
  218.             if(selectRS.next()) {
  219.                 remoteStore = new RemoteStore();
  220.                 remoteStore.setId(selectRS.getLong(COLUMN_ID));
  221.                 remoteStore.setDataAggiornamento(selectRS.getTimestamp(COLUMN_DATA_AGGIORNAMENTO));
  222.                 remoteStore.setLastEvent(selectRS.getString(COLUMN_LAST_EVENT));
  223.                 remoteStore.setNome(selectRS.getString(COLUMN_NOME));
  224.             }
  225.             else if(throwExceptionNotFound){
  226.                 throw new KeystoreException("RemoteStore '"+remoteStoreName+"'"+SUFFIX_NOT_FOUND);
  227.             }
  228.         }
  229.         catch(Exception e) {
  230.             throw new KeystoreException(e.getMessage(),e);
  231.         }
  232.         finally {
  233.            
  234.             JDBCUtilities.closeResources(selectRS, selectStmt);
  235.         }
  236.        
  237.         return remoteStore;
  238.     }
  239.    
  240.    
  241.     public static int updateRemoteStore(DriverConfigurazioneDB driverConfigurazioneDB, long idStore, String lastEventId) throws KeystoreException {
  242.         Connection con = null;
  243.         try {
  244.             con = driverConfigurazioneDB.getConnection("updateRemoteStore");
  245.             return updateRemoteStore(con, driverConfigurazioneDB.getTipoDB(), idStore, lastEventId);
  246.         }
  247.         catch(Exception e) {
  248.             throw new KeystoreException(e.getMessage(),e);
  249.         }
  250.         finally {
  251.             driverConfigurazioneDB.releaseConnection(con);
  252.         }
  253.     }
  254.     public static int updateRemoteStore(Connection con, String tipoDatabase, long idStore, String lastEventId) throws KeystoreException {
  255.         PreparedStatement updateStmt = null;
  256.         try {
  257.             checkRemoteStoreParams(idStore, lastEventId);
  258.            
  259.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDatabase);
  260.             sqlQueryObject.addUpdateTable(CostantiDB.REMOTE_STORE);
  261.             sqlQueryObject.addUpdateField(COLUMN_LAST_EVENT, "?");
  262.             sqlQueryObject.addUpdateField(COLUMN_DATA_AGGIORNAMENTO, "?");
  263.             sqlQueryObject.addWhereCondition(COLUMN_ID+"=?");
  264.             sqlQueryObject.setANDLogicOperator(true);
  265.             String updateQuery = sqlQueryObject.createSQLUpdate();
  266.             updateStmt = con.prepareStatement(updateQuery);
  267.             int index = 1;
  268.             Timestamp now = DateManager.getTimestamp();
  269.             updateStmt.setString(index++, lastEventId);
  270.             updateStmt.setTimestamp(index++, now);
  271.             updateStmt.setLong(index++, idStore);
  272.             int rows = updateStmt.executeUpdate();
  273.             updateStmt.close();
  274.             return rows;
  275.         }
  276.         catch(Exception e) {
  277.             throw new KeystoreException(e.getMessage(),e);
  278.         }
  279.         finally {  
  280.             JDBCUtilities.closeResources(updateStmt);
  281.         }
  282.     }
  283.     private static void checkRemoteStoreParams(long idStore, String lastEventId) throws KeystoreException {
  284.         if(idStore<=0) {
  285.             throw new KeystoreException("IdStore undefined");
  286.         }
  287.         if(lastEventId==null) {
  288.             throw new KeystoreException("LastEventId undefined");
  289.         }
  290.     }
  291.    
  292.    
  293.     public static List<RemoteStore> getRemoteStores(DriverConfigurazioneDB driverConfigurazioneDB) throws KeystoreException {
  294.         Connection con = null;
  295.         try {
  296.             con = driverConfigurazioneDB.getConnection("getRemoteStores");
  297.             return getRemoteStores(con, driverConfigurazioneDB.getTipoDB());
  298.         }
  299.         catch(Exception e) {
  300.             throw new KeystoreException(e.getMessage(),e);
  301.         }
  302.         finally {
  303.             driverConfigurazioneDB.releaseConnection(con);
  304.         }
  305.     }
  306.     public static List<RemoteStore> getRemoteStores(Connection con, String tipoDatabase) throws KeystoreException {
  307.        
  308.         List<RemoteStore> list = new ArrayList<>();
  309.         PreparedStatement selectStmt = null;
  310.         ResultSet selectRS = null;
  311.         try {
  312.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDatabase);
  313.             sqlQueryObject.addFromTable(CostantiDB.REMOTE_STORE);
  314.             sqlQueryObject.setANDLogicOperator(true);
  315.             sqlQueryObject.addOrderBy(COLUMN_NOME);
  316.             String sqlQuery = sqlQueryObject.createSQLQuery();
  317.             selectStmt = con.prepareStatement(sqlQuery);
  318.             selectRS = selectStmt.executeQuery();
  319.             while(selectRS.next()) {
  320.                 long idRemoteStore = selectRS.getLong(COLUMN_ID);
  321.                 Date dataAggiornamento = selectRS.getTimestamp(COLUMN_DATA_AGGIORNAMENTO);
  322.                 String lastEvent =  selectRS.getString(COLUMN_LAST_EVENT);
  323.                 String nome = selectRS.getString(COLUMN_NOME);
  324.                 RemoteStore rs = new RemoteStore();
  325.                 rs.setId(idRemoteStore);
  326.                 rs.setDataAggiornamento(dataAggiornamento);
  327.                 rs.setLastEvent(lastEvent);
  328.                 rs.setNome(nome);
  329.                 list.add(rs);
  330.             }
  331.         }
  332.         catch(Exception e) {
  333.             throw new KeystoreException(e.getMessage(),e);
  334.         }
  335.         finally {
  336.            
  337.             JDBCUtilities.closeResources(selectRS, selectStmt);
  338.         }
  339.        
  340.         return list;
  341.     }
  342.    
  343.    
  344.    
  345.    
  346.    
  347.    
  348.     public static int addRemoteStoreKey(DriverConfigurazioneDB driverConfigurazioneDB, long idStore, String kid, byte[] key) throws KeystoreException {
  349.         Connection con = null;
  350.         PreparedStatement updateStmt = null;
  351.         try {
  352.             con = driverConfigurazioneDB.getConnection("addRemoteStoreKey");
  353.            
  354.             checkParams(idStore, kid, key);
  355.            
  356.             IJDBCAdapter jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(driverConfigurazioneDB.getTipoDB());
  357.            
  358.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(driverConfigurazioneDB.getTipoDB());
  359.             sqlQueryObject.addInsertTable(CostantiDB.REMOTE_STORE_KEY);
  360.             sqlQueryObject.addInsertField(COLUMN_ID_REMOTE_STORE, "?");
  361.             sqlQueryObject.addInsertField(COLUMN_KID, "?");
  362.             sqlQueryObject.addInsertField(COLUMN_KEY, "?");
  363.             sqlQueryObject.addInsertField(COLUMN_DATA_REGISTRAZIONE, "?");
  364.             sqlQueryObject.addInsertField(COLUMN_DATA_AGGIORNAMENTO, "?");
  365.             String updateQuery = sqlQueryObject.createSQLInsert();
  366.             updateStmt = con.prepareStatement(updateQuery);
  367.             int index = 1;
  368.             updateStmt.setLong(index++, idStore);
  369.             updateStmt.setString(index++, kid);
  370.             jdbcAdapter.setBinaryData(updateStmt, index++, key);
  371.             Timestamp now = DateManager.getTimestamp();
  372.             updateStmt.setTimestamp(index++, now);
  373.             updateStmt.setTimestamp(index++, now);
  374.             int rows = updateStmt.executeUpdate();
  375.             updateStmt.close();
  376.             return rows;
  377.         }
  378.         catch(Exception e) {
  379.             throw new KeystoreException(e.getMessage(),e);
  380.         }
  381.         finally {
  382.            
  383.             JDBCUtilities.closeResources(updateStmt);
  384.            
  385.             driverConfigurazioneDB.releaseConnection(con);
  386.         }
  387.     }
  388.    
  389.     public static int invalidRemoteStoreKey(DriverConfigurazioneDB driverConfigurazioneDB, long idStore, String kid) throws KeystoreException {
  390.         return updateRemoteStoreKeyEngine(driverConfigurazioneDB, idStore, kid, null, true);
  391.     }
  392.     public static int invalidRemoteStoreKey(Connection con, String tipoDatabase, long idStore, String kid) throws KeystoreException {
  393.         return updateRemoteStoreKeyEngine(con, tipoDatabase, idStore, kid, null, true);
  394.     }
  395.     public static int updateRemoteStoreKey(DriverConfigurazioneDB driverConfigurazioneDB, long idStore, String kid, byte[] key) throws KeystoreException {
  396.         return updateRemoteStoreKeyEngine(driverConfigurazioneDB, idStore, kid, key, false);
  397.     }
  398.     private static Timestamp dataInvalidaScaduta = null;
  399.     static{
  400.         try {
  401.             dataInvalidaScaduta = new Timestamp(DateUtils.getSimpleDateFormatDay().parse("2000-01-01").getTime());
  402.         }catch(Exception e) {
  403.             // ignore
  404.         }
  405.     }
  406.     private static int updateRemoteStoreKeyEngine(DriverConfigurazioneDB driverConfigurazioneDB, long idStore, String kid, byte[] key, boolean invalid) throws KeystoreException {
  407.         Connection con = null;
  408.         try {
  409.             con = driverConfigurazioneDB.getConnection(invalid ? "invalidRemoteStoreKey" : "updateRemoteStoreKey");
  410.             return updateRemoteStoreKeyEngine(con, driverConfigurazioneDB.getTipoDB(), idStore, kid, key, invalid);
  411.         }
  412.         catch(Exception e) {
  413.             throw new KeystoreException(e.getMessage(),e);
  414.         }
  415.         finally {
  416.             driverConfigurazioneDB.releaseConnection(con);
  417.         }
  418.     }
  419.     private static int updateRemoteStoreKeyEngine(Connection con, String tipoDatabase, long idStore, String kid, byte[] key, boolean invalid) throws KeystoreException {
  420.         PreparedStatement updateStmt = null;
  421.         try {
  422.             if(invalid) {
  423.                 checkParams(idStore, kid);  
  424.             }
  425.             else {
  426.                 checkParams(idStore, kid, key);
  427.             }
  428.            
  429.             IJDBCAdapter jdbcAdapter = null;
  430.            
  431.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDatabase);
  432.             sqlQueryObject.addUpdateTable(CostantiDB.REMOTE_STORE_KEY);
  433.             if(!invalid) {
  434.                 sqlQueryObject.addUpdateField(COLUMN_KEY, "?");
  435.                 jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(tipoDatabase);
  436.             }
  437.             sqlQueryObject.addUpdateField(COLUMN_DATA_AGGIORNAMENTO, "?");
  438.             if(invalid) {
  439.                 sqlQueryObject.addUpdateField(COLUMN_CLIENT_DATA_AGGIORNAMENTO, "?");
  440.             }
  441.             addWhereKidConditions(sqlQueryObject);
  442.             sqlQueryObject.setANDLogicOperator(true);
  443.             String updateQuery = sqlQueryObject.createSQLUpdate();
  444.             updateStmt = con.prepareStatement(updateQuery);
  445.             int index = 1;
  446.             Timestamp now = DateManager.getTimestamp();
  447.             if(invalid) {
  448.                 updateStmt.setTimestamp(index++, dataInvalidaScaduta);
  449.                 updateStmt.setTimestamp(index++, dataInvalidaScaduta);
  450.             }
  451.             else {
  452.                 jdbcAdapter.setBinaryData(updateStmt, index++, key);
  453.                 updateStmt.setTimestamp(index++, now);
  454.             }
  455.             updateStmt.setLong(index++, idStore);
  456.             updateStmt.setString(index++, kid);
  457.             int rows = updateStmt.executeUpdate();
  458.             updateStmt.close();
  459.             return rows;
  460.         }
  461.         catch(Exception e) {
  462.             throw new KeystoreException(e.getMessage(),e);
  463.         }
  464.         finally {
  465.             JDBCUtilities.closeResources(updateStmt);
  466.         }
  467.     }
  468.    
  469.     public static int deleteRemoteStoreKey(DriverConfigurazioneDB driverConfigurazioneDB, long idStore, String kid) throws KeystoreException {
  470.         Connection con = null;
  471.         try {
  472.             con = driverConfigurazioneDB.getConnection("deleteRemoteStoreKey");
  473.             return deleteRemoteStoreKey(con, driverConfigurazioneDB.getTipoDB(), idStore, kid);
  474.         }
  475.         catch(Exception e) {
  476.             throw new KeystoreException(e.getMessage(),e);
  477.         }
  478.         finally {
  479.             driverConfigurazioneDB.releaseConnection(con);
  480.         }
  481.     }
  482.     public static int deleteRemoteStoreKey(Connection con, String tipoDatabase, long idStore, String kid) throws KeystoreException {
  483.         PreparedStatement updateStmt = null;
  484.         try {
  485.             checkParams(idStore, kid);
  486.            
  487.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDatabase);
  488.             sqlQueryObject.addDeleteTable(CostantiDB.REMOTE_STORE_KEY);
  489.             addWhereKidConditions(sqlQueryObject);
  490.             sqlQueryObject.setANDLogicOperator(true);
  491.             String updateQuery = sqlQueryObject.createSQLDelete();
  492.             updateStmt = con.prepareStatement(updateQuery);
  493.             updateStmt.setLong(1, idStore);
  494.             updateStmt.setString(2, kid);
  495.             int rows = updateStmt.executeUpdate();
  496.             updateStmt.close();
  497.             return rows;
  498.         }
  499.         catch(Exception e) {
  500.             throw new KeystoreException(e.getMessage(),e);
  501.         }
  502.         finally {
  503.             JDBCUtilities.closeResources(updateStmt);
  504.         }
  505.     }
  506.    
  507.     public static RemoteStoreKey getRemoteStoreKey(DriverConfigurazioneDB driverConfigurazioneDB, long idStore, String kid) throws KeystoreException,KeystoreNotFoundException {
  508.        
  509.         Connection con = null;
  510.         PreparedStatement selectStmt = null;
  511.         ResultSet selectRS = null;
  512.         try {
  513.             con = driverConfigurazioneDB.getConnection("getRemoteStoreKey");
  514.            
  515.             checkParams(idStore, kid);
  516.            
  517.             IJDBCAdapter jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(driverConfigurazioneDB.getTipoDB());
  518.            
  519.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(driverConfigurazioneDB.getTipoDB());
  520.             sqlQueryObject.addFromTable(CostantiDB.REMOTE_STORE_KEY);
  521.             sqlQueryObject.addSelectField(COLUMN_KEY);
  522.             sqlQueryObject.addSelectField(COLUMN_DATA_AGGIORNAMENTO);
  523.             addWhereKidConditions(sqlQueryObject);
  524.             sqlQueryObject.setANDLogicOperator(true);
  525.             String sqlQuery = sqlQueryObject.createSQLQuery();
  526.             selectStmt = con.prepareStatement(sqlQuery);
  527.             selectStmt.setLong(1, idStore);
  528.             selectStmt.setString(2, kid);
  529.             selectRS = selectStmt.executeQuery();
  530.             if(selectRS.next()) {
  531.                 RemoteStoreKey rsk = new RemoteStoreKey();
  532.                 rsk.setKey(jdbcAdapter.getBinaryData(selectRS, COLUMN_KEY));
  533.                 rsk.setDataAggiornamento(selectRS.getTimestamp(COLUMN_DATA_AGGIORNAMENTO));
  534.                 rsk.setInvalid(dataInvalidaScaduta.equals(rsk.getDataAggiornamento()));
  535.                 return rsk;
  536.             }
  537.             throw new KeystoreNotFoundException("Key with kid '"+kid+"'"+SUFFIX_NOT_FOUND);
  538.         }
  539.         catch(KeystoreNotFoundException e) {
  540.             throw e;
  541.         }
  542.         catch(Exception e) {
  543.             throw new KeystoreException(e.getMessage(),e);
  544.         }
  545.         finally {
  546.            
  547.             JDBCUtilities.closeResources(selectRS, selectStmt);
  548.            
  549.             driverConfigurazioneDB.releaseConnection(con);
  550.         }
  551.        
  552.     }
  553.    
  554.     public static boolean existsRemoteStoreKey(DriverConfigurazioneDB driverConfigurazioneDB, long idStore, String kid, boolean checkDates) throws KeystoreException {
  555.        
  556.         Connection con = null;
  557.         try {
  558.             con = driverConfigurazioneDB.getConnection("existsRemoteStoreKey");
  559.             return existsRemoteStoreKey(con, driverConfigurazioneDB.getTipoDB(), idStore, kid, checkDates);
  560.         }
  561.         catch(Exception e) {
  562.             throw new KeystoreException(e.getMessage(),e);
  563.         }
  564.         finally {
  565.             driverConfigurazioneDB.releaseConnection(con);
  566.         }
  567.        
  568.     }
  569.     public static boolean existsRemoteStoreKey(Connection con, String tipoDatabase, long idStore, String kid, boolean checkDates) throws KeystoreException {
  570.        
  571.         PreparedStatement selectStmt = null;
  572.         ResultSet selectRS = null;
  573.         try {
  574.             checkParams(idStore, kid);
  575.            
  576.             Timestamp tooOld = null;
  577.             if(checkDates && RemoteStoreProviderDriver.getKeyMaxLifeMinutes()>0) {
  578.                 long maxLifeSeconds = RemoteStoreProviderDriver.getKeyMaxLifeMinutes() * 60l;
  579.                 long maxLifeMs = maxLifeSeconds * 1000l;
  580.                 tooOld = new Timestamp(DateManager.getTimeMillis()-maxLifeMs);
  581.             }
  582.            
  583.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDatabase);
  584.             sqlQueryObject.addFromTable(CostantiDB.REMOTE_STORE_KEY);
  585.             sqlQueryObject.addSelectField(COLUMN_KEY);
  586.             addWhereKidConditions(sqlQueryObject);
  587.             if(checkDates) {
  588.                 sqlQueryObject.addWhereCondition(COLUMN_DATA_AGGIORNAMENTO+">?");
  589.             }
  590.             sqlQueryObject.setANDLogicOperator(true);
  591.             String sqlQuery = sqlQueryObject.createSQLQuery();
  592.             selectStmt = con.prepareStatement(sqlQuery);
  593.             int index = 1;
  594.             selectStmt.setLong(index++, idStore);
  595.             selectStmt.setString(index++, kid);
  596.             if(checkDates) {
  597.                 if(tooOld!=null) {
  598.                     selectStmt.setTimestamp(index++, tooOld);
  599.                 }
  600.                 else {
  601.                     selectStmt.setTimestamp(index++, dataInvalidaScaduta);
  602.                 }
  603.             }
  604.             selectRS = selectStmt.executeQuery();
  605.             return selectRS.next();
  606.         }
  607.         catch(Exception e) {
  608.             throw new KeystoreException(e.getMessage(),e);
  609.         }
  610.         finally {
  611.             JDBCUtilities.closeResources(selectRS, selectStmt);
  612.         }
  613.        
  614.     }
  615.    
  616.    
  617.     public static RemoteStoreClientDetails getRemoteStoreClientDetails(DriverConfigurazioneDB driverConfigurazioneDB, long idStore, String kid, Logger log,
  618.             boolean createEntryIfNotExists) throws KeystoreException,KeystoreNotFoundException {
  619.        
  620.         Connection con = null;
  621.         try {
  622.             con = driverConfigurazioneDB.getConnection("getRemoteStoreClientDetails");
  623.            
  624.             return getRemoteStoreClientDetails(con, driverConfigurazioneDB.getTipoDB(), idStore, kid, log,
  625.                     createEntryIfNotExists);
  626.         }
  627.         catch(KeystoreNotFoundException e) {
  628.             throw e;
  629.         }
  630.         catch(Exception e) {
  631.             throw new KeystoreException(e.getMessage(),e);
  632.         }
  633.         finally {
  634.             driverConfigurazioneDB.releaseConnection(con);
  635.         }
  636.        
  637.     }
  638.     public static RemoteStoreClientDetails getRemoteStoreClientDetails(Connection con, String tipoDatabase, long idStore, String kid, Logger log,
  639.             boolean createEntryIfNotExists) throws KeystoreException,KeystoreNotFoundException {
  640.        
  641.         PreparedStatement selectStmt = null;
  642.         ResultSet selectRS = null;
  643.         try {
  644.             checkParams(idStore, kid);
  645.            
  646.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDatabase);
  647.             sqlQueryObject.addFromTable(CostantiDB.REMOTE_STORE_KEY);
  648.             sqlQueryObject.addSelectField(COLUMN_CLIENT_ID);
  649.             sqlQueryObject.addSelectField(COLUMN_CLIENT_DETAILS);
  650.             sqlQueryObject.addSelectField(COLUMN_ORGANIZATION_DETAILS);
  651.             sqlQueryObject.addSelectField(COLUMN_CLIENT_DATA_AGGIORNAMENTO);
  652.             addWhereKidConditions(sqlQueryObject);
  653.             sqlQueryObject.setANDLogicOperator(true);
  654.             String sqlQuery = sqlQueryObject.createSQLQuery();
  655.             selectStmt = con.prepareStatement(sqlQuery);
  656.             selectStmt.setLong(1, idStore);
  657.             selectStmt.setString(2, kid);
  658.             selectRS = selectStmt.executeQuery();
  659.             if(selectRS.next()) {
  660.                 RemoteStoreClientDetails rsk = new RemoteStoreClientDetails();
  661.                 rsk.setClientInfo(new RemoteStoreClientInfo());
  662.                 rsk.getClientInfo().setClientId(selectRS.getString(COLUMN_CLIENT_ID));
  663.                 rsk.getClientInfo().setClientDetails(selectRS.getString(COLUMN_CLIENT_DETAILS));
  664.                 if(rsk.getClientInfo().getClientId()!=null && rsk.getClientInfo().getClientDetails()!=null) {
  665.                     String jsonPath = OpenSPCoop2Properties.getInstance().getGestoreChiaviPDNDclientsOrganizationJsonPath();
  666.                     boolean readErrorAbortTransaction = false;
  667.                     String organizationId = PDNDConfigUtilities.readOrganizationId(jsonPath, readErrorAbortTransaction, rsk.getClientInfo().getClientDetails(), log);
  668.                     rsk.getClientInfo().setOrganizationId(organizationId);
  669.                 }
  670.                 rsk.getClientInfo().setOrganizationDetails(selectRS.getString(COLUMN_ORGANIZATION_DETAILS));
  671.                 rsk.setDataAggiornamento(selectRS.getTimestamp(COLUMN_CLIENT_DATA_AGGIORNAMENTO));
  672.                 rsk.setInvalid(dataInvalidaScaduta.equals(rsk.getDataAggiornamento()));
  673.                 return rsk;
  674.             }
  675.            
  676.             if(createEntryIfNotExists) {
  677.                 int row = initializeEmptyEntry(con, tipoDatabase, idStore, kid, log);
  678.                 if(row>0) {
  679.                     return new RemoteStoreClientDetails();
  680.                 }
  681.             }
  682.            
  683.             throw new KeystoreNotFoundException("Key with kid '"+kid+"'"+SUFFIX_NOT_FOUND);
  684.         }
  685.         catch(KeystoreNotFoundException e) {
  686.             throw e;
  687.         }
  688.         catch(Exception e) {
  689.             throw new KeystoreException(e.getMessage(),e);
  690.         }
  691.         finally {
  692.             JDBCUtilities.closeResources(selectRS, selectStmt);
  693.         }
  694.        
  695.     }
  696.    
  697.     private static final byte[] KEY_UNDEFINED = "KEY_UNDEFINED".getBytes();
  698.     private static int initializeEmptyEntry(Connection con, String tipoDB, long idStore, String kid, Logger log) {
  699.         PreparedStatement updateStmt = null;
  700.         try {
  701.             IJDBCAdapter jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(tipoDB);
  702.            
  703.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDB);
  704.             sqlQueryObject.addInsertTable(CostantiDB.REMOTE_STORE_KEY);
  705.             sqlQueryObject.addInsertField(COLUMN_ID_REMOTE_STORE, "?");
  706.             sqlQueryObject.addInsertField(COLUMN_KID, "?");
  707.             sqlQueryObject.addInsertField(COLUMN_KEY, "?");
  708.             sqlQueryObject.addInsertField(COLUMN_DATA_REGISTRAZIONE, "?");
  709.             sqlQueryObject.addInsertField(COLUMN_DATA_AGGIORNAMENTO, "?");
  710.             String updateQuery = sqlQueryObject.createSQLInsert();
  711.             updateStmt = con.prepareStatement(updateQuery);
  712.             int index = 1;
  713.             updateStmt.setLong(index++, idStore);
  714.             updateStmt.setString(index++, kid);
  715.             jdbcAdapter.setBinaryData(updateStmt, index++, KEY_UNDEFINED);
  716.             Timestamp now = DateManager.getTimestamp();
  717.             updateStmt.setTimestamp(index++, now);
  718.             updateStmt.setTimestamp(index++, dataInvalidaScaduta);
  719.             int rows = updateStmt.executeUpdate();
  720.             updateStmt.close();
  721.             return rows;
  722.         }
  723.         catch(Exception e) {
  724.             log.error("initializeEmptyEntry failed: "+e.getMessage(),e);
  725.             return -1;
  726.         }
  727.         finally {
  728.             JDBCUtilities.closeResources(updateStmt);
  729.         }
  730.     }
  731.    
  732.     public static int updateRemoteStoreClientDetails(DriverConfigurazioneDB driverConfigurazioneDB, long idStore, String kid, RemoteStoreClientDetails clientDetails) throws KeystoreException {
  733.         Connection con = null;
  734.         try {
  735.             con = driverConfigurazioneDB.getConnection("updateRemoteStoreClientDetails");
  736.             return updateRemoteStoreClientDetails(con, driverConfigurazioneDB.getTipoDB(), idStore, kid, clientDetails);
  737.         }
  738.         catch(Exception e) {
  739.             throw new KeystoreException(e.getMessage(),e);
  740.         }
  741.         finally {
  742.             driverConfigurazioneDB.releaseConnection(con);
  743.         }
  744.     }
  745.     public static int updateRemoteStoreClientDetails(Connection con, String tipoDatabase, long idStore, String kid, RemoteStoreClientDetails clientDetails) throws KeystoreException {
  746.         PreparedStatement updateStmt = null;
  747.         try {
  748.             checkParams(idStore, kid);  

  749.             if(clientDetails==null) {
  750.                 throw new KeystoreException("ClientDetails undefined");
  751.             }
  752.             if(clientDetails.getClientInfo()==null) {
  753.                 throw new KeystoreException("ClientInfo undefined");
  754.             }
  755.            
  756.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDatabase);
  757.             sqlQueryObject.addUpdateTable(CostantiDB.REMOTE_STORE_KEY);
  758.             sqlQueryObject.addUpdateField(COLUMN_CLIENT_ID, "?");
  759.             sqlQueryObject.addUpdateField(COLUMN_CLIENT_DETAILS, "?");
  760.             sqlQueryObject.addUpdateField(COLUMN_ORGANIZATION_DETAILS, "?");
  761.             sqlQueryObject.addUpdateField(COLUMN_CLIENT_DATA_AGGIORNAMENTO, "?");
  762.             addWhereKidConditions(sqlQueryObject);
  763.             sqlQueryObject.setANDLogicOperator(true);
  764.             String updateQuery = sqlQueryObject.createSQLUpdate();
  765.             updateStmt = con.prepareStatement(updateQuery);
  766.             int index = 1;
  767.             updateStmt.setString(index++, clientDetails.getClientInfo().getClientId());
  768.             updateStmt.setString(index++, clientDetails.getClientInfo().getClientDetails());
  769.             updateStmt.setString(index++, clientDetails.getClientInfo().getOrganizationDetails());
  770.             updateStmt.setTimestamp(index++, clientDetails.getDataAggiornamento()!=null ? new Timestamp(clientDetails.getDataAggiornamento().getTime()) : DateManager.getTimestamp());
  771.             updateStmt.setLong(index++, idStore);
  772.             updateStmt.setString(index++, kid);
  773.             int rows = updateStmt.executeUpdate();
  774.             updateStmt.close();
  775.             return rows;
  776.         }
  777.         catch(Exception e) {
  778.             throw new KeystoreException(e.getMessage(),e);
  779.         }
  780.         finally {
  781.             JDBCUtilities.closeResources(updateStmt);
  782.         }
  783.     }

  784.    
  785.     private static void checkParams(long idStore, String kid, byte[] key) throws KeystoreException {
  786.         checkParams(idStore, kid);
  787.        
  788.         if(key==null || key.length<=0) {
  789.             throw new KeystoreException("Key undefined");
  790.         }
  791.     }
  792.     private static void checkParams(long idStore, String kid) throws KeystoreException {
  793.         if(idStore<=0) {
  794.             throw new KeystoreException("IdStore undefined");
  795.         }
  796.         if(kid==null) {
  797.             throw new KeystoreException("Kid undefined");
  798.         }
  799.     }
  800.    
  801.     private static void addWhereKidConditions(ISQLQueryObject sqlQueryObject) throws SQLQueryObjectException {
  802.         sqlQueryObject.addWhereCondition(COLUMN_ID_REMOTE_STORE+"=?");
  803.         sqlQueryObject.addWhereCondition(COLUMN_KID+"=?");
  804.     }
  805.    
  806.    
  807.    
  808.    
  809.    
  810.    
  811.    
  812.    
  813.    
  814.    
  815.    
  816.    
  817.     public static List<RemoteStoreKeyEntry> getRemoteStoreKeyEntries(Logger log, DriverConfigurazioneDB driverConfigurazioneDB, ISearch ricerca, long idRemoteStore) throws KeystoreException {
  818.         Connection con = null;
  819.         try {
  820.             con = driverConfigurazioneDB.getConnection("getRemoteStoreKeyEntries");
  821.             return getRemoteStoreKeyEntries(log, con, driverConfigurazioneDB.getTipoDB(), ricerca, idRemoteStore);
  822.         }
  823.         catch(Exception e) {
  824.             throw new KeystoreException(e.getMessage(),e);
  825.         }
  826.         finally {
  827.             driverConfigurazioneDB.releaseConnection(con);
  828.         }
  829.     }
  830.     public static List<RemoteStoreKeyEntry> getRemoteStoreKeyEntries(Logger log, Connection con, String tipoDatabase, ISearch ricerca, long idRemoteStore) throws KeystoreException {
  831.        
  832.         int idLista = Liste.REMOTE_STORE_KEY;
  833.         int offset;
  834.         int limit;
  835.         limit = ricerca.getPageSize(idLista);
  836.         offset = ricerca.getIndexIniziale(idLista);
  837.        
  838.         if (limit == 0) // con limit
  839.             limit = ISQLQueryObject.LIMIT_DEFAULT_VALUE;
  840.        
  841.         String filtroKid = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_REMOTE_STORE_KEY_KID);
  842.         if((filtroKid!=null && "".equals(filtroKid))) {
  843.             filtroKid=null;
  844.         }
  845.        
  846.         String filtroClientId = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_REMOTE_STORE_KEY_CLIENT_ID);
  847.         if((filtroClientId!=null && "".equals(filtroClientId))) {
  848.             filtroClientId=null;
  849.         }
  850.        
  851.         String filtroOrganizzazione = SearchUtils.getFilter(ricerca, idLista, Filtri.FILTRO_REMOTE_STORE_KEY_ORGANIZZAZIONE);
  852.         if((filtroOrganizzazione!=null && "".equals(filtroOrganizzazione))) {
  853.             filtroOrganizzazione=null;
  854.         }

  855.         // count
  856.         PreparedStatement selectStmtCount = null;
  857.         ResultSet selectRSCount = null;
  858.         int size = 0;
  859.         try {
  860.             ISQLQueryObject sqlQueryObject = buildSqlRemoteStoreKeyEntries(tipoDatabase, filtroKid, filtroClientId, filtroOrganizzazione);
  861.             sqlQueryObject.addSelectCountField("somma");
  862.             String sqlQuery = sqlQueryObject.createSQLQuery();
  863.             selectStmtCount = con.prepareStatement(sqlQuery);
  864.             selectStmtCount.setLong(1, idRemoteStore);
  865.             selectRSCount = selectStmtCount.executeQuery();
  866.             if(selectRSCount.next()) {
  867.                 size = selectRSCount.getInt("somma");
  868.                 if(size<0) {
  869.                     size=0;
  870.                 }
  871.                 ricerca.setNumEntries(idLista, size);
  872.             }
  873.         }
  874.         catch(Exception e) {
  875.             throw new KeystoreException(e.getMessage(),e);
  876.         }
  877.         finally {
  878.             JDBCUtilities.closeResources(selectRSCount, selectStmtCount);
  879.         }
  880.        
  881.         List<RemoteStoreKeyEntry> list = new ArrayList<>();
  882.         PreparedStatement selectStmt = null;
  883.         ResultSet selectRS = null;
  884.         try {
  885.             IJDBCAdapter jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(tipoDatabase);
  886.            
  887.             ISQLQueryObject sqlQueryObject = buildSqlRemoteStoreKeyEntries(tipoDatabase, filtroKid, filtroClientId, filtroOrganizzazione);
  888.             sqlQueryObject.addOrderBy(COLUMN_DATA_REGISTRAZIONE, false);
  889.             sqlQueryObject.setOffset(offset);
  890.             sqlQueryObject.setLimit(limit);
  891.             String sqlQuery = sqlQueryObject.createSQLQuery();
  892.             selectStmt = con.prepareStatement(sqlQuery);
  893.             selectStmt.setLong(1, idRemoteStore);
  894.             selectRS = selectStmt.executeQuery();
  895.             while(selectRS.next()) {
  896.                 list.add(readKeyEntry(log, selectRS, jdbcAdapter));
  897.             }
  898.         }
  899.         catch(Exception e) {
  900.             throw new KeystoreException(e.getMessage(),e);
  901.         }
  902.         finally {
  903.            
  904.             JDBCUtilities.closeResources(selectRS, selectStmt);
  905.         }
  906.        
  907.         return list;
  908.     }
  909.    
  910.     private static ISQLQueryObject buildSqlRemoteStoreKeyEntries(String tipoDatabase, String filtroKid, String filtroClientId, String filtroOrganizzazione) throws KeystoreException {
  911.         ISQLQueryObject sqlQueryObject = null;
  912.         try {
  913.             sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDatabase);
  914.             sqlQueryObject.addFromTable(CostantiDB.REMOTE_STORE_KEY);
  915.             sqlQueryObject.addWhereCondition(COLUMN_ID_REMOTE_STORE+"=?");
  916.             if(filtroKid!=null) {
  917.                 if(filtroKid.equals("-")) {
  918.                     sqlQueryObject.addWhereLikeCondition(COLUMN_KID, PDNDResolver.REMOTE_STORE_KEY_KID_STARTS_WITH_CLIENT_ID, LikeConfig.startsWith(false));
  919.                 }
  920.                 else {
  921.                     sqlQueryObject.addWhereLikeCondition(COLUMN_KID, filtroKid, LikeConfig.contains(true));
  922.                 }
  923.             }
  924.             if(filtroClientId!=null) {
  925.                 if(filtroClientId.equals("-")) {
  926.                     sqlQueryObject.addWhereIsNullCondition(COLUMN_CLIENT_ID);
  927.                 }
  928.                 else {
  929.                     sqlQueryObject.addWhereLikeCondition(COLUMN_CLIENT_ID, filtroClientId, LikeConfig.contains(true));
  930.                 }
  931.             }
  932.             if(filtroOrganizzazione!=null) {
  933.                 if(filtroOrganizzazione.equals("-")) {
  934.                     sqlQueryObject.addWhereIsNullCondition(COLUMN_ORGANIZATION_DETAILS);
  935.                 }
  936.                 else {
  937.                     sqlQueryObject.addWhereLikeCondition(COLUMN_ORGANIZATION_DETAILS, filtroOrganizzazione, LikeConfig.contains(true));
  938.                 }
  939.             }
  940.             sqlQueryObject.setANDLogicOperator(true);
  941.         }
  942.         catch(Exception e) {
  943.             throw new KeystoreException(e.getMessage(),e);
  944.         }
  945.         return sqlQueryObject;
  946.     }
  947.    
  948.     private static RemoteStoreKeyEntry readKeyEntry(Logger log, ResultSet selectRS, IJDBCAdapter jdbcAdapter) throws SQLException, UtilsException {
  949.         long id = selectRS.getLong(COLUMN_ID);
  950.         long idStore = selectRS.getLong(COLUMN_ID_REMOTE_STORE);
  951.         Date dataRegistrazione = selectRS.getTimestamp(COLUMN_DATA_REGISTRAZIONE);
  952.        
  953.         String kid = selectRS.getString(COLUMN_KID);
  954.         Date dataAggiornamento = selectRS.getTimestamp(COLUMN_DATA_AGGIORNAMENTO);
  955.        
  956.         String clientId =  selectRS.getString(COLUMN_CLIENT_ID);
  957.         String clientDetails = selectRS.getString(COLUMN_CLIENT_DETAILS);
  958.         String organizationDetails = selectRS.getString(COLUMN_ORGANIZATION_DETAILS);
  959.         Date clientDataAggiornamento = selectRS.getTimestamp(COLUMN_CLIENT_DATA_AGGIORNAMENTO);
  960.        
  961.         RemoteStoreKeyEntry rs = new RemoteStoreKeyEntry();
  962.         rs.setId(id);
  963.         rs.setDataRegistrazione(dataRegistrazione);
  964.         rs.setIdRemoteStore(idStore);
  965.        
  966.         rs.setContentKey(jdbcAdapter.getBinaryData(selectRS, COLUMN_KEY));
  967.         rs.setKid(kid);
  968.         rs.setDataAggiornamento(dataAggiornamento);
  969.        
  970.         rs.setClientId(clientId);
  971.         rs.setClientDetails(clientDetails);
  972.         rs.setOrganizationDetails(organizationDetails);
  973.         rs.setClientDataAggiornamento(clientDataAggiornamento);
  974.        
  975.         enrichOrganizationInfo(log, organizationDetails, rs);
  976.         return rs;
  977.     }
  978.    
  979.     private static void enrichOrganizationInfo(Logger log, String organizationDetails, RemoteStoreKeyEntry rs) {
  980.         if(organizationDetails!=null) {
  981.             try {
  982.                 rs.setOrganizationName(JsonPathExpressionEngine.extractAndConvertResultAsString(organizationDetails, "$.name", log));
  983.             }catch(Exception e) {
  984.                 // ignore
  985.             }
  986.             try {
  987.                 rs.setOrganizationExternalOrigin(JsonPathExpressionEngine.extractAndConvertResultAsString(organizationDetails, "$.externalId.origin", log));
  988.             }catch(Exception e) {
  989.                 // ignore
  990.             }
  991.             try {
  992.                 rs.setOrganizationExternalId(JsonPathExpressionEngine.extractAndConvertResultAsString(organizationDetails, "$.externalId.id", log));
  993.             }catch(Exception e) {
  994.                 // ignore
  995.             }
  996.             try {
  997.                 rs.setOrganizationCategory(JsonPathExpressionEngine.extractAndConvertResultAsString(organizationDetails, "$.category", log));
  998.             }catch(Exception e) {
  999.                 // ignore
  1000.             }
  1001.         }
  1002.     }
  1003.    
  1004.    
  1005.     public static int deleteRemoteStoreKeyEntry(DriverConfigurazioneDB driverConfigurazioneDB, long idRemoteStore, long idEntry) throws KeystoreException {
  1006.         Connection con = null;
  1007.         try {
  1008.             con = driverConfigurazioneDB.getConnection("deleteRemoteStoreKeyEntry");
  1009.             return deleteRemoteStoreKeyEntry(con, driverConfigurazioneDB.getTipoDB(), idRemoteStore, idEntry);
  1010.         }
  1011.         catch(Exception e) {
  1012.             throw new KeystoreException(e.getMessage(),e);
  1013.         }
  1014.         finally {
  1015.             driverConfigurazioneDB.releaseConnection(con);
  1016.         }
  1017.     }
  1018.     public static int deleteRemoteStoreKeyEntry(Connection con, String tipoDatabase, long idRemoteStore, long idEntry) throws KeystoreException {
  1019.         PreparedStatement updateStmt = null;
  1020.         try {
  1021.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDatabase);
  1022.             sqlQueryObject.addDeleteTable(CostantiDB.REMOTE_STORE_KEY);
  1023.             sqlQueryObject.addWhereCondition(COLUMN_ID_REMOTE_STORE+"=?");
  1024.             sqlQueryObject.addWhereCondition(COLUMN_ID+"=?");
  1025.             sqlQueryObject.setANDLogicOperator(true);
  1026.             String updateQuery = sqlQueryObject.createSQLDelete();
  1027.             updateStmt = con.prepareStatement(updateQuery);
  1028.             updateStmt.setLong(1, idRemoteStore);
  1029.             updateStmt.setLong(2, idEntry);
  1030.             int rows = updateStmt.executeUpdate();
  1031.             updateStmt.close();
  1032.             return rows;
  1033.         }
  1034.         catch(Exception e) {
  1035.             throw new KeystoreException(e.getMessage(),e);
  1036.         }
  1037.         finally {
  1038.             JDBCUtilities.closeResources(updateStmt);
  1039.         }
  1040.     }
  1041.    
  1042.     public static RemoteStoreKeyEntry getRemoteStoreKeyEntry(Logger log, DriverConfigurazioneDB driverConfigurazioneDB, long idRemoteStoreKey) throws KeystoreException, KeystoreNotFoundException {
  1043.         Connection con = null;
  1044.         try {
  1045.             con = driverConfigurazioneDB.getConnection("getRemoteStoreKeyEntry");
  1046.             return getRemoteStoreKeyEntry(log, con, driverConfigurazioneDB.getTipoDB(), idRemoteStoreKey);
  1047.         }
  1048.         catch(Exception e) {
  1049.             throw new KeystoreException(e.getMessage(),e);
  1050.         }
  1051.         finally {
  1052.             driverConfigurazioneDB.releaseConnection(con);
  1053.         }
  1054.     }
  1055.    
  1056.     public static RemoteStoreKeyEntry getRemoteStoreKeyEntry(Logger log, Connection con, String tipoDatabase, long idRemoteStoreKey) throws KeystoreException,KeystoreNotFoundException {
  1057.        
  1058.         PreparedStatement selectStmt = null;
  1059.         ResultSet selectRS = null;
  1060.         try {
  1061.             IJDBCAdapter jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(tipoDatabase);
  1062.            
  1063.             ISQLQueryObject sqlQueryObject = SQLObjectFactory.createSQLQueryObject(tipoDatabase);
  1064.             sqlQueryObject.addFromTable(CostantiDB.REMOTE_STORE_KEY);
  1065.             sqlQueryObject.addWhereCondition(COLUMN_ID+"=?");
  1066.             sqlQueryObject.setANDLogicOperator(true);
  1067.             String sqlQuery = sqlQueryObject.createSQLQuery();
  1068.             selectStmt = con.prepareStatement(sqlQuery);
  1069.             selectStmt.setLong(1, idRemoteStoreKey);
  1070.             selectRS = selectStmt.executeQuery();
  1071.             if(selectRS.next()) {
  1072.                 return readKeyEntry(log, selectRS, jdbcAdapter);
  1073.             }
  1074.             throw new KeystoreNotFoundException("Key with id '"+idRemoteStoreKey+"'"+SUFFIX_NOT_FOUND);
  1075.         }
  1076.         catch(KeystoreNotFoundException e) {
  1077.             throw e;
  1078.         }
  1079.         catch(Exception e) {
  1080.             throw new KeystoreException(e.getMessage(),e);
  1081.         }
  1082.         finally {
  1083.             JDBCUtilities.closeResources(selectRS, selectStmt);
  1084.         }
  1085.     }
  1086. }