XMLDataConverterMainProcessor.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.core.config.driver.utils;

  21. import java.io.File;
  22. import java.io.FileInputStream;
  23. import java.net.URL;
  24. import java.sql.Connection;
  25. import java.sql.DriverManager;

  26. import org.apache.logging.log4j.Level;
  27. import org.openspcoop2.core.config.AccessoConfigurazionePdD;
  28. import org.openspcoop2.core.config.driver.ExtendedInfoManager;
  29. import org.openspcoop2.utils.LoggerWrapperFactory;
  30. import org.openspcoop2.utils.Semaphore;
  31. import org.openspcoop2.utils.SemaphoreLock;
  32. import org.openspcoop2.utils.Utilities;
  33. import org.openspcoop2.utils.resources.FileSystemUtilities;
  34. import org.openspcoop2.utils.resources.Loader;
  35. import org.slf4j.Logger;

  36. /**
  37.  * Inizializza una configurazione
  38.  *
  39.  * @author Andrea Poli (apoli@link.it)
  40.  * @author $Author$
  41.  * @version $Rev$, $Date$
  42.  */

  43. public class XMLDataConverterMainProcessor {


  44.     public static void main(String[] argoments) throws Exception {

  45.        
  46.                                        
  47.         if (argoments.length  < 9) {
  48.             String errorMsg = "ERROR, Usage:  java XMLDataConverterMainProcessor sorgenteXML tipoConfigurazioneCRUD proprietaConfigurazioneCRUD reset isGestioneConfigurazione tipoConversione gestioneSoggetti gestioneMappingErogazioneFruizione protocolloDefault [Logger]";
  49.             System.err.println(errorMsg);
  50.             throw new Exception(errorMsg);
  51.         }

  52.         String args_sorgenteXML = argoments[0].trim();
  53.         String args_tipoConfigurazioneCRUD = argoments[1].trim();
  54.         String args_proprietaConfigurazioneCRUD = argoments[2].trim();
  55.         String args_reset = argoments[3].trim();
  56.         String args_isGestioneConfigurazione = argoments[4].trim();
  57.         String args_tipoConversione = argoments[5].trim();
  58.         String args_gestioneSoggetti = argoments[6].trim();
  59.         String args_gestioneMappingErogazioneFruizione = argoments[7].trim();
  60.         String args_protocolloDefault = argoments[8].trim();
  61.         String args_logger = null;
  62.         if(argoments.length>9){
  63.             args_logger = argoments[9].trim();
  64.         }
  65.        
  66.         // Inizializzo logger
  67.         String loggerValue = null;
  68.         try{
  69.             if(args_logger!=null){
  70.                 LoggerWrapperFactory.setLogConfiguration(args_logger);
  71.             }else{
  72.                 URL url = XMLDataConverterMainProcessor.class.getResource("/xml2backend.log4j2.properties");
  73.                 if(url!=null){
  74.                     LoggerWrapperFactory.setLogConfiguration(url);
  75.                 }
  76.                 else{
  77.                     File logFile = FileSystemUtilities.createTempFile("testXMLDataConverterConfigurazione_", ".log");
  78.                     System.out.println("LogMessages write in "+logFile.getAbsolutePath());
  79.                     LoggerWrapperFactory.setDefaultLogConfiguration(Level.ALL, false, null, logFile, "%p <%d{dd-MM-yyyy HH:mm:ss}> %C.%M(%L): %m %n %n");
  80.                 }
  81.             }
  82.         }catch(Exception e) {
  83.             String errorMsg = "Errore durante il caricamento del file di log loggerValue["+loggerValue+"] : "+e.getMessage();
  84.             System.err.println(errorMsg);
  85.             System.out.println("Args.length: "+argoments.length);
  86.             for (int i = 0; i < argoments.length; i++) {
  87.                 System.out.println("Arg["+i+"]=["+argoments[i]+"]");
  88.             }
  89.             throw new Exception(errorMsg,e);
  90.         }  
  91.         Logger log = LoggerWrapperFactory.getLogger("gestoreDatiConfigurazione");
  92.        
  93.         java.util.Properties reader = new java.util.Properties();
  94.         try{
  95.             try(FileInputStream fin = new FileInputStream(args_proprietaConfigurazioneCRUD)){
  96.                 reader.load(fin);
  97.             }
  98.         }catch(java.io.IOException e) {
  99.             String errorMsg = "Errore durante il caricamento del file di properties ["+args_proprietaConfigurazioneCRUD+"] : "+e.getMessage();
  100.             log.error(errorMsg,e);
  101.             throw new Exception(errorMsg,e);
  102.         }

  103.         // ProtocolloDefault
  104.         String protocolloDefault = args_protocolloDefault;
  105.        
  106.         // Reset
  107.         boolean reset = Boolean.parseBoolean(args_reset);
  108.        
  109.         // GestioneSoggetti
  110.         boolean gestioneSoggetti =  Boolean.parseBoolean(args_gestioneSoggetti);
  111.        
  112.         // isGestioneConfigurazione
  113.         boolean isGestioneConfigurazione = Boolean.parseBoolean(args_isGestioneConfigurazione);
  114.        
  115.         // GestioneMappingErogazioneFruizione
  116.         boolean gestioneMappingErogazioneFruizione =  Boolean.parseBoolean(args_gestioneMappingErogazioneFruizione);
  117.        
  118.         // Raccolta proprieta'
  119.         AccessoConfigurazionePdD acCRUD = new AccessoConfigurazionePdD();
  120.         String superUser = null;
  121.         boolean connectionDB = false;
  122.         String connection = null;
  123.         String username = null;
  124.         String password = null;
  125.         String driver =  null;
  126.         String tipoDatabase = null;
  127.         boolean condivisioneDBRegservPddValue = false;
  128.         try{
  129.             acCRUD.setTipo(args_tipoConfigurazioneCRUD);
  130.                        
  131.             superUser = reader.getProperty("openspcoop2.superuser");
  132.             if(superUser!=null)
  133.                 superUser = superUser.trim();
  134.            
  135.             if("db".equals(args_tipoConfigurazioneCRUD)){
  136.                 // Database
  137.                 tipoDatabase = reader.getProperty("openspcoop2.configurazione.db.tipo");
  138.                 if(tipoDatabase==null){
  139.                     throw new Exception("Non e' stato definito il tipo di database");
  140.                 }else{
  141.                     tipoDatabase = tipoDatabase.trim();
  142.                 }
  143.                
  144.                 String condivisioneDBRegservPdd = reader.getProperty("openspcoop2.configurazione.db.condivisioneDBRegserv");
  145.                 try{
  146.                     condivisioneDBRegservPddValue = Boolean.parseBoolean(condivisioneDBRegservPdd.trim());
  147.                 }catch(Exception e){
  148.                     throw new Exception("Non e' stato definita o e' definita non correttamente la proprieta' [openspcoop2.configurazione.db.condivisioneDBRegserv]: "+e.getMessage());
  149.                 }
  150.                
  151.                 String dataSource = reader.getProperty("openspcoop2.configurazione.db.dataSource");
  152.                 if(dataSource!=null){
  153.                     dataSource = dataSource.trim();
  154.                     java.util.Properties context = Utilities.readProperties("openspcoop2.configurazione.db.context.",reader);
  155.                     acCRUD.setLocation(dataSource);
  156.                     acCRUD.setContext(context);
  157.                     acCRUD.setTipoDatabase(tipoDatabase);
  158.                 }else{
  159.                     connectionDB = true;
  160.                     connection = reader.getProperty("openspcoop2.configurazione.db.url");
  161.                     if(connection==null){
  162.                         throw new Exception("Non e' stata definita una destinazione ne attraverso un datasource, ne attraverso una connessione diretta");
  163.                     }
  164.                     connection = connection.trim();
  165.                     driver = reader.getProperty("openspcoop2.configurazione.db.driver");
  166.                     if(driver==null){
  167.                         throw new Exception("Connessione diretta: non e' stato definito il Driver");
  168.                     }
  169.                     driver = driver.trim();
  170.                     username = reader.getProperty("openspcoop2.configurazione.db.user");
  171.                     password = reader.getProperty("openspcoop2.configurazione.db.password");
  172.                     if(username!=null){
  173.                         username = username.trim();
  174.                     }
  175.                     if(password!=null){
  176.                         password = password.trim();
  177.                     }
  178.                 }
  179.             }

  180.         }catch(Exception e) {
  181.             String errorMsg = "Errore durante la lettura del file di properties ["+args_proprietaConfigurazioneCRUD+"] : "+e.getMessage();
  182.             log.error(errorMsg,e);
  183.             throw new Exception(errorMsg,e);
  184.         }

  185.         try{
  186.             ExtendedInfoManager.initialize(new Loader(XMLDataConverterMainProcessor.class.getClassLoader()), null, null, null);
  187.         }catch(Exception e){
  188.             log.error("Inizializzazione [ExtendedInfoManager] fallita",e);
  189.             return;
  190.         }
  191.        
  192.         Connection connectionSQL = null;
  193.         try{
  194.             // XMLDataConverter
  195.             File fSorgente = new File(args_sorgenteXML);
  196.             if(connectionDB){  
  197.                 Loader.getInstance().newInstance(driver);
  198.                 if(username!=null && password!=null){
  199.                     connectionSQL = DriverManager.getConnection(connection,username,password);
  200.                 }else{
  201.                     connectionSQL = DriverManager.getConnection(connection);
  202.                 }
  203.             }
  204.            
  205.             XMLDataConverterMainProcessor.letturaSorgenti(fSorgente, connectionDB, connectionSQL, tipoDatabase, log, acCRUD,
  206.                     condivisioneDBRegservPddValue, superUser,protocolloDefault, args_tipoConversione, isGestioneConfigurazione, reset, gestioneSoggetti, gestioneMappingErogazioneFruizione);
  207.            
  208.         }catch(Exception e){
  209.             String errorMsg = "Errore durante la conversione XML dei dati: "+e.getMessage();
  210.             log.error(errorMsg,e);
  211.             throw new Exception(errorMsg,e);
  212.         }finally{
  213.             try{
  214.                 if(connectionSQL!=null)
  215.                     connectionSQL.close();
  216.             }catch(Exception e){
  217.                 // close
  218.             }
  219.         }
  220.     }
  221.    
  222.    
  223.     private static Semaphore semaphoreResetEffettuata = new Semaphore("TestXMLDataConverterConfigReset");
  224.     private static Boolean resetEffettuata = false;
  225.     private static boolean reset(boolean b){
  226.         if(b){
  227.             // Se si desidera la reset, controllo se e' gia stata effettuata
  228.             SemaphoreLock lock = semaphoreResetEffettuata.acquireThrowRuntime("reset");
  229.             try {
  230.                 if(XMLDataConverterMainProcessor.resetEffettuata==false){
  231.                     XMLDataConverterMainProcessor.resetEffettuata=true;
  232.                     return true;
  233.                 }
  234.                 else{
  235.                     return false;
  236.                 }
  237.             }finally {
  238.                 semaphoreResetEffettuata.release(lock, "reset");
  239.             }
  240.         }
  241.         return false;
  242.     }
  243.    
  244.    
  245.     private static void letturaSorgenti(File fSorgente,boolean connectionDB,Connection connectionSQL,
  246.             String tipoDatabase,Logger log,AccessoConfigurazionePdD acCRUD,
  247.             boolean condivisioneDBRegservPddValue,String superUser,String protocolloDefault,
  248.             String tipoConversione, boolean isGestioneConfigurazione,boolean reset,boolean gestioneSoggetti,boolean gestioneMappingErogazioneFruizione) throws Exception{
  249.         if(fSorgente.isFile()){
  250.             if(fSorgente.canRead()==false){
  251.                 throw new Exception("Sorgente XML ["+fSorgente.getAbsolutePath()+"] non accessibile in lettura");
  252.             }
  253.             if(fSorgente.getName().endsWith(".xml")){
  254.                 // Per non convertire i wsdl e i xml
  255.                 XMLDataConverterMainProcessor.converti(fSorgente, connectionDB, connectionSQL, tipoDatabase, log, acCRUD,
  256.                         condivisioneDBRegservPddValue, superUser,protocolloDefault, tipoConversione, isGestioneConfigurazione, reset, gestioneSoggetti,gestioneMappingErogazioneFruizione);
  257.             }
  258.             else{
  259.                 log.debug("File ["+fSorgente.getAbsolutePath()+"] ignorato. Non possiede l'estensione .xml");
  260.             }
  261.         }
  262.         else if(fSorgente.isDirectory()){
  263.            
  264.             if(fSorgente.canRead()==false){
  265.                 throw new Exception("Directory contenente gli XML ["+fSorgente.getAbsolutePath()+"] non accessibile in lettura");
  266.             }
  267.            
  268.             File [] f = fSorgente.listFiles();
  269.             if(f==null || f.length<=0){
  270.                 throw new Exception("Directory ["+fSorgente.getAbsolutePath()+"] non contiene XML");
  271.             }
  272.             for(int i=0; i<f.length; i++){
  273.            
  274.                 XMLDataConverterMainProcessor.letturaSorgenti(f[i], connectionDB, connectionSQL, tipoDatabase, log, acCRUD,
  275.                         condivisioneDBRegservPddValue, superUser,protocolloDefault, tipoConversione, isGestioneConfigurazione, reset, gestioneSoggetti,gestioneMappingErogazioneFruizione);
  276.                
  277.             }
  278.         }
  279.     }
  280.    
  281.    
  282.     private static void converti(File f,boolean connectionDB,Connection connectionSQL,
  283.             String tipoDatabase,Logger log,AccessoConfigurazionePdD acCRUD,
  284.             boolean condivisioneDBRegservPddValue,String superUser,String protocolloDefault,
  285.             String tipoConversione, boolean isGestioneConfigurazione,boolean reset,boolean gestioneSoggetti,boolean gestioneMappingErogazioneFruizione) throws Exception{
  286.         // XMLDataConverter
  287.         XMLDataConverter dataConverter = null;
  288.         Logger logDriver = null;
  289.         if(connectionDB){      
  290.             dataConverter = new XMLDataConverter(f,connectionSQL,tipoDatabase,
  291.                     isGestioneConfigurazione,condivisioneDBRegservPddValue,superUser,protocolloDefault,
  292.                     log,logDriver);
  293.         }else{
  294.             dataConverter = new XMLDataConverter(f,acCRUD,
  295.                     isGestioneConfigurazione,condivisioneDBRegservPddValue,superUser,protocolloDefault,
  296.                     log,logDriver);
  297.         }
  298.        
  299.         if("insertUpdate".equals(tipoConversione)){
  300.             log.info("Inizio conversione...");
  301.             dataConverter.convertXML(XMLDataConverterMainProcessor.reset(reset),gestioneSoggetti,gestioneMappingErogazioneFruizione);
  302.             log.info("Conversione terminata.");
  303.         }
  304.         else if("delete".equals(tipoConversione)){
  305.             log.info("Inizio conversione...");
  306.             dataConverter.delete(gestioneSoggetti,gestioneMappingErogazioneFruizione);
  307.             log.info("Conversione terminata.");
  308.         }else{
  309.             throw new Exception("Valore opzione 'tipoConversioneConfigurazione' non gestito (valori possibili insertUpdate/delete): "+tipoConversione);
  310.         }
  311.     }
  312. }