SynchronizerCli.java

package esa.bscs.pds4.packager.cli;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Properties;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import esa.bscs.pds4.validate.exception.TechnicalErrorHandler;

public class SynchronizerCli {
    
    private static final Logger LOGGER = LoggerFactory.getLogger(SynchronizerCli.class);
    
    public static void main(String[] args) {
        
        Thread.setDefaultUncaughtExceptionHandler(new TechnicalErrorHandler());
        
        try {
            // Get conf directory from appassembler app.home
            
            final String appHome = System.getProperty("app.home");
            
            if(appHome == null || appHome.length() == 0) {
                LOGGER.error("Could not detect application directory");
                System.exit(1);
            }
            
            final File etc = new File(appHome, "etc");
            
            // Display packager info
            
            final Properties packagerProperties = new Properties();
            
            packagerProperties.load(ClassLoader.getSystemClassLoader().getResourceAsStream("META-INF/maven/esa.bscs.pds4/pds4-packager/pom.properties"));

            LOGGER.info("Packager {} installed at {}", packagerProperties.getProperty("version"), System.getProperty("app.home"));
            
            // Read packager configuration URL from synchronizer.properties
            
            final Properties synchronizerProperties = new Properties();
            
            synchronizerProperties.load(ClassLoader.getSystemClassLoader().getResourceAsStream("synchronizer.properties"));
            
            final URL packagerConfigUrl = new URL(synchronizerProperties.get("packager.config.classifiers.url").toString());
            final URL validateConfigUrl = new URL(synchronizerProperties.get("validate.config.dictionaries.url").toString());
            
            // Display remote version info
            
            final Properties remoteClassifierProperties = new Properties();
            final Properties remoteDictionaryProperties = new Properties();
            
            remoteClassifierProperties.load(new URL("jar:" + packagerConfigUrl.toExternalForm() + "!/META-INF/maven/esa.bscs.pds4/pds4-packager-classifiers/pom.properties").openStream());
            remoteDictionaryProperties.load(new URL("jar:" + validateConfigUrl.toExternalForm() + "!/META-INF/maven/esa.bscs.pds4-tools.packager/pds4-validate-data/pom.properties").openStream());
            
            // Recreate etc directory
            
            if(etc.isDirectory()) {
                FileUtils.cleanDirectory(etc);
            }
            
            etc.mkdir();
            
            // Copy remote files to etc
            
            final String[] packagerConfigFileElements = packagerConfigUrl.getFile().split("/");
            final String[] validateConfigFileElements = validateConfigUrl.getFile().split("/");
            
            LOGGER.info("Retrieving packager classifiers {} from {}", remoteClassifierProperties.getProperty("version"), packagerConfigUrl);
            
            FileUtils.copyURLToFile(packagerConfigUrl, new File(etc, packagerConfigFileElements[packagerConfigFileElements.length-1]));
                        
            LOGGER.info("Retrieving validate configuration {} from {}", remoteDictionaryProperties.getProperty("version"), validateConfigUrl);
            
            FileUtils.copyURLToFile(validateConfigUrl, new File(etc, validateConfigFileElements[validateConfigFileElements.length-1]));
                        
            LOGGER.info("Configuration update complete");
            
            System.exit(0);
        
        } catch(MalformedURLException e) {
            LOGGER.error("Could not retrieve configuration from remote server");
            System.exit(1);
        
        } catch(IOException e) {
            LOGGER.error("A problem arose while reading configuration" , e);
            System.exit(1);
        }
    }
}