logging-log4j-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From psm...@apache.org
Subject cvs commit: jakarta-log4j/tests/src/java/org/apache/log4j/plugins PluginTestCase.java
Date Thu, 18 Sep 2003 03:08:45 GMT
psmith      2003/09/17 20:08:45

  Modified:    src/java/org/apache/log4j/plugins PluginRegistry.java
               tests/src/java/org/apache/log4j/plugins PluginTestCase.java
  Added:       src/java/org/apache/log4j/plugins PluginEvent.java
                        PluginListener.java
  Log:
  Added PluginEvent & associated Listener class to the PluginRegistry.
  
  Also included Test case to verify.
  
  PluginRegistry now exposes via listeners when each Plugin
  is started/stopped via the Registry.  This is majorily
  useful in GUI situations where the View is/should be decoupled
  from the a controller/actions that modify the registry.
  
  Jalopolized.
  
  Revision  Changes    Path
  1.8       +107 -36   jakarta-log4j/src/java/org/apache/log4j/plugins/PluginRegistry.java
  
  Index: PluginRegistry.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/src/java/org/apache/log4j/plugins/PluginRegistry.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- PluginRegistry.java	26 Jun 2003 22:59:44 -0000	1.7
  +++ PluginRegistry.java	18 Sep 2003 03:08:45 -0000	1.8
  @@ -53,12 +53,14 @@
   import org.apache.log4j.spi.LoggerRepository;
   import org.apache.log4j.spi.LoggerRepositoryEventListener;
   
  +import java.util.ArrayList;
   import java.util.Collections;
  -import java.util.Map;
   import java.util.HashMap;
  -import java.util.List;
  -import java.util.ArrayList;
   import java.util.Iterator;
  +import java.util.List;
  +import java.util.Map;
  +
  +import javax.swing.event.EventListenerList;
   
   
   /**
  @@ -76,6 +78,8 @@
   
     /** the listener used to listen for repository events. */
     private static RepositoryListener listener = new RepositoryListener();
  +  private static final EventListenerList listenerList =
  +    new EventListenerList();
   
     /**
       Starts a Plugin with default logger repository.
  @@ -101,31 +105,33 @@
      * @param name The name to check the repository for
      * @return true if the name is already in use, otherwise false
      */
  -  public static boolean pluginNameExists(String name){
  +  public static boolean pluginNameExists(String name) {
       LoggerRepository repository = LogManager.getLoggerRepository();
   
       return pluginNameExists(name, repository);
     }
  -  
   
     /**
      * Returns true if the specified name is already taken by
  -   * an existing Plugin registered within the scope of the specified 
  +   * an existing Plugin registered within the scope of the specified
      * LoggerRepository.
      * @param name The name to check the repository for
      * @param repository the repository to check the name against
      * @return true if the name is already in use, otherwise false
      */
  -  public static boolean pluginNameExists(String name, LoggerRepository repository){
  -    synchronized(repositoryMap){
  +  public static boolean pluginNameExists(
  +    String name, LoggerRepository repository) {
  +    synchronized (repositoryMap) {
         Map pluginMap = (Map) repositoryMap.get(repository);
  -      if( pluginMap != null && pluginMap.containsKey(name)){
  +
  +      if ((pluginMap != null) && pluginMap.containsKey(name)) {
           return true;
         }
       }
  +
       return false;
     }
  -  
  +
     /**
       Starts a plugin with a given logger repository.
   
  @@ -175,60 +181,102 @@
   
         // start the new plugin
         plugin.activateOptions();
  +      firePluginStarted(plugin);
   
         return plugin;
       }
     }
   
     /**
  -    Returns all the plugins for a given repository.
  -    
  -    @param repository the logger repository to get the plugins from.
  -    @return List list of plugins from the repository. */
  +  * @param plugin
  +  */
  +  private static void firePluginStarted(Plugin plugin) {
  +    PluginListener[] listeners =
  +      (PluginListener[]) listenerList.getListeners(PluginListener.class);
  +
  +    PluginEvent e = null;
  +
  +    for (int i = 0; i < listeners.length; i++) {
  +      if (e == null) {
  +        e = new PluginEvent(plugin);
  +      }
  +
  +      listeners[i].pluginStarted(e);
  +    }
  +  }
  +
  +  private static void firePluginStopped(Plugin plugin) {
  +    PluginListener[] listeners =
  +      (PluginListener[]) listenerList.getListeners(PluginListener.class);
  +
  +    PluginEvent e = null;
  +
  +    for (int i = 0; i < listeners.length; i++) {
  +      if (e == null) {
  +        e = new PluginEvent(plugin);
  +      }
  +
  +      listeners[i].pluginStopped(e);
  +    }
  +  }
  +
  +  /**
  +      Returns all the plugins for a given repository.
  +
  +      @param repository the logger repository to get the plugins from.
  +      @return List list of plugins from the repository. */
     public static List getPlugins(LoggerRepository repository) {
       synchronized (repositoryMap) {
         // get plugin map for repository
         Map pluginMap = (Map) repositoryMap.get(repository);
  +
         if (pluginMap == null) {
  -      	return Collections.EMPTY_LIST;
  +        return Collections.EMPTY_LIST;
         } else {
  -      	List pluginList = new ArrayList(pluginMap.size());
  -      	Iterator iter = pluginMap.values().iterator();
  -      	while (iter.hasNext()) {
  -      		pluginList.add(iter.next());
  -      	}
  -      	return pluginList;
  +        List pluginList = new ArrayList(pluginMap.size());
  +        Iterator iter = pluginMap.values().iterator();
  +
  +        while (iter.hasNext()) {
  +          pluginList.add(iter.next());
  +        }
  +
  +        return pluginList;
         }
       }
     }
  -  
  +
     /**
       Returns all the plugins for a given repository that are instances
       of a certain class.
  -    
  +
       @param repository the logger repository to get the plugins from.
       @param pluginClass the class the plugin must implement to be selected.
       @return List list of plugins from the repository. */
  -  public static List getPlugins(LoggerRepository repository, Class pluginClass) {
  +  public static List getPlugins(
  +    LoggerRepository repository, Class pluginClass) {
       synchronized (repositoryMap) {
         // get plugin map for repository
         Map pluginMap = (Map) repositoryMap.get(repository);
  +
         if (pluginMap == null) {
  -      	return Collections.EMPTY_LIST;
  +        return Collections.EMPTY_LIST;
         } else {
  -      	List pluginList = new ArrayList(pluginMap.size());
  -      	Iterator iter = pluginMap.values().iterator();
  -      	while (iter.hasNext()) {
  -      		Object plugin = iter.next();
  -      		if (pluginClass.isInstance(plugin)) {
  -	      		pluginList.add(plugin);
  -	      	}
  -      	}
  -      	return pluginList;
  +        List pluginList = new ArrayList(pluginMap.size());
  +        Iterator iter = pluginMap.values().iterator();
  +
  +        while (iter.hasNext()) {
  +          Object plugin = iter.next();
  +
  +          if (pluginClass.isInstance(plugin)) {
  +            pluginList.add(plugin);
  +          }
  +        }
  +
  +        return pluginList;
         }
       }
     }
  -  
  +
     /**
       Stops a plugin by plugin object.
   
  @@ -281,6 +329,7 @@
   
         // remove it from the plugin map
         pluginMap.remove(pluginName);
  +      firePluginStopped(plugin);
   
         // if no more plugins, remove the plugin map from
         // repository map
  @@ -318,13 +367,35 @@
         Iterator iter = pluginMap.values().iterator();
   
         while (iter.hasNext()) {
  -        ((Plugin) iter.next()).shutdown();
  +		Plugin plugin = (Plugin) iter.next();
  +        plugin.shutdown();
  +        firePluginStopped(plugin);
         }
   
         // since no more plugins, remove plugin map from
         // the repository
         repositoryMap.remove(repository);
       }
  +  }
  +
  +  /**
  +   * Adds a PluginListener to this registry to be notified
  +   * of PluginEvents
  +   *
  +   * @param l PluginListener to add to this registry
  +   */
  +  public static final void addPluginListener(PluginListener l) {
  +    listenerList.add(PluginListener.class, l);
  +  }
  +
  +  /**
  +   * Removes a particular PluginListener from this registry
  +   * such that it will no longer be notified of PluginEvents
  +   *
  +   * @param l PluginListener to remove
  +   */
  +  public static final void removePluginListener(PluginListener l) {
  +    listenerList.remove(PluginListener.class, l);
     }
   
     /**
  
  
  
  1.1                  jakarta-log4j/src/java/org/apache/log4j/plugins/PluginEvent.java
  
  Index: PluginEvent.java
  ===================================================================
  /*
   * ============================================================================
   *                   The Apache Software License, Version 1.1
   * ============================================================================
   *
   *    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without modifica-
   * tion, are permitted provided that the following conditions are met:
   *
   * 1. Redistributions of  source code must  retain the above copyright  notice,
   *    this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright notice,
   *    this list of conditions and the following disclaimer in the documentation
   *    and/or other materials provided with the distribution.
   *
   * 3. The end-user documentation included with the redistribution, if any, must
   *    include  the following  acknowledgment:  "This product includes  software
   *    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
   *    Alternately, this  acknowledgment may  appear in the software itself,  if
   *    and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "log4j" and  "Apache Software Foundation"  must not be used to
   *    endorse  or promote  products derived  from this  software without  prior
   *    written permission. For written permission, please contact
   *    apache@apache.org.
   *
   * 5. Products  derived from this software may not  be called "Apache", nor may
   *    "Apache" appear  in their name,  without prior written permission  of the
   *    Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   * FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   * APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   * INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   * DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   * OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   * ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   * (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   * This software  consists of voluntary contributions made  by many individuals
   * on  behalf of the Apache Software  Foundation.  For more  information on the
   * Apache Software Foundation, please see <http://www.apache.org/>.
   *
   */
  
  package org.apache.log4j.plugins;
  
  import java.util.EventObject;
  
  
  /**
   * All Plugin events are encapsulated in this class, which
   * simply contains the source Plugin, but may in future include more
   * information.
   *
   * @author Paul Smith
   */
  public class PluginEvent extends EventObject {
    /**
     * @param source The source plugin of the event
     */
    PluginEvent(Plugin source) {
      super(source);
    }
  
  	/**
  	 * Returns the source Plugin of this event, which is simple
  	 * the getSource() method casted to Plugin for convenience.
  	 * @return Plugin source of this event
  	 */
    public Plugin getPlugin() {
      return (Plugin) getSource();
    }
  }
  
  
  
  1.1                  jakarta-log4j/src/java/org/apache/log4j/plugins/PluginListener.java
  
  Index: PluginListener.java
  ===================================================================
  /*
   * ============================================================================
   *                   The Apache Software License, Version 1.1
   * ============================================================================
   *
   *    Copyright (C) 1999 The Apache Software Foundation. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without modifica-
   * tion, are permitted provided that the following conditions are met:
   *
   * 1. Redistributions of  source code must  retain the above copyright  notice,
   *    this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright notice,
   *    this list of conditions and the following disclaimer in the documentation
   *    and/or other materials provided with the distribution.
   *
   * 3. The end-user documentation included with the redistribution, if any, must
   *    include  the following  acknowledgment:  "This product includes  software
   *    developed  by the  Apache Software Foundation  (http://www.apache.org/)."
   *    Alternately, this  acknowledgment may  appear in the software itself,  if
   *    and wherever such third-party acknowledgments normally appear.
   *
   * 4. The names "log4j" and  "Apache Software Foundation"  must not be used to
   *    endorse  or promote  products derived  from this  software without  prior
   *    written permission. For written permission, please contact
   *    apache@apache.org.
   *
   * 5. Products  derived from this software may not  be called "Apache", nor may
   *    "Apache" appear  in their name,  without prior written permission  of the
   *    Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
   * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
   * FITNESS  FOR A PARTICULAR  PURPOSE ARE  DISCLAIMED.  IN NO  EVENT SHALL  THE
   * APACHE SOFTWARE  FOUNDATION  OR ITS CONTRIBUTORS  BE LIABLE FOR  ANY DIRECT,
   * INDIRECT, INCIDENTAL, SPECIAL,  EXEMPLARY, OR CONSEQUENTIAL  DAMAGES (INCLU-
   * DING, BUT NOT LIMITED TO, PROCUREMENT  OF SUBSTITUTE GOODS OR SERVICES; LOSS
   * OF USE, DATA, OR  PROFITS; OR BUSINESS  INTERRUPTION)  HOWEVER CAUSED AND ON
   * ANY  THEORY OF LIABILITY,  WHETHER  IN CONTRACT,  STRICT LIABILITY,  OR TORT
   * (INCLUDING  NEGLIGENCE OR  OTHERWISE) ARISING IN  ANY WAY OUT OF THE  USE OF
   * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   * This software  consists of voluntary contributions made  by many individuals
   * on  behalf of the Apache Software  Foundation.  For more  information on the
   * Apache Software Foundation, please see <http://www.apache.org/>.
   *
   */
  
  /*
   */
  package org.apache.log4j.plugins;
  
  import java.util.EventListener;
  
  
  /**
   * PluginListeners are notified when plugins are started or stopped
   * by the PluginRegistry.
   * 
   * @author Paul Smith <psmith@apache.org>
   */
  public interface PluginListener extends EventListener {
    public void pluginStarted(PluginEvent e);
  
    public void pluginStopped(PluginEvent e);
  }
  
  
  
  1.8       +47 -0     jakarta-log4j/tests/src/java/org/apache/log4j/plugins/PluginTestCase.java
  
  Index: PluginTestCase.java
  ===================================================================
  RCS file: /home/cvs/jakarta-log4j/tests/src/java/org/apache/log4j/plugins/PluginTestCase.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- PluginTestCase.java	17 Sep 2003 23:30:14 -0000	1.7
  +++ PluginTestCase.java	18 Sep 2003 03:08:45 -0000	1.8
  @@ -368,6 +368,26 @@
         Compare.compare(getOutputFile(testName), getWitnessFile(testName)));
     }
   
  +	public void testPluginListeners(){
  +		Plugin p = new PluginTester1("MyNewPlugin",1);
  +		PluginListenerLatch l = new PluginListenerLatch();
  +		PluginRegistry.stopAllPlugins();
  +		PluginRegistry.addPluginListener(l);
  +		PluginRegistry.startPlugin(p);
  +		
  +		PluginEvent e = l.LastEvent;
  +		
  +		assertTrue("PluginListener should have been notified of start", l.StartLatch);
  +		assertTrue("PluginListener stop latch should not be activated", !l.StopLatch);
  +		assertTrue("PluginListener should be given reference to Plugin", e.getPlugin() == p);
  +
  +		PluginRegistry.stopAllPlugins();
  +		assertTrue("PluginListener should have been notified of stop", l.StopLatch);
  +		assertTrue("PluginListener should not have been notified of start", !l.StartLatch);
  +		assertTrue("PluginListener should be given reference to Plugin", l.LastEvent.getPlugin()
== p);
  +		assertTrue("PluginListener should have received a distinct event object", l.LastEvent
!= e);
  +	}
  +	
     public void testPropertyChangeListeners() {
       Plugin plugin = new PluginTester1("PluginTest1", 1);
   
  @@ -456,10 +476,37 @@
       suite.addTest(new PluginTestCase("test1"));
       suite.addTest(new PluginTestCase("test2"));
       suite.addTest(new PluginTestCase("testPropertyChangeListeners"));
  +    suite.addTest(new PluginTestCase("testPluginListeners"));
   
       return suite;
     }
   
  +	private static class PluginListenerLatch implements PluginListener{
  +		private boolean StartLatch;
  +		private boolean StopLatch;
  +		private PluginEvent LastEvent;
  +		/* (non-Javadoc)
  +		 * @see org.apache.log4j.plugins.PluginListener#pluginStarted(org.apache.log4j.plugins.PluginEvent)
  +		 */
  +		public void pluginStarted(PluginEvent e) {
  +			StartLatch = true;
  +			LastEvent = e;
  +		}
  +
  +		/* (non-Javadoc)
  +		 * @see org.apache.log4j.plugins.PluginListener#pluginStopped(org.apache.log4j.plugins.PluginEvent)
  +		 */
  +		public void pluginStopped(PluginEvent e) {
  +			StopLatch = true;
  +			LastEvent = e;
  +		}
  +		void reset(){
  +			StartLatch = false;
  +			StopLatch = false;
  +			LastEvent = null;
  +		}
  +	}
  +	
     private static class PropertyChangeListenerLatch
       implements PropertyChangeListener {
       boolean latch = false;
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: log4j-dev-help@jakarta.apache.org


Mime
View raw message