UniqueIdentifierManager.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.utils.id;


  21. import org.slf4j.Logger;
  22. import org.openspcoop2.utils.LoggerWrapperFactory;
  23. import org.openspcoop2.utils.resources.Loader;

  24. /**
  25.  * UniqueIdentifierManager
  26.  *
  27.  * @author Poli Andrea (apoli@link.it)
  28.  * @author $Author$
  29.  * @version $Rev$, $Date$
  30.  */
  31. public class UniqueIdentifierManager {

  32.     /** Istanza per creare gli id */
  33.     private static boolean useThreadLocal = false;
  34.     private static String className_threadLocal = null;
  35.     private static Object [] args_threadLocal = null;
  36.     private static final ThreadLocal<IUniqueIdentifierGenerator> uniqueIdentifierGenerator_threadLocal =
  37.             new ThreadLocal<IUniqueIdentifierGenerator>() {
  38.                 @Override
  39.                 protected IUniqueIdentifierGenerator initialValue() {
  40.                     try{
  41.                         IUniqueIdentifierGenerator uniqueIdentifierGenerator = (IUniqueIdentifierGenerator) Loader.getInstance().newInstance(className_threadLocal);
  42.                         uniqueIdentifierGenerator.init(args_threadLocal);
  43.                         return uniqueIdentifierGenerator;
  44.                     }catch(Exception e){
  45.                         throw new RuntimeException("Riscontrato errore durante il caricamento del manager specificato [class:"+className_threadLocal+"]: "+e.getMessage(),e);
  46.                     }
  47.                 }
  48.                
  49.         };
  50.    
  51.     private static IUniqueIdentifierGenerator uniqueIdentifierGenerator_staticInstance;
  52.     private static boolean bufferSupported_staticInstance;
  53.    
  54.     /** Generazione UID Disabiltiata */
  55.     private static boolean generazioneUIDDisabilitata = false;
  56.     public static boolean isGenerazioneUIDDisabilitata() {
  57.         return UniqueIdentifierManager.generazioneUIDDisabilitata;
  58.     }
  59.    
  60.     public static void disabilitaGenerazioneUID(){
  61.         UniqueIdentifierManager.generazioneUIDDisabilitata=true;
  62.     }
  63.    
  64.     public static boolean isInitialized() {
  65.         if(!UniqueIdentifierManager.generazioneUIDDisabilitata) {
  66.             if(useThreadLocal) {
  67.                 return className_threadLocal!=null;
  68.             }
  69.             else {
  70.                 return uniqueIdentifierGenerator_staticInstance!=null;
  71.             }
  72.         }
  73.         return false;
  74.     }
  75.    
  76.     public static synchronized void inizializzaUniqueIdentifierManager(boolean useThreadLocal, String className,Object ... o)throws UniqueIdentifierException{
  77.         inizializzaUniqueIdentifierManager(false, useThreadLocal, className, o);
  78.     }
  79.     public static synchronized void inizializzaUniqueIdentifierManager(boolean forceInitManager, boolean useThreadLocal, String className,Object ... o)throws UniqueIdentifierException{
  80.         UniqueIdentifierManager.useThreadLocal = useThreadLocal;
  81.         if(useThreadLocal) {
  82.             if(UniqueIdentifierManager.className_threadLocal==null || forceInitManager){
  83.                 UniqueIdentifierManager.className_threadLocal=className;
  84.                 UniqueIdentifierManager.args_threadLocal=o;
  85.                
  86.                 try{
  87.                     IUniqueIdentifierGenerator uniqueIdentifierGenerator = (IUniqueIdentifierGenerator) Loader.getInstance().newInstance(className);
  88.                     UniqueIdentifierManager.bufferSupported_staticInstance = uniqueIdentifierGenerator.isBufferSupperted();
  89.                 }catch(Exception e){
  90.                     throw new RuntimeException("Riscontrato errore durante il caricamento del manager specificato [class:"+className_threadLocal+"]: "+e.getMessage(),e);
  91.                 }
  92.             }
  93.         }
  94.         else {
  95.             if(UniqueIdentifierManager.uniqueIdentifierGenerator_staticInstance==null || forceInitManager){
  96.                 try{
  97.                     UniqueIdentifierManager.uniqueIdentifierGenerator_staticInstance = (IUniqueIdentifierGenerator) Loader.getInstance().newInstance(className);
  98.                     UniqueIdentifierManager.uniqueIdentifierGenerator_staticInstance.init(o);
  99.                     UniqueIdentifierManager.bufferSupported_staticInstance = UniqueIdentifierManager.uniqueIdentifierGenerator_staticInstance.isBufferSupperted();
  100.                 }catch(Exception e){
  101.                     throw new UniqueIdentifierException("Riscontrato errore durante il caricamento del manager specificato [class:"+className+"]: "+e.getMessage(),e);
  102.                 }
  103.             }
  104.         }
  105.        
  106.     }
  107.    
  108.     public static boolean isBufferSupported() {
  109.         return UniqueIdentifierManager.bufferSupported_staticInstance;
  110.     }
  111.    
  112.     public static IUniqueIdentifier newUniqueIdentifier() throws UniqueIdentifierException{
  113.         if(UniqueIdentifierManager.generazioneUIDDisabilitata){
  114.             return null;
  115.         }
  116.         try{
  117.             if(useThreadLocal) {
  118.                 return UniqueIdentifierManager.uniqueIdentifierGenerator_threadLocal.get().newID();
  119.             }
  120.             else {
  121.                 if(UniqueIdentifierManager.uniqueIdentifierGenerator_staticInstance==null){
  122.                     Logger log = LoggerWrapperFactory.getLogger(UniqueIdentifierManager.class);
  123.                     log.error("UniqueIdentifierManager non inizializzato");
  124.                     UniqueIdentifierManager.inizializzaUniqueIdentifierManager(false, "org.openspcoop.utils.id.ClusterIdentifier");
  125.                 }
  126.                 return UniqueIdentifierManager.uniqueIdentifierGenerator_staticInstance.newID();
  127.             }
  128.         }catch(Exception e){
  129.             throw new UniqueIdentifierException("UniqueIdentifierManager.newID() non riuscita",e);      
  130.         }
  131.     }
  132.    
  133.     public static IUniqueIdentifier newUniqueIdentifier(boolean useBuffer) throws UniqueIdentifierException{
  134.         if(UniqueIdentifierManager.generazioneUIDDisabilitata){
  135.             return null;
  136.         }
  137.         try{
  138.             if(useThreadLocal) {
  139.                 return UniqueIdentifierManager.uniqueIdentifierGenerator_threadLocal.get().newID(useBuffer);
  140.             }
  141.             else {
  142.                 if(UniqueIdentifierManager.uniqueIdentifierGenerator_staticInstance==null){
  143.                     Logger log = LoggerWrapperFactory.getLogger(UniqueIdentifierManager.class);
  144.                     log.error("UniqueIdentifierManager non inizializzato");
  145.                     UniqueIdentifierManager.inizializzaUniqueIdentifierManager(false, "org.openspcoop.utils.id.ClusterIdentifier");
  146.                 }
  147.                 return UniqueIdentifierManager.uniqueIdentifierGenerator_staticInstance.newID(useBuffer);
  148.             }
  149.         }catch(Exception e){
  150.             throw new UniqueIdentifierException("UniqueIdentifierManager.newID(useBuffer) non riuscita",e);    
  151.         }
  152.     }
  153.    
  154.     public static IUniqueIdentifier convertFromString(String value) throws UniqueIdentifierException{
  155.         if(UniqueIdentifierManager.generazioneUIDDisabilitata){
  156.             return null;
  157.         }
  158.         try{
  159.             if(useThreadLocal) {
  160.                 return UniqueIdentifierManager.uniqueIdentifierGenerator_threadLocal.get().convertFromString(value);
  161.             }
  162.             else {
  163.                 if(UniqueIdentifierManager.uniqueIdentifierGenerator_staticInstance==null){
  164.                     Logger log = LoggerWrapperFactory.getLogger(UniqueIdentifierManager.class);
  165.                     log.error("UniqueIdentifierManager non inizializzato");
  166.                     UniqueIdentifierManager.inizializzaUniqueIdentifierManager(false, "org.openspcoop.utils.id.ClusterIdentifier");
  167.                 }
  168.                 return UniqueIdentifierManager.uniqueIdentifierGenerator_staticInstance.convertFromString(value);
  169.             }
  170.         }catch(Exception e){
  171.             throw new UniqueIdentifierException("UniqueIdentifierManager.convertFromString() non riuscita",e);      
  172.         }
  173.     }
  174.    
  175.     public static void removeThreadLocal() throws UniqueIdentifierException{
  176.         if(useThreadLocal) {
  177.             UniqueIdentifierManager.uniqueIdentifierGenerator_threadLocal.remove();
  178.         }
  179.     }
  180. }