psmith      2003/12/16 01:23:48

  Modified:    src/java/org/apache/log4j/chainsaw/prefs
                        SettingsManager.java
  Log:
  Now the SettingsManager can handle instances of 
  the Profileable interface and can load and save
  it's settings using it's own namespace (separate Properties).
  
  Defaults for a Profileable come from the global settings (default.properties)
  
  While XML would definately be better, this is quick and easy, and
  there is still so much to be done! :)
  
  
  Revision  Changes    Path
  1.3       +306 -189  
jakarta-log4j/src/java/org/apache/log4j/chainsaw/prefs/SettingsManager.java
  
  Index: SettingsManager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-log4j/src/java/org/apache/log4j/chainsaw/prefs/SettingsManager.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- SettingsManager.java      2 Oct 2003 08:27:08 -0000       1.2
  +++ SettingsManager.java      16 Dec 2003 09:23:48 -0000      1.3
  @@ -46,7 +46,6 @@
    * Apache Software Foundation, please see <http://www.apache.org/>.
    *
    */
  -
   package org.apache.log4j.chainsaw.prefs;
   
   import java.io.BufferedInputStream;
  @@ -70,199 +69,317 @@
    *
    * @author Paul Smith <[EMAIL PROTECTED]>
    * @author Scott Deboy <[EMAIL PROTECTED]>
  - * 
  + *
    */
   public final class SettingsManager {
  -  private static final SettingsManager instance = new SettingsManager();
  -  private static final String SETTINGS_FILE_NAME =
  -    "chainsaw.settings.properties";
  -  private static final String HEADER = "Chainsaws Settings Files";
  -  private EventListenerList listenerList = new EventListenerList();
  -  private Properties defaultProperties = new Properties();
  -
  -  /**
  -   * Initialises the SettingsManager by loading the default Properties from
  -   * a resource
  -   *
  -   */
  -  private SettingsManager() {
  -    //       load the default properties as a Resource
  -    InputStream is = null;
  -
  -    try {
  -      is =
  -        this.getClass().getClassLoader()
  -            .getResource("org/apache/log4j/chainsaw/prefs/default.properties")
  -            .openStream();
  -      defaultProperties.load(is);
  -
  -      //      defaultProperties.list(System.out);
  -      is.close();
  -    } catch (IOException e) {
  -      e.printStackTrace();
  -    } finally {
  -      if (is != null) {
  +    private static final SettingsManager instance = new SettingsManager();
  +    private static final String GLOBAL_SETTINGS_FILE_NAME = 
"chainsaw.settings.properties";
  +    private static final String HEADER = "Chainsaws Settings Files";
  +    private EventListenerList listenerList = new EventListenerList();
  +    private Properties defaultProperties = new Properties();
  +
  +    /**
  +     * Initialises the SettingsManager by loading the default Properties from
  +     * a resource
  +     *
  +     */
  +    private SettingsManager() {
  +        //   load the default properties as a Resource
  +        InputStream is = null;
  +
           try {
  -          is.close();
  -        } catch (Exception e) {
  +            is = this.getClass().getClassLoader()
  +                     
.getResource("org/apache/log4j/chainsaw/prefs/default.properties")
  +                     .openStream();
  +            defaultProperties.load(is);
  +
  +            //      defaultProperties.list(System.out);
  +            is.close();
  +        } catch (IOException e) {
  +            e.printStackTrace();
  +        } finally {
  +            if (is != null) {
  +                try {
  +                    is.close();
  +                } catch (Exception e) {
  +                }
  +            }
  +        }
  +    }
  +
  +    /**
  +     * Returns the singleton instance of the SettingsManager
  +     * @return
  +     */
  +    public static final SettingsManager getInstance() {
  +        return instance;
  +    }
  +
  +    /**
  +     * Registers the listener with the manager
  +     * @param listener
  +     */
  +    public void addSettingsListener(SettingsListener listener) {
  +        listenerList.add(SettingsListener.class, listener);
  +    }
  +
  +    /**
  +     * Requests that the settings be loaded, all listeners will be notified of
  +     * this call, and configure themselves according to the values found in the
  +     * loaded settings
  +     *
  +     */
  +    public void loadSettings() {
  +        /*
  +         * Ok, note we ensure we have a .chainsaw directory in the users
  +         * home folder, and create a chainsaw.settings.properties file..
  +         */
  +        File settingsDir = getSettingsDirectory();
  +
  +        if (!settingsDir.exists()) {
  +            settingsDir.mkdir();
  +        }
  +
  +        loadGlobalSettings();
  +        loadProfileableSettings();
  +    }
  +
  +    /**
  +     *
  +     */
  +    private void loadProfileableSettings() {
  +        EventListener[] listeners = 
listenerList.getListeners(SettingsListener.class);
  +
  +        for (int i = 0; i < listeners.length; i++) {
  +            SettingsListener settingsListener = (SettingsListener) listeners[i];
  +
  +            if (settingsListener instanceof Profileable) {
  +                Profileable p = (Profileable) settingsListener;
  +                loadProfileble(p);
  +            }
  +        }
  +    }
  +
  +    private void loadProfileble(Profileable p) {
  +        LoadSettingsEvent event = createProfilebleEvent(p);
  +        p.loadSettings(event);
  +    }
  +
  +    private LoadSettingsEvent createProfilebleEvent(Profileable p) {
  +        Properties loadedProperties = new Properties();
  +        loadedProperties.putAll(getDefaultSettings());
  +        loadedProperties.putAll(loadProperties(p));
  +        
  +
  +        LoadSettingsEvent event = new LoadSettingsEvent(this, loadedProperties);
  +
  +        return event;
  +    }
  +
  +    /**
  +     * @param p
  +     * @return
  +     */
  +    private Properties loadProperties(Profileable p) {
  +        Properties properties = new Properties(defaultProperties);
  +        InputStream is = null;
  +
  +        File f = new File(getSettingsDirectory(),
  +                p.getNamespace() + ".properties");
  +
  +        if (f.exists()) {
  +            try {
  +                is = new BufferedInputStream(new FileInputStream(f));
  +
  +                Properties toLoad = new Properties();
  +                toLoad.load(is);
  +                properties.putAll(toLoad);
  +            } catch (IOException ioe) {
  +                ioe.printStackTrace();
  +            } finally {
  +                if (is != null) {
  +                    try {
  +                        is.close();
  +                    } catch (IOException e1) {
  +                        e1.printStackTrace();
  +                    }
  +                }
  +            }
  +        }
  +
  +        return properties;
  +    }
  +
  +    private void loadGlobalSettings() {
  +        EventListener[] listeners = 
listenerList.getListeners(SettingsListener.class);
  +        LoadSettingsEvent event = null;
  +
  +        for (int i = 0; i < listeners.length; i++) {
  +            SettingsListener settingsListener = (SettingsListener) listeners[i];
  +
  +            if (event == null) {
  +                Properties loadedProperties = loadGlobalProperties();
  +
  +                //        loadedProperties.list(System.out);
  +                event = new LoadSettingsEvent(this, loadedProperties);
  +            }
  +
  +            settingsListener.loadSettings(event);
           }
  -      }
       }
  -  }
   
  -  /**
  -   * Returns the singleton instance of the SettingsManager
  -   * @return
  -   */
  -  public static final SettingsManager getInstance() {
  -    return instance;
  -  }
  -
  -  /**
  -   * Registers the listener with the manager
  -   * @param listener
  -   */
  -  public void addSettingsListener(SettingsListener listener) {
  -    listenerList.add(SettingsListener.class, listener);
  -  }
  -
  -  /**
  -   * Requests that the settings be loaded, all listeners will be notified of
  -   * this call, and configure themselves according to the values found in the
  -   * loaded settings
  -   *
  -   */
  -  public void loadSettings() {
  -    /*
  -     * Ok, note we ensure we have a .chainsaw directory in the users
  -     * home folder, and create a chainsaw.settings.properties file..
  -     */
  -    File settingsDir = getSettingsDirectory();
  -
  -    if (!settingsDir.exists()) {
  -      settingsDir.mkdir();
  -    }
  -      
  -    EventListener[] listeners =
  -      listenerList.getListeners(SettingsListener.class);
  -    LoadSettingsEvent event = null;
  -
  -    for (int i = 0; i < listeners.length; i++) {
  -      SettingsListener settingsListener = (SettingsListener) listeners[i];
  -
  -      if (event == null) {
  -        Properties loadedProperties = loadCurrentUserProperties();
  -
  -        //        loadedProperties.list(System.out);
  -        event = new LoadSettingsEvent(this, loadedProperties);
  -      }
  -
  -      settingsListener.loadSettings(event);
  -    }
  -  }
  -
  -  /**
  -   * Creates a SaveSettingsEvent and calls all the SettingsListeners
  -   * to populate the properties with configuration information
  -   *
  -   */
  -  public void saveSettings() {
  -    /*
  -     * Ok, note we ensure we have a .chainsaw directory in the users
  -     * home folder, and create a chainsaw.settings.properties file..
  -     */
  -    File settingsDir = getSettingsDirectory();
  -
  -    if (!settingsDir.exists()) {
  -      settingsDir.mkdir();
  -    }
  -
  -    EventListener[] listeners =
  -      listenerList.getListeners(SettingsListener.class);
  -    SaveSettingsEvent event = null;
  -
  -    for (int i = 0; i < listeners.length; i++) {
  -      SettingsListener settingsListener = (SettingsListener) listeners[i];
  -
  -      if (event == null) {
  -        event = new SaveSettingsEvent(this);
  -      }
  -
  -      settingsListener.saveSettings(event);
  -    }
  -
  -    OutputStream os = null;
  -
  -    try {
  -      os =
  -        new BufferedOutputStream(
  -          new FileOutputStream(new File(settingsDir, SETTINGS_FILE_NAME)));
  -      event.getProperties().store(os, HEADER);
  -    } catch (Exception e) {
  -      e.printStackTrace();
  -    } finally {
  -      if (os != null) {
  +    /**
  +     * Creates a SaveSettingsEvent and calls all the SettingsListeners
  +     * to populate the properties with configuration information
  +     *
  +     */
  +    public void saveSettings() {
  +        /*
  +         * Ok, note we ensure we have a .chainsaw directory in the users
  +         * home folder, and create a chainsaw.settings.properties file..
  +         */
  +        File settingsDir = getSettingsDirectory();
  +
  +        if (!settingsDir.exists()) {
  +            settingsDir.mkdir();
  +        }
  +
  +        saveGlobalSettings(settingsDir);
  +        saveProfileableSetting(settingsDir);
  +    }
  +
  +    /**
  +     * Looks up all the Profileable's that have been registered
  +     * and creates a new event for each of them, and ensures that they
  +     * are saved within a separate external store
  +     * @param settingsDir
  +     */
  +    private void saveProfileableSetting(File settingsDir) {
  +        EventListener[] listeners = 
listenerList.getListeners(SettingsListener.class);
  +        SaveSettingsEvent event = null;
  +
  +        for (int i = 0; i < listeners.length; i++) {
  +            SettingsListener settingsListener = (SettingsListener) listeners[i];
  +
  +            if (settingsListener instanceof Profileable) {
  +                Profileable profileable = (Profileable) settingsListener;
  +                event = new SaveSettingsEvent(this);
  +
  +                profileable.saveSettings(event);
  +
  +                OutputStream os = null;
  +
  +                try {
  +                    os = new BufferedOutputStream(new FileOutputStream(
  +                                new File(settingsDir,
  +                                    profileable.getNamespace() + ".properties")));
  +                    event.getProperties().store(os, HEADER);
  +                } catch (Exception e) {
  +                    e.printStackTrace();
  +                } finally {
  +                    if (os != null) {
  +                        try {
  +                            os.close();
  +                        } catch (IOException e1) {
  +                            e1.printStackTrace();
  +                        }
  +                    }
  +                }
  +            }
  +        }
  +    }
  +
  +    private void saveGlobalSettings(File settingsDir) {
  +        EventListener[] listeners = 
listenerList.getListeners(SettingsListener.class);
  +        SaveSettingsEvent event = null;
  +
  +        for (int i = 0; i < listeners.length; i++) {
  +            SettingsListener settingsListener = (SettingsListener) listeners[i];
  +
  +            if (!(settingsListener instanceof Profileable)) {
  +                if (event == null) {
  +                    event = new SaveSettingsEvent(this);
  +                }
  +
  +                settingsListener.saveSettings(event);
  +            }
  +        }
  +
  +        OutputStream os = null;
  +
           try {
  -          os.close();
  -        } catch (IOException e1) {
  -          e1.printStackTrace();
  -        }
  -      }
  -    }
  -  }
  -
  -  public File getSettingsDirectory() {
  -    return new File(System.getProperty("user.home"), ".chainsaw");
  -  }
  -
  -  public void configure(SettingsListener listener) {
  -      Properties loadedProperties = loadCurrentUserProperties();
  -      LoadSettingsEvent event = new LoadSettingsEvent(this, loadedProperties);
  -      listener.loadSettings(event);
  -  }
  -  
  -  /**
  -   * Returns the current Properties settings for this user
  -   * by merging the default Properties with the ones we find in their directory.
  -   *
  -   * @return
  -   */
  -  private Properties loadCurrentUserProperties() {
  -    Properties properties = new Properties(defaultProperties);
  -    InputStream is = null;
  -
  -    File f = new File(getSettingsDirectory(), SETTINGS_FILE_NAME);
  -    if (f.exists()) {
  -      try {
  -        is =
  -          new BufferedInputStream(
  -            new FileInputStream(f));
  -
  -        Properties toLoad = new Properties();
  -        toLoad.load(is);
  -        properties.putAll(toLoad);
  -      } catch (IOException ioe) {
  -        ioe.printStackTrace();
  -      } finally {
  -        if (is != null) {
  -          try {
  -            is.close();
  -          } catch (IOException e1) {
  -            e1.printStackTrace();
  -          }
  -        }
  -      }
  -    }
  -
  -    return properties;
  -  }
  -
  -  /**
  -   * Returns the loaded default settings, which can be used by
  -   * other classes within this package.
  -   * @return Properties defaults
  -   */
  -  public Properties getDefaultSettings() {
  -    return defaultProperties;
  -  }
  +            os = new BufferedOutputStream(new FileOutputStream(
  +                        new File(settingsDir, GLOBAL_SETTINGS_FILE_NAME)));
  +            event.getProperties().store(os, HEADER);
  +        } catch (Exception e) {
  +            e.printStackTrace();
  +        } finally {
  +            if (os != null) {
  +                try {
  +                    os.close();
  +                } catch (IOException e1) {
  +                    e1.printStackTrace();
  +                }
  +            }
  +        }
  +    }
  +
  +    public File getSettingsDirectory() {
  +        return new File(System.getProperty("user.home"), ".chainsaw");
  +    }
  +
  +    public void configure(SettingsListener listener) {
  +        if (listener instanceof Profileable) {
  +            loadProfileble((Profileable) listener);
  +        } else {
  +            Properties loadedProperties = loadGlobalProperties();
  +            LoadSettingsEvent event = new LoadSettingsEvent(this,
  +                    loadedProperties);
  +            listener.loadSettings(event);
  +        }
  +    }
  +
  +    /**
  +     * Returns the current Properties settings for this user
  +     * by merging the default Properties with the ones we find in their directory.
  +     *
  +     * @return
  +     */
  +    private Properties loadGlobalProperties() {
  +        Properties properties = new Properties(defaultProperties);
  +        InputStream is = null;
  +
  +        File f = new File(getSettingsDirectory(), GLOBAL_SETTINGS_FILE_NAME);
  +
  +        if (f.exists()) {
  +            try {
  +                is = new BufferedInputStream(new FileInputStream(f));
  +
  +                Properties toLoad = new Properties();
  +                toLoad.load(is);
  +                properties.putAll(toLoad);
  +            } catch (IOException ioe) {
  +                ioe.printStackTrace();
  +            } finally {
  +                if (is != null) {
  +                    try {
  +                        is.close();
  +                    } catch (IOException e1) {
  +                        e1.printStackTrace();
  +                    }
  +                }
  +            }
  +        }
  +
  +        return properties;
  +    }
  +
  +    /**
  +     * Returns the loaded default settings, which can be used by
  +     * other classes within this package.
  +     * @return Properties defaults
  +     */
  +    public Properties getDefaultSettings() {
  +        return defaultProperties;
  +    }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to