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.registry.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 java.util.Enumeration;

  27. import org.apache.logging.log4j.Level;
  28. import org.openspcoop2.core.config.AccessoRegistroRegistro;
  29. import org.openspcoop2.core.config.constants.RegistroTipo;
  30. import org.openspcoop2.core.registry.constants.StatiAccordo;
  31. import org.openspcoop2.utils.LoggerWrapperFactory;
  32. import org.openspcoop2.utils.Semaphore;
  33. import org.openspcoop2.utils.SemaphoreLock;
  34. import org.openspcoop2.utils.Utilities;
  35. import org.openspcoop2.utils.resources.FileSystemUtilities;
  36. import org.openspcoop2.utils.resources.Loader;
  37. import org.slf4j.Logger;

  38. /**
  39.  * Inizializza un registro Servizi
  40.  *
  41.  * @author Andrea Poli (apoli@link.it)
  42.  * @author $Author$
  43.  * @version $Rev$, $Date$
  44.  */

  45. public class XMLDataConverterMainProcessor {


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

  47.         if (argoments.length  < 9) {
  48.             String errorMsg = "ERROR, Usage:  java XMLDataConverterMainProcessor sorgenteXML tipoRegistroCRUD proprietaRegistroCRUD reset tipoConversione gestioneSoggetti mantieniFruitori deleteMappingErogazioneFruizione statoAccordiImportati protocolloDefault [[logger] [nomePddOperativa logger]]";
  49.             System.err.println(errorMsg);
  50.             throw new Exception(errorMsg);
  51.         }

  52.         String args_sorgenteXML = argoments[0].trim();
  53.         String args_tipoRegistroCRUD = argoments[1].trim();
  54.         String args_proprietaRegistroCRUD = argoments[2].trim();
  55.         String args_reset = argoments[3].trim();
  56.         String args_tipoConversione = argoments[4].trim();
  57.         String args_gestioneSoggetti = argoments[5].trim();
  58.         String args_mantieniFruitori = argoments[6].trim();
  59.         String argsdeleteEngineMappingErogazioneFruizione = argoments[7].trim();
  60.         String args_statoAccordiImportati = argoments[8].trim();
  61.         String args_protocolloDefault = argoments[9].trim();
  62.         String args_nomePddOperativa = null;
  63.         String args_logger = null;
  64.         if(argoments.length==11){
  65.             args_logger = argoments[10].trim();
  66.         }
  67.         else{
  68.             args_nomePddOperativa = argoments[10].trim();
  69.             args_logger = argoments[11].trim();
  70.         }
  71.        
  72.         // Inizializzo logger
  73.         String loggerValue = null;
  74.         try{
  75.             if(args_logger!=null){
  76.                 LoggerWrapperFactory.setLogConfiguration(args_logger);
  77.             }else{
  78.                 URL url = XMLDataConverterMainProcessor.class.getResource("/xml2backend.log4j2.properties");
  79.                 if(url!=null){
  80.                     LoggerWrapperFactory.setLogConfiguration(url);
  81.                 }
  82.                 else{
  83.                     File logFile = FileSystemUtilities.createTempFile("testXMLDataConverterRegistro_", ".log");
  84.                     System.out.println("LogMessages write in "+logFile.getAbsolutePath());
  85.                     LoggerWrapperFactory.setDefaultLogConfiguration(Level.ALL, false, null, logFile, "%p <%d{dd-MM-yyyy HH:mm:ss}> %C.%M(%L): %m %n %n");
  86.                 }
  87.             }
  88.         }catch(Exception e) {
  89.             String errorMsg = "Errore durante il caricamento del file di log loggerValue["+loggerValue+"] : "+e.getMessage();
  90.             System.err.println(errorMsg);
  91.             System.out.println("Args.length: "+argoments.length);
  92.             for (int i = 0; i < argoments.length; i++) {
  93.                 System.out.println("Arg["+i+"]=["+argoments[i]+"]");
  94.             }
  95.             throw new Exception(errorMsg,e);
  96.         }  
  97.         Logger log = LoggerWrapperFactory.getLogger("gestoreDatiRegistro");
  98.        
  99.         // StatoAccordo
  100.         String statoAccordo = args_statoAccordiImportati;
  101.         if(!StatiAccordo.bozza.toString().equals(statoAccordo) && !StatiAccordo.operativo.toString().equals(statoAccordo) && !StatiAccordo.finale.toString().equals(statoAccordo)){
  102.             String errorMsg = "Opzione 'statoAccordiImportati' non valida ("+statoAccordo+"), valori possibili sono: "+StatiAccordo.bozza.toString()+","+StatiAccordo.operativo.toString()+","+StatiAccordo.finale.toString();
  103.             System.err.println(errorMsg);
  104.             throw new Exception(errorMsg);
  105.         }
  106.         StatiAccordo statoAccordoObject = StatiAccordo.valueOf(statoAccordo);

  107.         // ProtocolloDefault
  108.         String protocolloDefault = args_protocolloDefault;
  109.        
  110.         // Reset
  111.         boolean reset = Boolean.parseBoolean(args_reset);
  112.        
  113.         // GestioneSoggetti
  114.         boolean gestioneSoggetti =  Boolean.parseBoolean(args_gestioneSoggetti);
  115.        
  116.         // MantieniFruitori
  117.         boolean mantieniFruitori = Boolean.parseBoolean(args_mantieniFruitori);
  118.        
  119.         // DeleteMappingErogazioneFruizione
  120.         boolean deleteMappingErogazioneFruizione = Boolean.parseBoolean(argsdeleteEngineMappingErogazioneFruizione);
  121.        
  122.         // Properties
  123.         java.util.Properties reader = new java.util.Properties();
  124.         try{
  125.             try(FileInputStream fin = new FileInputStream(args_proprietaRegistroCRUD)){
  126.                 reader.load(fin);
  127.             }
  128.         }catch(java.io.IOException e) {
  129.             String errorMsg = "Errore durante il caricamento del file di properties ["+args_proprietaRegistroCRUD+"] : "+e.getMessage();
  130.             log.error(errorMsg,e);
  131.             throw new Exception(errorMsg,e);
  132.         }

  133.         // Raccolta proprieta'
  134.         AccessoRegistroRegistro acCRUD = new AccessoRegistroRegistro();

  135.         String superUser = null;
  136.         boolean connectionDB = false;
  137.         String connection = null;
  138.         String username = null;
  139.         String password = null;
  140.         String driver =  null;
  141.         String tipoDatabase = null;
  142.         try{
  143.             acCRUD.setTipo(RegistroTipo.toEnumConstant(args_tipoRegistroCRUD));
  144.            
  145.             superUser = reader.getProperty("openspcoop2.superuser");
  146.             if(superUser!=null)
  147.                 superUser = superUser.trim();
  148.            
  149.             if("db".equals(args_tipoRegistroCRUD)){
  150.                 // Database
  151.                 tipoDatabase = reader.getProperty("openspcoop2.registroServizi.db.tipo");
  152.                 if(tipoDatabase==null){
  153.                     throw new Exception("Non e' stato definito il tipo di database");
  154.                 }else{
  155.                     tipoDatabase = tipoDatabase.trim();
  156.                 }
  157.                
  158.                 String dataSource = reader.getProperty("openspcoop2.registroServizi.db.dataSource");
  159.                 if(dataSource!=null){
  160.                     dataSource = dataSource.trim();
  161.                     java.util.Properties context = Utilities.readProperties("openspcoop2.registroServizi.db.context.",reader);
  162.                     acCRUD.setLocation(dataSource);
  163.                     acCRUD.setTipoDatabase(tipoDatabase);
  164.                     Enumeration<?> keys = context.keys();
  165.                     while (keys.hasMoreElements()) {
  166.                         String key = (String) keys.nextElement();
  167.                         String value = context.getProperty(key);
  168.                         acCRUD.putGenericProperties(key, value);
  169.                     }
  170.                 }else{
  171.                     connectionDB = true;
  172.                     connection = reader.getProperty("openspcoop2.registroServizi.db.url");
  173.                     if(connection==null){
  174.                         throw new Exception("Non e' stata definita una destinazione ne attraverso un datasource, ne attraverso una connessione diretta");
  175.                     }
  176.                     connection = connection.trim();
  177.                     driver = reader.getProperty("openspcoop2.registroServizi.db.driver");
  178.                     if(driver==null){
  179.                         throw new Exception("Connessione diretta: non e' stato definito il Driver");
  180.                     }
  181.                     driver = driver.trim();
  182.                     username = reader.getProperty("openspcoop2.registroServizi.db.user");
  183.                     password = reader.getProperty("openspcoop2.registroServizi.db.password");
  184.                     if(username!=null){
  185.                         username = username.trim();
  186.                     }
  187.                     if(password!=null){
  188.                         password = password.trim();
  189.                     }
  190.                 }      
  191.             }else if("uddi".equals(args_tipoRegistroCRUD)){
  192.                 // UDDI
  193.                 String inquiryUrl = reader.getProperty("openspcoop2.registroServizi.uddi.inquiryUrl");
  194.                 if(inquiryUrl!=null)
  195.                     inquiryUrl = inquiryUrl.trim();
  196.                 String publishUrl = reader.getProperty("openspcoop2.registroServizi.uddi.publishUrl");
  197.                 if(publishUrl!=null)
  198.                     publishUrl = publishUrl.trim();
  199.                 String usernameUDDI = reader.getProperty("openspcoop2.registroServizi.uddi.username");
  200.                 if(usernameUDDI!=null)
  201.                     usernameUDDI = usernameUDDI.trim();
  202.                 String passwordUDDI = reader.getProperty("openspcoop2.registroServizi.uddi.password");
  203.                 if(passwordUDDI!=null)
  204.                     passwordUDDI = passwordUDDI.trim();
  205.                 String urlPrefix = reader.getProperty("openspcoop2.registroServizi.uddi.urlPrefix");
  206.                 if(urlPrefix!=null)
  207.                     urlPrefix = urlPrefix.trim();
  208.                 String pathPrefix = reader.getProperty("openspcoop2.registroServizi.uddi.pathPrefix");
  209.                 if(pathPrefix!=null)
  210.                     pathPrefix = pathPrefix.trim();
  211.                 acCRUD.setLocation(inquiryUrl);
  212.                 acCRUD.setUser(usernameUDDI);
  213.                 acCRUD.setPassword(passwordUDDI);
  214.                 acCRUD.putGenericProperties("publishUrl", publishUrl);
  215.                 acCRUD.putGenericProperties("urlPrefix", urlPrefix);
  216.                 acCRUD.putGenericProperties("pathPrefix", pathPrefix);
  217.             }else if("web".equals(args_tipoRegistroCRUD)){
  218.                 // WEB
  219.                 String urlPrefix = reader.getProperty("openspcoop2.registroServizi.web.urlPrefix");
  220.                 if(urlPrefix!=null)
  221.                     urlPrefix = urlPrefix.trim();
  222.                 String pathPrefix = reader.getProperty("openspcoop2.registroServizi.web.pathPrefix");
  223.                 if(pathPrefix!=null)
  224.                     pathPrefix = pathPrefix.trim();
  225.                 acCRUD.setLocation(urlPrefix);
  226.                 acCRUD.putGenericProperties("pathPrefix", pathPrefix);
  227.             }

  228.         }catch(Exception e) {
  229.             String errorMsg = "Errore durante la lettura del file di properties ["+args_proprietaRegistroCRUD+"] : "+e.getMessage();
  230.             log.error(errorMsg,e);
  231.             throw new Exception(errorMsg,e);
  232.         }

  233.         Connection connectionSQL = null;
  234.         try{
  235.             File fSorgente = new File(args_sorgenteXML);
  236.             if(connectionDB){      
  237.                 Loader.getInstance().newInstance(driver);
  238.                 if(username!=null && password!=null){
  239.                     connectionSQL = DriverManager.getConnection(connection,username,password);
  240.                 }else{
  241.                     connectionSQL = DriverManager.getConnection(connection);
  242.                 }
  243.             }
  244.            
  245.             XMLDataConverterMainProcessor.letturaSorgenti(fSorgente, connectionDB, connectionSQL, tipoDatabase, log, superUser, acCRUD,
  246.                     statoAccordoObject, protocolloDefault, args_tipoConversione, args_nomePddOperativa, gestioneSoggetti, reset, mantieniFruitori,deleteMappingErogazioneFruizione);
  247.            
  248.         }catch(Exception e){
  249.             String errorMsg = "Errore durante la conversione XML dei dati: "+e.getMessage();
  250.             log.error(errorMsg,e);
  251.             throw new Exception(errorMsg,e);
  252.         }finally{
  253.             try{
  254.                 if(connectionSQL!=null)
  255.                     connectionSQL.close();
  256.             }catch(Exception e){
  257.                 // close
  258.             }
  259.         }
  260.     }
  261.    
  262.    
  263.     private static Semaphore semaphoreResetEffettuata = new Semaphore("TestXMLDataConverterRegistryReset");
  264.     private static Boolean resetEffettuata = false;
  265.     private static boolean reset(boolean b){
  266.         if(b){
  267.             // Se si desidera la reset, controllo se e' gia stata effettuata
  268.             SemaphoreLock lock = semaphoreResetEffettuata.acquireThrowRuntime("reset");
  269.             try {
  270.                 if(XMLDataConverterMainProcessor.resetEffettuata==false){
  271.                     XMLDataConverterMainProcessor.resetEffettuata=true;
  272.                     return true;
  273.                 }
  274.                 else{
  275.                     return false;
  276.                 }
  277.             }finally {
  278.                 semaphoreResetEffettuata.release(lock, "reset");
  279.             }
  280.         }
  281.         return false;
  282.     }
  283.    
  284.    
  285.     private static void letturaSorgenti(File fSorgente,boolean connectionDB,Connection connectionSQL,
  286.             String tipoDatabase,Logger log,String superUser,AccessoRegistroRegistro acCRUD,
  287.             StatiAccordo statoAccordoObject,String protocolloDefault,
  288.             String tipoConversione,String nomePddOperativa,
  289.             boolean gestioneSoggetti,boolean reset, boolean mantieniFruitori, boolean deleteMappingErogazioneFruizione) throws Exception{
  290.         if(fSorgente.isFile()){
  291.             if(fSorgente.canRead()==false){
  292.                 throw new Exception("Sorgente XML ["+fSorgente.getAbsolutePath()+"] non accessibile in lettura");
  293.             }
  294.             if(fSorgente.getName().endsWith(".xml")){
  295.                 // Per non convertire i wsdl e i xml
  296.                 XMLDataConverterMainProcessor.converti(fSorgente, connectionDB, connectionSQL, tipoDatabase, log, superUser, acCRUD,
  297.                         statoAccordoObject, protocolloDefault,tipoConversione,nomePddOperativa,gestioneSoggetti,reset,mantieniFruitori,deleteMappingErogazioneFruizione);
  298.             }
  299.             else{
  300.                 log.debug("File ["+fSorgente.getAbsolutePath()+"] ignorato. Non possiede l'estensione .xml");
  301.             }
  302.         }
  303.         else if(fSorgente.isDirectory()){
  304.            
  305.             if(fSorgente.canRead()==false){
  306.                 throw new Exception("Directory contenente gli XML ["+fSorgente.getAbsolutePath()+"] non accessibile in lettura");
  307.             }
  308.            
  309.             File [] f = fSorgente.listFiles();
  310.             if(f==null || f.length<=0){
  311.                 throw new Exception("Directory ["+fSorgente.getAbsolutePath()+"] non contiene XML");
  312.             }
  313.             for(int i=0; i<f.length; i++){
  314.            
  315.                 XMLDataConverterMainProcessor.letturaSorgenti(f[i], connectionDB, connectionSQL, tipoDatabase, log, superUser, acCRUD,
  316.                         statoAccordoObject, protocolloDefault,tipoConversione,nomePddOperativa,gestioneSoggetti,reset,mantieniFruitori,deleteMappingErogazioneFruizione);
  317.                
  318.             }
  319.         }
  320.     }
  321.    
  322.    
  323.     private static void converti(File f,boolean connectionDB,Connection connectionSQL,
  324.             String tipoDatabase,Logger log,String superUser,AccessoRegistroRegistro acCRUD,
  325.             StatiAccordo statoAccordoObject,String protocolloDefault,
  326.             String tipoConversione,String nomePddOperativa,
  327.             boolean gestioneSoggetti,boolean reset, boolean mantieniFruitori, boolean deleteMappingErogazioneFruizione) throws Exception{
  328.        
  329.         Logger logDriver = null;
  330.         if( org.openspcoop2.core.config.constants.RegistroTipo.UDDI.equals(acCRUD.getTipo()) || org.openspcoop2.core.config.constants.RegistroTipo.WEB.equals(acCRUD.getTipo()) ){
  331.             logDriver = log;
  332.         }
  333.        
  334.         // XMLDataConverter
  335.         XMLDataConverter dataConverter = null;
  336.         if(connectionDB){      
  337.             dataConverter = new XMLDataConverter(f.getAbsolutePath(),connectionSQL,tipoDatabase,superUser,protocolloDefault,log,logDriver);
  338.         }else{
  339.             dataConverter = new XMLDataConverter(f.getAbsolutePath(),acCRUD,superUser,protocolloDefault,log,logDriver);
  340.         }
  341.        
  342.         if("insertUpdate".equals(tipoConversione)){
  343.             log.info("Inizio conversione...");
  344.             if(nomePddOperativa!=null){
  345.                 PdDConfig pddConfig = new PdDConfig();
  346.                 String pddOperativa = nomePddOperativa;
  347.                 pddConfig.setPddOperativaCtrlstatSinglePdd(pddOperativa);
  348.                 dataConverter.convertXML(XMLDataConverterMainProcessor.reset(reset),pddConfig,mantieniFruitori,gestioneSoggetti,statoAccordoObject);
  349.             }else{
  350.                 dataConverter.convertXML(XMLDataConverterMainProcessor.reset(reset),mantieniFruitori,gestioneSoggetti,statoAccordoObject);
  351.             }
  352.             log.info("Conversione terminata.");
  353.         }
  354.         else if("delete".equals(tipoConversione)){
  355.             log.info("Inizio conversione...");
  356.             dataConverter.delete(gestioneSoggetti, deleteMappingErogazioneFruizione);
  357.             log.info("Conversione terminata.");
  358.         }else{
  359.             throw new Exception("Valore opzione 'tipoConversioneRegistroServizi' non gestito (valori possibili insertUpdate/delete): "+tipoConversione);
  360.         }
  361.     }
  362. }