PolicyGroupByActiveThreadsDistributedNearCache.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.hazelcast;

  21. import java.util.Date;
  22. import java.util.Map.Entry;

  23. import org.openspcoop2.core.controllo_traffico.beans.ActivePolicy;
  24. import org.openspcoop2.core.controllo_traffico.beans.DatiCollezionati;
  25. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicy;
  26. import org.openspcoop2.core.controllo_traffico.beans.MisurazioniTransazione;
  27. import org.openspcoop2.core.controllo_traffico.driver.PolicyException;
  28. import org.openspcoop2.core.controllo_traffico.driver.PolicyGroupByActiveThreadsType;
  29. import org.openspcoop2.core.controllo_traffico.driver.PolicyNotFoundException;
  30. import org.openspcoop2.pdd.core.controllo_traffico.policy.PolicyDateUtils;
  31. import org.openspcoop2.utils.Map;
  32. import org.slf4j.Logger;

  33. import com.hazelcast.core.HazelcastInstance;

  34. /**
  35.  *
  36.  * Gestore contatori policy che lavora sulla copia distribuita ed esegue computazioni locali con quello
  37.  * che trova nella cache.
  38.  *
  39.  *
  40.  * @author Francesco Scarlato (scarlato@link.it)
  41.  * @author $Author$
  42.  * @version $Rev$, $Date$
  43.  */
  44. public class PolicyGroupByActiveThreadsDistributedNearCache extends AbstractPolicyGroupByActiveThreadsDistributed  {


  45.     public PolicyGroupByActiveThreadsDistributedNearCache(ActivePolicy policy, String uniqueIdMap, HazelcastInstance hazelcast) throws PolicyException {
  46.         super(policy, uniqueIdMap, PolicyGroupByActiveThreadsType.HAZELCAST_NEAR_CACHE, hazelcast);
  47.     }

  48.     @Override
  49.     public DatiCollezionati registerStartRequest(Logger log, String idTransazione, IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx)
  50.             throws PolicyException {
  51.        
  52.         datiGroupBy = augmentIDUnivoco(datiGroupBy);
  53.        
  54.         // Lavoro in asincrono sui contatori della copia remota
  55.         this.distributedMap.submitToKey(datiGroupBy, new StartRequestProcessor(this.activePolicy,ctx));
  56.        
  57.         DatiCollezionati datiCollezionati = this.distributedMap.get(datiGroupBy);
  58.         boolean newDati = false;
  59.         if (datiCollezionati == null) {
  60.             Date gestorePolicyConfigDate = PolicyDateUtils.readGestorePolicyConfigDateIntoContext(ctx);
  61.             datiCollezionati = new DatiCollezionati(this.activePolicy.getInstanceConfiguration().getUpdateTime(), gestorePolicyConfigDate);
  62.             newDati = true;
  63.         }
  64.         else {
  65.             if(datiCollezionati.getUpdatePolicyDate()!=null) {
  66.                 if(!datiCollezionati.getUpdatePolicyDate().equals(this.activePolicy.getInstanceConfiguration().getUpdateTime())) {
  67.                     // data aggiornata
  68.                     datiCollezionati.resetCounters(this.activePolicy.getInstanceConfiguration().getUpdateTime());
  69.                 }
  70.             }
  71.         }
  72.         DatiCollezionati datiCollezionatiPerPolicyVerifier = (DatiCollezionati) datiCollezionati.newInstance(); // i valori utilizzati dal policy verifier verranno impostati con il valore impostato nell'operazione chiamata
  73.         if(newDati) {
  74.             datiCollezionatiPerPolicyVerifier.initDatiIniziali(this.activePolicy);
  75.             datiCollezionatiPerPolicyVerifier.checkDate(log, this.activePolicy); // inizializza le date se ci sono
  76.         }
  77.        
  78.         // Lavoro anche sulla copia locale
  79.         datiCollezionati.registerStartRequest(log, this.activePolicy, ctx, datiCollezionatiPerPolicyVerifier);
  80.        
  81.         return datiCollezionatiPerPolicyVerifier;
  82.     }
  83.    
  84.    
  85.     @Override
  86.     public DatiCollezionati updateDatiStartRequestApplicabile(Logger log, String idTransazione,
  87.             IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx) throws PolicyException, PolicyNotFoundException {
  88.        
  89.         datiGroupBy = augmentIDUnivoco(datiGroupBy);

  90.         // Lavoro sulla copia remota
  91.         this.distributedMap.submitToKey(datiGroupBy, new UpdateDatiRequestProcessor(this.activePolicy, ctx));

  92.         // Opero sulla copia locale
  93.         // per adesso se la policy non รจ ancora arrivata nella near cache, agisco in locale come se fosse la prima richiesta.
  94.         DatiCollezionati datiCollezionati = this.distributedMap.get(datiGroupBy);          
  95.         if(datiCollezionati == null) {
  96.             log.debug("(idTransazione:"+idTransazione+") Policy non ancora in Near Cache. Conto come fosse la prima richiesta; dati identificativi ["+datiGroupBy.toString()+"]");
  97.            
  98.             Date gestorePolicyConfigDate = PolicyDateUtils.readGestorePolicyConfigDateIntoContext(ctx);
  99.             datiCollezionati = new DatiCollezionati(this.activePolicy.getInstanceConfiguration().getUpdateTime(), gestorePolicyConfigDate);
  100.             datiCollezionati.registerStartRequest(log, this.activePolicy, null);
  101.             return datiCollezionati;
  102.         } else {
  103.             DatiCollezionati datiCollezionatiPerPolicyVerifier = (DatiCollezionati) datiCollezionati.newInstance(); // i valori utilizzati dal policy verifier verranno impostati con il valore impostato nell'operazione chiamata
  104.            
  105.             boolean update = datiCollezionati.updateDatiStartRequestApplicabile(log, this.activePolicy, ctx, datiCollezionatiPerPolicyVerifier);
  106.             if(update) {
  107.                 return datiCollezionatiPerPolicyVerifier;
  108.             }
  109.            
  110.             return null;
  111.         }
  112.     }
  113.    
  114.     @Override
  115.     public void registerStopRequest(Logger log, String idTransazione, IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx,
  116.             MisurazioniTransazione dati, boolean isApplicabile, boolean isViolata)
  117.             throws PolicyException, PolicyNotFoundException {
  118.        
  119.         datiGroupBy = augmentIDUnivoco(datiGroupBy);

  120.         // Lavoro sulla copia remota
  121.         this.distributedMap.submitToKey(datiGroupBy, new EndRequestProcessor(this.activePolicy, ctx, dati, isApplicabile, isViolata));          
  122.        
  123.         // Non ho nulla da restituire e non gestisco direttamente la near cache quindi l'ultima richiesta la faccio solo in remoto
  124.     }
  125.    
  126.     @Override
  127.     public void resetCounters() {
  128.        
  129.         this.distributedMap.executeOnEntries( (Entry<IDUnivocoGroupByPolicy, DatiCollezionati> entry) -> {
  130.             entry.getValue().resetCounters();
  131.             entry.setValue(entry.getValue());
  132.             return true;
  133.         });        
  134.     }
  135.    
  136. }