You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by og...@apache.org on 2008/11/21 20:28:11 UTC

svn commit: r719683 - in /maven/mercury/trunk/mercury-util/src: main/java/org/apache/maven/mercury/util/event/ test/java/org/apache/maven/mercury/util/event/

Author: ogusakov
Date: Fri Nov 21 11:28:11 2008
New Revision: 719683

URL: http://svn.apache.org/viewvc?rev=719683&view=rev
Log: (empty)

Added:
    maven/mercury/trunk/mercury-util/src/test/java/org/apache/maven/mercury/util/event/EventFrameworkTest.java
Modified:
    maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/event/EventManager.java
    maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/event/MercuryEvent.java

Modified: maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/event/EventManager.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/event/EventManager.java?rev=719683&r1=719682&r2=719683&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/event/EventManager.java (original)
+++ maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/event/EventManager.java Fri Nov 21 11:28:11 2008
@@ -22,27 +22,73 @@
  */
 public class EventManager
 {
+  public static final int THREAD_COUNT = 4;
+
+  /**
+   * this property may contain comma separated list of bit numbers defined in MercuryEvent.EventTypeEnum. It supersedes 
+   * any bits set by the appropriate EventManager constructor by OR operation with those
+   */
+  public static final String SYSTEM_PROPERTY_EVENT_MASK = "maven.mercury.events";
+  public static final String systemPropertyEventMask = System.getProperty( SYSTEM_PROPERTY_EVENT_MASK, null );
+
   private static final IMercuryLogger _log = MercuryLoggerManager.getLogger( EventManager.class );
   private static final Language _lang = new DefaultLanguage( EventManager.class );
   
-  public static final int THREAD_COUNT = 4;
-  
   final List<MercuryEventListener> _listeners = new ArrayList<MercuryEventListener>(8);
   
   final LinkedBlockingQueue<UnitOfWork> _queue = new LinkedBlockingQueue<UnitOfWork>( 512 );
   
-  ExecutorService execService;
+  private ExecutorService _execService;
   
+  private MercuryEvent.EventMask _eventMask;
+  
+  /**
+   * default initialization - create thread pool
+   */
   public EventManager()
   {
-    execService = Executors.newFixedThreadPool( THREAD_COUNT );
+    _execService = Executors.newFixedThreadPool( THREAD_COUNT );
+
     for( int i = 0; i < THREAD_COUNT; i++ )
-      execService.execute( new Runner( _queue ) );
+      _execService.execute( new Runner( _queue ) );
+    
+    processSystemOptions();
+  }
+
+  /**
+   * default initialization - create thread pool
+   */
+  public EventManager( MercuryEvent.EventMask eventMask )
+  {
+    this();
+    
+    this._eventMask = eventMask;
+    
+    processSystemOptions();
+  }
+  
+  private final void processSystemOptions()
+  {
+    if( systemPropertyEventMask == null )
+      return;
+    
+    if( _eventMask == null )
+      _eventMask = new MercuryEvent.EventMask( systemPropertyEventMask );
+    else
+      _eventMask.setBits( systemPropertyEventMask );
   }
   
+  /**
+   * add listener only if it meets the criteria
+   * 
+   * @param listener
+   */
   public void register( MercuryEventListener listener )
   {
-    _listeners.add( listener );
+    MercuryEvent.EventMask lMask = listener.getMask();
+    
+    if( lMask == null || _eventMask == null || _eventMask.intersects( lMask ) )
+      _listeners.add( listener );
   }
   
   public void unRegister( MercuryEventListener listener )
@@ -85,7 +131,19 @@
     {
       try
       {
-        listener.fire( event );
+        MercuryEvent.EventMask lMask = listener.getMask();
+        
+        if( _eventMask != null )
+        {
+          if( lMask == null )
+            lMask = _eventMask;
+          else 
+            lMask.and( _eventMask );
+        }
+        
+        
+        if( lMask == null || lMask.get( event.getType().bitNo ) )
+          listener.fire( event );
       }
       catch( Throwable th )
       {

Modified: maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/event/MercuryEvent.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/event/MercuryEvent.java?rev=719683&r1=719682&r2=719683&view=diff
==============================================================================
--- maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/event/MercuryEvent.java (original)
+++ maven/mercury/trunk/mercury-util/src/main/java/org/apache/maven/mercury/util/event/MercuryEvent.java Fri Nov 21 11:28:11 2008
@@ -2,6 +2,7 @@
 
 import java.util.BitSet;
 import java.util.Map;
+import java.util.StringTokenizer;
 
 /**
  * 
@@ -50,6 +51,30 @@
       for( EventTypeEnum bit : bits )
         set( bit.bitNo );
     }
+
+    public EventMask( String bits )
+    {
+      super();
+      
+      setBits( bits );
+    }
+    
+    public final void setBits( String bits )
+    {
+      if( bits == null )
+        return;
+      
+      StringTokenizer st = new StringTokenizer( bits, ",");
+      
+      while( st.hasMoreTokens() )
+      {
+        String bit = st.nextToken();
+        
+        int bitNo = Integer.valueOf( bit );
+        
+        set( bitNo, true );
+      }
+    }
   }
 
   /**

Added: maven/mercury/trunk/mercury-util/src/test/java/org/apache/maven/mercury/util/event/EventFrameworkTest.java
URL: http://svn.apache.org/viewvc/maven/mercury/trunk/mercury-util/src/test/java/org/apache/maven/mercury/util/event/EventFrameworkTest.java?rev=719683&view=auto
==============================================================================
--- maven/mercury/trunk/mercury-util/src/test/java/org/apache/maven/mercury/util/event/EventFrameworkTest.java (added)
+++ maven/mercury/trunk/mercury-util/src/test/java/org/apache/maven/mercury/util/event/EventFrameworkTest.java Fri Nov 21 11:28:11 2008
@@ -0,0 +1,233 @@
+package org.apache.maven.mercury.util.event;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import junit.framework.TestCase;
+
+import org.apache.maven.mercury.util.event.MercuryEvent.EventMask;
+
+/**
+ *
+ *
+ * @author Oleg Gusakov
+ * @version $Id$
+ *
+ */
+public class EventFrameworkTest
+extends TestCase
+{
+  static final int THREAD_COUNT = 5;
+  static final int EVENT_COUNT  = 10;
+  
+  ExecutorService es;
+  
+  EventManager em;
+  
+  Listener listener;
+  
+  @Override
+  protected void setUp()
+  throws Exception
+  {
+    es = Executors.newFixedThreadPool( THREAD_COUNT );
+  }
+  public void testListenAllEvents()
+  throws InterruptedException
+  {
+    em = new EventManager();
+    
+    // testing this one - receive all events
+    listener = new Listener( null );
+    
+    em.register( listener );
+
+    for( int i=0; i<THREAD_COUNT; i++ )
+    {
+      es.execute( new Generator( em, MercuryEvent.EventTypeEnum.localRepository, ""+i ) );
+    }
+
+    for( int i=0; i<THREAD_COUNT; i++ )
+    {
+      es.execute( new Generator( em, MercuryEvent.EventTypeEnum.remoteRepository, ""+i ) );
+    }
+    
+    es.awaitTermination( 2, TimeUnit.SECONDS );
+    
+    assertEquals( THREAD_COUNT * EventFrameworkTest.EVENT_COUNT, listener.localRepoCount );
+    assertEquals( THREAD_COUNT * EventFrameworkTest.EVENT_COUNT, listener.remoteRepoCount );
+  }
+
+  public void testListenMaskedListenerEvents()
+  throws InterruptedException
+  {
+    em = new EventManager();
+    
+    // test this - receive only local repo events
+    listener = new Listener( new MercuryEvent.EventMask(MercuryEvent.EventTypeEnum.localRepository) );
+    
+    em.register( listener );
+
+    for( int i=0; i<THREAD_COUNT; i++ )
+    {
+      es.execute( new Generator( em, MercuryEvent.EventTypeEnum.localRepository, ""+i ) );
+    }
+
+    for( int i=0; i<THREAD_COUNT; i++ )
+    {
+      es.execute( new Generator( em, MercuryEvent.EventTypeEnum.remoteRepository, ""+i ) );
+    }
+    
+    es.awaitTermination( 2, TimeUnit.SECONDS );
+    
+    assertEquals( THREAD_COUNT * EventFrameworkTest.EVENT_COUNT, listener.localRepoCount );
+    assertEquals( 0, listener.remoteRepoCount );
+  }
+
+  public void testListenMaskedManagerEvents()
+  throws InterruptedException
+  {
+    // test this - propagate only remote repo events
+    em = new EventManager( new MercuryEvent.EventMask(MercuryEvent.EventTypeEnum.remoteRepository) );
+    
+    // listen to all
+    listener = new Listener( null );
+    
+    em.register( listener );
+
+    for( int i=0; i<THREAD_COUNT; i++ )
+    {
+      es.execute( new Generator( em, MercuryEvent.EventTypeEnum.localRepository, ""+i ) );
+    }
+
+    for( int i=0; i<THREAD_COUNT; i++ )
+    {
+      es.execute( new Generator( em, MercuryEvent.EventTypeEnum.remoteRepository, ""+i ) );
+    }
+    
+    es.awaitTermination( 2, TimeUnit.SECONDS );
+    
+    assertEquals( 0, listener.localRepoCount );
+    assertEquals( THREAD_COUNT * EventFrameworkTest.EVENT_COUNT, listener.remoteRepoCount );
+  }
+
+  public void testListenMismatchedMaskEvents()
+  throws InterruptedException
+  {
+    // test this - propagate only remote repo events
+    em = new EventManager( new MercuryEvent.EventMask(MercuryEvent.EventTypeEnum.remoteRepository) );
+    
+    // and this - listen only to local events
+    listener = new Listener( new MercuryEvent.EventMask(MercuryEvent.EventTypeEnum.localRepository) );
+    
+    em.register( listener );
+
+    for( int i=0; i<THREAD_COUNT; i++ )
+    {
+      es.execute( new Generator( em, MercuryEvent.EventTypeEnum.localRepository, ""+i ) );
+    }
+
+    for( int i=0; i<THREAD_COUNT; i++ )
+    {
+      es.execute( new Generator( em, MercuryEvent.EventTypeEnum.remoteRepository, ""+i ) );
+    }
+    
+    es.awaitTermination( 2, TimeUnit.SECONDS );
+    
+    assertEquals( 0, listener.localRepoCount );
+    assertEquals( 0, listener.remoteRepoCount );
+  }
+}
+
+//=====================  helper classes  =====================
+class Listener
+implements MercuryEventListener
+{
+  MercuryEvent.EventMask _mask;
+  
+  int localRepoCount = 0;
+  
+  int remoteRepoCount = 0;
+  
+  public Listener( MercuryEvent.EventMask mask )
+  {
+    _mask = mask;
+  }
+
+  public void fire( MercuryEvent event )
+  {
+    System.out.println( EventManager.toString( event ) );
+    System.out.flush();
+    
+    if( event.getType().equals( MercuryEvent.EventTypeEnum.localRepository ) )
+      ++localRepoCount;
+    else
+      if( event.getType().equals( MercuryEvent.EventTypeEnum.remoteRepository ) )
+        ++remoteRepoCount;
+  }
+
+  public EventMask getMask()
+  {
+    return _mask;
+  }
+  
+}
+
+class Generator
+implements Runnable, EventGenerator
+{
+  
+  EventManager _eventManager;
+  
+  String _msg;
+  
+  MercuryEvent.EventTypeEnum _myType;
+  
+  public Generator( EventManager em, MercuryEvent.EventTypeEnum type, String msg  )
+  {
+    _eventManager = em;
+    _msg = msg;
+    _myType = type;
+  }
+  
+  public void run()
+  {
+    for( int i=0; i< EventFrameworkTest.EVENT_COUNT; i++ )
+      try
+      {
+        GenericEvent event = new GenericEvent( _myType, _msg );
+        Thread.sleep( (int)(100.0*Math.random()) );
+        event.stop();
+        _eventManager.fireEvent( event );
+      }
+      catch( InterruptedException e )
+      {
+        return;
+      }
+  }
+
+  public void register( MercuryEventListener listener )
+  {
+    if( _eventManager == null )
+      _eventManager = new EventManager();
+      
+    _eventManager.register( listener );
+  }
+
+  public void unRegister( MercuryEventListener listener )
+  {
+    if( _eventManager != null )
+      _eventManager.unRegister( listener );
+  }
+  
+  public void setEventManager( EventManager eventManager )
+  {
+    if( _eventManager == null )
+      _eventManager = eventManager;
+    else
+      _eventManager.getListeners().addAll( eventManager.getListeners() );
+      
+  }
+}
+