package org.dcache.gplazma.configuration; import java.io.File; import java.util.concurrent.TimeUnit; import org.dcache.gplazma.configuration.parser.ConfigurationParser; import org.dcache.gplazma.configuration.parser.ConfigurationParserFactory; import org.dcache.gplazma.configuration.parser.FactoryConfigurationException; import org.dcache.gplazma.configuration.parser.ParseException; /** * This loading strategy loads the configuration from file, if file has been * updated. * This class is not thread safe. * @author timur */ public class FromFileConfigurationLoadingStrategy implements ConfigurationLoadingStrategy { private static final long CONFIGURATION_UPDATE_FREQUENCY_MILLIS = TimeUnit.SECONDS.toMillis(1); private final File configurationFile; private long configurationFileLastModified; private long configurationFileLastChecked; public FromFileConfigurationLoadingStrategy(File configurationFile) { this.configurationFile = configurationFile; } public FromFileConfigurationLoadingStrategy(String configurationFileName) { this(new File(configurationFileName)); } /** * * @return true if the configuration file has been modified, * false otherwise */ @Override public boolean hasUpdated() { if( (System.currentTimeMillis() - configurationFileLastChecked) < CONFIGURATION_UPDATE_FREQUENCY_MILLIS) { /* we checked less then CONFIGURATION_UPDATE_FREQUNCY_MILLIS * milliseconds ago */ return false; } if(configurationFileLastModified == configurationFile.lastModified() ) { //configuration file has not been updated. no need to reread return false; } return true; } /** * * @return configuration loaded from the configuration file */ @Override public Configuration load() throws ParseException, FactoryConfigurationException { configurationFileLastModified = configurationFile.lastModified(); configurationFileLastChecked = System.currentTimeMillis(); ConfigurationParserFactory parserFactory = ConfigurationParserFactory.getInstance(); ConfigurationParser parser = parserFactory.newConfigurationParser(); return parser.parse(configurationFile); } }