mirror of
				https://github.com/scm-manager/scm-manager.git
				synced 2025-11-03 20:15:52 +01:00 
			
		
		
		
	move eventbus implementation from scm-core to scm-webapp
This commit is contained in:
		@@ -32,10 +32,9 @@
 | 
			
		||||
 | 
			
		||||
package sonia.scm.event;
 | 
			
		||||
 | 
			
		||||
import com.google.common.eventbus.ThrowingEventBus;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Exception is thrown if from the {@link ThrowingEventBus} an error occurs 
 | 
			
		||||
 * Exception is thrown from the {@link ScmEventBus} if an error occurs 
 | 
			
		||||
 * during a synchronous event post operation.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Sebastian Sdorra
 | 
			
		||||
 
 | 
			
		||||
@@ -30,26 +30,26 @@
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
package sonia.scm.event;
 | 
			
		||||
 | 
			
		||||
//~--- non-JDK imports --------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import com.google.common.eventbus.AsyncEventBus;
 | 
			
		||||
import com.google.common.eventbus.EventBus;
 | 
			
		||||
import com.google.common.eventbus.ThrowingEventBus;
 | 
			
		||||
 | 
			
		||||
import org.apache.shiro.concurrent.SubjectAwareExecutorService;
 | 
			
		||||
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
import sonia.scm.util.ServiceUtil;
 | 
			
		||||
 | 
			
		||||
//~--- JDK imports ------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import java.util.concurrent.Executors;
 | 
			
		||||
import java.util.ServiceLoader;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Dispatches events to listeners, and provides ways for listeners to register
 | 
			
		||||
 * themselves.
 | 
			
		||||
 * themselves. The ScmEventBus searches its implementation with the
 | 
			
		||||
 * {@link ServiceLoader}.
 | 
			
		||||
 *
 | 
			
		||||
 * @see {@link EventBus}
 | 
			
		||||
 * @author Sebastian Sdorra
 | 
			
		||||
@@ -57,31 +57,18 @@ import java.util.concurrent.Executors;
 | 
			
		||||
 *
 | 
			
		||||
 * @apiviz.landmark
 | 
			
		||||
 */
 | 
			
		||||
public class ScmEventBus extends EventBus
 | 
			
		||||
