    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    }