PolicyGroupByActiveThreadsDistributedCountersWithLock.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.  * PolicyGroupByActiveThreadsDistributedCountersWithLock
  46.  *
  47.  * @author Francesco Scarlato (scarlato@link.it)
  48.  * @author $Author$
  49.  * @version $Rev$, $Date$
  50.  */
  51. public class PolicyGroupByActiveThreadsDistributedCountersWithLock implements Serializable,IPolicyGroupByActiveThreadsInMemory {

  52.     private static final long serialVersionUID = 1L;

  53.     private transient org.openspcoop2.utils.Semaphore _lock = null;
  54.     private synchronized void initLock() {
  55.         if(this._lock==null) {
  56.             this._lock = new org.openspcoop2.utils.Semaphore("PolicyGroupByActiveThreadsDistributedCountersWithLock");
  57.         }
  58.     }
  59.     public org.openspcoop2.utils.Semaphore getLock(){
  60.         if(this._lock==null) {
  61.             initLock();
  62.         }
  63.         return this._lock;
  64.     }  

  65.     private final java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> mapActiveThreads = new HashMap<IDUnivocoGroupByPolicy, DatiCollezionati>();
  66.    
  67.     private String uniqueIdMap_idActivePolicy;
  68.     @SuppressWarnings("unused")
  69.     private Date uniqueIdMap_updateTime;
  70.    
  71.     private final ActivePolicy activePolicy;
  72.     private final BuilderDatiCollezionatiDistributed builderDatiCollezionati;

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


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


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


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

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

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


  150.     @Override
  151.     public DatiCollezionati registerStartRequest(Logger log, String idTransazione, IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx) throws PolicyException{

  152.         DatiCollezionati datiCollezionati;

  153.         SemaphoreLock slock = this.getLock().acquireThrowRuntime("registerStartRequest");
  154.         try {
  155.             IDUnivocoGroupByPolicyMapId datiGroupByMapId = augmentIDUnivoco(datiGroupBy);
  156.             datiCollezionati = this.mapActiveThreads.get(datiGroupByMapId);
  157.             if (datiCollezionati == null){              
  158.                 datiCollezionati = this.builderDatiCollezionati.build(
  159.                         this.activePolicy.getInstanceConfiguration().getUpdateTime(),
  160.                         datiGroupByMapId,
  161.                         this.activePolicy,
  162.                         ctx
  163.                         );

  164.                 this.mapActiveThreads.put(datiGroupByMapId, datiCollezionati); // registro nuova immagine
  165.             }
  166.             // La gestione dell'else è stata spostata dentro il costruttore degli oggetti DatiCollezionatiDistributedXXXX
  167. /**         else {
  168. //              if(datiCollezionati.getUpdatePolicyDate()!=null) {
  169. //                  if(!datiCollezionati.getUpdatePolicyDate().equals(this.activePolicy.getInstanceConfiguration().getUpdateTime())) {
  170. //                      // data aggiornata
  171. //                      datiCollezionati.resetCounters(this.activePolicy.getInstanceConfiguration().getUpdateTime());
  172. //                  }
  173. //              }
  174. //          }*/
  175.                        
  176.             // incremento il numero di thread
  177.             datiCollezionati.registerStartRequest(log, this.activePolicy, ctx);

  178.             return datiCollezionati.newInstance();
  179.         }
  180.         finally {
  181.             this.getLock().release(slock, "registerStartRequest");
  182.         }

  183.     }


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

  186.         SemaphoreLock slock = this.getLock().acquireThrowRuntime("updateDatiStartRequestApplicabile");

  187.         try {
  188.             IDUnivocoGroupByPolicyMapId datiGroupByMapId = augmentIDUnivoco(datiGroupBy);
  189.             DatiCollezionati datiCollezionati = this.mapActiveThreads.get(datiGroupByMapId);
  190.             if(datiCollezionati == null) {
  191.                 throw new PolicyNotFoundException("Non sono presenti alcun threads registrati per la richiesta con dati identificativi ["+datiGroupByMapId.toString()+"]");
  192.             }

  193.             // incremento il numero dei contatori
  194.             boolean updated = datiCollezionati.updateDatiStartRequestApplicabile(log, this.activePolicy, ctx);

  195.             // mi salvo fuori dal synchronized l'attuale stato
  196.             if(updated) {
  197.                 return datiCollezionati.newInstance();
  198.             }

  199.         }
  200.         finally {
  201.             this.getLock().release(slock, "updateDatiStartRequestApplicabile");
  202.         }

  203.         return null;
  204.     }


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

  208.         SemaphoreLock slock = this.getLock().acquireThrowRuntime("registerStopRequest");
  209.         try {
  210.             IDUnivocoGroupByPolicyMapId datiGroupByMapId = augmentIDUnivoco(datiGroupBy);
  211.             DatiCollezionati datiCollezionati =  this.mapActiveThreads.get(datiGroupByMapId);
  212.             if(datiCollezionati == null) {
  213.                 throw new PolicyNotFoundException("Non sono presenti alcun threads registrati per la richiesta con dati identificativi ["+datiGroupByMapId.toString()+"]");
  214.             }

  215.             datiCollezionati.registerEndRequest(log, this.activePolicy, ctx, dati);
  216.             if(isApplicabile){

  217.                 List<Integer> esitiCodeOk = null;
  218.                 List<Integer> esitiCodeKoSenzaFaultApplicativo = null;
  219.                 List<Integer> esitiCodeFaultApplicativo = null;
  220.                 try {
  221.                     EsitiProperties esitiProperties = EsitiProperties.getInstanceFromProtocolName(log,dati.getProtocollo());
  222.                     esitiCodeOk = esitiProperties.getEsitiCodeOk_senzaFaultApplicativo();
  223.                     esitiCodeKoSenzaFaultApplicativo = esitiProperties.getEsitiCodeKo_senzaFaultApplicativo();
  224.                     esitiCodeFaultApplicativo = esitiProperties.getEsitiCodeFaultApplicativo();
  225.                 }catch(Exception e) {
  226.                     throw new PolicyException(e.getMessage(),e);
  227.                 }
  228.                 datiCollezionati.updateDatiEndRequestApplicabile(log, this.activePolicy, ctx, dati,
  229.                         esitiCodeOk,esitiCodeKoSenzaFaultApplicativo, esitiCodeFaultApplicativo, isViolata);
  230.             }

  231.         }
  232.         finally {
  233.             this.getLock().release(slock, "registerStopRequest");
  234.         }

  235.     }


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

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

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

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

  263.     }


  264.     @Override
  265.     public String printInfos(Logger log, String separatorGroups) throws UtilsException{

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

  294.     }


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