001    package org.shiftone.jrat.core;
002    
003    import org.shiftone.jrat.core.config.Configuration;
004    import org.shiftone.jrat.core.config.ConfigurationParser;
005    import org.shiftone.jrat.core.config.Settings;
006    import org.shiftone.jrat.util.io.IOUtil;
007    import org.shiftone.jrat.util.io.ResourceUtil;
008    import org.shiftone.jrat.util.log.Logger;
009    
010    import java.io.*;
011    import java.util.Date;
012    
013    /**
014     * @author jeff@shiftone.org (Jeff Drost)
015     */
016    public class Environment {
017    
018        private static final Logger LOG = Logger.getLogger(Environment.class);
019        private static final String CONFIG_FILE = "jrat.xml";
020        private static final String DEFAULT_FILE = "org/shiftone/jrat/core/default-jrat.xml";
021        public static final Environment INSTANCE = new Environment();
022        private final Configuration configuration;
023    
024        public Environment() {
025    
026            if (Mode.get().isEnvironmentLoadingEnabled()) {
027    
028                File file = new File(CONFIG_FILE);
029    
030                byte[] configurationData = getConfigurationData(file);
031    
032                configuration = ConfigurationParser.parse(
033                        new ByteArrayInputStream(configurationData)
034                );
035    
036            } else {
037    
038                configuration = new Configuration();
039    
040            }
041        }
042    
043        private byte[] getConfigurationData(File file) {
044    
045    
046            if (!file.exists()) {
047    
048                LOG.info("Initializing configuration file with default...");
049                LOG.info("Edit this file to further configure JRat.");
050                copyDefaultFile(file);
051    
052            } else {
053    
054                LOG.info("Using existing configuration file.");
055    
056            }
057    
058            LOG.info("Loading JRat Configuration : " + file.getAbsolutePath() + "...");
059            LOG.info("File was last modified " + new Date(file.lastModified()));
060    
061            return IOUtil.readAndClose(IOUtil.openInputStream(file));
062    
063        }
064    
065    
066        private void copyDefaultFile(File file) {
067    
068            try {
069    
070                InputStream defaultStream = ResourceUtil.loadResourceAsStream(DEFAULT_FILE);
071                OutputStream outputStream = new FileOutputStream(file);
072                IOUtil.copy(defaultStream, outputStream);
073    
074            } catch (Exception e) {
075    
076                throw new JRatException("unable to copy default configuration file to : " + file.getAbsolutePath(), e);
077    
078            }
079        }
080    
081    
082        public static Configuration getConfiguration() {
083            return INSTANCE.configuration;
084        }
085    
086        public static Settings getSettings() {
087            return getConfiguration().getSettings();
088        }
089    
090    
091    }