package com.urbanmania.spring.beans.factory.config.annotations; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; import org.springframework.core.io.Resource; public class PropertyFileLoader implements PropertyLoader { private static final Logger log = Logger.getLogger(PropertyFileLoader.class.getName()); private Properties properties; private List<PropertyListener> listeners = new ArrayList<PropertyListener>(); private List<Resource> resources; private Map<String, Long> lastModified = new HashMap<String, Long>(); public void setResources(List<Resource> resources) { this.resources = resources; } public Properties loadProperties() throws IOException { properties = new Properties(); for(Resource resource : resources) { properties.load(resource.getInputStream()); } for (Resource resource : resources) { updateLastModified(resource); } return properties; } public void registerPropertyListener(PropertyListener listener) { listeners.add(listener); } public void checkResourcesForUpdates() throws IOException { for (Resource resource : resources) { if(log.isLoggable(Level.FINE)) log.fine("checking file=[" + resource.getFile() + ",lastModified="+resource.getFile().lastModified()+"] for updates since=["+lastModified.get(resource.getFilename())+"]"); if (resource.getFile().lastModified() > lastModified.get(resource.getFilename())) { Properties updatedProperies = new Properties(); updatedProperies.load(resource.getInputStream()); for (Object o : updatedProperies.keySet()) { String key = (String) o; if (!updatedProperies.get(key).equals(properties.get(key))) { log.info("changed property=[" + key + "] in file=[" + resource.getFile() + "]: " + properties.get(key) + " -> " + updatedProperies.get(key)); String value = (String) updatedProperies.get(key); properties.put(key, value); PropertyEvent event = new PropertyEvent(this, key, value); for (PropertyListener listener : listeners) { listener.propertyChanged(event); } } } updateLastModified(resource); } } } private void updateLastModified(Resource resource) throws IOException { lastModified.put(resource.getFilename(), resource.getFile().lastModified()); } }