BuilderDatiCollezionatiDistributed.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.Serializable;
  22. import java.util.Date;
  23. import java.util.HashMap;
  24. import java.util.List;

  25. import org.openspcoop2.core.controllo_traffico.beans.ActivePolicy;
  26. import org.openspcoop2.core.controllo_traffico.beans.DatiCollezionati;
  27. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicyMapId;
  28. import org.openspcoop2.core.controllo_traffico.driver.PolicyException;
  29. import org.openspcoop2.core.controllo_traffico.driver.PolicyGroupByActiveThreadsType;
  30. import org.openspcoop2.pdd.config.OpenSPCoop2Properties;
  31. import org.openspcoop2.pdd.core.controllo_traffico.policy.PolicyDateUtils;
  32. import org.openspcoop2.pdd.core.controllo_traffico.policy.driver.hazelcast.HazelcastManager;
  33. import org.openspcoop2.pdd.core.controllo_traffico.policy.driver.hazelcast.counters.DatiCollezionatiDistributedAtomicLong;
  34. import org.openspcoop2.pdd.core.controllo_traffico.policy.driver.hazelcast.counters.DatiCollezionatiDistributedAtomicLongAsync;
  35. import org.openspcoop2.pdd.core.controllo_traffico.policy.driver.hazelcast.counters.DatiCollezionatiDistributedPNCounter;
  36. import org.openspcoop2.pdd.core.controllo_traffico.policy.driver.redisson.RedissonManager;
  37. import org.openspcoop2.pdd.core.controllo_traffico.policy.driver.redisson.counters.DatiCollezionatiDistributedLongAdder;
  38. import org.openspcoop2.pdd.core.controllo_traffico.policy.driver.redisson.counters.DatiCollezionatiDistributedRedisAtomicLong;
  39. import org.openspcoop2.pdd.logger.OpenSPCoop2Logger;
  40. import org.openspcoop2.utils.Map;
  41. import org.redisson.api.RedissonClient;
  42. import org.slf4j.Logger;

  43. import com.hazelcast.core.HazelcastInstance;

  44. /**
  45.  * BuilderDatiCollezionatiDistributed
  46.  *
  47.  * @author Francesco Scarlato (scarlato@link.it)
  48.  * @author $Author$
  49.  * @version $Rev$, $Date$
  50.  */
  51. public class BuilderDatiCollezionatiDistributed implements Serializable {
  52.    
  53.     // - c config: configuration date
  54.     // - i intervallo: intervallo di validità del contatore
  55.    
  56.     private static final long serialVersionUID = 1L;
  57.    
  58.     public static final String DISTRUBUITED_UPDATE_POLICY_DATE = "-updatePolicyDate-c-";
  59.     public static final String DISTRUBUITED_POLICY_DATE = "-policyDate-c";
  60.    
  61.     public static final String DISTRUBUITED_SUFFIX_CONFIG_DATE = "-c-";
  62.    
  63.     public static final String DISTRUBUITED_INTERVAL_POLICY_REQUEST_COUNTER = "-policyRequestCounter-i-";
  64.     public static final String DISTRUBUITED_INTERVAL_POLICY_COUNTER = "-policyCounter-i-";
  65.    
  66.     public static final String DISTRUBUITED_POLICY_DEGRADO_PRESTAZIONALE_DATE = "-policyDegradoPrestazionaleDate-c-";
  67.     public static final String DISTRUBUITED_INTERVAL_POLICY_DEGRADO_PRESTAZIONALE_COUNTER = "-policyDegradoPrestazionaleCounter-i-";
  68.     public static final String DISTRUBUITED_INTERVAL_POLICY_DEGRADO_PRESTAZIONALE_REQUEST_COUNTER = "-policyDegradoPrestazionaleRequestCounter-i-";
  69.    
  70.     public static final String DISTRUBUITED_ACTIVE_REQUEST_COUNTER = "-activeRequestCounter-c-";
  71.    
  72.     public static final String DISTRUBUITED_INTERVAL_POLICY_DENY_REQUEST_COUNTER = "-policyDenyRequestCounter-i-";
  73.    
  74.    
  75.     public final PolicyGroupByActiveThreadsType tipoPolicy;
  76.    
  77.     private transient HazelcastInstance _hazelcast = null;
  78.     private synchronized void initHazelcast() throws PolicyException {
  79.         if(this._hazelcast==null) {
  80.             this._hazelcast = HazelcastManager.getInstance(this.tipoPolicy);
  81.         }
  82.     }
  83.     public HazelcastInstance getHazelcast() throws RuntimeException{
  84.         if(this._hazelcast==null) {
  85.             try {
  86.                 initHazelcast();
  87.             }catch(Exception e) {
  88.                 throw new RuntimeException(e.getMessage(),e);
  89.             }
  90.         }
  91.         return this._hazelcast;
  92.     }
  93.    
  94.     private transient RedissonClient _redisson = null;
  95.     private synchronized void initRedisson() throws PolicyException {
  96.         if(this._redisson==null) {
  97.             boolean throwInitializingException = true;
  98.             try {
  99.                 this._redisson = RedissonManager.getRedissonClient(throwInitializingException);
  100.             }catch(Exception e) {
  101.                 throw new PolicyException(e.getMessage(),e);
  102.             }
  103.         }
  104.     }
  105.     public RedissonClient getRedisson() throws RuntimeException{
  106.         if(this._redisson==null) {
  107.             try {
  108.                 initRedisson();
  109.             }catch(Exception e) {
  110.                 throw new RuntimeException(e.getMessage(),e);
  111.             }
  112.         }
  113.         return this._redisson;
  114.     }
  115.    
  116.    
  117.     private static final java.util.Map<PolicyGroupByActiveThreadsType, BuilderDatiCollezionatiDistributed> builderCache = new HashMap<>();
  118.     private static final List<PolicyGroupByActiveThreadsType> policyAmmesse = List.of(
  119.             PolicyGroupByActiveThreadsType.HAZELCAST_ATOMIC_LONG,
  120.             PolicyGroupByActiveThreadsType.HAZELCAST_ATOMIC_LONG_ASYNC,
  121.             PolicyGroupByActiveThreadsType.HAZELCAST_PNCOUNTER,
  122.             PolicyGroupByActiveThreadsType.REDISSON_ATOMIC_LONG,
  123.             PolicyGroupByActiveThreadsType.REDISSON_LONGADDER);
  124.            
  125.    
  126.     private BuilderDatiCollezionatiDistributed(PolicyGroupByActiveThreadsType tipoPolicy) throws PolicyException {
  127.        
  128.         if (!policyAmmesse.contains(tipoPolicy)) {
  129.             throw new PolicyException("Tipo Policy " + tipoPolicy + " non supportato per il BuilderDatiCollezionatiDistributed, utilizzare una delle policyAmmesse.");
  130.         }
  131.        
  132.         this.tipoPolicy = tipoPolicy;
  133.        
  134.         if (tipoPolicy.isHazelcast() ) {
  135.             this._hazelcast = HazelcastManager.getInstance(this.tipoPolicy);
  136.             this._redisson  = null;
  137.         } else {
  138.             boolean throwInitializingException = true;
  139.             try {
  140.                 this._redisson = RedissonManager.getRedissonClient(throwInitializingException);
  141.             }catch(Exception e) {
  142.                 throw new PolicyException(e.getMessage(),e);
  143.             }
  144.             this._hazelcast = null;
  145.         }
  146.     }
  147.    
  148.    
  149.     public DatiCollezionati build(DatiCollezionati dati, IDUnivocoGroupByPolicyMapId id, ActivePolicy activePolicy) {
  150.         DatiCollezionati ret;
  151.        
  152.         Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTraffico(OpenSPCoop2Properties.getInstance().isControlloTrafficoDebug());
  153.        
  154.         switch (this.tipoPolicy) {
  155.         case HAZELCAST_ATOMIC_LONG:
  156.             ret = new DatiCollezionatiDistributedAtomicLong(log, dati, this.getHazelcast(), id, activePolicy);
  157.             break;
  158.         case HAZELCAST_ATOMIC_LONG_ASYNC:
  159.             ret = new DatiCollezionatiDistributedAtomicLongAsync(log, dati, this.getHazelcast(), id, activePolicy);
  160.             break;
  161.         case HAZELCAST_PNCOUNTER:
  162.             ret = new DatiCollezionatiDistributedPNCounter(log, dati, this.getHazelcast(), id, activePolicy);
  163.             break;
  164.         case REDISSON_ATOMIC_LONG:
  165.             ret = new DatiCollezionatiDistributedRedisAtomicLong(log, dati,  this.getRedisson(), id, activePolicy);
  166.             break;
  167.         case REDISSON_LONGADDER:
  168.             ret = new DatiCollezionatiDistributedLongAdder(log, dati, this.getRedisson(), id, activePolicy);
  169.             break;
  170.         default:
  171.             throw new RuntimeException("Tipo Policy" + this.tipoPolicy + " Sconosciuto per il builder. Sono controllati nel costruttore, non dovrebbe mai accadere!");
  172.         }
  173.        
  174.         return ret;
  175.     }
  176.    
  177.    
  178.     public DatiCollezionati build(Date updatePolicyDate, IDUnivocoGroupByPolicyMapId id, ActivePolicy activePolicy, Map<Object> ctx) {
  179.         DatiCollezionati ret;
  180.        
  181.         Logger log = OpenSPCoop2Logger.getLoggerOpenSPCoopControlloTraffico(OpenSPCoop2Properties.getInstance().isControlloTrafficoDebug());
  182.        
  183.         Date gestorePolicyConfigDate = PolicyDateUtils.readGestorePolicyConfigDateIntoContext(ctx);
  184.                
  185.         switch (this.tipoPolicy) {
  186.         case HAZELCAST_ATOMIC_LONG:
  187.             ret = new DatiCollezionatiDistributedAtomicLong(log, updatePolicyDate, gestorePolicyConfigDate, this.getHazelcast(), id, activePolicy);
  188.             break;
  189.         case HAZELCAST_ATOMIC_LONG_ASYNC:
  190.             ret = new DatiCollezionatiDistributedAtomicLongAsync(log, updatePolicyDate, gestorePolicyConfigDate, this.getHazelcast(), id, activePolicy);
  191.             break;
  192.         case HAZELCAST_PNCOUNTER:
  193.             ret = new DatiCollezionatiDistributedPNCounter(log, updatePolicyDate, gestorePolicyConfigDate, this.getHazelcast(), id, activePolicy);
  194.             break;
  195.         case REDISSON_ATOMIC_LONG:
  196.             ret = new DatiCollezionatiDistributedRedisAtomicLong(log, updatePolicyDate, gestorePolicyConfigDate, this.getRedisson(), id, activePolicy);
  197.             break;
  198.         case REDISSON_LONGADDER:
  199.             ret = new DatiCollezionatiDistributedLongAdder(log, updatePolicyDate, gestorePolicyConfigDate, this.getRedisson(), id, activePolicy);
  200.             break;
  201.         default:
  202.             throw new RuntimeException("Tipo Policy" + this.tipoPolicy + " Sconosciuto per il builder. Sono controllati nel costruttore, non dovrebbe mai accadere!");
  203.         }
  204.        
  205.         return ret;
  206.     }

  207.    
  208.     private static synchronized void initBuilder(PolicyGroupByActiveThreadsType type) throws PolicyException {
  209.        
  210.         var ret = builderCache.get(type);
  211.         if (ret == null) {
  212.             ret = new BuilderDatiCollezionatiDistributed(type);
  213.             builderCache.put(type,  ret);
  214.         }

  215.     }
  216.     public static BuilderDatiCollezionatiDistributed getBuilder(PolicyGroupByActiveThreadsType type) throws PolicyException {
  217.        
  218.         var ret = builderCache.get(type);
  219.         if (ret == null) {
  220.             initBuilder(type);
  221.             ret = builderCache.get(type);
  222.         }

  223.         return ret;
  224.     }
  225.    
  226.    
  227. }