PolicyGroupByActiveThreadsDistributedCounters.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.ArrayList;
  23. import java.util.Date;
  24. import java.util.HashMap;
  25. import java.util.Iterator;
  26. import java.util.List;

  27. import org.openspcoop2.core.controllo_traffico.beans.ActivePolicy;
  28. import org.openspcoop2.core.controllo_traffico.beans.DatiCollezionati;
  29. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupBy;
  30. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicy;
  31. import org.openspcoop2.core.controllo_traffico.beans.IDUnivocoGroupByPolicyMapId;
  32. import org.openspcoop2.core.controllo_traffico.beans.IDatiCollezionatiDistributed;
  33. import org.openspcoop2.core.controllo_traffico.beans.MisurazioniTransazione;
  34. import org.openspcoop2.core.controllo_traffico.beans.UniqueIdentifierUtilities;
  35. import org.openspcoop2.core.controllo_traffico.constants.Costanti;
  36. import org.openspcoop2.core.controllo_traffico.driver.IPolicyGroupByActiveThreadsInMemory;
  37. import org.openspcoop2.core.controllo_traffico.driver.PolicyException;
  38. import org.openspcoop2.core.controllo_traffico.driver.PolicyNotFoundException;
  39. import org.openspcoop2.protocol.utils.EsitiProperties;
  40. import org.openspcoop2.utils.Map;
  41. import org.openspcoop2.utils.SemaphoreLock;
  42. import org.openspcoop2.utils.UtilsException;
  43. import org.slf4j.Logger;

  44. /**
  45.  * PolicyGroupByActiveThreadsDistributedCounters
  46.  *
  47.  * @author Francesco Scarlato (scarlato@link.it)
  48.  * @author $Author$
  49.  * @version $Rev$, $Date$
  50.  */
  51. public class PolicyGroupByActiveThreadsDistributedCounters implements Serializable,IPolicyGroupByActiveThreadsInMemory {

  52.     private static final long serialVersionUID = 1L;

  53.     private transient org.openspcoop2.utils.Semaphore _lock = null; // usato solo in creazione e quando si accede a tutta la mappa
  54.     private synchronized void initLock() {
  55.         if(this._lock==null) {
  56.             this._lock = new org.openspcoop2.utils.Semaphore("PolicyGroupByActiveThreadsDistributedCounters");
  57.         }
  58.     }
  59.     public org.openspcoop2.utils.Semaphore getLock(){
  60.         if(this._lock==null) {
  61.             initLock();
  62.         }
  63.         return this._lock;
  64.     }  
  65.    
  66.     private final java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> mapActiveThreads = new HashMap<IDUnivocoGroupByPolicy, DatiCollezionati>();
  67.    
  68.     private String uniqueIdMap_idActivePolicy;
  69.     @SuppressWarnings("unused")
  70.     private Date uniqueIdMap_updateTime;
  71.    
  72.     private final ActivePolicy activePolicy;
  73.     private final BuilderDatiCollezionatiDistributed builderDatiCollezionati;

  74.     public PolicyGroupByActiveThreadsDistributedCounters(ActivePolicy activePolicy, String uniqueIdMap, BuilderDatiCollezionatiDistributed builder) throws PolicyException {
  75.         this.activePolicy = activePolicy;
  76.         this.builderDatiCollezionati = builder;
  77.        
  78.         this.uniqueIdMap_idActivePolicy = UniqueIdentifierUtilities.extractIdActivePolicy(uniqueIdMap);
  79.         try {
  80.             this.uniqueIdMap_updateTime = UniqueIdentifierUtilities.extractUpdateTimeActivePolicy(uniqueIdMap);
  81.         }catch(Exception e) {
  82.             throw new PolicyException(e.getMessage(),e);
  83.         }
  84.     }


  85.     @Override
  86.     public ActivePolicy getActivePolicy() {
  87.         return this.activePolicy;
  88.     }
  89.     @Override
  90.     public java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> getMapActiveThreads(){
  91.         return this.mapActiveThreads;
  92.     }


  93.     @Override
  94.     public void initMap(java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> map) {
  95.         SemaphoreLock slock = this.getLock().acquireThrowRuntime("initMap");
  96.         try {
  97.             if(map!=null && !map.isEmpty()) {
  98.                 for (IDUnivocoGroupByPolicy datiGroupBy : map.keySet()) {
  99.                     IDUnivocoGroupByPolicyMapId datiGroupByMapId = augmentIDUnivoco(datiGroupBy);
  100.                     DatiCollezionati dati = map.get(datiGroupBy);
  101.                     DatiCollezionati datiContatoriDistribuiti = this.builderDatiCollezionati.build(dati, datiGroupByMapId, this.activePolicy);
  102.                     this.mapActiveThreads.put(datiGroupByMapId, datiContatoriDistribuiti);
  103.                 }
  104.             }
  105.         }
  106.         finally {
  107.             this.getLock().release(slock, "initMap");
  108.         }
  109.     }


  110.     @Override
  111.     public void resetCounters(){

  112.         SemaphoreLock slock = this.getLock().acquireThrowRuntime("resetCounters");
  113.         try {
  114.             if(this.mapActiveThreads.size()>0){
  115.                 Iterator<DatiCollezionati> datiCollezionati = this.mapActiveThreads.values().iterator();
  116.                 while (datiCollezionati.hasNext()) {
  117.                     DatiCollezionati item = datiCollezionati.next();
  118.                     item.resetCounters();
  119.                 }
  120.             }
  121.         }
  122.         finally {
  123.             this.getLock().release(slock, "resetCounters");
  124.         }
  125.     }
  126.    
  127.    
  128.     @Override
  129.     public void remove() throws UtilsException {
  130.         SemaphoreLock slock = this.getLock().acquireThrowRuntime("remove");

  131.         try {
  132.             List<IDUnivocoGroupByPolicy> deleteList = new ArrayList<>();
  133.             for (IDUnivocoGroupByPolicy datiGroupBy : this.mapActiveThreads.keySet()) {
  134.                 if(datiGroupBy instanceof IDUnivocoGroupByPolicyMapId){
  135.                     IDUnivocoGroupByPolicyMapId mapId = (IDUnivocoGroupByPolicyMapId) datiGroupBy;
  136.                     if(this.uniqueIdMap_idActivePolicy.equals(mapId.getUniqueMapId())) {
  137.                         deleteList.add(datiGroupBy);
  138.                     }
  139.                 }
  140.             }
  141.             while(!deleteList.isEmpty()) {
  142.                 IDUnivocoGroupByPolicy id = deleteList.remove(0);
  143.                 IDatiCollezionatiDistributed dati = (IDatiCollezionatiDistributed) this.mapActiveThreads.remove(id);    
  144.                 dati.destroyDatiDistribuiti();
  145.             }
  146.            
  147.         }   finally {
  148.             this.getLock().release(slock, "remove");
  149.         }
  150.     }


  151.     private DatiCollezionati initStartRequest(Logger log, String idTransazione, IDUnivocoGroupByPolicyMapId datiGroupByMapId, Map<Object> ctx) throws PolicyException{
  152.         SemaphoreLock slock = this.getLock().acquireThrowRuntime("initStartRequest");
  153.         DatiCollezionati datiCollezionati = null;
  154.         try {
  155.             datiCollezionati = this.mapActiveThreads.get(datiGroupByMapId);
  156.             if (datiCollezionati == null){              
  157.                 datiCollezionati = this.builderDatiCollezionati.build(
  158.                         this.activePolicy.getInstanceConfiguration().getUpdateTime(),
  159.                         datiGroupByMapId,
  160.                         this.activePolicy,
  161.                         ctx
  162.                         );

  163.                 this.mapActiveThreads.put(datiGroupByMapId, datiCollezionati); // registro nuova immagine
  164.             }
  165.             // La gestione dell'else è stata spostata dentro il costruttore degli oggetti DatiCollezionatiDistributedXXXX
  166. /**         else {
  167. //              if(datiCollezionati.getUpdatePolicyDate()!=null) {
  168. //                  if(!datiCollezionati.getUpdatePolicyDate().equals(this.activePolicy.getInstanceConfiguration().getUpdateTime())) {
  169. //                      // data aggiornata
  170. //                      datiCollezionati.resetCounters(this.activePolicy.getInstanceConfiguration().getUpdateTime());
  171. //                  }
  172. //              }
  173. //          }*/
  174.             return datiCollezionati;
  175.         }
  176.         finally {
  177.             this.getLock().release(slock, "initStartRequest");
  178.         }
  179.     }
  180.     @Override
  181.     public DatiCollezionati registerStartRequest(Logger log, String idTransazione, IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx) throws PolicyException{

  182.         IDUnivocoGroupByPolicyMapId datiGroupByMapId = augmentIDUnivoco(datiGroupBy);
  183.         DatiCollezionati datiCollezionati = this.mapActiveThreads.get(datiGroupByMapId);
  184.         if (datiCollezionati == null){              
  185.             datiCollezionati = initStartRequest(log, idTransazione, datiGroupByMapId, ctx);
  186.         }
  187.         DatiCollezionati datiCollezionatiPerPolicyVerifier = datiCollezionati.newInstance(); // i valori utilizzati dal policy verifier verranno impostati con il valore remoto corretto
  188.         // l'oggetto datiCollezionati, anche se appena creato, è già stato inizializzato dentro il costruttore di DatiCollezionatiXXX
  189.        
  190.         // incremento il numero di thread
  191.         datiCollezionati.registerStartRequest(log, this.activePolicy, ctx, datiCollezionatiPerPolicyVerifier);
  192.        
  193.         return datiCollezionatiPerPolicyVerifier;

  194.     }


  195.     @Override
  196.     public DatiCollezionati updateDatiStartRequestApplicabile(Logger log, String idTransazione, IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx) throws PolicyException,PolicyNotFoundException{

  197.         IDUnivocoGroupByPolicyMapId datiGroupByMapId = augmentIDUnivoco(datiGroupBy);
  198.         DatiCollezionati datiCollezionati = this.mapActiveThreads.get(datiGroupByMapId);
  199.         if(datiCollezionati == null) {
  200.             throw new PolicyNotFoundException("Non sono presenti alcun threads registrati per la richiesta con dati identificativi ["+datiGroupByMapId.toString()+"]");
  201.         }
  202.         DatiCollezionati datiCollezionatiPerPolicyVerifier = datiCollezionati.newInstance(); // i valori utilizzati dal policy verifier verranno impostati con il valore remoto corretto
  203.        
  204.         // incremento il numero dei contatori
  205.         boolean updated = datiCollezionati.updateDatiStartRequestApplicabile(log, this.activePolicy, ctx, datiCollezionatiPerPolicyVerifier);

  206.         // mi salvo fuori dal synchronized l'attuale stato
  207.         if(updated) {
  208.             return datiCollezionatiPerPolicyVerifier;
  209.         }

  210.         return null;
  211.     }


  212.     @Override
  213.     public void registerStopRequest(Logger log, String idTransazione,IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx,
  214.             MisurazioniTransazione dati, boolean isApplicabile, boolean isViolata) throws PolicyException,PolicyNotFoundException{

  215.         IDUnivocoGroupByPolicyMapId datiGroupByMapId = augmentIDUnivoco(datiGroupBy);
  216.         DatiCollezionati datiCollezionati =  this.mapActiveThreads.get(datiGroupByMapId);
  217.         if(datiCollezionati == null) {
  218.             throw new PolicyNotFoundException("Non sono presenti alcun threads registrati per la richiesta con dati identificativi ["+datiGroupByMapId.toString()+"]");
  219.         }
  220.        
  221.         datiCollezionati.registerEndRequest(log, this.activePolicy, ctx, dati);
  222.         if(isApplicabile){

  223.             List<Integer> esitiCodeOk = null;
  224.             List<Integer> esitiCodeKoSenzaFaultApplicativo = null;
  225.             List<Integer> esitiCodeFaultApplicativo = null;
  226.             try {
  227.                 EsitiProperties esitiProperties = EsitiProperties.getInstanceFromProtocolName(log,dati.getProtocollo());
  228.                 esitiCodeOk = esitiProperties.getEsitiCodeOk_senzaFaultApplicativo();
  229.                 esitiCodeKoSenzaFaultApplicativo = esitiProperties.getEsitiCodeKo_senzaFaultApplicativo();
  230.                 esitiCodeFaultApplicativo = esitiProperties.getEsitiCodeFaultApplicativo();
  231.             }catch(Exception e) {
  232.                 throw new PolicyException(e.getMessage(),e);
  233.             }
  234.             datiCollezionati.updateDatiEndRequestApplicabile(log, this.activePolicy, ctx, dati,
  235.                     esitiCodeOk,esitiCodeKoSenzaFaultApplicativo, esitiCodeFaultApplicativo, isViolata);
  236.         }

  237.     }


  238.     @Override
  239.     public long getActiveThreads(){
  240.         return this.getActiveThreads(null);
  241.     }
  242.     @Override
  243.     public long getActiveThreads(IDUnivocoGroupByPolicy filtro){

  244.         SemaphoreLock slock = this.getLock().acquireThrowRuntime("getActiveThreads");
  245.         try {
  246.             long counter = 0l;

  247.             if(this.mapActiveThreads!=null && !this.mapActiveThreads.isEmpty()) {
  248.                 for (IDUnivocoGroupByPolicy datiGroupBy : this.mapActiveThreads.keySet()) {
  249.    
  250.                     if(filtro!=null){
  251.                         IDUnivocoGroupBy<IDUnivocoGroupByPolicy> idAstype = datiGroupBy;
  252.                         if(!idAstype.match(filtro)){
  253.                             continue;
  254.                         }
  255.                     }
  256.    
  257.                     counter = counter + this.mapActiveThreads.get(datiGroupBy).getActiveRequestCounter();
  258.                 }
  259.             }

  260.             return counter;
  261.         }
  262.         finally {
  263.             this.getLock().release(slock, "getActiveThreads");
  264.         }

  265.     }


  266.     @Override
  267.     public String printInfos(Logger log, String separatorGroups) throws UtilsException{

  268.         SemaphoreLock slock = this.getLock().acquireThrowRuntime("printInfos");
  269.         try {
  270.             StringBuilder bf = new StringBuilder();
  271.             if(this.mapActiveThreads!=null && !this.mapActiveThreads.isEmpty()) {
  272.                 for (IDUnivocoGroupByPolicy datiGroupBy : this.mapActiveThreads.keySet()) {
  273.                     bf.append(separatorGroups);
  274.                     bf.append("\n");
  275.                     bf.append(Costanti.LABEL_MODALITA_SINCRONIZZAZIONE).append(" ").append(this.builderDatiCollezionati.tipoPolicy.toLabel());
  276.                     bf.append("\n");
  277.                     bf.append("Criterio di Collezionamento dei Dati\n");
  278.                     bf.append(datiGroupBy.toString(true));
  279.                     bf.append("\n");
  280.                     this.mapActiveThreads.get(datiGroupBy).checkDate(log, this.activePolicy); // imposta correttamente gli intervalli
  281.                     bf.append(this.mapActiveThreads.get(datiGroupBy).toString());
  282.                     bf.append("\n");
  283.                 }
  284.             }
  285.             if(bf.length()<=0){
  286.                 bf.append("Nessuna informazione disponibile");
  287.                 return bf.toString();
  288.             }
  289.             else{
  290.                 return bf.toString()+separatorGroups;
  291.             }
  292.         }
  293.         finally {
  294.             this.getLock().release(slock, "printInfos");
  295.         }

  296.     }


  297.     protected IDUnivocoGroupByPolicyMapId augmentIDUnivoco(IDUnivocoGroupByPolicy idUnivoco) {
  298.         if(idUnivoco instanceof IDUnivocoGroupByPolicyMapId) {
  299.             return (IDUnivocoGroupByPolicyMapId) idUnivoco;
  300.         }
  301.         else {
  302.             return new IDUnivocoGroupByPolicyMapId(idUnivoco, this.uniqueIdMap_idActivePolicy); // NOTA: non serve gestirlo all'interno poichè verrà creato un nuovo identificativo //, this.uniqueIdMap_updateTime);
  303.         }
  304.     }
  305. }