public abstract class ScmEventBus
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  /** Field description */
 | 
			
		||||
  private volatile static ScmEventBus instance;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * the logger for ScmEventBus
 | 
			
		||||
   */
 | 
			
		||||
  private static final Logger logger =
 | 
			
		||||
    LoggerFactory.getLogger(ScmEventBus.class);
 | 
			
		||||
 | 
			
		||||
  /** Field description */
 | 
			
		||||
  private static ScmEventBus instance = new ScmEventBus();
 | 
			
		||||
 | 
			
		||||
  //~--- constructors ---------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   *  Constructs a new ScmEventBus
 | 
			
		||||
   *
 | 
			
		||||
   */
 | 
			
		||||
  private ScmEventBus()
 | 
			
		||||
  {
 | 
			
		||||
    eventBus = new ThrowingEventBus();
 | 
			
		||||
    asyncEventBus = new AsyncEventBus(
 | 
			
		||||
      new SubjectAwareExecutorService(Executors.newCachedThreadPool()));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //~--- get methods ----------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
@@ -92,97 +79,65 @@ public class ScmEventBus extends EventBus
 | 
			
		||||
   */
 | 
			
		||||
  public static ScmEventBus getInstance()
 | 
			
		||||
  {
 | 
			
		||||
    if (instance == null)
 | 
			
		||||
    {
 | 
			
		||||
      synchronized (ScmEventBus.class)
 | 
			
		||||
      {
 | 
			
		||||
        if (instance == null)
 | 
			
		||||
        {
 | 
			
		||||
          instance = ServiceUtil.getService(ScmEventBus.class);
 | 
			
		||||
 | 
			
		||||
          if (instance == null)
 | 
			
		||||
          {
 | 
			
		||||
            throw new IllegalStateException(
 | 
			
		||||
              "could not find a event bus implementation");
 | 
			
		||||
          }
 | 
			
		||||
          else
 | 
			
		||||
          {
 | 
			
		||||
            logger.info("use {} as event bus implementation",
 | 
			
		||||
              instance.getClass().getName());
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return instance;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //~--- methods --------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * {@inheritDoc}
 | 
			
		||||
   * Post a event through the event bus. All registered subscribers will be
 | 
			
		||||
   * notified by the event bus.
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @param event
 | 
			
		||||
   * @param event event to send through the event bus
 | 
			
		||||
   */
 | 
			
		||||
  @Override
 | 
			
		||||
  public void post(Object event)
 | 
			
		||||
  {
 | 
			
		||||
    logger.debug("post {} to event bus", event);
 | 
			
		||||
    asyncEventBus.post(event);
 | 
			
		||||
    eventBus.post(event);
 | 
			
		||||
  }
 | 
			
		||||
  public abstract void post(Object event);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * {@inheritDoc}
 | 
			
		||||
   * Register all handler methods with the {@link Subscribe} annotation as
 | 
			
		||||
   * subscriber for the event bus.
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @param object
 | 
			
		||||
   * @param subscriber subscriber object
 | 
			
		||||
   * @param async should the subscriber receive the event in async manner
 | 
			
		||||
   */
 | 
			
		||||
  @Override
 | 
			
		||||
  public void register(Object object)
 | 
			
		||||
  {
 | 
			
		||||
    register(object, true);
 | 
			
		||||
  }
 | 
			
		||||
  public abstract void register(Object subscriber, boolean async);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Registers a object to the eventbus.
 | 
			
		||||
   * Unregister the given subscriber object from the event bus.
 | 
			
		||||
   *
 | 
			
		||||
   * @param object object to register
 | 
			
		||||
   * @param async handle event asynchronously
 | 
			
		||||
   *
 | 
			
		||||
   * @see {@link #register(java.lang.Object)}
 | 
			
		||||
   * @param subscriber subscriber object to unregister
 | 
			
		||||
   */
 | 
			
		||||
  public void register(Object object, boolean async)
 | 
			
		||||
  {
 | 
			
		||||
    logger.debug("register {} to event bus, async = {}", object, async);
 | 
			
		||||
 | 
			
		||||
    if (async)
 | 
			
		||||
    {
 | 
			
		||||
      asyncEventBus.register(object);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      eventBus.register(object);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  public abstract void unregister(Object subscriber);
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * {@inheritDoc}
 | 
			
		||||
   * This method is the same as {@code register(subscriber, true)}.
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @param object
 | 
			
		||||
   * @param subscriber subscriber object
 | 
			
		||||
   */
 | 
			
		||||
  @Override
 | 
			
		||||
  public void unregister(Object object)
 | 
			
		||||
  public void register(Object subscriber)
 | 
			
		||||
  {
 | 
			
		||||
    logger.debug("unregister {} from event bus", object);
 | 
			
		||||
    unregister(asyncEventBus, object);
 | 
			
		||||
    unregister(eventBus, object);
 | 
			
		||||
    register(subscriber, true);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Unregisters the object from eventbus.
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @param bus event bus
 | 
			
		||||
   * @param object object to unregister
 | 
			
		||||
   */
 | 
			
		||||
  private void unregister(EventBus bus, Object object)
 | 
			
		||||
  {
 | 
			
		||||
    try
 | 
			
		||||
    {
 | 
			
		||||
      bus.unregister(object);
 | 
			
		||||
    }
 | 
			
		||||
    catch (IllegalArgumentException ex)
 | 
			
		||||
    {
 | 
			
		||||
      logger.trace("object {} was not registered at {}", object, bus);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //~--- fields ---------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
  /** asynchronous event bus */
 | 
			
		||||
  private AsyncEventBus asyncEventBus;
 | 
			
		||||
 | 
			
		||||
  /** synchronous event bus */
 | 
			
		||||
  private EventBus eventBus;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -34,7 +34,6 @@ package sonia.scm.event;
 | 
			
		||||
 | 
			
		||||
//~--- JDK imports ------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
import com.google.common.eventbus.EventBus;
 | 
			
		||||
import com.google.common.eventbus.Subscribe;
 | 
			
		||||
import java.lang.annotation.Documented;
 | 
			
		||||
import java.lang.annotation.ElementType;
 | 
			
		||||
@@ -47,7 +46,7 @@ import sonia.scm.EagerSingleton;
 | 
			
		||||
 * The subscriber annotation could be use to register listener classes to the 
 | 
			
		||||
 * {@link ScmEventBus}. A registered listener object can use the 
 | 
			
		||||
 * {@link Subscribe} annotation for methods to receive events, 
 | 
			
		||||
 * for more informations have a look at {@link EventBus}. The annotated object 
 | 
			
		||||
 * for more informations have a look at {@link ScmEventBus}. The annotated object 
 | 
			
		||||
 * is only bind to the {@link ScmEventBus}, if the the object is loaded from the
 | 
			
		||||
 * injection system of SCM-Manager. If your object is not loaded by the 
 | 
			
		||||
 * injection system you have to register your object by yourself with the 
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,6 @@ import java.lang.reflect.InvocationTargetException;
 | 
			
		||||
 * {@link EventBus} which is able to throw {@link EventBusException}.
 | 
			
		||||
 *
 | 
			
		||||
 * @author Sebastian Sdorra
 | 
			
		||||
 * @since 1.23
 | 
			
		||||
 */
 | 
			
		||||
public class ThrowingEventBus extends EventBus
 | 
			
		||||
{
 | 
			
		||||
@@ -252,7 +252,6 @@ public class ScmServletModule extends ServletModule
 | 
			
		||||
 | 
			
		||||
    // bind event api
 | 
			
		||||
    bind(ScmEventBus.class).toInstance(ScmEventBus.getInstance());
 | 
			
		||||
    bind(EventBus.class).toInstance(ScmEventBus.getInstance());
 | 
			
		||||
 | 
			
		||||
    // bind core
 | 
			
		||||
    bind(StoreFactory.class, JAXBStoreFactory.class);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										154
									
								
								scm-webapp/src/main/java/sonia/scm/event/GuavaScmEventBus.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								scm-webapp/src/main/java/sonia/scm/event/GuavaScmEventBus.java
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,154 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright (c) 2010, Sebastian Sdorra All rights reserved.
 | 
			
		||||
 *
 | 
			
		||||
 * Redistribution and use in source and binary forms, with or without
 | 
			
		||||
 * modification, 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. Neither the name of SCM-Manager;
 | 
			
		||||
 * nor the names of its contributors may be used to endorse or promote products
 | 
			
		||||
 * derived from this software without specific prior written permission.
 | 
			
		||||
 *
 | 
			
		||||
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | 
			
		||||
 * AND ANY EXPRESS 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 REGENTS OR CONTRIBUTORS BE LIABLE FOR
 | 
			
		||||
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 | 
			
		||||
 * DAMAGES (INCLUDING, 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.
 | 
			
		||||
 *
 | 
			
		||||
 * http://bitbucket.org/sdorra/scm-manager
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
package sonia.scm.event;
 | 
			
		||||
 | 
			
		||||
import com.google.common.eventbus.AsyncEventBus;
 | 
			
		||||
import com.google.common.eventbus.EventBus;
 | 
			
		||||
import com.google.common.eventbus.ThrowingEventBus;
 | 
			
		||||
import java.util.concurrent.Executors;
 | 
			
		||||
import org.apache.shiro.concurrent.SubjectAwareExecutorService;
 | 
			
		||||
import org.slf4j.Logger;
 | 
			
		||||
import org.slf4j.LoggerFactory;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 *
 | 
			
		||||
 * @author Sebastian Sdorra
 | 
			
		||||
 */
 | 
			
		||||
public class GuavaScmEventBus extends ScmEventBus
 | 
			
		||||
{
 | 
			
		||||
  
 | 
			
		||||
  /**
 | 
			
		||||
   * the logger for GuavaScmEventBus
 | 
			
		||||
   */
 | 
			
		||||
  private static final Logger logger = LoggerFactory.getLogger(
 | 
			
		||||
    GuavaScmEventBus.class);
 | 
			
		||||
  
 | 
			
		||||
  
 | 
			
		||||
  /**
 | 
			
		||||
   *  Constructs a new ScmEventBus
 | 
			
		||||
   *
 | 
			
		||||
   */
 | 
			
		||||
  public GuavaScmEventBus()
 | 
			
		||||
  {
 | 
			
		||||
    eventBus = new ThrowingEventBus();
 | 
			
		||||
    asyncEventBus = new AsyncEventBus(
 | 
			
		||||
      new SubjectAwareExecutorService(Executors.newCachedThreadPool()));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  /**
 | 
			
		||||
   * {@inheritDoc}
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @param event
 | 
			
		||||
   */
 | 
			
		||||
  @Override
 | 
			
		||||
  public void post(Object event)
 | 
			
		||||
  {
 | 
			
		||||
    logger.debug("post {} to event bus", event);
 | 
			
		||||
    asyncEventBus.post(event);
 | 
			
		||||
    eventBus.post(event);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * {@inheritDoc}
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @param object
 | 
			
		||||
   */
 | 
			
		||||
  @Override
 | 
			
		||||
  public void register(Object object)
 | 
			
		||||
  {
 | 
			
		||||
    register(object, true);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Registers a object to the eventbus.
 | 
			
		||||
   *
 | 
			
		||||
   * @param object object to register
 | 
			
		||||
   * @param async handle event asynchronously
 | 
			
		||||
   *
 | 
			
		||||
   * @see {@link #register(java.lang.Object)}
 | 
			
		||||
   */
 | 
			
		||||
  @Override
 | 
			
		||||
  public void register(Object object, boolean async)
 | 
			
		||||
  {
 | 
			
		||||
    logger.debug("register {} to event bus, async = {}", object, async);
 | 
			
		||||
 | 
			
		||||
    if (async)
 | 
			
		||||
    {
 | 
			
		||||
      asyncEventBus.register(object);
 | 
			
		||||
    }
 | 
			
		||||
    else
 | 
			
		||||
    {
 | 
			
		||||
      eventBus.register(object);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * {@inheritDoc}
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @param object
 | 
			
		||||
   */
 | 
			
		||||
  @Override
 | 
			
		||||
  public void unregister(Object object)
 | 
			
		||||
  {
 | 
			
		||||
    logger.debug("unregister {} from event bus", object);
 | 
			
		||||
    unregister(asyncEventBus, object);
 | 
			
		||||
    unregister(eventBus, object);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Unregisters the object from eventbus.
 | 
			
		||||
   *
 | 
			
		||||
   *
 | 
			
		||||
   * @param bus event bus
 | 
			
		||||
   * @param object object to unregister
 | 
			
		||||
   */
 | 
			
		||||
  private void unregister(EventBus bus, Object object)
 | 
			
		||||
  {
 | 
			
		||||
    try
 | 
			
		||||
    {
 | 
			
		||||
      bus.unregister(object);
 | 
			
		||||
    }
 | 
			
		||||
    catch (IllegalArgumentException ex)
 | 
			
		||||
    {
 | 
			
		||||
      logger.trace("object {} was not registered at {}", object, bus);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //~--- fields ---------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
  /** asynchronous event bus */
 | 
			
		||||
  private AsyncEventBus asyncEventBus;
 | 
			
		||||
 | 
			
		||||
  /** synchronous event bus */
 | 
			
		||||
  private EventBus eventBus;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1 @@
 | 
			
		||||
sonia.scm.event.GuavaScmEventBus
 | 
			
		||||
		Reference in New Issue
	
	Block a user