001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    
018    package org.apache.commons.jci.examples.configuration;
019    
020    import java.io.File;
021    import java.io.FileInputStream;
022    import java.io.IOException;
023    import java.io.InputStream;
024    import java.util.ArrayList;
025    import java.util.Collection;
026    import java.util.Properties;
027    
028    import org.apache.commons.jci.listeners.FileChangeListener;
029    import org.apache.commons.jci.monitor.FilesystemAlterationListener;
030    import org.apache.commons.jci.monitor.FilesystemAlterationMonitor;
031    import org.apache.commons.jci.monitor.FilesystemAlterationObserver;
032    
033    /**
034     * 
035     * @author tcurdt
036     */
037    public final class ConfigurationReloading {
038    
039        private final FilesystemAlterationMonitor fam = new FilesystemAlterationMonitor();
040    
041        private void run(String[] args) {
042    
043            final File configFile = new File("some.properties");
044    
045            System.out.println("Watching " + configFile.getAbsolutePath());
046    
047            final Collection<Configurable> configurables = new ArrayList<Configurable>();
048    
049            final FilesystemAlterationListener listener = new FileChangeListener() {
050                public void onStop(FilesystemAlterationObserver pObserver) {
051                    super.onStop(pObserver);
052    
053                    if (hasChanged()) {
054                        System.out.println("Configuration change detected " + configFile);
055    
056                        final Properties props = new Properties();
057                        InputStream is = null; 
058                        try {
059                            is = new FileInputStream(configFile);
060                            props.load(is);
061    
062                            System.out.println("Notifying about configuration change " + configFile);
063    
064                            for (Configurable configurable : configurables) {
065                                configurable.configure(props);
066                            }
067    
068                        } catch (Exception e) {
069                            System.err.println("Failed to load configuration " + configFile);
070                        } finally {
071                            try {
072                                                            is.close();
073                                                    } catch (IOException e) {
074                                                    }
075                        }
076    
077                    }
078                }
079            };
080    
081            fam.addListener(configFile, listener);
082                    fam.start();
083    
084                    configurables.add(new Something());
085    
086            while(true) {
087                try {
088                    Thread.sleep(1000);
089                } catch (InterruptedException e) {
090                }
091            }
092        }
093    
094        public static void main(String[] args) {
095            new ConfigurationReloading().run(args);
096        }
097    }