PolicyGroupByActiveThreads.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.Iterator;
  25. import java.util.List;

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

  42. /**    
  43.  * PolicyGroupByActiveThreads
  44.  *
  45.  * @author Poli Andrea (poli@link.it)
  46.  * @author $Author$
  47.  * @version $Rev$, $Date$
  48.  */
  49. public class PolicyGroupByActiveThreads implements Serializable,IPolicyGroupByActiveThreadsInMemory {

  50.     /**
  51.      *
  52.      */
  53.     private static final long serialVersionUID = 1L;
  54.    
  55.     private java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> mapActiveThreads = new HashMap<IDUnivocoGroupByPolicy, DatiCollezionati>();
  56.    
  57.     //private final Boolean semaphore = Boolean.valueOf(false);
  58.     private transient org.openspcoop2.utils.Semaphore _lock = null;
  59.     private synchronized void initLock() {
  60.         if(this._lock==null) {
  61.             this._lock = new org.openspcoop2.utils.Semaphore("PolicyGroupByActiveThreads");
  62.         }
  63.     }
  64.     public org.openspcoop2.utils.Semaphore getLock(){
  65.         if(this._lock==null) {
  66.             initLock();
  67.         }
  68.         return this._lock;
  69.     }
  70.    
  71.     private ActivePolicy activePolicy;
  72.     private PolicyGroupByActiveThreadsType tipoGestore;

  73.     public PolicyGroupByActiveThreads(ActivePolicy activePolicy, PolicyGroupByActiveThreadsType tipoGestore) {
  74.         this.activePolicy = activePolicy;
  75.         this.tipoGestore = tipoGestore;
  76.     }
  77.    
  78.    
  79.     @Override
  80.     public ActivePolicy getActivePolicy() {
  81.         return this.activePolicy;
  82.     }
  83.     @Override
  84.     public java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> getMapActiveThreads(){
  85.         return this.mapActiveThreads;
  86.     }
  87.    
  88.    
  89.     public void setMapActiveThreads(java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> value) {
  90.         this.mapActiveThreads = value;
  91.     }
  92.    
  93.     @Override
  94.     public void initMap(java.util.Map<IDUnivocoGroupByPolicy, DatiCollezionati> map) {
  95.         /**synchronized (this.semaphore) {*/
  96.         SemaphoreLock slock =this.getLock().acquireThrowRuntime("initMap");
  97.         try {
  98.             if(map!=null && map.size()>0){
  99.                 this.mapActiveThreads.putAll(map);
  100.             }
  101.         }finally {
  102.             this.getLock().release(slock, "initMap");
  103.         }
  104.     }
  105.    
  106.     @Override
  107.     public void resetCounters(){
  108.         /**synchronized (this.semaphore) {*/
  109.         SemaphoreLock slock =this.getLock().acquireThrowRuntime("resetCounters");
  110.         try {
  111.             if(this.mapActiveThreads.size()>0){
  112.                 Iterator<DatiCollezionati> datiCollezionati = this.mapActiveThreads.values().iterator();
  113.                 while (datiCollezionati.hasNext()) {
  114.                     DatiCollezionati item = datiCollezionati.next();
  115.                     item.resetCounters();
  116.                 }
  117.             }
  118.         }finally {
  119.             this.getLock().release(slock, "resetCounters");
  120.         }
  121.     }
  122.    
  123.     @Override
  124.     public void remove() throws UtilsException{
  125.         // nop;
  126.     }
  127.    
  128.     @Override
  129.     public DatiCollezionati registerStartRequest(Logger log, String idTransazione, IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx) throws PolicyException{
  130.                
  131.         DatiCollezionati datiCollezionatiReaded = null;
  132.         /**System.out.println("<"+idTransazione+">registerStartRequest ...");*/
  133.         /**synchronized (this.semaphore) {*/
  134.         SemaphoreLock slock =this.getLock().acquireThrowRuntime("registerStartRequest", idTransazione);
  135.         try {
  136.             /**System.out.println("<"+idTransazione+">registerStartRequest entrato");*/
  137.            
  138.             DatiCollezionati datiCollezionati = null;
  139.             if(this.mapActiveThreads.containsKey(datiGroupBy)){
  140.                 /**System.out.println("<"+idTransazione+">registerStartRequest CHECK CONTAINS ["+datiGroupBy+"]=true");*/
  141.                 datiCollezionati = this.mapActiveThreads.get(datiGroupBy);  
  142.             }
  143.             else{
  144.                 /**System.out.println("<"+idTransazione+">registerStartRequest CHECK CONTAINS ["+datiGroupBy+"]=false");*/
  145.                 Date gestorePolicyConfigDate = PolicyDateUtils.readGestorePolicyConfigDateIntoContext(ctx);
  146.                 datiCollezionati = new DatiCollezionati(this.activePolicy.getInstanceConfiguration().getUpdateTime(), gestorePolicyConfigDate);
  147.                 /**System.out.println("<"+idTransazione+">registerStartRequest PUT");*/
  148.                 this.mapActiveThreads.put(datiGroupBy, datiCollezionati); // registro nuova immagine
  149.             }
  150.            
  151.             // incremento il numero di thread
  152.             /**System.out.println("<"+idTransazione+">registerStartRequest in datiCollezionati ...");*/
  153.             datiCollezionati.registerStartRequest(log, this.activePolicy, ctx);
  154.             /**System.out.println("<"+idTransazione+">registerStartRequest in datiCollezionati ok: "+datiCollezionati.getActiveRequestCounter());*/
  155.                                    
  156.             // mi salvo fuori dal synchronized l'attuale stato
  157.             datiCollezionatiReaded = datiCollezionati.newInstance();
  158.        
  159.             /**System.out.println("<"+idTransazione+">registerStartRequest esco");*/
  160.         }finally {
  161.             this.getLock().release(slock, "registerStartRequest", idTransazione);
  162.         }
  163.        
  164.        
  165.         // Tutti i restanti controlli sono effettuati usando il valore di datiCollezionatiReaded, che e' gia' stato modificato
  166.         // Inoltre e' stato re-inserito nella map come oggetto nuovo, quindi il valore dentro il metodo non subira' trasformazioni (essendo stato fatto il clone)
  167.         // E' possibile procedere con l'analisi rispetto al valore che possiedono il counter dentro questo scope.
  168.        
  169.         return datiCollezionatiReaded;

  170.     }
  171.    
  172.     @Override
  173.     public DatiCollezionati updateDatiStartRequestApplicabile(Logger log, String idTransazione, IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx) throws PolicyException,PolicyNotFoundException{
  174.        
  175.         DatiCollezionati datiCollezionatiReaded = null;
  176.         /**System.out.println("<"+idTransazione+">updateDatiStartRequestApplicabile ...");*/
  177.         /**synchronized (this.semaphore) {*/
  178.         SemaphoreLock slock =this.getLock().acquireThrowRuntime("updateDatiStartRequestApplicabile", idTransazione);
  179.         try {
  180.             /**System.out.println("<"+idTransazione+">updateDatiStartRequestApplicabile entrato");*/
  181.            
  182.             DatiCollezionati datiCollezionati = null;
  183.             if(this.mapActiveThreads.containsKey(datiGroupBy)==false){
  184.                 /**System.out.println("<"+idTransazione+">updateDatiStartRequestApplicabile Non sono presenti alcun threads registrati per la richiesta con dati identificativi ["+datiGroupBy.toString()+"]");*/
  185.                 throw new PolicyNotFoundException("Non sono presenti alcun threads registrati per la richiesta con dati identificativi ["+datiGroupBy.toString()+"]");
  186.             }
  187.             else{
  188.                 datiCollezionati = this.mapActiveThreads.get(datiGroupBy);  
  189.             }
  190.            
  191.             // incremento il numero dei contatori
  192.             /**System.out.println("<"+idTransazione+">updateDatiStartRequestApplicabile updateDatiStartRequestApplicabile ...");*/
  193.             boolean updated = datiCollezionati.updateDatiStartRequestApplicabile(log, this.activePolicy, ctx);
  194.             /**System.out.println("<"+idTransazione+">updateDatiStartRequestApplicabile updateDatiStartRequestApplicabile ok");*/
  195.                                    
  196.             // mi salvo fuori dal synchronized l'attuale stato
  197.             if(updated) {
  198.                 datiCollezionatiReaded = datiCollezionati.newInstance();
  199.             }
  200.            
  201.             /**System.out.println("<"+idTransazione+">updateDatiStartRequestApplicabile esco");*/
  202.         }finally {
  203.             this.getLock().release(slock, "updateDatiStartRequestApplicabile", idTransazione);
  204.         }
  205.        
  206.         // Tutti i restanti controlli sono effettuati usando il valore di datiCollezionatiReaded, che e' gia' stato modificato
  207.         // Inoltre e' stato re-inserito nella map come oggetto nuovo, quindi il valore dentro il metodo non subira' trasformazioni (essendo stato fatto il clone)
  208.         // E' possibile procedere con l'analisi rispetto al valore che possiedono il counter dentro questo scope.
  209.        
  210.         return datiCollezionatiReaded;

  211.     }
  212.    
  213.     @Override
  214.     public void registerStopRequest(Logger log, String idTransazione,IDUnivocoGroupByPolicy datiGroupBy, Map<Object> ctx,
  215.             MisurazioniTransazione dati, boolean isApplicabile, boolean isViolata) throws PolicyException,PolicyNotFoundException{
  216.         /**System.out.println("<"+idTransazione+">registerStopRequest ...");*/
  217.         /**synchronized (this.semaphore) {*/
  218.         SemaphoreLock slock =this.getLock().acquireThrowRuntime("registerStopRequest", idTransazione);
  219.         try {
  220.             /**System.out.println("<"+idTransazione+">registerStopRequest entro");*/
  221.            
  222.             if(this.mapActiveThreads.containsKey(datiGroupBy)==false){
  223.                 /**System.out.println("<"+idTransazione+">registerStopRequest Non sono presenti alcun threads registrati per la richiesta con dati identificativi ["+datiGroupBy.toString()+"]");*/
  224.                 throw new PolicyNotFoundException("Non sono presenti alcun threads registrati per la richiesta con dati identificativi ["+datiGroupBy.toString()+"]");
  225.             }
  226.             else{
  227.                 /**System.out.println("<"+idTransazione+">registerStopRequest get ...");*/
  228.                 DatiCollezionati datiCollezionati = this.mapActiveThreads.get(datiGroupBy);
  229.                 /**System.out.println("<"+idTransazione+">registerStopRequest registerEndRequest ...");*/
  230.                 datiCollezionati.registerEndRequest(log, this.activePolicy, ctx, dati);
  231.                 /**System.out.println("<"+idTransazione+">registerStopRequest registerEndRequest ok");*/
  232.                 if(isApplicabile){
  233.                     /**System.out.println("<"+idTransazione+">registerStopRequest updateDatiEndRequestApplicabile ...");*/
  234.                     List<Integer> esitiCodeOk = null;
  235.                     List<Integer> esitiCodeKoSenzaFaultApplicativo = null;
  236.                     List<Integer> esitiCodeFaultApplicativo = null;
  237.                     try {
  238.                         EsitiProperties esitiProperties = EsitiProperties.getInstanceFromProtocolName(log,dati.getProtocollo());
  239.                         esitiCodeOk = esitiProperties.getEsitiCodeOk_senzaFaultApplicativo();
  240.                         esitiCodeKoSenzaFaultApplicativo = esitiProperties.getEsitiCodeKo_senzaFaultApplicativo();
  241.                         esitiCodeFaultApplicativo = esitiProperties.getEsitiCodeFaultApplicativo();
  242.                     }catch(Exception e) {
  243.                         throw new PolicyException(e.getMessage(),e);
  244.                     }
  245.                     datiCollezionati.updateDatiEndRequestApplicabile(log, this.activePolicy, ctx, dati,
  246.                             esitiCodeOk,esitiCodeKoSenzaFaultApplicativo, esitiCodeFaultApplicativo, isViolata);
  247.                     /**System.out.println("<"+idTransazione+">registerStopRequest updateDatiEndRequestApplicabile ok");*/
  248.                 }
  249.             }
  250.            
  251.             /**System.out.println("<"+idTransazione+">registerStopRequest esco");*/
  252.         }finally {
  253.             this.getLock().release(slock, "registerStopRequest", idTransazione);
  254.         }  
  255.     }

  256.    
  257.     @Override
  258.     public long getActiveThreads(){
  259.         return this.getActiveThreads(null);
  260.     }
  261.     @Override
  262.     public long getActiveThreads(IDUnivocoGroupByPolicy filtro){
  263.        
  264.         /**synchronized (this.semaphore) {*/
  265.         SemaphoreLock slock =this.getLock().acquireThrowRuntime("getActiveThreads");
  266.         try {
  267.            
  268.             long counter = 0l;
  269.            
  270.             if(this.mapActiveThreads!=null && !this.mapActiveThreads.isEmpty()) {
  271.                 for (IDUnivocoGroupByPolicy datiGroupBy : this.mapActiveThreads.keySet()) {
  272.                    
  273.                     if(filtro!=null){
  274.                         IDUnivocoGroupBy<IDUnivocoGroupByPolicy> idAstype = datiGroupBy;
  275.                         if(!idAstype.match(filtro)){
  276.                             continue;
  277.                         }
  278.                     }
  279.                    
  280.                     counter = counter + this.mapActiveThreads.get(datiGroupBy).getActiveRequestCounter();
  281.                 }
  282.             }
  283.            
  284.             return counter;
  285.         }finally {
  286.             this.getLock().release(slock, "getActiveThreads");
  287.         }
  288.     }
  289.    
  290.     @Override
  291.     public String printInfos(Logger log, String separatorGroups) throws UtilsException{
  292.         /**synchronized (this.semaphore) {*/
  293.         SemaphoreLock slock =this.getLock().acquireThrowRuntime("printInfos");
  294.         try {
  295.             StringBuilder bf = new StringBuilder();
  296.             if(this.mapActiveThreads!=null && !this.mapActiveThreads.isEmpty()) {
  297.                 for (IDUnivocoGroupByPolicy datiGroupBy : this.mapActiveThreads.keySet()) {
  298.                     bf.append(separatorGroups);
  299.                     bf.append("\n");
  300.                     bf.append(Costanti.LABEL_MODALITA_SINCRONIZZAZIONE).append(" ").append(this.tipoGestore.toLabel());
  301.                     bf.append("\n");
  302.                     bf.append("Criterio di Collezionamento dei Dati\n");
  303.                     bf.append(datiGroupBy.toString(true));
  304.                     bf.append("\n");
  305.                     this.mapActiveThreads.get(datiGroupBy).checkDate(log, this.activePolicy); // imposta correttamente gli intervalli
  306.                     bf.append(this.mapActiveThreads.get(datiGroupBy).toString());
  307.                     bf.append("\n");
  308.                 }
  309.             }
  310.             if(bf.length()<=0){
  311.                 bf.append("Nessuna informazione disponibile");
  312.                 return bf.toString();
  313.             }
  314.             else{
  315.                 return bf.toString()+separatorGroups;
  316.             }
  317.         }finally {
  318.             this.getLock().release(slock, "printInfos");
  319.         }
  320.     }
  321. }