DatiStatisticiDAOManager.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;

  21. import java.sql.Connection;
  22. import java.util.ArrayList;
  23. import java.util.Calendar;
  24. import java.util.Date;
  25. import java.util.List;
  26. import java.util.Map;

  27. import org.openspcoop2.core.commons.CoreException;
  28. import org.openspcoop2.core.commons.dao.DAOFactory;
  29. import org.openspcoop2.core.commons.dao.DAOFactoryProperties;
  30. import org.openspcoop2.core.config.PortaApplicativa;
  31. import org.openspcoop2.core.config.PortaDelegata;
  32. import org.openspcoop2.core.config.driver.DriverConfigurazioneException;
  33. import org.openspcoop2.core.config.driver.DriverConfigurazioneNotFound;
  34. import org.openspcoop2.core.config.driver.FiltroRicercaServiziApplicativi;
  35. import org.openspcoop2.core.constants.TipoPdD;
  36. import org.openspcoop2.core.controllo_traffico.AttivazionePolicyFiltro;
  37. import org.openspcoop2.core.controllo_traffico.beans.DatiTransazione;
  38. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicy;
  39. import org.openspcoop2.core.controllo_traffico.beans.RisultatoStatistico;
  40. import org.openspcoop2.core.controllo_traffico.constants.RuoloPolicy;
  41. import org.openspcoop2.core.controllo_traffico.constants.TipoBanda;
  42. import org.openspcoop2.core.controllo_traffico.constants.TipoFinestra;
  43. import org.openspcoop2.core.controllo_traffico.constants.TipoLatenza;
  44. import org.openspcoop2.core.controllo_traffico.constants.TipoPeriodoStatistico;
  45. import org.openspcoop2.core.controllo_traffico.constants.TipoRisorsa;
  46. import org.openspcoop2.core.id.IDAccordo;
  47. import org.openspcoop2.core.id.IDGruppo;
  48. import org.openspcoop2.core.id.IDPortaApplicativa;
  49. import org.openspcoop2.core.id.IDPortaDelegata;
  50. import org.openspcoop2.core.id.IDRuolo;
  51. import org.openspcoop2.core.id.IDServizio;
  52. import org.openspcoop2.core.id.IDServizioApplicativo;
  53. import org.openspcoop2.core.id.IDSoggetto;
  54. import org.openspcoop2.core.registry.driver.DriverRegistroServiziException;
  55. import org.openspcoop2.core.registry.driver.DriverRegistroServiziNotFound;
  56. import org.openspcoop2.core.registry.driver.FiltroRicercaAccordi;
  57. import org.openspcoop2.core.registry.driver.FiltroRicercaServizi;
  58. import org.openspcoop2.core.registry.driver.FiltroRicercaSoggetti;
  59. import org.openspcoop2.core.registry.driver.IDServizioFactory;
  60. import org.openspcoop2.core.statistiche.StatisticaGiornaliera;
  61. import org.openspcoop2.core.statistiche.StatisticaMensile;
  62. import org.openspcoop2.core.statistiche.StatisticaOraria;
  63. import org.openspcoop2.core.statistiche.StatisticaSettimanale;
  64. import org.openspcoop2.core.statistiche.constants.TipoPorta;
  65. import org.openspcoop2.core.statistiche.model.StatisticaModel;
  66. import org.openspcoop2.core.statistiche.utils.StatisticheUtils;
  67. import org.openspcoop2.generic_project.beans.Function;
  68. import org.openspcoop2.generic_project.beans.FunctionField;
  69. import org.openspcoop2.generic_project.dao.IDBServiceUtilities;
  70. import org.openspcoop2.generic_project.dao.IServiceSearchWithoutId;
  71. import org.openspcoop2.generic_project.exception.ExpressionException;
  72. import org.openspcoop2.generic_project.exception.ExpressionNotImplementedException;
  73. import org.openspcoop2.generic_project.exception.NotFoundException;
  74. import org.openspcoop2.generic_project.exception.NotImplementedException;
  75. import org.openspcoop2.generic_project.exception.ServiceException;
  76. import org.openspcoop2.generic_project.expression.IExpression;
  77. import org.openspcoop2.generic_project.expression.impl.sql.ISQLFieldConverter;
  78. import org.openspcoop2.generic_project.utils.ServiceManagerProperties;
  79. import org.openspcoop2.pdd.config.ConfigurazionePdDManager;
  80. import org.openspcoop2.pdd.config.DBStatisticheManager;
  81. import org.openspcoop2.pdd.config.DBTransazioniManager;
  82. import org.openspcoop2.pdd.config.Resource;
  83. import org.openspcoop2.pdd.core.controllo_traffico.ConfigurazioneGatewayControlloTraffico;
  84. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  85. import org.openspcoop2.protocol.engine.ProtocolFactoryManager;
  86. import org.openspcoop2.protocol.registry.RegistroServiziManager;
  87. import org.openspcoop2.protocol.sdk.IProtocolFactory;
  88. import org.openspcoop2.protocol.sdk.ProtocolException;
  89. import org.openspcoop2.protocol.sdk.state.IState;
  90. import org.openspcoop2.protocol.sdk.state.RequestInfo;
  91. import org.openspcoop2.protocol.sdk.state.StateMessage;
  92. import org.openspcoop2.protocol.utils.EsitiProperties;
  93. import org.openspcoop2.utils.date.DateManager;
  94. import org.slf4j.Logger;

  95. /**    
  96.  * DatiStatisticiDAOManager
  97.  *
  98.  * @author Poli Andrea (poli@link.it)
  99.  * @author $Author$
  100.  * @version $Rev$, $Date$
  101.  */
  102. public class DatiStatisticiDAOManager  {

  103.     private static DatiStatisticiDAOManager staticInstance = null;
  104.     public static synchronized void initialize(ConfigurazioneGatewayControlloTraffico configurazioneControlloTraffico) throws CoreException{
  105.         if(staticInstance==null){
  106.             staticInstance = new DatiStatisticiDAOManager(configurazioneControlloTraffico);
  107.         }
  108.     }
  109.     public static DatiStatisticiDAOManager getInstance() throws CoreException{
  110.         if(staticInstance==null){
  111.             // spotbugs warning 'SING_SINGLETON_GETTER_NOT_SYNCHRONIZED': l'istanza viene creata allo startup
  112.             synchronized (DatiStatisticiDAOManager.class) {
  113.                 throw new CoreException("DatiStatisticiDAOManager non inizializzato");
  114.             }
  115.         }
  116.         return staticInstance;
  117.     }
  118.    
  119.     private ConfigurazioneGatewayControlloTraffico configurazioneControlloTraffico;
  120.    
  121.     /** Indicazione se deve essere effettuato il log delle query */
  122.     private boolean debug = false;  
  123.        
  124.     /** Database */
  125.     /**private DataSource ds = null;
  126.     private String datasource = null;*/
  127.     private String tipoDatabase = null; //tipoDatabase
  128.     private DAOFactory daoFactory = null;
  129.     private Logger daoFactoryLogger = null;
  130.     private ServiceManagerProperties daoFactoryServiceManagerPropertiesStatistiche = null;
  131.    
  132.     private DBStatisticheManager dbStatisticheManager = null;
  133.     private boolean checkState = false;
  134.    
  135.     private Logger log;
  136.     private void logDebug(String msg) {
  137.         if(this.log!=null) {
  138.             this.log.debug(msg);
  139.         }
  140.     }
  141.     private void logDebug(String msg, Exception e) {
  142.         if(this.log!=null) {
  143.             this.log.debug(msg,e);
  144.         }
  145.     }
  146.     private void logError(String msg, Exception e) {
  147.         if(this.log!=null) {
  148.             this.log.error(msg,e);
  149.         }
  150.     }
  151.    
  152.     private DatiStatisticiDAOManager(ConfigurazioneGatewayControlloTraffico configurazioneControlloTraffico) throws CoreException{
  153.         try{
  154.            
  155.             this.configurazioneControlloTraffico = configurazioneControlloTraffico;
  156.            
  157.             this.debug = this.configurazioneControlloTraffico.isDebug();
  158.            
  159.             this.tipoDatabase = this.configurazioneControlloTraffico.getTipoDatabaseConfig();
  160.            
  161.             if(this.tipoDatabase==null){
  162.                 throw new CoreException("Tipo Database non definito");
  163.             }

  164.             // DAOFactory
  165.             DAOFactoryProperties daoFactoryProperties = null;
  166.             this.daoFactoryLogger = OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTrafficoSql(this.debug);
  167.             this.daoFactory = DAOFactory.getInstance(this.daoFactoryLogger);
  168.             daoFactoryProperties = DAOFactoryProperties.getInstance(this.daoFactoryLogger);
  169.                        
  170.             this.daoFactoryServiceManagerPropertiesStatistiche = daoFactoryProperties.getServiceManagerProperties(org.openspcoop2.core.statistiche.utils.ProjectInfo.getInstance());
  171.             this.daoFactoryServiceManagerPropertiesStatistiche.setShowSql(this.debug);  
  172.             this.daoFactoryServiceManagerPropertiesStatistiche.setDatabaseType(this.tipoDatabase);
  173.            
  174.             this.dbStatisticheManager = DBStatisticheManager.getInstance();
  175.             if(this.dbStatisticheManager.useRuntimePdD()
  176.                     ||
  177.                 (  
  178.                         this.dbStatisticheManager.useTransazioni() &&
  179.                         DBTransazioniManager.getInstance().useRuntimePdD()
  180.                 )
  181.                     ){
  182.                 this.checkState = true;
  183.             }
  184.            
  185.             this.log = OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTraffico(this.debug);
  186.            
  187.         }catch(Exception e){
  188.             throw new CoreException("Errore durante l'inizializzazione del datasource: "+e.getMessage(),e);
  189.         }
  190.        
  191.     }
  192.    
  193.     private static final String RISORSA_DB_NON_DISPONIBILE = "Risorsa al database non disponibile";
  194.     private static final String CONNESSIONE_DB_NON_DISPONIBILE = "Connessione non disponibile";
  195.     private static final String MODEL_UNKNOWN = "Model unknown";
  196.     private static final String DAO_UNKNOWN = "DAO unknown";
  197.    
  198.    
  199.     /* ********************** NUMERO ESISTI *************************** */
  200.     public RisultatoStatistico readNumeroEsiti(String key, TipoPeriodoStatistico tipoPeriodo, Integer periodLength,
  201.             Date endDate,  List<Integer> esiti, IDServizio servizio, IDSoggetto mittente, List<String> ignoreOperations, DatiTransazione datiTransazione, IState state) throws CoreException {
  202.         Resource r = null;
  203.         boolean useConnectionRuntime = false;
  204.         IDSoggetto dominio = datiTransazione.getDominio();
  205.         String idModulo = datiTransazione.getModulo()+".statistiche.readExpression";
  206.         String idTransazione = datiTransazione.getIdTransazione();
  207.         try{
  208.            
  209.             Connection con = null;
  210.             if(this.checkState &&
  211.                 state!=null &&
  212.                 state instanceof StateMessage) {
  213.                 StateMessage s = (StateMessage) state;
  214.                 if(s.getConnectionDB()!=null && !s.getConnectionDB().isClosed()) {
  215.                     con = s.getConnectionDB();
  216.                     useConnectionRuntime = true;
  217.                 }
  218.             }
  219.             if(!useConnectionRuntime){
  220.                 r = this.dbStatisticheManager.getResource(dominio, idModulo, idTransazione);
  221.                 if(r==null){
  222.                     throw new CoreException(RISORSA_DB_NON_DISPONIBILE);
  223.                 }
  224.                 con = (Connection) r.getResource();
  225.             }
  226.             if(con == null)
  227.                 throw new CoreException(CONNESSIONE_DB_NON_DISPONIBILE);    
  228.            
  229.             org.openspcoop2.core.statistiche.dao.IServiceManager statisticheSM =
  230.                     (org.openspcoop2.core.statistiche.dao.IServiceManager) this.daoFactory.getServiceManager(org.openspcoop2.core.statistiche.utils.ProjectInfo.getInstance(),
  231.                             con, this.daoFactoryServiceManagerPropertiesStatistiche, this.daoFactoryLogger);
  232.             boolean useGiornaliero = this.configurazioneControlloTraffico.isElaborazioneStatistica_distribuzioneSettimanale_usaStatisticheGiornaliere();
  233.            
  234.             StatisticaModel model = null;
  235.             IServiceSearchWithoutId<?> dao = null;
  236.             Calendar c = Calendar.getInstance();
  237.             c.setTime(endDate);
  238.            
  239.             switch (tipoPeriodo) {
  240.             case ORARIO:
  241.                 model = StatisticaOraria.model().STATISTICA_BASE;
  242.                 dao = statisticheSM.getStatisticaOrariaServiceSearch();
  243.                 c.add(Calendar.HOUR, -periodLength);
  244.                 break;
  245.             case GIORNALIERO:
  246.                 model = StatisticaGiornaliera.model().STATISTICA_BASE;
  247.                 dao = statisticheSM.getStatisticaGiornalieraServiceSearch();
  248.                 c.add(Calendar.DATE, -periodLength);
  249.                 break;
  250.             case SETTIMANALE:
  251.                 model = useGiornaliero ? StatisticaGiornaliera.model().STATISTICA_BASE : StatisticaSettimanale.model().STATISTICA_BASE;
  252.                 dao = useGiornaliero ? statisticheSM.getStatisticaGiornalieraServiceSearch() : statisticheSM.getStatisticaSettimanaleServiceSearch();
  253.                 c.add(Calendar.DATE, -7 * periodLength);
  254.                 break;
  255.             case MENSILE:
  256.                 model = useGiornaliero ? StatisticaGiornaliera.model().STATISTICA_BASE : StatisticaMensile.model().STATISTICA_BASE;
  257.                 dao = useGiornaliero ? statisticheSM.getStatisticaGiornalieraServiceSearch() : statisticheSM.getStatisticaMensileServiceSearch();
  258.                 c.add(Calendar.MONTH, -periodLength);
  259.                 break;
  260.             }
  261.             Date startDate = c.getTime();
  262.            
  263.             if(model==null) {
  264.                 throw new CoreException(MODEL_UNKNOWN);
  265.             }
  266.             if(dao==null) {
  267.                 throw new CoreException(DAO_UNKNOWN);
  268.             }
  269.            
  270.             IExpression expression = dao.newExpression();
  271.             expression.between(model.DATA, startDate, endDate);
  272.             if (esiti != null)
  273.                 expression.in(model.ESITO, esiti);
  274.             expression.equals(model.SERVIZIO, servizio.getNome());
  275.             expression.equals(model.TIPO_SERVIZIO, servizio.getTipo());
  276.             expression.equals(model.VERSIONE_SERVIZIO, servizio.getVersione());
  277.             expression.equals(model.DESTINATARIO, servizio.getSoggettoErogatore().getNome());
  278.             expression.equals(model.TIPO_DESTINATARIO, servizio.getSoggettoErogatore().getTipo());
  279.             expression.isNotNull(model.NUMERO_TRANSAZIONI);
  280.             if (mittente != null) {
  281.                 expression.equals(model.MITTENTE, mittente.getNome());
  282.                 expression.equals(model.TIPO_MITTENTE, mittente.getTipo());
  283.             }
  284.            
  285.             if (ignoreOperations != null) {
  286.                 for (String ignoreOperation : ignoreOperations)
  287.                     expression.notEquals(model.AZIONE, ignoreOperation);
  288.             }
  289.            
  290.            
  291.             RisultatoStatistico risultato = new RisultatoStatistico();
  292.             risultato.setDateCheck(DateManager.getDate());
  293.             risultato.setDataInizio(startDate);
  294.             risultato.setDataFine(endDate);
  295.             FunctionField ff = new  FunctionField(model.NUMERO_TRANSAZIONI, Function.SUM, "somma");
  296.            
  297.             try{
  298.                 Object result = dao.aggregate(expression, ff);
  299.                 if(result!=null && this.isKnownType(result) ){
  300.                     this.logDebug("NumeroRichiesteFound ["+result.getClass().getName()+"]: "+result);
  301.                     Long l = this.translateType(result);
  302.                     if(l!=null) {
  303.                         risultato.setRisultato(l.longValue());
  304.                     }
  305.                     else {
  306.                         throw new CoreException("Translate type (result) '"+result+"' non riuscito");
  307.                     }
  308.                 }
  309.                 else{
  310.                     if(result!=null){
  311.                         this.logDebug("NumeroRichiesteNotFound ["+result.getClass().getName()+"]: "+result);
  312.                     }else{
  313.                         this.logDebug("NumeroRichiesteNotFound, result is null");
  314.                     }
  315.                     risultato.setRisultato(0);
  316.                 }
  317.             }catch(NotFoundException notFound){
  318.                 this.logDebug("NumeroRichiesteNotFound:"+notFound.getMessage(),notFound);
  319.                 risultato.setRisultato(0);
  320.             }
  321.            
  322.             return risultato;
  323.            
  324.         }catch(Exception e){
  325.             this.logError("Errore durante la raccolta dei dati statisti (" + key + "): "+e.getMessage(),e);
  326.             throw new CoreException(e.getMessage(),e);
  327.         }finally {
  328.             try{
  329.                 if(!useConnectionRuntime && r != null) {
  330.                     this.dbStatisticheManager.releaseResource(dominio, idModulo, r);
  331.                 }
  332.             }catch(Exception eClose){}
  333.         }
  334.     }
  335.    
  336.     /* ********************** NUMERO RICHIESTE ************************** */
  337.    
  338.     public RisultatoStatistico readNumeroRichieste(String key,TipoRisorsa tipoRisorsa,
  339.             TipoFinestra tipoFinestra,TipoPeriodoStatistico tipoPeriodo, Date leftInterval, Date rightInterval,
  340.             DatiTransazione datiTransazione,IDUnivocoGroupByPolicy groupByPolicy, AttivazionePolicyFiltro filtro,
  341.             IState state,
  342.             RequestInfo requestInfo,
  343.             IProtocolFactory<?> protocolFactory) throws CoreException {
  344.    
  345.         Resource r = null;
  346.         boolean useConnectionRuntime = false;
  347.         IDSoggetto dominio = datiTransazione.getDominio();
  348.         String idModulo = datiTransazione.getModulo()+".statistiche.readNumeroRichieste";
  349.         String idTransazione = datiTransazione.getIdTransazione();
  350.         try{
  351.            
  352.             Connection con = null;
  353.             if(this.checkState &&
  354.                 state!=null &&
  355.                 state instanceof StateMessage) {
  356.                 StateMessage s = (StateMessage) state;
  357.                 if(s.getConnectionDB()!=null && !s.getConnectionDB().isClosed()) {
  358.                     con = s.getConnectionDB();
  359.                     useConnectionRuntime = true;
  360.                 }
  361.             }
  362.             if(!useConnectionRuntime){
  363.                 r = this.dbStatisticheManager.getResource(dominio, idModulo, idTransazione);
  364.                 if(r==null){
  365.                     throw new CoreException(RISORSA_DB_NON_DISPONIBILE);
  366.                 }
  367.                 con = (Connection) r.getResource();
  368.             }
  369.             if(con == null)
  370.                 throw new CoreException(CONNESSIONE_DB_NON_DISPONIBILE);    
  371.            
  372.             org.openspcoop2.core.statistiche.dao.IServiceManager statisticheSM =
  373.                     (org.openspcoop2.core.statistiche.dao.IServiceManager) this.daoFactory.getServiceManager(org.openspcoop2.core.statistiche.utils.ProjectInfo.getInstance(),
  374.                             con, this.daoFactoryServiceManagerPropertiesStatistiche, this.daoFactoryLogger);
  375.                
  376.             StatisticaModel model = null;
  377.             IServiceSearchWithoutId<?> dao = null;
  378.        
  379.             if(tipoFinestra!=null && TipoFinestra.SCORREVOLE.equals(tipoFinestra)){
  380.                 model = StatisticaOraria.model().STATISTICA_BASE;
  381.                 dao = statisticheSM.getStatisticaOrariaServiceSearch();
  382.             }
  383.             else{
  384.                 switch (tipoPeriodo) {
  385.                 case ORARIO:
  386.                     model = StatisticaOraria.model().STATISTICA_BASE;
  387.                     dao = statisticheSM.getStatisticaOrariaServiceSearch();
  388.                     break;
  389.                 case GIORNALIERO:
  390.                     model = StatisticaGiornaliera.model().STATISTICA_BASE;
  391.                     dao = statisticheSM.getStatisticaGiornalieraServiceSearch();
  392.                     break;
  393.                 case SETTIMANALE:
  394.                     if(this.configurazioneControlloTraffico.isElaborazioneStatistica_distribuzioneSettimanale_usaStatisticheGiornaliere()) {
  395.                         model = StatisticaGiornaliera.model().STATISTICA_BASE;
  396.                         dao = statisticheSM.getStatisticaGiornalieraServiceSearch();
  397.                     }
  398.                     else {
  399.                         model = StatisticaSettimanale.model().STATISTICA_BASE;
  400.                         dao = statisticheSM.getStatisticaSettimanaleServiceSearch();
  401.                     }
  402.                     break;
  403.                 case MENSILE:
  404.                     if(this.configurazioneControlloTraffico.isElaborazioneStatistica_distribuzioneMensile_usaStatisticheGiornaliere()) {
  405.                         model = StatisticaGiornaliera.model().STATISTICA_BASE;
  406.                         dao = statisticheSM.getStatisticaGiornalieraServiceSearch();
  407.                     }
  408.                     else {
  409.                         model = StatisticaMensile.model().STATISTICA_BASE;
  410.                         dao = statisticheSM.getStatisticaMensileServiceSearch();
  411.                     }
  412.                     break;
  413.                 }
  414.             }
  415.             if(model==null) {
  416.                 throw new CoreException(MODEL_UNKNOWN);
  417.             }
  418.             if(dao==null) {
  419.                 throw new CoreException(DAO_UNKNOWN);
  420.             }
  421.            
  422.             IExpression expression = this.createWhereExpressionNumeroRichieste(dao, model, tipoRisorsa, leftInterval, rightInterval,
  423.                     datiTransazione.getTipoPdD(), protocolFactory, datiTransazione.getProtocollo(), groupByPolicy, filtro, state, requestInfo);
  424.                        
  425.             FunctionField ff = new  FunctionField(model.NUMERO_TRANSAZIONI, Function.SUM, "somma");
  426.            
  427.             RisultatoStatistico risultato = new RisultatoStatistico();
  428.             risultato.setDataInizio(leftInterval);
  429.             risultato.setDataFine(rightInterval);
  430.             risultato.setDateCheck(DateManager.getDate());
  431.            
  432.             try{
  433.                 Object result = dao.aggregate(expression, ff);
  434.                 if(result!=null && this.isKnownType(result) ){
  435.                     /**System.out.println("RITORNO OGGETTO LETTO DA DB CON CHIAVE ["+key+"]: ["+result+"] ["+result.getClass().getName()+"]");*/
  436.                     this.logDebug("NumeroRichiesteFound ["+result.getClass().getName()+"]: "+result);
  437.                     Long l = this.translateType(result);
  438.                     if(l!=null) {
  439.                         risultato.setRisultato(l.longValue());
  440.                     }
  441.                     else {
  442.                         throw new CoreException("Translate type (result) '"+result+"' non riuscito");
  443.                     }
  444.                 }
  445.                 else{
  446.                     if(result!=null){
  447.                         /**System.out.println("RITORNO OGGETTO LETTO DA DB CON CHIAVE ["+key+"]: ["+result+"] ["+result.getClass().getName()+"]");*/
  448.                         this.logDebug("NumeroRichiesteNotFound ["+result.getClass().getName()+"]: "+result);
  449.                     }else{
  450.                         this.logDebug("NumeroRichiesteNotFound, result is null");
  451.                     }
  452.                     risultato.setRisultato(0);
  453.                 }
  454.             }catch(NotFoundException notFound){
  455.                 this.logDebug("NumeroRichiesteNotFound:"+notFound.getMessage(),notFound);
  456.                 risultato.setRisultato(0);
  457.             }
  458.            
  459.             return risultato;
  460.            
  461.         }catch(Exception e){
  462.             this.logError("Errore durante la raccolta dei dati statisti (key:"+key+"): "+e.getMessage(),e);
  463.             throw new CoreException(e.getMessage(),e);
  464.         }finally {
  465.             try{
  466.                 if(!useConnectionRuntime &&
  467.                     r!=null) {
  468.                     this.dbStatisticheManager.releaseResource(dominio, idModulo, r);
  469.                 }
  470.             }catch(Exception eClose){
  471.                 // ignore
  472.             }
  473.         }
  474.        
  475.     }
  476.    
  477.     private IExpression createWhereExpressionNumeroRichieste(
  478.             IServiceSearchWithoutId<?> dao, StatisticaModel model,
  479.             TipoRisorsa tipoRisorsa,
  480.             Date dataInizio, Date dataFine,
  481.             TipoPdD tipoPdDTransazioneInCorso,
  482.             IProtocolFactory<?> protocolFactory, String protocollo,
  483.             IDUnivocoGroupByPolicy groupByPolicy,
  484.             AttivazionePolicyFiltro filtro,
  485.             IState state,
  486.             RequestInfo requestInfo) throws ServiceException, NotImplementedException, ExpressionNotImplementedException, ExpressionException, ProtocolException, DriverRegistroServiziException, DriverConfigurazioneException {
  487.        
  488.         IExpression expr = this.createWhereExpression(dao, model, tipoRisorsa, dataInizio, dataFine, tipoPdDTransazioneInCorso, protocolFactory, protocollo, groupByPolicy, filtro, state, requestInfo);

  489.         expr.isNotNull(model.NUMERO_TRANSAZIONI);
  490.        
  491.         return expr;
  492.        
  493.     }
  494.    
  495.    
  496.    
  497.    
  498.    
  499.    
  500.    
  501.    
  502.    
  503.     /* ********************** OCCUPAZIONE BANDA ************************** */
  504.    
  505.     public RisultatoStatistico readOccupazioneBanda(String key,TipoRisorsa tipoRisorsa,
  506.             TipoFinestra tipoFinestra,TipoPeriodoStatistico tipoPeriodo, Date leftInterval, Date rightInterval,
  507.             TipoBanda tipoBanda,
  508.             DatiTransazione datiTransazione,IDUnivocoGroupByPolicy groupByPolicy, AttivazionePolicyFiltro filtro,
  509.             IState state,
  510.             RequestInfo requestInfo,
  511.             IProtocolFactory<?> protocolFactory) throws CoreException {
  512.    
  513.         Resource r = null;
  514.         boolean useConnectionRuntime = false;
  515.         IDSoggetto dominio = datiTransazione.getDominio();
  516.         String idModulo = datiTransazione.getModulo()+".statistiche.readOccupazioneBanda";
  517.         String idTransazione = datiTransazione.getIdTransazione();
  518.         try{
  519.             Connection con = null;
  520.             if(this.checkState &&
  521.                 state!=null &&
  522.                 state instanceof StateMessage) {
  523.                 StateMessage s = (StateMessage) state;
  524.                 if(s.getConnectionDB()!=null && !s.getConnectionDB().isClosed()) {
  525.                     con = s.getConnectionDB();
  526.                     useConnectionRuntime = true;
  527.                 }
  528.             }
  529.             if(!useConnectionRuntime){
  530.                 r = this.dbStatisticheManager.getResource(dominio, idModulo, idTransazione);
  531.                 if(r==null){
  532.                     throw new CoreException(RISORSA_DB_NON_DISPONIBILE);
  533.                 }
  534.                 con = (Connection) r.getResource();
  535.             }
  536.             if(con == null)
  537.                 throw new CoreException(CONNESSIONE_DB_NON_DISPONIBILE);    

  538.             org.openspcoop2.core.statistiche.dao.IServiceManager statisticheSM =
  539.                     (org.openspcoop2.core.statistiche.dao.IServiceManager) this.daoFactory.getServiceManager(org.openspcoop2.core.statistiche.utils.ProjectInfo.getInstance(),
  540.                             con, this.daoFactoryServiceManagerPropertiesStatistiche, this.daoFactoryLogger);
  541.                
  542.             StatisticaModel model = null;
  543.             IServiceSearchWithoutId<?> dao = null;

  544.             if(tipoFinestra!=null && TipoFinestra.SCORREVOLE.equals(tipoFinestra)){
  545.                 model = StatisticaOraria.model().STATISTICA_BASE;
  546.                 dao = statisticheSM.getStatisticaOrariaServiceSearch();
  547.             }
  548.             else{
  549.                 switch (tipoPeriodo) {
  550.                 case ORARIO:
  551.                     model = StatisticaOraria.model().STATISTICA_BASE;
  552.                     dao = statisticheSM.getStatisticaOrariaServiceSearch();
  553.                     break;
  554.                 case GIORNALIERO:
  555.                     model = StatisticaGiornaliera.model().STATISTICA_BASE;
  556.                     dao = statisticheSM.getStatisticaGiornalieraServiceSearch();
  557.                     break;
  558.                 case SETTIMANALE:
  559.                     if(this.configurazioneControlloTraffico.isElaborazioneStatistica_distribuzioneSettimanale_usaStatisticheGiornaliere()) {
  560.                         model = StatisticaGiornaliera.model().STATISTICA_BASE;
  561.                         dao = statisticheSM.getStatisticaGiornalieraServiceSearch();
  562.                     }
  563.                     else {
  564.                         model = StatisticaSettimanale.model().STATISTICA_BASE;
  565.                         dao = statisticheSM.getStatisticaSettimanaleServiceSearch();
  566.                     }
  567.                     break;
  568.                 case MENSILE:
  569.                     if(this.configurazioneControlloTraffico.isElaborazioneStatistica_distribuzioneMensile_usaStatisticheGiornaliere()) {
  570.                         model = StatisticaGiornaliera.model().STATISTICA_BASE;
  571.                         dao = statisticheSM.getStatisticaGiornalieraServiceSearch();
  572.                     }
  573.                     else {
  574.                         model = StatisticaMensile.model().STATISTICA_BASE;
  575.                         dao = statisticheSM.getStatisticaMensileServiceSearch();
  576.                     }
  577.                     break;
  578.                 }
  579.             }
  580.            
  581.             if(model==null) {
  582.                 throw new CoreException(MODEL_UNKNOWN);
  583.             }
  584.             if(dao==null) {
  585.                 throw new CoreException(DAO_UNKNOWN);
  586.             }
  587.            
  588.             IExpression expression = this.createWhereExpressionBanda(dao, model, tipoRisorsa, leftInterval, rightInterval,
  589.                     datiTransazione.getTipoPdD(), protocolFactory, datiTransazione.getProtocollo(), groupByPolicy, filtro, tipoBanda, state, requestInfo);
  590.                        
  591.             FunctionField ff = null;
  592.             switch (tipoBanda) {
  593.             case COMPLESSIVA:
  594.                 ff = new  FunctionField(model.DIMENSIONI_BYTES_BANDA_COMPLESSIVA, Function.SUM, "somma");
  595.                 break;
  596.             case INTERNA:
  597.                 ff = new  FunctionField(model.DIMENSIONI_BYTES_BANDA_INTERNA, Function.SUM, "somma");
  598.                 break;
  599.             case ESTERNA:
  600.                 ff = new  FunctionField(model.DIMENSIONI_BYTES_BANDA_ESTERNA, Function.SUM, "somma");
  601.                 break;
  602.             }
  603.            
  604.            
  605.             RisultatoStatistico risultato = new RisultatoStatistico();
  606.             risultato.setDataInizio(leftInterval);
  607.             risultato.setDataFine(rightInterval);
  608.             risultato.setDateCheck(DateManager.getDate());
  609.            
  610.             try{
  611.                 Object result = dao.aggregate(expression, ff);
  612.                 if(result!=null && this.isKnownType(result) ){
  613.                     /**System.out.println("RITORNO OGGETTO LETTO DA DB CON CHIAVE ["+key+"]: ["+result+"] ["+result.getClass().getName()+"]");*/
  614.                     this.logDebug("BandaFound ["+result.getClass().getName()+"]: "+result);
  615.                     Long l = this.translateType(result);
  616.                     if(l!=null) {
  617.                         risultato.setRisultato(l.longValue());
  618.                     }
  619.                     else {
  620.                         throw new CoreException("Translate type (result) '"+result+"' non riuscito");
  621.                     }
  622.                 }
  623.                 else{
  624.                     if(result!=null){
  625.                         /**System.out.println("RITORNO OGGETTO LETTO DA DB CON CHIAVE ["+key+"]: ["+result+"] ["+result.getClass().getName()+"]");*/
  626.                         this.logDebug("BandaNotFound ["+result.getClass().getName()+"]: "+result);
  627.                     }else{
  628.                         this.logDebug("BandaNotFound, result is null");
  629.                     }
  630.                     risultato.setRisultato(0);
  631.                 }
  632.             }catch(NotFoundException notFound){
  633.                 this.logDebug("BandaNotFound:"+notFound.getMessage(),notFound);
  634.                 risultato.setRisultato(0);
  635.             }
  636.            
  637.             return risultato;
  638.            
  639.         }catch(Exception e){
  640.             this.logError("Errore durante la raccolta dei dati statisti (key:"+key+"): "+e.getMessage(),e);
  641.             throw new CoreException(e.getMessage(),e);
  642.         }finally {
  643.             try{
  644.                 if(!useConnectionRuntime &&
  645.                     r!=null) {
  646.                     this.dbStatisticheManager.releaseResource(dominio, idModulo, r);
  647.                 }
  648.             }catch(Exception eClose){
  649.                 // ignore
  650.             }
  651.         }
  652.        
  653.     }
  654.    
  655.     private IExpression createWhereExpressionBanda(
  656.             IServiceSearchWithoutId<?> dao, StatisticaModel model,
  657.             TipoRisorsa tipoRisorsa,
  658.             Date dataInizio, Date dataFine,
  659.             TipoPdD tipoPdDTransazioneInCorso,
  660.             IProtocolFactory<?> protocolFactory, String protocollo,
  661.             IDUnivocoGroupByPolicy groupByPolicy, AttivazionePolicyFiltro filtro,
  662.             TipoBanda tipoBanda,
  663.             IState state,
  664.             RequestInfo requestInfo) throws ServiceException, NotImplementedException, ExpressionNotImplementedException, ExpressionException, ProtocolException, DriverRegistroServiziException, DriverConfigurazioneException {
  665.        
  666.         IExpression expr = this.createWhereExpression(dao, model, tipoRisorsa, dataInizio, dataFine, tipoPdDTransazioneInCorso, protocolFactory, protocollo, groupByPolicy, filtro, state, requestInfo);

  667.         switch (tipoBanda) {
  668.         case COMPLESSIVA:
  669.             expr.isNotNull(model.DIMENSIONI_BYTES_BANDA_COMPLESSIVA);
  670.             break;
  671.         case INTERNA:
  672.             expr.isNotNull(model.DIMENSIONI_BYTES_BANDA_INTERNA);
  673.             break;
  674.         case ESTERNA:
  675.             expr.isNotNull(model.DIMENSIONI_BYTES_BANDA_ESTERNA);
  676.             break;
  677.         }
  678.        
  679.         return expr;
  680.        
  681.     }
  682.    
  683.    
  684.    
  685.     /* ********************** LATENZA ************************** */
  686.    
  687.     public RisultatoStatistico readLatenza(String key,TipoRisorsa tipoRisorsa,
  688.             TipoFinestra tipoFinestra,TipoPeriodoStatistico tipoPeriodo, Date leftInterval, Date rightInterval,
  689.             TipoLatenza tipoLatenza,
  690.             DatiTransazione datiTransazione,IDUnivocoGroupByPolicy groupByPolicy, AttivazionePolicyFiltro filtro,
  691.             IState state,
  692.             RequestInfo requestInfo,
  693.             IProtocolFactory<?> protocolFactory) throws CoreException {
  694.    
  695.         Resource r = null;
  696.         boolean useConnectionRuntime = false;
  697.         IDSoggetto dominio = datiTransazione.getDominio();
  698.         String idModulo = datiTransazione.getModulo()+".statistiche.readLatenza";
  699.         String idTransazione = datiTransazione.getIdTransazione();
  700.         try{
  701.             Connection con = null;
  702.             if(this.checkState &&
  703.                 state!=null &&
  704.                 state instanceof StateMessage) {
  705.                 StateMessage s = (StateMessage) state;
  706.                 if(s.getConnectionDB()!=null && !s.getConnectionDB().isClosed()) {
  707.                     con = s.getConnectionDB();
  708.                     useConnectionRuntime = true;
  709.                 }
  710.             }
  711.             if(!useConnectionRuntime){
  712.                 r = this.dbStatisticheManager.getResource(dominio, idModulo, idTransazione);
  713.                 if(r==null){
  714.                     throw new CoreException(RISORSA_DB_NON_DISPONIBILE);
  715.                 }
  716.                 con = (Connection) r.getResource();
  717.             }
  718.             if(con == null)
  719.                 throw new CoreException(CONNESSIONE_DB_NON_DISPONIBILE);    

  720.             org.openspcoop2.core.statistiche.dao.IServiceManager statisticheSM =
  721.                     (org.openspcoop2.core.statistiche.dao.IServiceManager) this.daoFactory.getServiceManager(org.openspcoop2.core.statistiche.utils.ProjectInfo.getInstance(),
  722.                             con, this.daoFactoryServiceManagerPropertiesStatistiche, this.daoFactoryLogger);
  723.                
  724.             StatisticaModel model = null;
  725.             IServiceSearchWithoutId<?> dao = null;
  726.             boolean calcolaSommeMediaPesata = false;
  727.            
  728.             if(tipoFinestra!=null && TipoFinestra.SCORREVOLE.equals(tipoFinestra)){
  729.                 model = StatisticaOraria.model().STATISTICA_BASE;
  730.                 dao = statisticheSM.getStatisticaOrariaServiceSearch();
  731.             }
  732.             else{
  733.                 switch (tipoPeriodo) {
  734.                 case ORARIO:
  735.                     model = StatisticaOraria.model().STATISTICA_BASE;
  736.                     dao = statisticheSM.getStatisticaOrariaServiceSearch();
  737.                     break;
  738.                 case GIORNALIERO:
  739.                     model = StatisticaGiornaliera.model().STATISTICA_BASE;
  740.                     dao = statisticheSM.getStatisticaGiornalieraServiceSearch();
  741.                     break;
  742.                 case SETTIMANALE:
  743.                     if(this.configurazioneControlloTraffico.isElaborazioneStatistica_distribuzioneSettimanale_usaStatisticheGiornaliere()) {
  744.                         model = StatisticaGiornaliera.model().STATISTICA_BASE;
  745.                         dao = statisticheSM.getStatisticaGiornalieraServiceSearch();
  746.                         calcolaSommeMediaPesata = this.configurazioneControlloTraffico.isElaborazioneStatistica_distribuzioneSettimanaleMensile_usaStatisticheGiornaliere_latenza_mediaPesata();
  747.                     }
  748.                     else {
  749.                         model = StatisticaSettimanale.model().STATISTICA_BASE;
  750.                         dao = statisticheSM.getStatisticaSettimanaleServiceSearch();
  751.                     }
  752.                     break;
  753.                 case MENSILE:
  754.                     if(this.configurazioneControlloTraffico.isElaborazioneStatistica_distribuzioneMensile_usaStatisticheGiornaliere()) {
  755.                         model = StatisticaGiornaliera.model().STATISTICA_BASE;
  756.                         dao = statisticheSM.getStatisticaGiornalieraServiceSearch();
  757.                         calcolaSommeMediaPesata = this.configurazioneControlloTraffico.isElaborazioneStatistica_distribuzioneSettimanaleMensile_usaStatisticheGiornaliere_latenza_mediaPesata();
  758.                     }
  759.                     else {
  760.                         model = StatisticaMensile.model().STATISTICA_BASE;
  761.                         dao = statisticheSM.getStatisticaMensileServiceSearch();
  762.                     }
  763.                     break;
  764.                 }
  765.             }
  766.            
  767.             if(model==null) {
  768.                 throw new CoreException(MODEL_UNKNOWN);
  769.             }
  770.             if(dao==null) {
  771.                 throw new CoreException(DAO_UNKNOWN);
  772.             }
  773.            
  774.             ISQLFieldConverter fieldConverter = ((IDBServiceUtilities<?>)dao).getFieldConverter();
  775.            
  776.             IExpression expression = this.createWhereExpressionLatenza(dao, model, tipoRisorsa, leftInterval, rightInterval,
  777.                     datiTransazione.getTipoPdD(), protocolFactory, datiTransazione.getProtocollo(), groupByPolicy, filtro, tipoLatenza, state, requestInfo);
  778.                        
  779.             FunctionField ff = null;
  780.             switch (tipoLatenza) {
  781.             case PORTA:
  782.                 /**ff = new  FunctionField(model.LATENZA_PORTA, Function.AVG, "somma_latenza");*/
  783.                 ff = StatisticheUtils.calcolaMedia(fieldConverter, model.LATENZA_PORTA, model.NUMERO_TRANSAZIONI, "somma_latenza");
  784.                 break;
  785.             case SERVIZIO:
  786.                 /**ff = new  FunctionField(model.LATENZA_SERVIZIO, Function.AVG, "somma_latenza");*/
  787.                 ff = StatisticheUtils.calcolaMedia(fieldConverter, model.LATENZA_SERVIZIO, model.NUMERO_TRANSAZIONI, "somma_latenza");
  788.                 break;
  789.             case TOTALE:
  790.             default:
  791.                 /**ff = new  FunctionField(model.LATENZA_TOTALE, Function.AVG, "somma_latenza");*/
  792.                 ff = StatisticheUtils.calcolaMedia(fieldConverter, model.LATENZA_TOTALE, model.NUMERO_TRANSAZIONI, "somma_latenza");
  793.                 break;
  794.             }
  795.            
  796.             FunctionField ffSommaPesata = null;
  797.             if(calcolaSommeMediaPesata) {
  798.                 // per media pesata
  799.                 ffSommaPesata = new FunctionField(model.NUMERO_TRANSAZIONI,Function.SUM, "somma_media_pesata");
  800.             }
  801.            
  802.             RisultatoStatistico risultato = new RisultatoStatistico();
  803.             risultato.setDataInizio(leftInterval);
  804.             risultato.setDataFine(rightInterval);
  805.             risultato.setDateCheck(DateManager.getDate());
  806.            
  807.             try{
  808.                 if(ffSommaPesata!=null) {
  809.                    
  810.                     expression.addGroupBy(model.DATA);
  811.                    
  812.                     List<Map<String, Object>> list = dao.groupBy(expression, ff, ffSommaPesata);
  813.                     if(list!=null && !list.isEmpty()) {
  814.                         long sommaMediePesate = 0;
  815.                         long sommaNumeroTransazioni = 0;
  816.                         for (Map<String, Object> map : list) {
  817.                             Object result = map.get("somma_latenza");
  818.                             Object resultPesata = map.get("somma_media_pesata");
  819.                             long latenza = 0;
  820.                             long numeroTransazioni = 0;
  821.                             if(result!=null && this.isKnownType(result) ){
  822.                                 Long l = this.translateType(result);
  823.                                 if(l!=null) {
  824.                                     latenza = l.longValue();
  825.                                 }
  826.                                 else {
  827.                                     throw new CoreException("Translate type (result) '"+result+"' non riuscito");
  828.                                 }
  829.                             }
  830.                             if(resultPesata!=null && this.isKnownType(resultPesata) ){
  831.                                 Long l = this.translateType(resultPesata);
  832.                                 if(l!=null) {
  833.                                     numeroTransazioni = l.longValue();
  834.                                 }
  835.                                 else {
  836.                                     throw new CoreException("Translate type (resultPesata) '"+resultPesata+"' non riuscito");
  837.                                 }
  838.                             }
  839.                             sommaNumeroTransazioni+=numeroTransazioni;
  840.                             long mediaPesata = latenza*numeroTransazioni;
  841.                             sommaMediePesate+=mediaPesata;
  842.                         }
  843.                         long risultatoPesato = (sommaNumeroTransazioni>0) ? (sommaMediePesate / sommaNumeroTransazioni) : 0;
  844.                         risultato.setRisultato(risultatoPesato);
  845.                     }
  846.                     else {
  847.                         this.logDebug("LatenzaNotFound");
  848.                         risultato.setRisultato(0);
  849.                     }
  850.                 }
  851.                 else {
  852.                     Object result = dao.aggregate(expression, ff);
  853.                     if(result!=null && this.isKnownType(result) ){
  854.                         /**System.out.println("RITORNO OGGETTO LETTO DA DB CON CHIAVE ["+key+"]: ["+result+"] ["+result.getClass().getName()+"]");*/
  855.                         this.logDebug("LatenzaFound ["+result.getClass().getName()+"]: "+result);
  856.                         Long l = this.translateType(result);
  857.                         if(l!=null) {
  858.                             risultato.setRisultato(l.longValue());
  859.                         }
  860.                         else {
  861.                             throw new CoreException("Translate type (result) '"+result+"' non riuscito");
  862.                         }
  863.                     }
  864.                     else{
  865.                         if(result!=null){
  866.                             /**System.out.println("RITORNO OGGETTO LETTO DA DB CON CHIAVE ["+key+"]: ["+result+"] ["+result.getClass().getName()+"]");*/
  867.                             this.logDebug("LatenzaNotFound ["+result.getClass().getName()+"]: "+result);
  868.                         }else{
  869.                             this.logDebug("LatenzaNotFound, result is null");
  870.                         }
  871.                         risultato.setRisultato(0);
  872.                     }
  873.                 }
  874.             }catch(NotFoundException notFound){
  875.                 this.logDebug("LatenzaNotFound:"+notFound.getMessage(),notFound);
  876.                 risultato.setRisultato(0);
  877.             }
  878.            
  879.             return risultato;
  880.            
  881.         }catch(Exception e){
  882.             this.logError("Errore durante la raccolta dei dati statisti (key:"+key+"): "+e.getMessage(),e);
  883.             throw new CoreException(e.getMessage(),e);
  884.         }finally {
  885.             try{
  886.                 if(!useConnectionRuntime &&
  887.                     r!=null) {
  888.                     this.dbStatisticheManager.releaseResource(dominio, idModulo, r);
  889.                 }
  890.             }catch(Exception eClose){
  891.                 // ignore
  892.             }
  893.         }
  894.        
  895.     }
  896.    
  897.     private IExpression createWhereExpressionLatenza(
  898.             IServiceSearchWithoutId<?> dao, StatisticaModel model,
  899.             TipoRisorsa tipoRisorsa,
  900.             Date dataInizio, Date dataFine,
  901.             TipoPdD tipoPdDTransazioneInCorso,
  902.             IProtocolFactory<?> protocolFactory, String protocollo,
  903.             IDUnivocoGroupByPolicy groupByPolicy, AttivazionePolicyFiltro filtro,
  904.             TipoLatenza tipoLatenza,
  905.             IState state,
  906.             RequestInfo requestInfo) throws ServiceException, NotImplementedException, ExpressionNotImplementedException, ExpressionException, ProtocolException, DriverRegistroServiziException, DriverConfigurazioneException {
  907.        
  908.         IExpression expr = this.createWhereExpression(dao, model, tipoRisorsa, dataInizio, dataFine, tipoPdDTransazioneInCorso, protocolFactory, protocollo, groupByPolicy, filtro, state, requestInfo);

  909.         int [] esiti = null;
  910.         if(TipoPdD.DELEGATA.equals(tipoPdDTransazioneInCorso)){
  911.             esiti = this.configurazioneControlloTraffico.getCalcoloLatenzaPortaDelegataEsitiConsiderati().get(protocollo);
  912.         }
  913.         else{
  914.             esiti = this.configurazioneControlloTraffico.getCalcoloLatenzaPortaApplicativaEsitiConsiderati().get(protocollo);      
  915.         }
  916.        
  917.         // esito
  918.         IExpression exprEsiti = dao.newExpression();
  919.         exprEsiti.or();
  920.         for (int i = 0; i < esiti.length; i++) {
  921.             exprEsiti.equals(model.ESITO, esiti[i]);
  922.         }
  923.         expr.and(exprEsiti);
  924.            
  925.        
  926.         switch (tipoLatenza) {
  927.         case PORTA:
  928.             expr.isNotNull(model.LATENZA_PORTA);
  929.             break;
  930.         case SERVIZIO:
  931.             expr.isNotNull(model.LATENZA_SERVIZIO);
  932.             break;
  933.         case TOTALE:
  934.         default:
  935.             expr.isNotNull(model.LATENZA_TOTALE);
  936.             break;
  937.         }
  938.        
  939.         return expr;
  940.        
  941.     }
  942.    
  943.    
  944.    
  945.     // ***************** UTILS ************************
  946.    
  947.    
  948.     private IExpression createWhereExpression(
  949.             IServiceSearchWithoutId<?> dao, StatisticaModel model,
  950.             TipoRisorsa tipoRisorsa,
  951.             Date dataInizio, Date dataFine,
  952.             TipoPdD tipoPdDTransazioneInCorso,
  953.             IProtocolFactory<?> protocolFactory, String protocollo,
  954.             IDUnivocoGroupByPolicy groupByPolicy,
  955.             AttivazionePolicyFiltro filtro,
  956.             IState state,
  957.             RequestInfo requestInfo) throws ServiceException, NotImplementedException, ExpressionNotImplementedException, ExpressionException, ProtocolException, DriverRegistroServiziException, DriverConfigurazioneException  {

  958.         IExpression expr = null;

  959.         expr = dao.newExpression();
  960.         expr.and();
  961.        
  962.         // Data
  963.         expr.between(model.DATA,
  964.                 dataInizio,
  965.                 dataFine);
  966.        
  967.         // Record validi
  968.         StatisticheUtils.selezionaRecordValidi(expr, model);

  969.        
  970.         // escludo le transazioni con esito policy violate
  971.         int [] esitiPolicyViolate = this.configurazioneControlloTraffico.getEsitiPolicyViolate().get(protocollo);    
  972.         IExpression exprEsitiPolicyViolate = dao.newExpression();
  973.         exprEsitiPolicyViolate.or();
  974.         for (int i = 0; i < esitiPolicyViolate.length; i++) {
  975.             exprEsitiPolicyViolate.equals(model.ESITO, esitiPolicyViolate[i]);
  976.         }
  977.         expr.not(exprEsitiPolicyViolate);

  978.        
  979.         // Aggiungo esiti specifici
  980.         switch (tipoRisorsa) {
  981.         case NUMERO_RICHIESTE:
  982.         case DIMENSIONE_MASSIMA_MESSAGGIO:
  983.         case OCCUPAZIONE_BANDA:
  984.         case TEMPO_COMPLESSIVO_RISPOSTA:
  985.         case TEMPO_MEDIO_RISPOSTA:
  986.             // non serve filtrare altri esiti
  987.             break;

  988.         case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO:
  989.             expr.in(model.ESITO, EsitiProperties.getInstance(this.daoFactoryLogger,protocolFactory).getEsitiCodeOk());
  990.             break;
  991.         case NUMERO_RICHIESTE_FALLITE:
  992.             expr.in(model.ESITO, EsitiProperties.getInstance(this.daoFactoryLogger,protocolFactory).getEsitiCodeKo_senzaFaultApplicativo());
  993.             break;
  994.         case NUMERO_FAULT_APPLICATIVI:
  995.             expr.in(model.ESITO, EsitiProperties.getInstance(this.daoFactoryLogger,protocolFactory).getEsitiCodeFaultApplicativo());
  996.             break;
  997.         case NUMERO_RICHIESTE_FALLITE_OFAULT_APPLICATIVI:
  998.             expr.in(model.ESITO, EsitiProperties.getInstance(this.daoFactoryLogger,protocolFactory).getEsitiCodeKo());
  999.             break;
  1000.         case NUMERO_RICHIESTE_COMPLETATE_CON_SUCCESSO_OFAULT_APPLICATIVI:{
  1001.             List<Integer> esitiAppartenentiGruppo = new ArrayList<>();
  1002.             esitiAppartenentiGruppo.addAll(EsitiProperties.getInstance(this.daoFactoryLogger,protocolFactory).getEsitiCodeOk());
  1003.             esitiAppartenentiGruppo.addAll(EsitiProperties.getInstance(this.daoFactoryLogger,protocolFactory).getEsitiCodeFaultApplicativo());
  1004.             expr.in(model.ESITO, esitiAppartenentiGruppo);
  1005.             break;
  1006.         }
  1007.         }
  1008.        
  1009.        
  1010.         // capisco tipologia di policy
  1011.         boolean policyGlobale = true;
  1012.         if(filtro!=null && filtro.isEnabled() && filtro.getNomePorta()!=null && !"".equals(filtro.getNomePorta())){
  1013.             policyGlobale = false;
  1014.         }
  1015.        
  1016.        
  1017.         // Tipo Porta
  1018.         TipoPorta tipoPortaStat = null;
  1019.         TipoPdD tipoPdD = groupByPolicy.getRuoloPortaAsTipoPdD();
  1020.         if(tipoPdD==null &&
  1021.             // se è stato applicato un filtro, devo prelevare solo le informazioni statistiche che hanno un match non il filtro
  1022.             (filtro!=null && filtro.isEnabled() &&
  1023.                 (filtro.getRuoloPorta()!=null && !"".equals(filtro.getRuoloPorta().getValue()) &&
  1024.                         !RuoloPolicy.ENTRAMBI.equals(filtro.getRuoloPorta()))
  1025.                 )
  1026.             ){              
  1027.             if(RuoloPolicy.DELEGATA.equals(filtro.getRuoloPorta())){
  1028.                 tipoPdD = TipoPdD.DELEGATA;
  1029.             }
  1030.             if(RuoloPolicy.APPLICATIVA.equals(filtro.getRuoloPorta())){
  1031.                 tipoPdD = TipoPdD.APPLICATIVA;
  1032.             }
  1033.         }
  1034.         if(tipoPdD!=null){
  1035.             switch (tipoPdD) {
  1036.             case DELEGATA:
  1037.                 tipoPortaStat = TipoPorta.DELEGATA;
  1038.                 break;
  1039.             case APPLICATIVA:
  1040.                 tipoPortaStat = TipoPorta.APPLICATIVA;
  1041.                 break;
  1042.             case INTEGRATION_MANAGER:
  1043.                 tipoPortaStat = TipoPorta.INTEGRATION_MANAGER;
  1044.                 break;
  1045.             case ROUTER:
  1046.                 tipoPortaStat = TipoPorta.ROUTER;
  1047.                 break;
  1048.    
  1049.             }
  1050.             expr.equals(model.TIPO_PORTA, tipoPortaStat);
  1051.         }
  1052.        
  1053.         // mittente
  1054.         IDSoggetto fruitore = groupByPolicy.getFruitoreIfDefined();
  1055.         List<IDSoggetto> fruitoriByRuolo = null;
  1056.         if(fruitore==null &&
  1057.             // se è stato applicato un filtro, devo prelevare solo le informazioni statistiche che hanno un match non il filtro
  1058.             filtro!=null && filtro.isEnabled()){
  1059.             if(filtro.getTipoFruitore()!=null && !"".equals(filtro.getTipoFruitore()) &&
  1060.                     filtro.getNomeFruitore()!=null && !"".equals(filtro.getNomeFruitore())){
  1061.                 fruitore = new IDSoggetto(filtro.getTipoFruitore(), filtro.getNomeFruitore());
  1062.             }
  1063.             else if(filtro.getRuoloFruitore()!=null && !"".equals(filtro.getRuoloFruitore())){
  1064.                 /*
  1065.                  * Se policyGlobale:
  1066.                  *    si controlla sia il fruitore che l'applicativo. Basta che uno sia soddisfatto.
  1067.                  * else
  1068.                  *    nel caso di delegata si controlla solo l'applicativo.
  1069.                  *    nel caso di applicativa entrambi, e basta che uno sia soddisfatto.
  1070.                  **/
  1071.                 if(policyGlobale || TipoPdD.APPLICATIVA.equals(tipoPdD)){
  1072.                     RegistroServiziManager registroManager = RegistroServiziManager.getInstance(state);
  1073.                     FiltroRicercaSoggetti filtroRicerca = new FiltroRicercaSoggetti();
  1074.                     IDRuolo idRuolo = new IDRuolo(filtro.getRuoloFruitore());
  1075.                     filtroRicerca.setIdRuolo(idRuolo);
  1076.                     try {
  1077.                         fruitoriByRuolo = registroManager.getAllIdSoggetti(filtroRicerca, null);
  1078.                     }catch(DriverRegistroServiziNotFound notFound) {
  1079.                         // ignore
  1080.                     }
  1081.                 }
  1082.             }
  1083.         }
  1084.         if(fruitore!=null){
  1085.             expr.equals(model.TIPO_MITTENTE, fruitore.getTipo());
  1086.             expr.equals(model.MITTENTE, fruitore.getNome());
  1087.         }
  1088.         else if (fruitoriByRuolo!=null && !fruitoriByRuolo.isEmpty()) {
  1089.             List<IExpression> l = new ArrayList<>();
  1090.             for (IDSoggetto soggetto : fruitoriByRuolo) {
  1091.                 IExpression exprSoggetto = dao.newExpression();
  1092.                 exprSoggetto.equals(model.TIPO_MITTENTE, soggetto.getTipo());
  1093.                 exprSoggetto.and();
  1094.                 exprSoggetto.equals(model.MITTENTE, soggetto.getNome());
  1095.                 l.add(exprSoggetto);
  1096.             }
  1097.             expr.or(l.toArray(new IExpression[l.size()]));
  1098.         }
  1099.        
  1100.         // destinatario
  1101.         IDSoggetto erogatore = groupByPolicy.getErogatoreIfDefined();
  1102.         List<IDSoggetto> erogatoriByRuolo = null;
  1103.         if(erogatore==null &&
  1104.             // se è stato applicato un filtro, devo prelevare solo le informazioni statistiche che hanno un match non il filtro
  1105.             filtro!=null && filtro.isEnabled()){
  1106.             if(filtro.getTipoErogatore()!=null && !"".equals(filtro.getTipoErogatore()) &&
  1107.                     filtro.getNomeErogatore()!=null && !"".equals(filtro.getNomeErogatore())){
  1108.                 erogatore = new IDSoggetto(filtro.getTipoErogatore(), filtro.getNomeErogatore());
  1109.             }
  1110.             else if(filtro.getRuoloErogatore()!=null && !"".equals(filtro.getRuoloErogatore())){
  1111.                 RegistroServiziManager registroManager = RegistroServiziManager.getInstance(state);
  1112.                 FiltroRicercaSoggetti filtroRicerca = new FiltroRicercaSoggetti();
  1113.                 IDRuolo idRuolo = new IDRuolo(filtro.getRuoloErogatore());
  1114.                 filtroRicerca.setIdRuolo(idRuolo);
  1115.                 try {
  1116.                     erogatoriByRuolo = registroManager.getAllIdSoggetti(filtroRicerca, null);
  1117.                 }catch(DriverRegistroServiziNotFound notFound) {
  1118.                     // ignore
  1119.                 }
  1120.             }
  1121.         }
  1122.         if(erogatore!=null){
  1123.             expr.equals(model.TIPO_DESTINATARIO, erogatore.getTipo());
  1124.             expr.equals(model.DESTINATARIO, erogatore.getNome());
  1125.         }
  1126.         else if (erogatoriByRuolo!=null && !erogatoriByRuolo.isEmpty()) {
  1127.             List<IExpression> l = new ArrayList<>();
  1128.             for (IDSoggetto soggetto : erogatoriByRuolo) {
  1129.                 IExpression exprSoggetto = dao.newExpression();
  1130.                 exprSoggetto.equals(model.TIPO_DESTINATARIO, soggetto.getTipo());
  1131.                 exprSoggetto.and();
  1132.                 exprSoggetto.equals(model.DESTINATARIO, soggetto.getNome());
  1133.                 l.add(exprSoggetto);
  1134.             }
  1135.             expr.or(l.toArray(new IExpression[l.size()]));
  1136.         }
  1137.        
  1138.         // servizio
  1139.         IDServizio idServizio = groupByPolicy.getServizioIfDefined();
  1140.         List<IDServizio> idServiziByTag = null;
  1141.         if(idServizio==null &&
  1142.             // se è stato applicato un filtro, devo prelevare solo le informazioni statistiche che hanno un match non il filtro
  1143.             filtro!=null && filtro.isEnabled()){
  1144.             if(filtro.getTipoServizio()!=null && !"".equals(filtro.getTipoServizio()) &&
  1145.                     filtro.getNomeServizio()!=null && !"".equals(filtro.getNomeServizio()) &&
  1146.                     filtro.getVersioneServizio()!=null){
  1147.                 idServizio = IDServizioFactory.getInstance().getIDServizioFromValuesWithoutCheck(filtro.getTipoServizio(), filtro.getNomeServizio(), null, null, filtro.getVersioneServizio().intValue());
  1148.             }
  1149.             else if(!policyGlobale && filtro.getNomePorta()!=null && !"".equals(filtro.getNomePorta()) && filtro.getRuoloPorta()!=null) {
  1150.                 ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance(state);
  1151.                 if(RuoloPolicy.DELEGATA.equals(filtro.getRuoloPorta())){
  1152.                     IDPortaDelegata idPD = new IDPortaDelegata();
  1153.                     idPD.setNome(filtro.getNomePorta());
  1154.                     PortaDelegata pd = configurazionePdDManager.getPortaDelegataSafeMethod(idPD, requestInfo);
  1155.                     if(pd!=null && pd.getServizio()!=null && pd.getSoggettoErogatore()!=null) {
  1156.                         idServizio = IDServizioFactory.getInstance().getIDServizioFromValuesWithoutCheck(pd.getServizio().getTipo(), pd.getServizio().getNome(),
  1157.                                 pd.getSoggettoErogatore().getTipo(), pd.getSoggettoErogatore().getNome(),
  1158.                                 pd.getServizio().getVersione());
  1159.                     }
  1160.                 }
  1161.                 else {
  1162.                     IDPortaApplicativa idPA = new IDPortaApplicativa();
  1163.                     idPA.setNome(filtro.getNomePorta());
  1164.                     PortaApplicativa pa = configurazionePdDManager.getPortaApplicativaSafeMethod(idPA, requestInfo);
  1165.                     if(pa!=null && pa.getServizio()!=null) {
  1166.                         idServizio = IDServizioFactory.getInstance().getIDServizioFromValuesWithoutCheck(pa.getServizio().getTipo(), pa.getServizio().getNome(),
  1167.                                 pa.getTipoSoggettoProprietario(), pa.getNomeSoggettoProprietario(),
  1168.                                 pa.getServizio().getVersione());
  1169.                     }
  1170.                 }
  1171.             }
  1172.             else if(filtro.getTag()!=null && !"".equals(filtro.getTag())){
  1173.                 RegistroServiziManager registroManager = RegistroServiziManager.getInstance(state);
  1174.                 FiltroRicercaAccordi filtroRicercaAccordi = new FiltroRicercaAccordi();
  1175.                 filtroRicercaAccordi.setIdGruppo(new IDGruppo(filtro.getTag()));
  1176.                 List<IDAccordo> lIdAccordi = null;
  1177.                 try {
  1178.                     lIdAccordi = registroManager.getAllIdAccordiServizioParteComune(filtroRicercaAccordi, null);
  1179.                 }catch(DriverRegistroServiziNotFound notFound) {
  1180.                     // ignore
  1181.                 }
  1182.                 if(lIdAccordi!=null && !lIdAccordi.isEmpty()) {
  1183.                     for (IDAccordo idAccordoByTag : lIdAccordi) {
  1184.                         FiltroRicercaServizi filtroRicerca = new FiltroRicercaServizi();
  1185.                         filtroRicerca.setIdAccordoServizioParteComune(idAccordoByTag);
  1186.                         if(erogatore!=null) {
  1187.                             filtroRicerca.setTipoSoggettoErogatore(erogatore.getTipo());
  1188.                             filtroRicerca.setNomeSoggettoErogatore(erogatore.getNome());
  1189.                         }
  1190.                         List<IDServizio> lIdServizi = null;
  1191.                         try {
  1192.                             lIdServizi = registroManager.getAllIdServizi(filtroRicerca, null);
  1193.                         }catch(DriverRegistroServiziNotFound notFound) {
  1194.                             // ignore
  1195.                         }
  1196.                         if(lIdServizi!=null && !lIdServizi.isEmpty()) {
  1197.                             if(idServiziByTag==null) {
  1198.                                 idServiziByTag = new ArrayList<>();
  1199.                             }
  1200.                             for (IDServizio idServizioByTag : lIdServizi) {
  1201.                                 idServiziByTag.add(idServizioByTag);
  1202.                             }
  1203.                         }
  1204.                     }
  1205.                 }
  1206.             }
  1207.         }
  1208.         if(idServizio!=null){
  1209.             expr.equals(model.TIPO_SERVIZIO, idServizio.getTipo());
  1210.             expr.equals(model.SERVIZIO, idServizio.getNome());
  1211.             expr.equals(model.VERSIONE_SERVIZIO, idServizio.getVersione());
  1212.         }
  1213.         else if (idServiziByTag!=null && !idServiziByTag.isEmpty()) {
  1214.             List<IExpression> l = new ArrayList<>();
  1215.             for (IDServizio idServizioByTag : idServiziByTag) {
  1216.                 IExpression exprServizio = dao.newExpression();
  1217.                 exprServizio.and();
  1218.                 exprServizio.equals(model.TIPO_DESTINATARIO, idServizioByTag.getSoggettoErogatore().getTipo());
  1219.                 exprServizio.equals(model.DESTINATARIO, idServizioByTag.getSoggettoErogatore().getNome());
  1220.                 exprServizio.equals(model.TIPO_SERVIZIO, idServizioByTag.getTipo());
  1221.                 exprServizio.equals(model.SERVIZIO, idServizioByTag.getNome());
  1222.                 exprServizio.equals(model.VERSIONE_SERVIZIO, idServizioByTag.getVersione());
  1223.                 l.add(exprServizio);
  1224.             }
  1225.             expr.or(l.toArray(new IExpression[l.size()]));
  1226.         }
  1227.        
  1228.         // protocollo
  1229.         String protocolloGroupBy = groupByPolicy.getProtocolloIfDefined();
  1230.         if(protocolloGroupBy==null &&
  1231.             // se è stato applicato un filtro, devo prelevare solo le informazioni statistiche che hanno un match non il filtro
  1232.             filtro!=null && filtro.isEnabled() &&
  1233.             filtro.getProtocollo()!=null && !"".equals(filtro.getProtocollo())){
  1234.             protocolloGroupBy = filtro.getProtocollo();
  1235.         }
  1236.         if(protocolloGroupBy!=null &&
  1237.             fruitore==null && erogatore==null && idServizio==null){
  1238.             // il tipo se è definito uno dei 3 elementi è insito nell'elemento stesso
  1239.             List<String> listaTipiSoggetto = ProtocolFactoryManager.getInstance().getOrganizationTypes().get(protocolloGroupBy);
  1240.             expr.in(model.TIPO_MITTENTE, listaTipiSoggetto);
  1241.             expr.in(model.TIPO_DESTINATARIO, listaTipiSoggetto);
  1242.         }
  1243.        
  1244.         // azione
  1245.         String azione = groupByPolicy.getAzioneIfDefined();
  1246.         if(azione!=null){
  1247.             expr.equals(model.AZIONE, azione);
  1248.         }
  1249.         else {
  1250.             // se è stato applicato un filtro, devo prelevare solo le informazioni statistiche che hanno un match non il filtro
  1251.             if(filtro!=null && filtro.isEnabled() &&
  1252.                 filtro.getAzione()!=null && !"".equals(filtro.getAzione()) && idServizio!=null){
  1253.                 String [] tmp = filtro.getAzione().split(",");
  1254.                 List<String> azioneList = new ArrayList<>();
  1255.                 if(tmp!=null && tmp.length>0) {
  1256.                     for (String az : tmp) {
  1257.                         azioneList.add(az);
  1258.                     }
  1259.                 }
  1260.                 expr.in(model.AZIONE, azioneList);
  1261.             }
  1262.         }
  1263.        
  1264.         // Servizio Applicativo
  1265.         /**if(TipoPdD.DELEGATA.equals(tipoPdDTransazioneInCorso)){*/
  1266.            
  1267.         // servizioApplicativoFruitore
  1268.         String servizioApplicativoFruitore = groupByPolicy.getServizioApplicativoFruitoreIfDefined();
  1269.         List<IDServizioApplicativo> servizioApplicativoFruitoreByRuolo = null;
  1270.         if(servizioApplicativoFruitore==null &&
  1271.             // se è stato applicato un filtro, devo prelevare solo le informazioni statistiche che hanno un match non il filtro
  1272.             filtro!=null && filtro.isEnabled()){
  1273.             if(filtro.getServizioApplicativoFruitore()!=null && !"".equals(filtro.getServizioApplicativoFruitore())){
  1274.                 servizioApplicativoFruitore = filtro.getServizioApplicativoFruitore();
  1275.             }
  1276.             else if(filtro.getRuoloFruitore()!=null && !"".equals(filtro.getRuoloFruitore())){
  1277.                 /*
  1278.                  * Se policyGlobale:
  1279.                  *    si controlla sia il fruitore che l'applicativo. Basta che uno sia soddisfatto.
  1280.                  * else
  1281.                  *    nel caso di delegata si controlla solo l'applicativo.
  1282.                  *    nel caso di applicativa entrambi, e basta che uno sia soddisfatto.
  1283.                  **/
  1284.                 ConfigurazionePdDManager configurazionePdDManager = ConfigurazionePdDManager.getInstance(state);
  1285.                 FiltroRicercaServiziApplicativi filtroRicerca = new FiltroRicercaServiziApplicativi();
  1286.                 IDRuolo idRuolo = new IDRuolo(filtro.getRuoloFruitore());
  1287.                 filtroRicerca.setIdRuolo(idRuolo);
  1288.                 List<IDServizioApplicativo> list = null;
  1289.                 try {
  1290.                     list = configurazionePdDManager.getAllIdServiziApplicativi(filtroRicerca);
  1291.                 }catch(DriverConfigurazioneNotFound notFound) {
  1292.                     // ignore
  1293.                 }
  1294.                 if(list!=null && !list.isEmpty()) {
  1295.                     servizioApplicativoFruitoreByRuolo = list;
  1296.                 }
  1297.             }
  1298.         }
  1299.         if(servizioApplicativoFruitore!=null){
  1300.             expr.equals(model.SERVIZIO_APPLICATIVO, servizioApplicativoFruitore);
  1301.         }
  1302.         else if (servizioApplicativoFruitoreByRuolo!=null && !servizioApplicativoFruitoreByRuolo.isEmpty()) {
  1303.             List<IExpression> l = new ArrayList<>();
  1304.             for (IDServizioApplicativo idServizioApplicativo : servizioApplicativoFruitoreByRuolo) {
  1305.                 IExpression exprServizioApplicativo = dao.newExpression();
  1306.                 exprServizioApplicativo.and();
  1307.                 exprServizioApplicativo.equals(model.TIPO_MITTENTE, idServizioApplicativo.getIdSoggettoProprietario().getTipo());
  1308.                 exprServizioApplicativo.equals(model.MITTENTE, idServizioApplicativo.getIdSoggettoProprietario().getNome());
  1309.                 exprServizioApplicativo.equals(model.SERVIZIO_APPLICATIVO, idServizioApplicativo.getNome());
  1310.                 l.add(exprServizioApplicativo);
  1311.             }
  1312.             expr.or(l.toArray(new IExpression[l.size()]));
  1313.         }
  1314.            
  1315.        
  1316.        
  1317.         if(TipoPdD.APPLICATIVA.equals(tipoPdDTransazioneInCorso)){
  1318.            
  1319.             // servizioApplicativoErogatore
  1320.             String servizioApplicativoErogatore = groupByPolicy.getServizioApplicativoErogatoreIfDefined();
  1321.             if(servizioApplicativoErogatore==null &&
  1322.                 // se è stato applicato un filtro, devo prelevare solo le informazioni statistiche che hanno un match non il filtro
  1323.                 (filtro!=null && filtro.isEnabled() &&
  1324.                     filtro.getServizioApplicativoErogatore()!=null && !"".equals(filtro.getServizioApplicativoErogatore()))
  1325.                 ){
  1326.                 servizioApplicativoErogatore = filtro.getServizioApplicativoErogatore();
  1327.             }
  1328.             if(servizioApplicativoErogatore!=null){
  1329.                 expr.equals(model.SERVIZIO_APPLICATIVO, servizioApplicativoErogatore);
  1330.             }
  1331.            
  1332.         }
  1333.         return expr;
  1334.     }

  1335.     private boolean isKnownType(Object result){
  1336.         return (result instanceof Long) || (result instanceof Integer) || (result instanceof Short)
  1337.                 || (result instanceof Double) || (result instanceof Float)  ;
  1338.     }
  1339.    
  1340.     private Long translateType(Object result){
  1341.         if ( result instanceof Long  ){
  1342.             return (Long) result;
  1343.         }
  1344.         else if ( result instanceof Integer  ){
  1345.             return ((Integer) result).longValue();
  1346.         }
  1347.         else if ( result instanceof Short  ){
  1348.             return ((Short) result).longValue();
  1349.         }
  1350.         else if ( result instanceof Double  ){
  1351.             return ((Double) result).longValue();
  1352.         }
  1353.         else if ( result instanceof Float  ){
  1354.             return ((Float) result).longValue();
  1355.         }
  1356.         else{
  1357.             return null;
  1358.         }
  1359.     }
  1360. }