PolicyGroupByActiveThreadsDB.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.controllo_traffico.policy.driver;

  21. import java.io.ByteArrayOutputStream;
  22. import java.io.InputStream;
  23. import java.io.Serializable;
  24. import java.security.SecureRandom;
  25. import java.sql.Connection;
  26. import java.sql.PreparedStatement;
  27. import java.sql.ResultSet;
  28. import java.sql.Timestamp;
  29. import java.util.Date;
  30. import java.util.HashMap;
  31. import java.util.Iterator;
  32. import java.util.List;

  33. import org.openspcoop2.core.commons.DBUtils;
  34. import org.openspcoop2.core.controllo_traffico.beans.ActivePolicy;
  35. import org.openspcoop2.core.controllo_traffico.beans.DatiCollezionati;
  36. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupBy;
  37. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicy;
  38. import org.openspcoop2.core.controllo_traffico.beans.MisurazioniTransazione;
  39. import org.openspcoop2.core.controllo_traffico.beans.UniqueIdentifierUtilities;
  40. import org.openspcoop2.core.controllo_traffico.constants.Costanti;
  41. import org.openspcoop2.core.controllo_traffico.driver.IPolicyGroupByActiveThreadsInMemory;
  42. import org.openspcoop2.core.controllo_traffico.driver.PolicyException;
  43. import org.openspcoop2.core.controllo_traffico.driver.PolicyGroupByActiveThreadsType;
  44. import org.openspcoop2.core.controllo_traffico.driver.PolicyNotFoundException;
  45. import org.openspcoop2.core.id.IDSoggetto;
  46. import org.openspcoop2.pdd.config.DBManager;
  47. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  48. import org.openspcoop2.pdd.config.Resource;
  49. import org.openspcoop2.pdd.core.controllo_traffico.policy.PolicyDateUtils;
  50. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  51. import org.openspcoop2.protocol.sdk.state.IState;
  52. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  53. import org.openspcoop2.protocol.sdk.state.StateMessage;
  54. import org.openspcoop2.protocol.utils.EsitiProperties;
  55. import org.openspcoop2.utils.Map;
  56. import org.openspcoop2.utils.SemaphoreLock;
  57. import org.openspcoop2.utils.Utilities;
  58. import org.openspcoop2.utils.UtilsException;
  59. import org.openspcoop2.utils.date.DateManager;
  60. import org.openspcoop2.utils.date.DateUtils;
  61. import org.openspcoop2.utils.jdbc.IJDBCAdapter;
  62. import org.openspcoop2.utils.jdbc.JDBCAdapterFactory;
  63. import org.openspcoop2.utils.jdbc.JDBCUtilities;
  64. import org.openspcoop2.utils.serialization.JavaDeserializer;
  65. import org.openspcoop2.utils.serialization.JavaSerializer;
  66. import org.openspcoop2.utils.sql.ISQLQueryObject;
  67. import org.openspcoop2.utils.sql.SQLObjectFactory;
  68. import org.slf4j.Logger;

  69. /**    
  70.  * PolicyGroupByActiveThreads
  71.  *
  72.  * @author Poli Andrea (poli@link.it)
  73.  * @author $Author$
  74.  * @version $Rev$, $Date$
  75.  */
  76. public class PolicyGroupByActiveThreadsDB implements Serializable,IPolicyGroupByActiveThreadsInMemory {

  77.     /**
  78.      *
  79.      */
  80.     private static final long serialVersionUID = 1L;
  81.    
  82.     private static final String CT_MAP_TABLE = "ct_map";
  83.     private static final String CT_MAP_COLUMN_KEY = "map_key";
  84.     private static final String CT_MAP_COLUMN_UPDATE_TIME = "map_update_time";
  85.     private static final String CT_MAP_COLUMN_VALUE = "map_value";

  86.     private static java.util.Random _rnd = null;
  87.     private static synchronized void initRandom() {
  88.         if(_rnd==null) {
  89.             _rnd = new SecureRandom();
  90.         }
  91.     }
  92.     public static java.util.Random getRandom() {
  93.         if(_rnd==null) {
  94.             initRandom();
  95.         }
  96.         return _rnd;
  97.     }
  98.    
  99.     private boolean mapExists = false;
  100.    
  101.     private ActivePolicy activePolicy;
  102.     private PolicyGroupByActiveThreadsType tipoGestore;
  103.     private String uniqueIdMap_idActivePolicy;
  104.     private Date uniqueIdMap_updateTime;
  105.     private IState state;
  106.     private IDSoggetto dominio;
  107.     private String idTransazione;
  108.     private transient OpenSPCoop2Properties _op2Properties;
  109.     private String tipoDatabase;
  110.     private IJDBCAdapter jdbcAdapter;
  111.     private transient JavaSerializer _javaSerializer = null;
  112.     private transient JavaDeserializer _javaDeserializer = null;
  113.     private Logger log;
  114.     private Logger logSql;
  115.     private boolean debug;
  116.     private boolean transactionMode = true;
  117.    
  118.     private long attesaAttivaJDBC;
  119.     private int checkIntervalloJDBC;

  120.     public PolicyGroupByActiveThreadsDB(ActivePolicy activePolicy, PolicyGroupByActiveThreadsType tipoGestore, String uniqueIdMap, IState state,IDSoggetto dominio, String idTransazione) throws PolicyException {
  121.         this.activePolicy = activePolicy;
  122.         this.tipoGestore = tipoGestore;
  123.         this.uniqueIdMap_idActivePolicy = UniqueIdentifierUtilities.extractIdActivePolicy(uniqueIdMap);
  124.         try {
  125.             this.uniqueIdMap_updateTime = UniqueIdentifierUtilities.extractUpdateTimeActivePolicy(uniqueIdMap);
  126.         }catch(Exception e) {
  127.             throw new PolicyException(e.getMessage(),e);
  128.         }
  129.         this.state = state;
  130.         this.dominio = dominio;
  131.         this.idTransazione = idTransazione;
  132.         this._op2Properties = OpenSPCoop2Properties.getInstance();
  133.         this.tipoDatabase = this._op2Properties.getDatabaseType();
  134.         try {
  135.             this.jdbcAdapter = JDBCAdapterFactory.createJDBCAdapter(this.tipoDatabase);
  136.         }catch(Exception e){
  137.             throw new PolicyException("[createJDBCAdapter] "+e.getMessage(),e);
  138.         }
  139.         this._javaSerializer = new JavaSerializer();
  140.         this._javaDeserializer = new JavaDeserializer();
  141.         this.debug = this._op2Properties.isControlloTrafficoDebug();
  142.         this.log = OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTraffico(this.debug);
  143.         this.logSql = OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTrafficoSql(this.debug);
  144.        
  145.         this.transactionMode = this._op2Properties.isControlloTrafficoGestorePolicyInMemoryDatabaseUseTransaction();
  146.         this.attesaAttivaJDBC = this._op2Properties.getControlloTrafficoGestorePolicyInMemoryDatabaseSerializableDBAttesaAttiva();
  147.         this.checkIntervalloJDBC = this._op2Properties.getControlloTrafficoGestorePolicyInMemoryDatabaseSerializableDBCheckInterval();
  148.                
  149.     }
  150.    
  151.     private synchronized void initJavaSerializer() {
  152.         if(this._javaSerializer==null) {
  153.             this._javaSerializer = new JavaSerializer();
  154.         }
  155.     }
  156.     public JavaSerializer getJavaSerializer(){
  157.         if(this._javaSerializer==null) {
  158.             initJavaSerializer();
  159.         }
  160.         return this._javaSerializer;
  161.     }
  162.    
  163.     private synchronized void initJavaDeserializer() {
  164.         if(this._javaDeserializer==null) {
  165.             this._javaDeserializer = new JavaDeserializer();
  166.         }
  167.     }
  168.     public JavaDeserializer getJavaDeserializer(){
  169.         if(this._javaDeserializer==null) {
  170.             initJavaDeserializer();
  171.         }
  172.         return this._javaDeserializer;
  173.     }
  174.    
  175.     private synchronized void initOpenSPCoop2Properties() {
  176.         if(this._op2Properties==null) {
  177.             this._op2Properties = OpenSPCoop2Properties.getInstance();
  178.         }
  179.     }
  180.     public OpenSPCoop2Properties getOpenSPCoop2Properties(){
  181.         if(this._op2Properties==null) {
  182.             initOpenSPCoop2Properties();
  183.         }
  184.         return this._op2Properties;
  185.     }
  186.    
  187.    
  188.    
  189.     @Override
  190.     public ActivePolicy getActivePolicy() {
  191.         return this.activePolicy;
  192.     }
  193.    
  194.     @Override
  195.     public java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> getMapActiveThreads(){
  196.        
  197.         PolicyConnessioneRuntime resource = null;
  198.         try {
  199.             resource = getConnessione(this.state, this.dominio, "getMapActiveThreads", this.idTransazione, null);
  200.            
  201.             //checkMap(resource.con);
  202.            
  203.             return _getMapActiveThreads(resource.con);
  204.            
  205.         }
  206.         catch(Throwable e) {
  207.             this.log.error(e.getMessage(),e);
  208.             throw new RuntimeException(e.getMessage(),e);
  209.         }
  210.         finally {
  211.             if(resource!=null) {
  212.                 releaseConnessione(resource, this.dominio, "getMapActiveThreads", null);
  213.             }
  214.         }
  215.     }
  216.    
  217.     @Override
  218.     public void initMap(java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> map) {
  219.        
  220.         // Non serve essendo giĆ  persistente, si rischia di salvare una precedente immagine.
  221.        
  222.         /*
  223.         if(map!=null && map.size()>0){
  224.             PolicyConnessioneRuntime resource = null;
  225.             try {
  226.                 resource = getConnessione(this.state, this.dominio, "initMap", this.idTransazione);
  227.                
  228.                 checkMap(resource.con);
  229.                
  230.                 _initMap(resource.con, map);
  231.                
  232.             }
  233.             catch(Throwable e) {
  234.                 this.log.error(e.getMessage(),e);
  235.                 throw new RuntimeException(e.getMessage(),e);
  236.             }
  237.             finally {
  238.                 if(resource!=null) {
  239.                     releaseConnessione(resource, this.dominio, "initMap");
  240.                 }
  241.             }
  242.         }
  243.         */
  244.        
  245.     }
  246.    
  247.     @Override
  248.     public void resetCounters(){
  249.        
  250.         PolicyConnessioneRuntime resource = null;
  251.         try {
  252.             resource = getConnessione(this.state, this.dominio, "resetCounters", this.idTransazione, null);
  253.            
  254.             //checkMap(resource.con);
  255.            
  256.             _resetCounters(resource.con);
  257.            
  258.         }
  259.         catch(Throwable e) {
  260.             this.log.error(e.getMessage(),e);
  261.             throw new RuntimeException(e.getMessage(),e);
  262.         }
  263.         finally {
  264.             if(resource!=null) {
  265.                 releaseConnessione(resource, this.dominio, "resetCounters", null);
  266.             }
  267.         }
  268.        
  269.     }
  270.    
  271.     @Override
  272.     public void remove() throws UtilsException{
  273.        
  274.         PolicyConnessioneRuntime resource = null;
  275.         try {
  276.             resource = getConnessione(this.state, this.dominio, "remove", this.idTransazione, null);
  277.            
  278.             //checkMap(resource.con);
  279.            
  280.             _remove(resource.con);
  281.            
  282.         }
  283.         catch(Throwable e) {
  284.             this.log.error(e.getMessage(),e);
  285.             throw new RuntimeException(e.getMessage(),e);
  286.         }
  287.         finally {
  288.             if(resource!=null) {
  289.                 releaseConnessione(resource, this.dominio, "remove", null);
  290.             }
  291.         }
  292.        
  293.     }
  294.    
  295.     @Override
  296.     public DatiCollezionati registerStartRequest(Logger log, String idTransazione, IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx) throws PolicyException{
  297.        
  298.         PolicyConnessioneRuntime resource = null;
  299.         DatiCollezionati datiCollezionatiReaded = null;
  300.         try {
  301.             resource = getConnessione(this.state, this.dominio, "registerStartRequest", idTransazione, ctx);
  302.            
  303.             checkMap(resource.con);
  304.            
  305.             // mi salvo fuori dal synchronized l'attuale stato
  306.             datiCollezionatiReaded = _registerStartRequest(resource.con, log, idTransazione, datiGroupBy, ctx);
  307.            
  308.         }finally {
  309.             if(resource!=null) {
  310.                 releaseConnessione(resource, this.dominio, "registerStartRequest", ctx);
  311.             }
  312.         }
  313.        
  314.         // Tutti i restanti controlli sono effettuati usando il valore di datiCollezionatiReaded, che e' gia' stato modificato
  315.         // Inoltre e' stato re-inserito nella map come oggetto nuovo, quindi il valore dentro il metodo non subira' trasformazioni (essendo stato fatto il deserialize da db)
  316.         // E' possibile procedere con l'analisi rispetto al valore che possiedono il counter dentro questo scope.
  317.        
  318.         return datiCollezionatiReaded;

  319.     }
  320.    
  321.     @Override
  322.     public DatiCollezionati updateDatiStartRequestApplicabile(Logger log, String idTransazione, IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx) throws PolicyException,PolicyNotFoundException{
  323.        
  324.         PolicyConnessioneRuntime resource = null;
  325.         DatiCollezionati datiCollezionatiReaded = null;
  326.         try {
  327.             resource = getConnessione(this.state, this.dominio, "updateDatiStartRequestApplicabile", idTransazione, ctx);
  328.            
  329.             //checkMap(resource.con);
  330.            
  331.             // mi salvo fuori dal synchronized l'attuale stato
  332.             datiCollezionatiReaded = _updateDatiStartRequestApplicabile(resource.con, log, idTransazione, datiGroupBy, ctx);
  333.            
  334.         }finally {
  335.             if(resource!=null) {
  336.                 releaseConnessione(resource, this.dominio, "updateDatiStartRequestApplicabile", ctx);
  337.             }
  338.         }
  339.        
  340.         // Tutti i restanti controlli sono effettuati usando il valore di datiCollezionatiReaded, che e' gia' stato modificato
  341.         // Inoltre e' stato re-inserito nella map come oggetto nuovo, quindi il valore dentro il metodo non subira' trasformazioni (essendo stato fatto il deserialize da db)
  342.         // E' possibile procedere con l'analisi rispetto al valore che possiedono il counter dentro questo scope.
  343.        
  344.         return datiCollezionatiReaded;

  345.     }
  346.    
  347.     @Override
  348.     public void registerStopRequest(Logger log, String idTransazione,IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx,
  349.             MisurazioniTransazione dati, boolean isApplicabile, boolean isViolata) throws PolicyException,PolicyNotFoundException{
  350.        
  351.         PolicyConnessioneRuntime resource = null;
  352.         try {
  353.             resource = getConnessione(this.state, this.dominio, "registerStopRequest", idTransazione, ctx);
  354.            
  355.             //checkMap(resource.con);
  356.            
  357.             _registerStopRequest(resource.con, log, idTransazione,datiGroupBy, ctx,
  358.                     dati, isApplicabile, isViolata);
  359.            
  360.         }finally {
  361.             if(resource!=null) {
  362.                 releaseConnessione(resource, this.dominio, "registerStopRequest", ctx);
  363.             }
  364.         }
  365.        
  366.     }

  367.    
  368.     @Override
  369.     public long getActiveThreads(){
  370.         return this.getActiveThreads(null);
  371.     }
  372.     @Override
  373.     public long getActiveThreads(IDUnivocoGroupByPolicy filtro){
  374.        
  375.         PolicyConnessioneRuntime resource = null;
  376.         try {
  377.             resource = getConnessione(this.state, this.dominio, "getActiveThreads", this.idTransazione, null);
  378.            
  379.             //checkMap(resource.con);
  380.            
  381.             return _getActiveThreads(resource.con, filtro);
  382.            
  383.         }
  384.         catch(Throwable e) {
  385.             this.log.error(e.getMessage(),e);
  386.             throw new RuntimeException(e.getMessage(),e);
  387.         }
  388.         finally {
  389.             if(resource!=null) {
  390.                 releaseConnessione(resource, this.dominio, "getActiveThreads", null);
  391.             }
  392.         }
  393.        
  394.     }
  395.    
  396.     @Override
  397.     public String printInfos(Logger log, String separatorGroups) throws UtilsException{
  398.        
  399.         PolicyConnessioneRuntime resource = null;
  400.         try {
  401.             resource = getConnessione(this.state, this.dominio, "printInfos", this.idTransazione, null);
  402.            
  403.             //checkMap(resource.con);
  404.            
  405.             return _printInfos(resource.con, log, separatorGroups);
  406.            
  407.         }
  408.         catch(Throwable e) {
  409.             this.log.error(e.getMessage(),e);
  410.             throw new RuntimeException(e.getMessage(),e);
  411.         }
  412.         finally {
  413.             if(resource!=null) {
  414.                 releaseConnessione(resource, this.dominio, "printInfos", null);
  415.             }
  416.         }
  417.        
  418.     }
  419.    
  420.     private PolicyConnessioneRuntime getConnessione(IState state,IDSoggetto dominio, String funzione, String idTransazione, Map<Object> ctx) throws PolicyException {
  421.        
  422.         DBManager dbManager = null;
  423.         Resource r = null;
  424.         String modulo = null;
  425.         try {
  426.             Connection con = null;
  427.                
  428.             if(state!=null) {
  429.                 if(state instanceof StateMessage) {
  430.                     StateMessage s = (StateMessage) state;
  431.                     if(s.getConnectionDB()!=null && !s.getConnectionDB().isClosed()) {
  432.                         con = s.getConnectionDB();
  433.                         if(con!=null) {
  434.                             PolicyConnessioneRuntime cr = new PolicyConnessioneRuntime();
  435.                             cr.con = con;
  436.                             return cr;
  437.                         }
  438.                     }
  439.                 }
  440.             }
  441.            
  442.             if(dominio==null) {
  443.                
  444.                 String protocolName = null;
  445.                 if(ctx!=null && ctx.containsKey(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME)) {
  446.                     protocolName = (String) ctx.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME);
  447.                 }
  448.                
  449.                 RequestInfo requestInfo = null;
  450.                 if(ctx!=null && ctx.containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
  451.                     requestInfo = (RequestInfo) ctx.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  452.                 }
  453.                
  454.                 dominio = OpenSPCoop2Properties.getInstance().getIdentitaPortaDefault(protocolName, requestInfo);
  455.             }
  456.            
  457.             modulo = "RateLimitingActiveThreadsDB"+"."+funzione;
  458.             dbManager = DBManager.getInstance();
  459.             r = dbManager.getResource(dominio, modulo, idTransazione);
  460.             if(r==null){
  461.                 throw new Exception("Risorsa al database non disponibile");
  462.             }
  463.             con = (Connection) r.getResource();
  464.             if(con == null)
  465.                 throw new Exception("Connessione non disponibile");
  466.            
  467.             PolicyConnessioneRuntime cr = new PolicyConnessioneRuntime();
  468.             cr.con = con;
  469.             cr.r = r;
  470.             return cr;
  471.         }catch(Throwable e) {
  472.             if(r!=null) {
  473.                 try {
  474.                     dbManager.releaseResource(dominio, modulo, r);
  475.                 }catch(Throwable eClose) {
  476.                     // ignore
  477.                 }
  478.             }
  479.             throw new PolicyException(e.getMessage(),e);
  480.         }
  481.        
  482.     }
  483.    
  484.     private void releaseConnessione(PolicyConnessioneRuntime p, IDSoggetto dominio, String funzione, Map<Object> ctx) {
  485.         if(p.r!=null) {
  486.             if(dominio==null) {
  487.                 String protocolName = null;
  488.                 if(ctx!=null && ctx.containsKey(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME)) {
  489.                     protocolName = (String) ctx.getObject(org.openspcoop2.core.constants.Costanti.PROTOCOL_NAME);
  490.                 }              
  491.                
  492.                 RequestInfo requestInfo = null;
  493.                 if(ctx!=null && ctx.containsKey(org.openspcoop2.core.constants.Costanti.REQUEST_INFO)) {
  494.                     requestInfo = (RequestInfo) ctx.getObject(org.openspcoop2.core.constants.Costanti.REQUEST_INFO);
  495.                 }
  496.                
  497.                 dominio = OpenSPCoop2Properties.getInstance().getIdentitaPortaDefault(protocolName, requestInfo);
  498.             }
  499.             DBManager.getInstance().releaseResource(dominio, "RateLimitingActiveThreadsDB"+"."+funzione, p.r);
  500.         }
  501.     }
  502.    
  503.     private transient org.openspcoop2.utils.Semaphore _lock_checkMap = null;
  504.     private synchronized void initLockCheckMap() {
  505.         if(this._lock_checkMap==null) {
  506.             this._lock_checkMap = new org.openspcoop2.utils.Semaphore("PolicyGroupByActiveThreadsDB_checkMap");
  507.         }
  508.     }
  509.     public org.openspcoop2.utils.Semaphore getLockCheckMap(){
  510.         if(this._lock_checkMap==null) {
  511.             initLockCheckMap();
  512.         }
  513.         return this._lock_checkMap;
  514.     }
  515.    
  516.     private void checkMap(Connection con) throws PolicyException {
  517.         if(!this.mapExists) {
  518.             _checkMap(con);
  519.         }
  520.     }
  521.     private void _checkMap(Connection con) throws PolicyException {
  522.        
  523.         SemaphoreLock lock = this.getLockCheckMap().acquireThrowRuntime("checkMap");
  524.         try {

  525.             if(!this.mapExists) {
  526.            
  527.                 PreparedStatement pstmt = null;
  528.                 ResultSet rs = null;
  529.                 try {
  530.                
  531.                     ISQLQueryObject sqlGet = SQLObjectFactory.createSQLQueryObject(this.tipoDatabase);
  532.                     sqlGet.addSelectField(CT_MAP_COLUMN_KEY);
  533.                     sqlGet.addFromTable(CT_MAP_TABLE);
  534.                     sqlGet.setANDLogicOperator(true);
  535.                     sqlGet.addWhereCondition(CT_MAP_COLUMN_KEY+"=?");
  536.                     String query = sqlGet.createSQLQuery();
  537.                     if(this.debug) {
  538.                         this.logSql.debug("[checkMap"+""+this.idTransazione+"] execute "+DBUtils.formatSQLString(query, this.uniqueIdMap_idActivePolicy));
  539.                     }
  540.                     pstmt = con.prepareStatement(query);
  541.                     pstmt.setString(1, this.uniqueIdMap_idActivePolicy);
  542.                     rs = pstmt.executeQuery();
  543.                     if(rs == null) {
  544.                         pstmt.close();
  545.                         throw new UtilsException("CheckMap failed: ResultSet is null?");        
  546.                     }
  547.                     boolean exist = rs.next();
  548.                     if(this.debug) {
  549.                         this.logSql.debug("[checkMap"+""+this.idTransazione+"] executed (result:"+exist+") "+DBUtils.formatSQLString(query, this.uniqueIdMap_idActivePolicy));
  550.                     }
  551.                     rs.close();
  552.                     pstmt.close();
  553.                    
  554.                     if(!exist) {
  555.                        
  556.                         try{
  557.                             if(con.isClosed()){
  558.                                 throw new UtilsException("Connessione risulta giĆ  chiusa");
  559.                             }
  560.                         }catch(Exception e){
  561.                             throw new UtilsException("CheckMap failed: connection closed; "+e.getMessage(),e);
  562.                         }

  563.                         boolean originalConnectionAutocommit = false;
  564.                         boolean autoCommitModificato = false;
  565.                         try{
  566.                             originalConnectionAutocommit = con.getAutoCommit();
  567.                         }catch(Exception e){
  568.                             throw new UtilsException("CheckMap failed: autocommit mode disabled; "+e.getMessage(),e);
  569.                         }
  570.                         if(originalConnectionAutocommit==false){
  571.                             throw new UtilsException("CheckMap failed: autocommit mode disabled; non e' possibile fornire una connessione con autocommit disabilitato poiche' l'utility ha necessita' di effettuare operazioni di commit/rollback)");      
  572.                         }
  573.                        
  574.                         int originalConnectionTransactionIsolation = -1;
  575.                         boolean transactionIsolationModificato = false;
  576.                         try{
  577.                             originalConnectionTransactionIsolation = con.getTransactionIsolation();
  578.                         }catch(Exception e){
  579.                             throw new UtilsException("Lettura livello di isolamento transazione della Connessione non riuscito: "+e.getMessage(),e);
  580.                         }
  581.                        
  582.                         try {
  583.                            
  584.                             try{                

  585.                                 //System.out.println("SET TRANSACTION SERIALIZABLE ("+conDB.getTransactionIsolation()+","+conDB.getAutoCommit()+")");
  586.                                 // Il rollback, non servirebbe, pero le WrappedConnection di JBoss hanno un bug, per cui alcune risorse non vengono rilasciate.
  587.                                 // Con il rollback tali risorse vengono rilasciate, e poi effettivamente la ConnectionSottostante emette una eccezione.
  588.                                 try{
  589.                                     con.rollback();
  590.                                 }catch(Exception e){
  591.                                     //System.out.println("ROLLBACK ERROR: "+e.getMessage());
  592.                                 }
  593.                                
  594.                                 JDBCUtilities.setTransactionIsolationSerializable(this.tipoDatabase, con);
  595.                                 transactionIsolationModificato = true;
  596.                                                                
  597.                                 if(originalConnectionAutocommit){
  598.                                     con.setAutoCommit(false);
  599.                                     autoCommitModificato = true;
  600.                                 }
  601.                                
  602.                             } catch(Exception er) {
  603.                                 throw new UtilsException("CheckMap failed: setting connection error; "+er.getMessage(),er);    
  604.                             }
  605.                            
  606.                             long scadenzaWhile = DateManager.getTimeMillis()
  607.                                     + this.attesaAttivaJDBC;
  608.                             boolean transactionInsertFinished = false;
  609.                             int iteration = 0;
  610.                            
  611.                             while(transactionInsertFinished==false && DateManager.getTimeMillis() < scadenzaWhile){
  612.                                
  613.                                 try {
  614.                                     sqlGet = SQLObjectFactory.createSQLQueryObject(this.tipoDatabase);
  615.                                     sqlGet.addSelectField(CT_MAP_COLUMN_KEY);
  616.                                     sqlGet.addFromTable(CT_MAP_TABLE);
  617.                                     sqlGet.setANDLogicOperator(true);
  618.                                     sqlGet.addWhereCondition(CT_MAP_COLUMN_KEY+"=?");
  619.                                     sqlGet.setSelectForUpdate(true);
  620.                                    
  621.                                     query = sqlGet.createSQLQuery();
  622.                                     if(this.debug) {
  623.                                         this.logSql.debug("[checkMap"+""+this.idTransazione+"] (forUpdate) execute "+DBUtils.formatSQLString(query, this.uniqueIdMap_idActivePolicy));
  624.                                     }
  625.                                     pstmt = con.prepareStatement(query);
  626.                                     pstmt.setString(1, this.uniqueIdMap_idActivePolicy);
  627.                                     rs = pstmt.executeQuery();
  628.                                     if(rs == null) {
  629.                                         pstmt.close();
  630.                                         throw new UtilsException("CheckMap failed: ResultSet is null?");        
  631.                                     }
  632.                                     exist = rs.next();
  633.                                     if(this.debug) {
  634.                                         this.logSql.debug("[checkMap"+""+this.idTransazione+"] (forUpdate) executed (result:"+exist+") "+DBUtils.formatSQLString(query, this.uniqueIdMap_idActivePolicy));
  635.                                     }
  636.                                     //System.out.println("@check SELECT result:"+exist);
  637.                                     rs.close();
  638.                                     pstmt.close();
  639.                                    
  640.                                     if(!exist) {
  641.                                        
  642.                                         java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> mapActiveThreads = new HashMap<IDUnivocoGroupByPolicy, DatiCollezionati>();
  643.                                         ByteArrayOutputStream bout = new ByteArrayOutputStream();
  644.                                         this.getJavaSerializer().writeObject(mapActiveThreads, bout);
  645.                                         bout.flush();
  646.                                         bout.close();
  647.                                        
  648.                                         StringBuilder queryInsert = new StringBuilder();
  649.                                         ISQLQueryObject sqlInsert = SQLObjectFactory.createSQLQueryObject(this.tipoDatabase);
  650.                                         sqlInsert.addInsertTable(CT_MAP_TABLE);
  651.                                         sqlInsert.addInsertField(CT_MAP_COLUMN_KEY, "?");
  652.                                         sqlInsert.addInsertField(CT_MAP_COLUMN_UPDATE_TIME, "?");
  653.                                         sqlInsert.addInsertField(CT_MAP_COLUMN_VALUE, "?");
  654.                                         queryInsert.append(sqlInsert.createSQLInsert());
  655.                                         //System.out.println("INSERT ["+queryInsert.toString()+"]");
  656.                                        
  657.                                         if(this.debug) {
  658.                                             this.logSql.debug("[checkMap"+""+this.idTransazione+"] execute "+DBUtils.formatSQLString(queryInsert.toString(),
  659.                                                     this.uniqueIdMap_idActivePolicy,
  660.                                                     DateUtils.getSimpleDateFormatMs().format(this.uniqueIdMap_updateTime),
  661.                                                     ("blob-size:"+bout.size())));
  662.                                         }
  663.                                        
  664.                                         pstmt = con.prepareStatement(queryInsert.toString());
  665.                                         pstmt.setString(1, this.uniqueIdMap_idActivePolicy);
  666.                                         Timestamp t = new Timestamp(this.uniqueIdMap_updateTime.getTime());
  667.                                         pstmt.setTimestamp(2, t);
  668.                                         this.jdbcAdapter.setBinaryData(pstmt, 3, bout.toByteArray());
  669.                                         int rows = pstmt.executeUpdate();
  670.                                         pstmt.close();
  671.                                        
  672.                                         if(this.debug) {
  673.                                             this.logSql.debug("[checkMap"+""+this.idTransazione+"] executed (rows:"+rows+") "+DBUtils.formatSQLString(queryInsert.toString(),
  674.                                                     this.uniqueIdMap_idActivePolicy,
  675.                                                     DateUtils.getSimpleDateFormatMs().format(this.uniqueIdMap_updateTime),
  676.                                                     ("blob-size:"+bout.size())));
  677.                                         }
  678.                                        
  679.                                         //System.out.println("@check INSERT rows:"+rows);
  680.                                        
  681.                                     }
  682.                                    
  683.                                     // Chiusura Transazione
  684.                                     con.commit();
  685.    
  686.                                     // ID Costruito
  687.                                     transactionInsertFinished = true;
  688.                                    
  689.                                 } catch(Throwable e) {
  690.                                     if(this.debug) {
  691.                                         this.logSql.debug("Transaction error: "+e.getMessage(),e);
  692.                                     }
  693.                                     //System.out.println("ERRORE INSERT ("+iteration+"): "+e.getMessage());
  694.                                     //log.info("ERROR GET SERIAL SQL ["+e.getMessage()+"]");
  695.                                     try{
  696.                                         if( rs != null )
  697.                                             rs.close();
  698.                                     } catch(Exception er) {
  699.                                         // close
  700.                                     }
  701.                                     try{
  702.                                         if( pstmt != null )
  703.                                             pstmt.close();
  704.                                     } catch(Exception er) {
  705.                                         // close
  706.                                     }
  707.                                     try{
  708.                                         con.rollback();
  709.                                     } catch(Exception er) {
  710.                                         // ignore
  711.                                     }
  712.                                 }

  713.                                 if(transactionInsertFinished == false){
  714.                                     // Per aiutare ad evitare conflitti
  715.                                     try{
  716.                                         int sleep = (getRandom()).nextInt(this.checkIntervalloJDBC);
  717.                                         //System.out.println("Sleep: "+sleep);
  718.                                         Utilities.sleep(sleep); // random
  719.                                     }catch(Exception eRandom){
  720.                                         // ignore
  721.                                     }
  722.                                 }
  723.                                
  724.                                 iteration++;
  725.                                
  726.                             }
  727.                            
  728.                             if(!transactionInsertFinished) {
  729.                                 throw new Exception("Check non riuscito dopo '"+iteration+"' tentativi");
  730.                             }
  731.                            
  732.                         }
  733.                         finally{

  734.                             // Ripristino Transazione
  735.                             try{
  736.                                 if(transactionIsolationModificato){
  737.                                     con.setTransactionIsolation(originalConnectionTransactionIsolation);
  738.                                 }
  739.                                 if(autoCommitModificato){
  740.                                     con.setAutoCommit(originalConnectionAutocommit);
  741.                                 }
  742.                             } catch(Exception er) {
  743.                                 //System.out.println("ERROR UNSET:"+er.getMessage());
  744.                                 //throw new UtilsException("CheckMap failed: unsetting connection error; "+er.getMessage());
  745.                                 if(this.log!=null) {
  746.                                     this.log.error("CheckMap failed: unsetting connection error; "+er.getMessage(),er);
  747.                                 }
  748.                             }
  749.                         }
  750.                        
  751.                     }
  752.                     else {
  753.                        
  754.                         this.mapExists = true;
  755.                        
  756.                     }
  757.                    
  758.                 }catch(Throwable e) {
  759.                     throw new PolicyException(e.getMessage(),e);
  760.                 }
  761.                
  762.                
  763.                
  764.             }
  765.            
  766.         }finally {
  767.             this.getLockCheckMap().release(lock, "checkMap");
  768.         }
  769.     }
  770.    
  771.     private java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> _getMapActiveThreads(Connection con){
  772.         try {
  773.             return _updateMap(con, OperationType.getMapActiveThreads,
  774.                     this.log, this.idTransazione, null, null,
  775.                     null, false, false,
  776.                     null,
  777.                     null).map;
  778.         }catch(Throwable e) {
  779.             throw new RuntimeException(e.getMessage(),e);
  780.         }
  781.     }
  782.     @SuppressWarnings("unused")
  783.     private void _initMap(Connection con, java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> map) {
  784.         try {
  785.             if(map!=null && map.size()>0){
  786.                 _updateMap(con, OperationType.initMap,
  787.                         this.log, this.idTransazione, null, null,
  788.                         null, false, false,
  789.                         null,
  790.                         map);
  791.             }
  792.         }catch(Throwable e) {
  793.             throw new RuntimeException(e.getMessage(),e);
  794.         }
  795.     }
  796.     private DatiCollezionati _registerStartRequest(Connection con,Logger log, String idTransazione, IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx) throws PolicyException {
  797.         try {
  798.             return _updateMap(con, OperationType.registerStartRequest,
  799.                     log, idTransazione, datiGroupBy, ctx,
  800.                     null, false, false,
  801.                     null,
  802.                     null).datiCollezionatiReaded;
  803.         }catch(PolicyNotFoundException e) {
  804.             throw new PolicyException(e.getMessage(),e);
  805.         }
  806.     }
  807.     private DatiCollezionati _updateDatiStartRequestApplicabile(Connection con,Logger log, String idTransazione, IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx) throws PolicyException,PolicyNotFoundException{
  808.         return _updateMap(con, OperationType.updateDatiStartRequestApplicabile,
  809.                 log, idTransazione, datiGroupBy, ctx,
  810.                 null, false, false,
  811.                 null,
  812.                 null).datiCollezionatiReaded;
  813.     }
  814.     private void _registerStopRequest(Connection con,Logger log, String idTransazione,IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx,
  815.             MisurazioniTransazione dati, boolean isApplicabile, boolean isViolata) throws PolicyException,PolicyNotFoundException{
  816.         _updateMap(con, OperationType.registerStopRequest,
  817.                 log, idTransazione, datiGroupBy, ctx,
  818.                 dati, isApplicabile, isViolata,
  819.                 null,
  820.                 null);
  821.     }
  822.     private void _resetCounters(Connection con){
  823.         try {
  824.             _updateMap(con, OperationType.resetCounters,
  825.                     this.log, this.idTransazione, null, null,
  826.                     null, false, false,
  827.                     null,
  828.                     null);
  829.         }catch(Throwable e) {
  830.             throw new RuntimeException(e.getMessage(),e);
  831.         }
  832.     }
  833.     private void _remove(Connection con){
  834.         try {
  835.             _updateMap(con, OperationType.remove,
  836.                     this.log, this.idTransazione, null, null,
  837.                     null, false, false,
  838.                     null,
  839.                     null);
  840.         }catch(Throwable e) {
  841.             throw new RuntimeException(e.getMessage(),e);
  842.         }
  843.     }
  844.     private long _getActiveThreads(Connection con,IDUnivocoGroupByPolicy filtro){
  845.         try {
  846.             return _updateMap(con, OperationType.getActiveThreads,
  847.                     this.log, this.idTransazione, filtro, null,
  848.                     null, false, false,
  849.                     null,
  850.                     null).counter;
  851.         }catch(Throwable e) {
  852.             throw new RuntimeException(e.getMessage(),e);
  853.         }
  854.     }
  855.     private String _printInfos(Connection con,Logger log, String separatorGroups) throws UtilsException{
  856.         try {
  857.             return _updateMap(con, OperationType.printInfos,
  858.                     log, this.idTransazione, null, null,
  859.                     null, false, false,
  860.                     separatorGroups,
  861.                     null).info;
  862.         }catch(Exception e) {
  863.             throw new UtilsException(e.getMessage(),e);
  864.         }
  865.     }
  866.     @SuppressWarnings({ "unchecked"})
  867.     private UpdateResult _updateMap(Connection con, OperationType opType,
  868.             Logger log, String idTransazione, IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx,
  869.             MisurazioniTransazione dati, boolean isApplicabile, boolean isViolata,
  870.             String separatorGroups,
  871.             java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> map) throws PolicyException, PolicyNotFoundException {
  872.            
  873.         UpdateResult updateResult = new UpdateResult();
  874.        
  875.         try{
  876.             if(con.isClosed()){
  877.                 throw new UtilsException("Connessione risulta giĆ  chiusa");
  878.             }
  879.         }catch(Exception e){
  880.             throw new PolicyException("CheckMap failed: connection closed; "+e.getMessage(),e);
  881.         }

  882.         boolean originalConnectionAutocommit = false;
  883.         boolean autoCommitModificato = false;
  884.         try{
  885.             originalConnectionAutocommit = con.getAutoCommit();
  886.         }catch(Exception e){
  887.             throw new PolicyException("CheckMap failed: autocommit mode disabled; "+e.getMessage(),e);
  888.         }
  889.         if(originalConnectionAutocommit==false){
  890.             throw new PolicyException("CheckMap failed: autocommit mode disabled; non e' possibile fornire una connessione con autocommit disabilitato poiche' l'utility ha necessita' di effettuare operazioni di commit/rollback)");      
  891.         }
  892.                
  893.         try {
  894.            
  895.             if(this.transactionMode) {
  896.                 try{                
  897.    
  898.                     //System.out.println("SET TRANSACTION SERIALIZABLE ("+conDB.getTransactionIsolation()+","+conDB.getAutoCommit()+")");
  899.                     // Il rollback, non servirebbe, pero le WrappedConnection di JBoss hanno un bug, per cui alcune risorse non vengono rilasciate.
  900.                     // Con il rollback tali risorse vengono rilasciate, e poi effettivamente la ConnectionSottostante emette una eccezione.
  901.                     try{
  902.                         con.rollback();
  903.                     }catch(Exception e){
  904.                         //System.out.println("ROLLBACK ERROR: "+e.getMessage());
  905.                     }
  906.                                
  907.                     if(originalConnectionAutocommit){
  908.                         con.setAutoCommit(false);
  909.                         autoCommitModificato = true;
  910.                     }
  911.                    
  912.                 } catch(Exception er) {
  913.                     throw new PolicyException("CheckMap failed: setting connection error; "+er.getMessage(),er);        
  914.                 }
  915.             }
  916.            
  917.             long scadenzaWhile = DateManager.getTimeMillis()
  918.                     + this.attesaAttivaJDBC;
  919.             boolean transactionUpdateFinished = false;
  920.            
  921.             int iteration = 0;
  922.            
  923.             PolicyNotFoundException policyNotFoundException = null;
  924.             PolicyException policyException = null;
  925.            
  926.             while(transactionUpdateFinished==false && DateManager.getTimeMillis() < scadenzaWhile){
  927.                
  928.                 try {          
  929.                     ISQLQueryObject sqlGet = SQLObjectFactory.createSQLQueryObject(this.tipoDatabase);
  930.                     sqlGet.addSelectField(CT_MAP_COLUMN_VALUE);
  931.                     sqlGet.addSelectField(CT_MAP_COLUMN_UPDATE_TIME);
  932.                     sqlGet.addFromTable(CT_MAP_TABLE);
  933.                     sqlGet.setANDLogicOperator(true);
  934.                     sqlGet.addWhereCondition(CT_MAP_COLUMN_KEY+"=?");
  935.                     if(this.transactionMode) {
  936.                         sqlGet.setSelectForUpdate(true);
  937.                     }
  938.                    
  939.                     ResultSet rsMap = null;
  940.                     java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> mapActiveThreads = null;
  941.                     boolean updateDate = false;
  942.                     String query = sqlGet.createSQLQuery();
  943.                     if(this.debug) {
  944.                         this.logSql.debug("[updateMap"+""+this.idTransazione+"] (forUpdate) execute "+DBUtils.formatSQLString(query, this.uniqueIdMap_idActivePolicy));
  945.                     }
  946.                     try (PreparedStatement pstmtMap = con.prepareStatement(query)){
  947.                         pstmtMap.setString(1, this.uniqueIdMap_idActivePolicy);
  948.                         try{
  949.                             rsMap = pstmtMap.executeQuery();
  950.                             if(rsMap == null) {
  951.                                 throw new UtilsException("CheckMap failed: ResultSet is null?");        
  952.                             }
  953.                             boolean exist = rsMap.next();
  954.                             if(this.debug) {
  955.                                 this.logSql.debug("[updateMap"+""+this.idTransazione+"] (forUpdate) executed (result:"+exist+") "+DBUtils.formatSQLString(query, this.uniqueIdMap_idActivePolicy));
  956.                             }
  957.                             //System.out.println("@update SELECT ["+opType+"] result:"+exist);
  958.                            
  959.                             if(!exist) {
  960.                                 if(!OperationType.getMapActiveThreads.equals(opType) &&
  961.                                         !OperationType.resetCounters.equals(opType)  &&
  962.                                         !OperationType.remove.equals(opType) &&
  963.                                         !OperationType.getActiveThreads.equals(opType)  &&
  964.                                         !OperationType.printInfos.equals(opType)) {
  965.                                     throw new Exception("Map with id '"+this.uniqueIdMap_idActivePolicy+"' not found ?");
  966.                                 }
  967.                             }
  968.                             else {
  969.                                 Timestamp tCheck = rsMap.getTimestamp(CT_MAP_COLUMN_UPDATE_TIME);
  970.                                 if(this.uniqueIdMap_updateTime.equals(tCheck)) {
  971.                                     try(InputStream is = this.jdbcAdapter.getBinaryStream(rsMap, CT_MAP_COLUMN_VALUE);){
  972.                                         mapActiveThreads = (java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati>) this.getJavaDeserializer().readObject(is, java.util.Map.class);
  973.                                     }
  974.                                 }
  975.                                 else {
  976.                                     // data aggiornata
  977.                                     mapActiveThreads = new HashMap<IDUnivocoGroupByPolicy, DatiCollezionati>();
  978.                                     updateDate = true;
  979.                                 }
  980.                                 if(mapActiveThreads == null) {
  981.                                     if(!OperationType.getMapActiveThreads.equals(opType) &&
  982.                                             !OperationType.resetCounters.equals(opType)  &&
  983.                                             !OperationType.getActiveThreads.equals(opType)  &&
  984.                                             !OperationType.printInfos.equals(opType)) {
  985.                                         throw new Exception("Map with id '"+this.uniqueIdMap_idActivePolicy+"' null ?");
  986.                                     }
  987.                                 }
  988.                             }
  989.                         }finally {
  990.                             try{
  991.                                 if( rsMap != null ) {
  992.                                     rsMap.close();
  993.                                 }
  994.                             } catch(Throwable er) {
  995.                                 // close rs
  996.                             }
  997.                         }
  998.                     } // close pstmt
  999.                    
  1000.                    
  1001.                     DatiCollezionati datiCollezionati = null;
  1002.                     boolean deleteMap = false;
  1003.                     boolean updateMap = false;
  1004.                     switch (opType) {
  1005.                    
  1006.                     case getMapActiveThreads:
  1007.                        
  1008.                         updateResult.map = mapActiveThreads;
  1009.                         break;
  1010.                    
  1011.                     case initMap:
  1012.                        
  1013.                         if(map!=null && map.size()>0){
  1014.                            
  1015.                             if(mapActiveThreads == null) {
  1016.                                 throw new Exception("Map with id '"+this.uniqueIdMap_idActivePolicy+"' null ?");
  1017.                             }
  1018.                            
  1019.                             mapActiveThreads.putAll(map);
  1020.                             updateMap = true;
  1021.                         }
  1022.                        
  1023.                         break;
  1024.                        
  1025.                     case registerStartRequest:
  1026.                        
  1027.                         if(mapActiveThreads == null) {
  1028.                             throw new Exception("Map with id '"+this.uniqueIdMap_idActivePolicy+"' null ?");
  1029.                         }
  1030.                        
  1031.                         try {
  1032.                             if(mapActiveThreads.containsKey(datiGroupBy)){
  1033.                                 //System.out.println("<"+idTransazione+">registerStartRequest CHECK CONTAINS ["+datiGroupBy+"]=true");
  1034.                                 datiCollezionati = mapActiveThreads.get(datiGroupBy);  
  1035.                             }
  1036.                             else{
  1037.                                 //System.out.println("<"+idTransazione+">registerStartRequest CHECK CONTAINS ["+datiGroupBy+"]=false");
  1038.                                 Date gestorePolicyConfigDate = PolicyDateUtils.readGestorePolicyConfigDateIntoContext(ctx);
  1039.                                 datiCollezionati = new DatiCollezionati(this.activePolicy.getInstanceConfiguration().getUpdateTime(), gestorePolicyConfigDate);
  1040.                                 //System.out.println("<"+idTransazione+">registerStartRequest PUT");
  1041.                                 mapActiveThreads.put(datiGroupBy, datiCollezionati); // registro nuova immagine
  1042.                             }
  1043.                            
  1044.                             // incremento il numero di thread
  1045.                             //System.out.println("<"+idTransazione+">registerStartRequest in datiCollezionati ...");
  1046.                             datiCollezionati.registerStartRequest(log, this.activePolicy, ctx);
  1047.                             //System.out.println("<"+idTransazione+">registerStartRequest in datiCollezionati ok: "+datiCollezionati.getActiveRequestCounter());
  1048.                            
  1049.                             updateMap = true;
  1050.                            
  1051.                             // mi salvo fuori dal synchronized l'attuale stato
  1052.                             updateResult.datiCollezionatiReaded = (DatiCollezionati) datiCollezionati.newInstance();
  1053.                            
  1054.                         }catch(Exception e) {
  1055.                             policyException = new PolicyException(e.getMessage(),e);
  1056.                             transactionUpdateFinished = true;
  1057.                         }
  1058.                                                
  1059.                         break;

  1060.                     case updateDatiStartRequestApplicabile:
  1061.                        
  1062.                         if(mapActiveThreads == null) {
  1063.                             throw new Exception("Map with id '"+this.uniqueIdMap_idActivePolicy+"' null ?");
  1064.                         }
  1065.                        
  1066.                         try {
  1067.                             if(mapActiveThreads.containsKey(datiGroupBy)==false){
  1068.                                 //System.out.println("<"+idTransazione+">updateDatiStartRequestApplicabile Non sono presenti alcun threads registrati per la richiesta con dati identificativi ["+datiGroupBy.toString()+"]");
  1069.                                 policyNotFoundException = new PolicyNotFoundException("Non sono presenti alcun threads registrati per la richiesta con dati identificativi ["+datiGroupBy.toString()+"]");
  1070.                                 transactionUpdateFinished = true;
  1071.                             }
  1072.                             else{
  1073.                                 datiCollezionati = mapActiveThreads.get(datiGroupBy);  
  1074.                            
  1075.                                 // incremento il numero dei contatori
  1076.                                 //System.out.println("<"+idTransazione+">updateDatiStartRequestApplicabile updateDatiStartRequestApplicabile ...");
  1077.                                 boolean updated = datiCollezionati.updateDatiStartRequestApplicabile(log, this.activePolicy, ctx);
  1078.                                 //System.out.println("<"+idTransazione+">updateDatiStartRequestApplicabile updateDatiStartRequestApplicabile ok");
  1079.                                                        
  1080.                                 if(updated) {
  1081.                                    
  1082.                                     updateMap = true;
  1083.                                    
  1084.                                     // mi salvo fuori dal synchronized l'attuale stato
  1085.                                     updateResult.datiCollezionatiReaded = (DatiCollezionati) datiCollezionati.newInstance();
  1086.                                 }
  1087.                             }
  1088.                         }
  1089.                         catch(Exception e) {
  1090.                             policyException = new PolicyException(e.getMessage(),e);
  1091.                             transactionUpdateFinished = true;
  1092.                         }
  1093.                        
  1094.                         break;
  1095.                        
  1096.                     case registerStopRequest:
  1097.                        
  1098.                         if(mapActiveThreads == null) {
  1099.                             throw new Exception("Map with id '"+this.uniqueIdMap_idActivePolicy+"' null ?");
  1100.                         }
  1101.                        
  1102.                         try {
  1103.                             if(mapActiveThreads.containsKey(datiGroupBy)==false){
  1104.                                 //System.out.println("<"+idTransazione+">registerStopRequest Non sono presenti alcun threads registrati per la richiesta con dati identificativi ["+datiGroupBy.toString()+"]");
  1105.                                 policyNotFoundException = new PolicyNotFoundException("Non sono presenti alcun threads registrati per la richiesta con dati identificativi ["+datiGroupBy.toString()+"]");
  1106.                                 transactionUpdateFinished = true;
  1107.                             }
  1108.                             else{
  1109.                                 //System.out.println("<"+idTransazione+">registerStopRequest get ...");
  1110.                                 datiCollezionati = mapActiveThreads.get(datiGroupBy);  
  1111.                                 //System.out.println("<"+idTransazione+">registerStopRequest registerEndRequest ...");
  1112.                                 datiCollezionati.registerEndRequest(log, this.activePolicy, ctx, dati);
  1113.                                 //System.out.println("<"+idTransazione+">registerStopRequest registerEndRequest ok");
  1114.                                 if(isApplicabile){
  1115.                                     //System.out.println("<"+idTransazione+">registerStopRequest updateDatiEndRequestApplicabile ...");
  1116.                                     EsitiProperties esitiProperties = EsitiProperties.getInstanceFromProtocolName(log,dati.getProtocollo());
  1117.                                     List<Integer> esitiCodeOk = esitiProperties.getEsitiCodeOk_senzaFaultApplicativo();
  1118.                                     List<Integer> esitiCodeKo_senzaFaultApplicativo = esitiProperties.getEsitiCodeKo_senzaFaultApplicativo();
  1119.                                     List<Integer> esitiCodeFaultApplicativo = esitiProperties.getEsitiCodeFaultApplicativo();
  1120.                                     datiCollezionati.updateDatiEndRequestApplicabile(log, this.activePolicy, ctx, dati,
  1121.                                             esitiCodeOk,esitiCodeKo_senzaFaultApplicativo, esitiCodeFaultApplicativo, isViolata);
  1122.                                     //System.out.println("<"+idTransazione+">registerStopRequest updateDatiEndRequestApplicabile ok");
  1123.                                 }
  1124.                                
  1125.                                 updateMap = true;
  1126.                             }
  1127.                         }catch(Exception e) {
  1128.                             policyException = new PolicyException(e.getMessage(),e);
  1129.                             transactionUpdateFinished = true;
  1130.                         }
  1131.                        
  1132.                         break;
  1133.                        
  1134.                     case resetCounters:
  1135.                        
  1136.                         if(mapActiveThreads!=null && mapActiveThreads.size()>0){
  1137.                             Iterator<DatiCollezionati> datiCollezionatiIter = mapActiveThreads.values().iterator();
  1138.                             while (datiCollezionatiIter.hasNext()) {
  1139.                                 DatiCollezionati item = (DatiCollezionati) datiCollezionatiIter.next();
  1140.                                 item.resetCounters();
  1141.                             }
  1142.                            
  1143.                             updateMap = true;
  1144.                         }
  1145.                        
  1146.                         break;
  1147.                        
  1148.                        
  1149.                     case remove:
  1150.                        
  1151.                         if(mapActiveThreads!=null) {
  1152.                             deleteMap = true;
  1153.                         }
  1154.                        
  1155.                         break;
  1156.                        
  1157.                     case getActiveThreads:
  1158.                        
  1159.                         try {
  1160.                             long counter = 0l;
  1161.                            
  1162.                             if(mapActiveThreads!=null && !mapActiveThreads.isEmpty()) {
  1163.                                 for (IDUnivocoGroupByPolicy check : mapActiveThreads.keySet()) {
  1164.                                    
  1165.                                     if(datiGroupBy!=null){
  1166.                                         IDUnivocoGroupBy<IDUnivocoGroupByPolicy> idAstype = (IDUnivocoGroupBy<IDUnivocoGroupByPolicy>) check;
  1167.                                         if(!idAstype.match(datiGroupBy)){
  1168.                                             continue;
  1169.                                         }
  1170.                                     }
  1171.                                    
  1172.                                     counter = counter + mapActiveThreads.get(check).getActiveRequestCounter();
  1173.                                 }
  1174.                             }
  1175.                            
  1176.                             // mi appoggio a questa struttura
  1177.                             updateResult.counter = counter;
  1178.                            
  1179.                         }catch(Exception e) {
  1180.                             policyException = new PolicyException(e.getMessage(),e);
  1181.                             transactionUpdateFinished = true;
  1182.                         }
  1183.                        
  1184.                         break;
  1185.                        
  1186.                     case printInfos:
  1187.                        
  1188.                         StringBuilder bf = new StringBuilder();
  1189.                         if(mapActiveThreads!=null && !mapActiveThreads.isEmpty()) {
  1190.                             for (IDUnivocoGroupByPolicy check : mapActiveThreads.keySet()) {
  1191.                                 bf.append(separatorGroups);
  1192.                                 bf.append("\n");
  1193.                                 bf.append(Costanti.LABEL_MODALITA_SINCRONIZZAZIONE).append(" ").append(this.tipoGestore.toLabel());
  1194.                                 bf.append("\n");
  1195.                                 bf.append("Criterio di Collezionamento dei Dati\n");
  1196.                                 bf.append(check.toString(true));
  1197.                                 bf.append("\n");
  1198.                                 mapActiveThreads.get(check).checkDate(log, this.activePolicy); // imposta correttamente gli intervalli
  1199.                                 bf.append(mapActiveThreads.get(check).toString());
  1200.                                 bf.append("\n");
  1201.                             }
  1202.                         }
  1203.                         if(bf.length()<=0){
  1204.                             bf.append("Nessuna informazione disponibile");
  1205.                             updateResult.info = bf.toString();
  1206.                         }
  1207.                         else{
  1208.                             updateResult.info = bf.toString()+separatorGroups;
  1209.                         }
  1210.                        
  1211.                         break;
  1212.                     }
  1213.                    
  1214.                     if(updateMap) {
  1215.                    
  1216.                         ByteArrayOutputStream bout = new ByteArrayOutputStream();
  1217.                         this.getJavaSerializer().writeObject(mapActiveThreads, bout);
  1218.                         bout.flush();
  1219.                         bout.close();
  1220.                        
  1221.                         ISQLQueryObject sqlUpdate = SQLObjectFactory.createSQLQueryObject(this.tipoDatabase);
  1222.                         sqlUpdate.addUpdateTable(CT_MAP_TABLE);
  1223.                         //sqlUpdate.addUpdateField(CT_MAP_COLUMN_KEY, "?");
  1224.                         if(updateDate) {
  1225.                             sqlUpdate.addUpdateField(CT_MAP_COLUMN_UPDATE_TIME, "?");
  1226.                         }
  1227.                         sqlUpdate.addUpdateField(CT_MAP_COLUMN_VALUE, "?");
  1228.                         sqlUpdate.setANDLogicOperator(true);
  1229.                         sqlUpdate.addWhereCondition(CT_MAP_COLUMN_KEY+"=?");
  1230.                         String queryUpdate = sqlUpdate.createSQLUpdate();
  1231.                        
  1232.                         if(this.debug) {
  1233.                             if(updateDate) {
  1234.                                 this.logSql.debug("[updateMap"+""+this.idTransazione+"] execute "+DBUtils.formatSQLString(queryUpdate,
  1235.                                         DateUtils.getSimpleDateFormatMs().format(this.uniqueIdMap_updateTime),
  1236.                                         ("blob-size:"+bout.size()),
  1237.                                         this.uniqueIdMap_idActivePolicy));
  1238.                             }
  1239.                             else {
  1240.                                 this.logSql.debug("[updateMap"+""+this.idTransazione+"] execute "+DBUtils.formatSQLString(queryUpdate,
  1241.                                         ("blob-size:"+bout.size()),
  1242.                                         this.uniqueIdMap_idActivePolicy));
  1243.                             }
  1244.                         }
  1245.                        
  1246.                         PreparedStatement pstmtUpdateMap = null;
  1247.                         int rows = -1;
  1248.                         try {
  1249.                             //System.out.println("INSERT ["+queryInsert.toString()+"]");
  1250.                             pstmtUpdateMap = con.prepareStatement(queryUpdate);
  1251.                             int index = 1;
  1252.                             if(updateDate) {
  1253.                                 Timestamp t = new Timestamp(this.uniqueIdMap_updateTime.getTime());
  1254.                                 pstmtUpdateMap.setTimestamp(index++, t);
  1255.                             }
  1256.                             this.jdbcAdapter.setBinaryData(pstmtUpdateMap, index++, bout.toByteArray());
  1257.                             pstmtUpdateMap.setString(index++, this.uniqueIdMap_idActivePolicy);
  1258.                             rows = pstmtUpdateMap.executeUpdate();
  1259.                         }
  1260.                         finally {
  1261.                             try {
  1262.                                 if(pstmtUpdateMap!=null) {
  1263.                                     pstmtUpdateMap.close();
  1264.                                 }
  1265.                             }catch(Throwable t) {
  1266.                                 // ignore
  1267.                             }
  1268.                         }
  1269.                        
  1270.                         if(this.debug) {
  1271.                             if(updateDate) {
  1272.                                 this.logSql.debug("[updateMap"+""+this.idTransazione+"] executed (rows:"+rows+") "+DBUtils.formatSQLString(queryUpdate,
  1273.                                         DateUtils.getSimpleDateFormatMs().format(this.uniqueIdMap_updateTime),
  1274.                                         ("blob-size:"+bout.size()),
  1275.                                         this.uniqueIdMap_idActivePolicy));
  1276.                             }
  1277.                             else {
  1278.                                 this.logSql.debug("[updateMap"+""+this.idTransazione+"] executed (rows:"+rows+") "+DBUtils.formatSQLString(queryUpdate,
  1279.                                         ("blob-size:"+bout.size()),
  1280.                                         this.uniqueIdMap_idActivePolicy));
  1281.                             }
  1282.                         }
  1283.                        
  1284.                         //System.out.println("@update UPDATE ["+opType+"]: "+rows);
  1285.                     }
  1286.                    
  1287.                     if(deleteMap) {
  1288.                        
  1289.                         ISQLQueryObject sqlDelete = SQLObjectFactory.createSQLQueryObject(this.tipoDatabase);
  1290.                         sqlDelete.addDeleteTable(CT_MAP_TABLE);
  1291.                         sqlDelete.setANDLogicOperator(true);
  1292.                         sqlDelete.addWhereCondition(CT_MAP_COLUMN_KEY+"=?");
  1293.                         String queryDelete = sqlDelete.createSQLDelete();
  1294.                        
  1295.                         if(this.debug) {
  1296.                             this.logSql.debug("[deleteMap"+""+this.idTransazione+"] execute "+DBUtils.formatSQLString(queryDelete,
  1297.                                         this.uniqueIdMap_idActivePolicy));
  1298.                         }
  1299.                        
  1300.                         //System.out.println("INSERT ["+queryInsert.toString()+"]");
  1301.                         PreparedStatement pstmtDeleteMap = null;
  1302.                         int rows = -1;
  1303.                         try {
  1304.                             pstmtDeleteMap = con.prepareStatement(queryDelete);
  1305.                             int index = 1;
  1306.                             pstmtDeleteMap.setString(index++, this.uniqueIdMap_idActivePolicy);
  1307.                             rows = pstmtDeleteMap.executeUpdate();
  1308.                         }
  1309.                         finally {
  1310.                             try {
  1311.                                 if(pstmtDeleteMap!=null) {
  1312.                                     pstmtDeleteMap.close();
  1313.                                 }
  1314.                             }catch(Throwable t) {
  1315.                                 // ignore
  1316.                             }
  1317.                         }
  1318.                        
  1319.                         if(this.debug) {
  1320.                             this.logSql.debug("[updateMap"+""+this.idTransazione+"] executed (rows:"+rows+") "+DBUtils.formatSQLString(queryDelete,
  1321.                                         this.uniqueIdMap_idActivePolicy));
  1322.                         }
  1323.                        
  1324.                     }
  1325.                    
  1326.                     if(this.transactionMode) {
  1327.                         // Chiusura Transazione
  1328.                         con.commit();
  1329.                     }
  1330.                    
  1331.                     // ID Costruito
  1332.                     transactionUpdateFinished = true;
  1333.                 } catch(Throwable e) {
  1334.                     //System.out.println("ERRORE UPDATE ("+iteration+"): "+e.getMessage());
  1335.                     //log.info("ERROR GET SERIAL SQL ["+e.getMessage()+"]",e);
  1336.                     if(this.transactionMode) {
  1337.                         try{
  1338.                             con.rollback();
  1339.                         } catch(Exception er) {
  1340.                             // ignore
  1341.                         }
  1342.                     }
  1343.                     else {
  1344.                         throw new PolicyException("Operazione non riuscita: "+e.getMessage(),e);
  1345.                     }
  1346.                 }

  1347.                 if(transactionUpdateFinished == false){
  1348.                     if(this.transactionMode) {
  1349.                         // Per aiutare ad evitare conflitti
  1350.                         try{
  1351.                             int sleep = (getRandom()).nextInt(this.checkIntervalloJDBC);
  1352.                             //System.out.println("Sleep: "+sleep);
  1353.                             Utilities.sleep(sleep); // random
  1354.                         }catch(Exception eRandom){
  1355.                             // ignore
  1356.                         }
  1357.                     }
  1358.                     else {
  1359.                         throw new PolicyException("Operazione non riuscita");
  1360.                     }
  1361.                 }
  1362.                
  1363.                 iteration++;
  1364.                
  1365.                 if(policyNotFoundException!=null) {
  1366.                     throw policyNotFoundException;
  1367.                 }
  1368.                 if(policyException!=null) {
  1369.                     throw policyException;
  1370.                 }
  1371.                
  1372.             }
  1373.            
  1374.             if(!transactionUpdateFinished) {
  1375.                 throw new PolicyException("Operazione non riuscita dopo '"+iteration+"' tentativi");
  1376.             }
  1377.            
  1378.         }
  1379.         finally{

  1380.             // Ripristino Transazione
  1381.             if(this.transactionMode) {
  1382.                 try{
  1383.                     if(autoCommitModificato){
  1384.                         con.setAutoCommit(originalConnectionAutocommit);
  1385.                     }
  1386.                 } catch(Exception er) {
  1387.                     //System.out.println("ERROR UNSET:"+er.getMessage());
  1388.                     //throw new PolicyException("CheckMap failed: unsetting connection error; "+er.getMessage());
  1389.                     if(this.log!=null) {
  1390.                         this.log.error("CheckMap failed: unsetting connection error; "+er.getMessage(),er);
  1391.                     }
  1392.                 }
  1393.             }
  1394.         }

  1395.         return updateResult;
  1396.        
  1397.     }
  1398. }
  1399.    
  1400. class PolicyConnessioneRuntime{
  1401.    
  1402.     Resource r = null;
  1403.     Connection con = null;
  1404.    
  1405. }

  1406. class UpdateResult{
  1407.    
  1408.     DatiCollezionati datiCollezionatiReaded;
  1409.     long counter;
  1410.     String info;
  1411.     java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> map;
  1412.    
  1413. }

  1414. enum OperationType {
  1415.    
  1416.     registerStartRequest,
  1417.     updateDatiStartRequestApplicabile,
  1418.     registerStopRequest,
  1419.     getActiveThreads,
  1420.     printInfos,
  1421.     resetCounters,
  1422.     remove,
  1423.     getMapActiveThreads,
  1424.     initMap
  1425.    
  1426. }