improve modification handler events by sending old and new items to eventbus

This commit is contained in:
Sebastian Sdorra
2014-01-11 13:45:23 +01:00
parent 23d2c1f27c
commit c3100f420c
17 changed files with 361 additions and 252 deletions

View File

@@ -0,0 +1,187 @@
/**
* 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;
//~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Objects;
import sonia.scm.HandlerEventType;
/**
* Abstract base class for {@link HandlerEvent}.
*
* @author Sebastian Sdorra
* @since 2.0.0
*
* @param <T>
*/
public class AbstractHandlerEvent<T> implements HandlerEvent<T>
{
/**
* Constructs ...
*
*
* @param eventType
* @param item
*/
public AbstractHandlerEvent(HandlerEventType eventType, T item)
{
this(eventType, item, null);
}
/**
* Constructs ...
*
*
* @param eventType
* @param item
* @param oldItem
*/
public AbstractHandlerEvent(HandlerEventType eventType, T item, T oldItem)
{
this.eventType = eventType;
this.item = item;
this.oldItem = oldItem;
}
//~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param obj
*
* @return
*/
@Override
public boolean equals(Object obj)
{
if (obj == null)
{
return false;
}
if (getClass() != obj.getClass())
{
return false;
}
final AbstractHandlerEvent<?> other = (AbstractHandlerEvent<?>) obj;
return Objects.equal(eventType, other.eventType)
&& Objects.equal(item, other.item)
&& Objects.equal(oldItem, other.oldItem);
}
/**
* Method description
*
*
* @return
*/
@Override
public int hashCode()
{
return Objects.hashCode(eventType, item, oldItem);
}
/**
* Method description
*
*
* @return
*/
@Override
public String toString()
{
//J-
return Objects.toStringHelper(this)
.add("eventType", eventType)
.add("item", item)
.add("oldItem", oldItem)
.toString();
//J+
}
//~--- get methods ----------------------------------------------------------
/**
* Returns the type of the event.
*
*
* @return type of the event
*/
@Override
public HandlerEventType getEventType()
{
return eventType;
}
/**
* Returns changed item.
*
*
* @return changed item
*/
@Override
public T getItem()
{
return item;
}
/**
* Returns old item or null. This method will always return null expect of
* modification events.
*
*
* @return old item or null
*/
@Override
public T getOldItem()
{
return oldItem;
}
//~--- fields ---------------------------------------------------------------
/** event type */
private final HandlerEventType eventType;
/** changed item */
private final T item;
/** old item */
private final T oldItem;
}

View File

@@ -63,4 +63,15 @@ public interface HandlerEvent<T>
* @return changed item * @return changed item
*/ */
public T getItem(); public T getItem();
/**
* Returns old item or null. This method returns always expect for
* modification events.
*
*
* @return old item or null
*
* @since 2.0.0
*/
public T getOldItem();
} }

View File

@@ -38,8 +38,6 @@ package sonia.scm.group;
import sonia.scm.HandlerEventType; import sonia.scm.HandlerEventType;
import sonia.scm.event.ScmEventBus; import sonia.scm.event.ScmEventBus;
//~--- JDK imports ------------------------------------------------------------
/** /**
* Abstract base class for {@link GroupManager} implementations. This class * Abstract base class for {@link GroupManager} implementations. This class
* implements the listener methods of the {@link GroupManager} interface. * implements the listener methods of the {@link GroupManager} interface.
@@ -52,11 +50,23 @@ public abstract class AbstractGroupManager implements GroupManager
/** /**
* Send a {@link GroupEvent} to the {@link ScmEventBus}. * Send a {@link GroupEvent} to the {@link ScmEventBus}.
* *
* @param group group that has changed
* @param event type of change event * @param event type of change event
* @param group group that has changed
*/ */
protected void fireEvent(Group group, HandlerEventType event) protected void fireEvent(HandlerEventType event, Group group)
{ {
ScmEventBus.getInstance().post(new GroupEvent(group, event)); ScmEventBus.getInstance().post(new GroupEvent(event, group));
}
/**
* Send a {@link GroupEvent} to the {@link ScmEventBus}.
*
* @param event type of change event
* @param group group that has changed
* @param oldGroup old group
*/
protected void fireEvent(HandlerEventType event, Group group, Group oldGroup)
{
ScmEventBus.getInstance().post(new GroupEvent(event, group, oldGroup));
} }
} }

View File

@@ -35,11 +35,10 @@ package sonia.scm.group;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Objects;
import sonia.scm.HandlerEventType; import sonia.scm.HandlerEventType;
import sonia.scm.event.AbstractHandlerEvent;
import sonia.scm.event.Event; import sonia.scm.event.Event;
import sonia.scm.event.HandlerEvent;
/** /**
* The GroupEvent is fired if a group object changes. * The GroupEvent is fired if a group object changes.
@@ -48,72 +47,31 @@ import sonia.scm.event.HandlerEvent;
* @since 1.23 * @since 1.23
*/ */
@Event @Event
public final class GroupEvent implements HandlerEvent<Group> public final class GroupEvent extends AbstractHandlerEvent<Group>
{ {
/** /**
* Constructs new group event * Constructs a new group event.
* *
* *
* @param group changed group
* @param eventType type of the event * @param eventType type of the event
* @param group changed group
*/ */
public GroupEvent(Group group, HandlerEventType eventType) public GroupEvent(HandlerEventType eventType, Group group)
{ {
this.group = group; super(eventType, group);
this.eventType = eventType;
}
//~--- methods --------------------------------------------------------------
/**
* {@inheritDoc}
*
*
* @return
*/
@Override
public String toString()
{
//J-
return Objects.toStringHelper(this)
.add("eventType", eventType)
.add("group", group)
.toString();
//J+
}
//~--- get methods ----------------------------------------------------------
/**
* {@inheritDoc}
*
*
* @return
*/
@Override
public HandlerEventType getEventType()
{
return eventType;
} }
/** /**
* {@inheritDoc} * Constructs a new group event.
* *
* *
* @return * @param eventType type of the event
* @param group changed group
* @param oldGroup old group
*/ */
@Override public GroupEvent(HandlerEventType eventType, Group group, Group oldGroup)
public Group getItem()
{ {
return group; super(eventType, group, oldGroup);
} }
//~--- fields ---------------------------------------------------------------
/** event type */
private final HandlerEventType eventType;
/** changed group */
private final Group group;
} }

View File

@@ -67,6 +67,7 @@ public abstract class AbstractRepositoryManager implements RepositoryManager
* *
* @param event event to be fired * @param event event to be fired
*/ */
@Override
public void fireHookEvent(RepositoryHookEvent event) public void fireHookEvent(RepositoryHookEvent event)
{ {
AssertUtil.assertIsNotNull(event); AssertUtil.assertIsNotNull(event);
@@ -83,12 +84,26 @@ public abstract class AbstractRepositoryManager implements RepositoryManager
/** /**
* Send a {@link RepositoryEvent} to the {@link ScmEventBus}. * Send a {@link RepositoryEvent} to the {@link ScmEventBus}.
* *
* @param repository repository that has changed
* @param event type of change event * @param event type of change event
* @param repository repository that has changed
* @param oldRepository old repository
*/ */
protected void fireEvent(Repository repository, HandlerEventType event) protected void fireEvent(HandlerEventType event, Repository repository,
Repository oldRepository)
{ {
ScmEventBus.getInstance().post(new RepositoryEvent(repository, event)); ScmEventBus.getInstance().post(new RepositoryEvent(event, repository,
oldRepository));
}
/**
* Send a {@link RepositoryEvent} to the {@link ScmEventBus}.
*
* @param event type of change event
* @param repository repository that has changed
*/
protected void fireEvent(HandlerEventType event, Repository repository)
{
ScmEventBus.getInstance().post(new RepositoryEvent(event, repository));
} }
/** /**

View File

@@ -30,6 +30,7 @@
*/ */
package sonia.scm.repository; package sonia.scm.repository;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
@@ -37,6 +38,7 @@ package sonia.scm.repository;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import sonia.scm.HandlerEventType; import sonia.scm.HandlerEventType;
import sonia.scm.event.AbstractHandlerEvent;
import sonia.scm.event.Event; import sonia.scm.event.Event;
import sonia.scm.event.HandlerEvent; import sonia.scm.event.HandlerEvent;
@@ -47,72 +49,32 @@ import sonia.scm.event.HandlerEvent;
* @since 1.23 * @since 1.23
*/ */
@Event @Event
public final class RepositoryEvent implements HandlerEvent<Repository> public final class RepositoryEvent extends AbstractHandlerEvent<Repository>
{ {
/** /**
* Constructs new repository event * Constructs a new repository event.
* *
* *
* @param repository changed repository
* @param eventType type of the event * @param eventType type of the event
* @param repository changed repository
*/ */
public RepositoryEvent(Repository repository, HandlerEventType eventType) public RepositoryEvent(HandlerEventType eventType, Repository repository)
{ {
this.repository = repository; super(eventType, repository);
this.eventType = eventType;
}
//~--- methods --------------------------------------------------------------
/**
* {@inheritDoc}
*
*
* @return
*/
@Override
public String toString()
{
//J-
return Objects.toStringHelper(this)
.add("eventType", eventType)
.add("repository", repository)
.toString();
//J+
}
//~--- get methods ----------------------------------------------------------
/**
* {@inheritDoc}
*
*
* @return
*/
@Override
public HandlerEventType getEventType()
{
return eventType;
} }
/** /**
* {@inheritDoc} * Constructs a new repository event.
* *
* *
* @return * @param eventType type of the event
* @param repository changed repository
* @param oldRepository old repository
*/ */
@Override public RepositoryEvent(HandlerEventType eventType, Repository repository,
public Repository getItem() Repository oldRepository)
{ {
return repository; super(eventType, repository, oldRepository);
} }
//~--- fields ---------------------------------------------------------------
/** event type */
private final HandlerEventType eventType;
/** changed repository */
private final Repository repository;
} }

View File

@@ -38,9 +38,6 @@ package sonia.scm.user;
import sonia.scm.HandlerEventType; import sonia.scm.HandlerEventType;
import sonia.scm.event.ScmEventBus; import sonia.scm.event.ScmEventBus;
//~--- JDK imports ------------------------------------------------------------
/** /**
* Abstract base class for {@link UserManager} implementations. This class * Abstract base class for {@link UserManager} implementations. This class
* implements the listener methods of the {@link UserManager} interface. * implements the listener methods of the {@link UserManager} interface.
@@ -50,14 +47,26 @@ import sonia.scm.event.ScmEventBus;
public abstract class AbstractUserManager implements UserManager public abstract class AbstractUserManager implements UserManager
{ {
/**
* Send a {@link UserEvent} to the {@link ScmEventBus}.
*
* @param event type of change event
* @param user user that has changed
* @param oldUser old user
*/
protected void fireEvent(HandlerEventType event, User user, User oldUser)
{
ScmEventBus.getInstance().post(new UserEvent(event, user, oldUser));
}
/** /**
* Send a {@link UserEvent} to the {@link ScmEventBus}. * Send a {@link UserEvent} to the {@link ScmEventBus}.
* *
* @param user user that has changed * @param user user that has changed
* @param event type of change event * @param event type of change event
*/ */
protected void fireEvent(User user, HandlerEventType event) protected void fireEvent(HandlerEventType event, User user)
{ {
ScmEventBus.getInstance().post(new UserEvent(user, event)); ScmEventBus.getInstance().post(new UserEvent(event, user));
} }
} }

View File

@@ -30,15 +30,14 @@
*/ */
package sonia.scm.user; package sonia.scm.user;
//~--- non-JDK imports -------------------------------------------------------- //~--- non-JDK imports --------------------------------------------------------
import com.google.common.base.Objects;
import sonia.scm.HandlerEventType; import sonia.scm.HandlerEventType;
import sonia.scm.event.AbstractHandlerEvent;
import sonia.scm.event.Event; import sonia.scm.event.Event;
import sonia.scm.event.HandlerEvent;
/** /**
* The UserEvent is fired if a user object changes. * The UserEvent is fired if a user object changes.
@@ -47,72 +46,31 @@ import sonia.scm.event.HandlerEvent;
* @since 1.23 * @since 1.23
*/ */
@Event @Event
public final class UserEvent implements HandlerEvent<User> public final class UserEvent extends AbstractHandlerEvent<User>
{ {
/** /**
* Constructs new UserEvent. * Constructs a new user event.
* *
* *
* @param eventType event type
* @param user changed user * @param user changed user
*/
public UserEvent(HandlerEventType eventType, User user)
{
super(eventType, user);
}
/**
* Constructs a new user event.
*
*
* @param eventType type of the event * @param eventType type of the event
* @param user changed user
* @param oldUser old user
*/ */
public UserEvent(User user, HandlerEventType eventType) public UserEvent(HandlerEventType eventType, User user, User oldUser)
{ {
this.user = user; super(eventType, user, oldUser);
this.eventType = eventType;
} }
//~--- methods --------------------------------------------------------------
/**
* {@inheritDoc}
*
*
* @return
*/
@Override
public String toString()
{
//J-
return Objects.toStringHelper(this)
.add("eventType", eventType)
.add("user", user)
.toString();
//J+
}
//~--- get methods ----------------------------------------------------------
/**
* {@inheritDoc}
*
*
* @return
*/
@Override
public HandlerEventType getEventType()
{
return eventType;
}
/**
* {@inheritDoc}
*
*
* @return
*/
@Override
public User getItem()
{
return user;
}
//~--- fields ---------------------------------------------------------------
/** type of the event */
private final HandlerEventType eventType;
/** changed user */
private final User user;
} }

View File

@@ -42,7 +42,7 @@ import org.apache.shiro.subject.Subject;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import sonia.scm.HandlerEvent; import sonia.scm.HandlerEventType;
import sonia.scm.Manager; import sonia.scm.Manager;
import sonia.scm.ManagerTestBase; import sonia.scm.ManagerTestBase;
import sonia.scm.event.ScmEventBus; import sonia.scm.event.ScmEventBus;
@@ -263,23 +263,23 @@ public abstract class RepositoryManagerTestBase
repoManager.create(repository); repoManager.create(repository);
assertRepositoriesEquals(repository, listener.preRepository); assertRepositoriesEquals(repository, listener.preRepository);
assertSame(HandlerEvent.BEFORE_CREATE, listener.preEvent); assertSame(HandlerEventType.BEFORE_CREATE, listener.preEvent);
assertRepositoriesEquals(repository, listener.postRepository); assertRepositoriesEquals(repository, listener.postRepository);
assertSame(HandlerEvent.CREATE, listener.postEvent); assertSame(HandlerEventType.CREATE, listener.postEvent);
repository.setDescription("changed description"); repository.setDescription("changed description");
repoManager.modify(repository); repoManager.modify(repository);
assertRepositoriesEquals(repository, listener.preRepository); assertRepositoriesEquals(repository, listener.preRepository);
assertSame(HandlerEvent.BEFORE_MODIFY, listener.preEvent); assertSame(HandlerEventType.BEFORE_MODIFY, listener.preEvent);
assertRepositoriesEquals(repository, listener.postRepository); assertRepositoriesEquals(repository, listener.postRepository);
assertSame(HandlerEvent.MODIFY, listener.postEvent); assertSame(HandlerEventType.MODIFY, listener.postEvent);
repoManager.delete(repository); repoManager.delete(repository);
assertRepositoriesEquals(repository, listener.preRepository); assertRepositoriesEquals(repository, listener.preRepository);
assertSame(HandlerEvent.BEFORE_DELETE, listener.preEvent); assertSame(HandlerEventType.BEFORE_DELETE, listener.preEvent);
assertRepositoriesEquals(repository, listener.postRepository); assertRepositoriesEquals(repository, listener.postRepository);
assertSame(HandlerEvent.DELETE, listener.postEvent); assertSame(HandlerEventType.DELETE, listener.postEvent);
} }
/** /**
@@ -574,13 +574,13 @@ public abstract class RepositoryManagerTestBase
//~--- fields ------------------------------------------------------------- //~--- fields -------------------------------------------------------------
/** Field description */ /** Field description */
private HandlerEvent postEvent; private HandlerEventType postEvent;
/** Field description */ /** Field description */
private Repository postRepository; private Repository postRepository;
/** Field description */ /** Field description */
private HandlerEvent preEvent; private HandlerEventType preEvent;
/** Field description */ /** Field description */
private Repository preRepository; private Repository preRepository;

View File

@@ -43,7 +43,7 @@ import com.google.inject.Singleton;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.HandlerEvent; import sonia.scm.HandlerEventType;
import sonia.scm.SCMContextProvider; import sonia.scm.SCMContextProvider;
import sonia.scm.TransformFilter; import sonia.scm.TransformFilter;
import sonia.scm.search.SearchRequest; import sonia.scm.search.SearchRequest;
@@ -138,9 +138,9 @@ public class DefaultGroupManager extends AbstractGroupManager
removeDuplicateMembers(group); removeDuplicateMembers(group);
group.setCreationDate(System.currentTimeMillis()); group.setCreationDate(System.currentTimeMillis());
fireEvent(group, HandlerEvent.BEFORE_CREATE); fireEvent(HandlerEventType.BEFORE_CREATE, group);
groupDAO.add(group); groupDAO.add(group);
fireEvent(group, HandlerEvent.CREATE); fireEvent(HandlerEventType.CREATE, group);
} }
/** /**
@@ -167,9 +167,9 @@ public class DefaultGroupManager extends AbstractGroupManager
if (groupDAO.contains(name)) if (groupDAO.contains(name))
{ {
fireEvent(group, HandlerEvent.BEFORE_DELETE); fireEvent(HandlerEventType.BEFORE_DELETE, group);
groupDAO.delete(group); groupDAO.delete(group);
fireEvent(group, HandlerEvent.DELETE); fireEvent(HandlerEventType.DELETE, group);
} }
else else
{ {
@@ -184,9 +184,7 @@ public class DefaultGroupManager extends AbstractGroupManager
* @param context * @param context
*/ */
@Override @Override
public void init(SCMContextProvider context) public void init(SCMContextProvider context) {}
{
}
/** /**
* Method description * Method description
@@ -210,13 +208,15 @@ public class DefaultGroupManager extends AbstractGroupManager
String name = group.getName(); String name = group.getName();
if (groupDAO.contains(name)) Group oldGroup = groupDAO.get(name);
if (oldGroup != null)
{ {
removeDuplicateMembers(group); removeDuplicateMembers(group);
group.setLastModified(System.currentTimeMillis()); group.setLastModified(System.currentTimeMillis());
fireEvent(group, HandlerEvent.BEFORE_MODIFY); fireEvent(HandlerEventType.BEFORE_MODIFY, group, oldGroup);
groupDAO.modify(group); groupDAO.modify(group);
fireEvent(group, HandlerEvent.MODIFY); fireEvent(HandlerEventType.MODIFY, group, oldGroup);
} }
else else
{ {

View File

@@ -50,7 +50,7 @@ import org.slf4j.LoggerFactory;
import sonia.scm.ArgumentIsInvalidException; import sonia.scm.ArgumentIsInvalidException;
import sonia.scm.ConfigurationException; import sonia.scm.ConfigurationException;
import sonia.scm.HandlerEvent; import sonia.scm.HandlerEventType;
import sonia.scm.SCMContextProvider; import sonia.scm.SCMContextProvider;
import sonia.scm.Type; import sonia.scm.Type;
import sonia.scm.config.ScmConfiguration; import sonia.scm.config.ScmConfiguration;
@@ -105,7 +105,6 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
* @param keyGenerator * @param keyGenerator
* @param repositoryDAO * @param repositoryDAO
* @param handlerSet * @param handlerSet
* @param preProcessorUtil
*/ */
@Inject @Inject
public DefaultRepositoryManager(ScmConfiguration configuration, public DefaultRepositoryManager(ScmConfiguration configuration,
@@ -187,9 +186,9 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
getHandler(repository).create(repository); getHandler(repository).create(repository);
} }
fireEvent(repository, HandlerEvent.BEFORE_CREATE); fireEvent(HandlerEventType.BEFORE_CREATE, repository);
repositoryDAO.add(repository); repositoryDAO.add(repository);
fireEvent(repository, HandlerEvent.CREATE); fireEvent(HandlerEventType.CREATE, repository);
} }
/** /**
@@ -237,19 +236,18 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
if (repositoryDAO.contains(repository)) if (repositoryDAO.contains(repository))
{ {
fireEvent(repository, HandlerEvent.BEFORE_DELETE); fireEvent(HandlerEventType.BEFORE_DELETE, repository);
getHandler(repository).delete(repository); getHandler(repository).delete(repository);
repositoryDAO.delete(repository); repositoryDAO.delete(repository);
fireEvent(HandlerEventType.DELETE, repository);
} }
else else
{ {
throw new RepositoryNotFoundException( throw new RepositoryNotFoundException(
"repository ".concat(repository.getName()).concat(" not found")); "repository ".concat(repository.getName()).concat(" not found"));
} }
fireEvent(repository, HandlerEvent.DELETE);
} }
/** /**
* Method description * Method description
* *
@@ -273,9 +271,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
* @param context * @param context
*/ */
@Override @Override
public void init(SCMContextProvider context) public void init(SCMContextProvider context) {}
{
}
/** /**
* Method description * Method description
@@ -298,24 +294,23 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
AssertUtil.assertIsValid(repository); AssertUtil.assertIsValid(repository);
Repository notModifiedRepository = repositoryDAO.get(repository.getType(), Repository oldRepository = repositoryDAO.get(repository.getType(),
repository.getName()); repository.getName());
if (notModifiedRepository != null) if (oldRepository != null)
{ {
assertIsOwner(notModifiedRepository); assertIsOwner(oldRepository);
fireEvent(repository, HandlerEvent.BEFORE_MODIFY); fireEvent(HandlerEventType.BEFORE_MODIFY, repository, oldRepository);
repository.setLastModified(System.currentTimeMillis()); repository.setLastModified(System.currentTimeMillis());
getHandler(repository).modify(repository); getHandler(repository).modify(repository);
repositoryDAO.modify(repository); repositoryDAO.modify(repository);
fireEvent(HandlerEventType.MODIFY, repository, oldRepository);
} }
else else
{ {
throw new RepositoryNotFoundException( throw new RepositoryNotFoundException(
"repository ".concat(repository.getName()).concat(" not found")); "repository ".concat(repository.getName()).concat(" not found"));
} }
fireEvent(repository, HandlerEvent.MODIFY);
} }
/** /**
@@ -511,7 +506,7 @@ public class DefaultRepositoryManager extends AbstractRepositoryManager
return validTypes; return validTypes;
} }
/** /**
* Method description * Method description
* *

View File

@@ -48,7 +48,7 @@ import org.apache.shiro.SecurityUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.HandlerEvent; import sonia.scm.HandlerEventType;
import sonia.scm.event.ScmEventBus; import sonia.scm.event.ScmEventBus;
import sonia.scm.group.GroupEvent; import sonia.scm.group.GroupEvent;
import sonia.scm.store.ConfigurationEntryStore; import sonia.scm.store.ConfigurationEntryStore;
@@ -132,7 +132,7 @@ public class DefaultSecuritySystem implements SecuritySystem
//J- //J-
ScmEventBus.getInstance().post( ScmEventBus.getInstance().post(
new StoredAssignedPermissionEvent(HandlerEvent.CREATE, sap) new StoredAssignedPermissionEvent(HandlerEventType.CREATE, sap)
); );
//J+ //J+
@@ -152,7 +152,7 @@ public class DefaultSecuritySystem implements SecuritySystem
store.remove(permission.getId()); store.remove(permission.getId());
//J- //J-
ScmEventBus.getInstance().post( ScmEventBus.getInstance().post(
new StoredAssignedPermissionEvent(HandlerEvent.CREATE, permission) new StoredAssignedPermissionEvent(HandlerEventType.CREATE, permission)
); );
//J+ //J+
} }
@@ -185,7 +185,7 @@ public class DefaultSecuritySystem implements SecuritySystem
@Subscribe @Subscribe
public void handleEvent(final UserEvent event) public void handleEvent(final UserEvent event)
{ {
if (event.getEventType() == HandlerEvent.DELETE) if (event.getEventType() == HandlerEventType.DELETE)
{ {
deletePermissions(new Predicate<AssignedPermission>() deletePermissions(new Predicate<AssignedPermission>()
{ {
@@ -209,7 +209,7 @@ public class DefaultSecuritySystem implements SecuritySystem
@Subscribe @Subscribe
public void handleEvent(final GroupEvent event) public void handleEvent(final GroupEvent event)
{ {
if (event.getEventType() == HandlerEvent.DELETE) if (event.getEventType() == HandlerEventType.DELETE)
{ {
deletePermissions(new Predicate<AssignedPermission>() deletePermissions(new Predicate<AssignedPermission>()
{ {
@@ -243,7 +243,7 @@ public class DefaultSecuritySystem implements SecuritySystem
//J- //J-
ScmEventBus.getInstance().post( ScmEventBus.getInstance().post(
new StoredAssignedPermissionEvent(HandlerEvent.CREATE, permission) new StoredAssignedPermissionEvent(HandlerEventType.CREATE, permission)
); );
//J+ //J+
} }

View File

@@ -58,7 +58,7 @@ import org.apache.shiro.subject.SimplePrincipalCollection;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.HandlerEvent; import sonia.scm.HandlerEventType;
import sonia.scm.config.ScmConfiguration; import sonia.scm.config.ScmConfiguration;
import sonia.scm.group.Group; import sonia.scm.group.Group;
import sonia.scm.group.GroupManager; import sonia.scm.group.GroupManager;
@@ -121,9 +121,8 @@ public class ScmRealm extends AuthorizingRealm
*/ */
@Inject @Inject
public ScmRealm(ScmConfiguration configuration, public ScmRealm(ScmConfiguration configuration,
LoginAttemptHandler loginAttemptHandler, LoginAttemptHandler loginAttemptHandler, AuthorizationCollector collector,
AuthorizationCollector collector,UserManager userManager, UserManager userManager, GroupManager groupManager, UserDAO userDAO,
GroupManager groupManager, UserDAO userDAO,
AuthenticationManager authenticator, RepositoryManager manager, AuthenticationManager authenticator, RepositoryManager manager,
Provider<HttpServletRequest> requestProvider, Provider<HttpServletRequest> requestProvider,
Provider<HttpServletResponse> responseProvider) Provider<HttpServletResponse> responseProvider)
@@ -149,8 +148,6 @@ public class ScmRealm extends AuthorizingRealm
// set components // set components
setPermissionResolver(new RepositoryPermissionResolver()); setPermissionResolver(new RepositoryPermissionResolver());
} }
private final LoginAttemptHandler loginAttemptHandler;
//~--- methods -------------------------------------------------------------- //~--- methods --------------------------------------------------------------
@@ -174,7 +171,7 @@ public class ScmRealm extends AuthorizingRealm
{ {
throw new UnsupportedTokenException("ScmAuthenticationToken is required"); throw new UnsupportedTokenException("ScmAuthenticationToken is required");
} }
loginAttemptHandler.beforeAuthentication(authToken); loginAttemptHandler.beforeAuthentication(authToken);
UsernamePasswordToken token = (UsernamePasswordToken) authToken; UsernamePasswordToken token = (UsernamePasswordToken) authToken;
@@ -198,6 +195,7 @@ public class ScmRealm extends AuthorizingRealm
else else
{ {
loginAttemptHandler.onUnsuccessfulAuthentication(authToken, result); loginAttemptHandler.onUnsuccessfulAuthentication(authToken, result);
throw new AccountException("authentication failed"); throw new AccountException("authentication failed");
} }
@@ -257,9 +255,10 @@ public class ScmRealm extends AuthorizingRealm
user.setCreationDate(System.currentTimeMillis()); user.setCreationDate(System.currentTimeMillis());
// TODO find a better way // TODO find a better way
UserEventHack.fireEvent(userManager, user, HandlerEvent.BEFORE_CREATE); UserEventHack.fireEvent(userManager, HandlerEventType.BEFORE_CREATE,
user);
userDAO.add(user); userDAO.add(user);
UserEventHack.fireEvent(userManager, user, HandlerEvent.CREATE); UserEventHack.fireEvent(userManager, HandlerEventType.CREATE, user);
} }
else if (logger.isErrorEnabled()) else if (logger.isErrorEnabled())
{ {
@@ -547,6 +546,9 @@ public class ScmRealm extends AuthorizingRealm
/** Field description */ /** Field description */
private final GroupManager groupManager; private final GroupManager groupManager;
/** Field description */
private final LoginAttemptHandler loginAttemptHandler;
/** Field description */ /** Field description */
private final Provider<HttpServletRequest> requestProvider; private final Provider<HttpServletRequest> requestProvider;

View File

@@ -44,7 +44,7 @@ import org.apache.shiro.subject.Subject;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.HandlerEvent; import sonia.scm.HandlerEventType;
import sonia.scm.SCMContextProvider; import sonia.scm.SCMContextProvider;
import sonia.scm.TransformFilter; import sonia.scm.TransformFilter;
import sonia.scm.search.SearchRequest; import sonia.scm.search.SearchRequest;
@@ -179,9 +179,9 @@ public class DefaultUserManager extends AbstractUserManager
AssertUtil.assertIsValid(user); AssertUtil.assertIsValid(user);
user.setCreationDate(System.currentTimeMillis()); user.setCreationDate(System.currentTimeMillis());
fireEvent(user, HandlerEvent.BEFORE_CREATE); fireEvent(HandlerEventType.BEFORE_CREATE, user);
userDAO.add(user); userDAO.add(user);
fireEvent(user, HandlerEvent.CREATE); fireEvent(HandlerEventType.CREATE, user);
} }
/** /**
@@ -207,9 +207,9 @@ public class DefaultUserManager extends AbstractUserManager
if (userDAO.contains(name)) if (userDAO.contains(name))
{ {
fireEvent(user, HandlerEvent.BEFORE_DELETE); fireEvent(HandlerEventType.BEFORE_DELETE, user);
userDAO.delete(user); userDAO.delete(user);
fireEvent(user, HandlerEvent.DELETE); fireEvent(HandlerEventType.DELETE, user);
} }
else else
{ {
@@ -267,14 +267,16 @@ public class DefaultUserManager extends AbstractUserManager
} }
String name = user.getName(); String name = user.getName();
User oldUser = userDAO.get(name);
if (userDAO.contains(name)) if (oldUser != null)
{ {
AssertUtil.assertIsValid(user); AssertUtil.assertIsValid(user);
user.setLastModified(System.currentTimeMillis()); user.setLastModified(System.currentTimeMillis());
fireEvent(user, HandlerEvent.BEFORE_MODIFY); fireEvent(HandlerEventType.BEFORE_MODIFY, user, oldUser);
userDAO.modify(user); userDAO.modify(user);
fireEvent(user, HandlerEvent.MODIFY); fireEvent(HandlerEventType.MODIFY, user, oldUser);
} }
else else
{ {

View File

@@ -38,7 +38,7 @@ package sonia.scm.user;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import sonia.scm.HandlerEvent; import sonia.scm.HandlerEventType;
/** /**
* *
@@ -71,15 +71,15 @@ public final class UserEventHack
* @param user * @param user
* @param event * @param event
*/ */
public static void fireEvent(UserManager userManager, User user, public static void fireEvent(UserManager userManager, HandlerEventType event,
HandlerEvent event) User user)
{ {
AbstractUserManager abstractUserManager = AbstractUserManager abstractUserManager =
getAbstractUserManager(userManager); getAbstractUserManager(userManager);
if (abstractUserManager != null) if (abstractUserManager != null)
{ {
abstractUserManager.fireEvent(user, event); abstractUserManager.fireEvent(event, user);
} }
else if (logger.isWarnEnabled()) else if (logger.isWarnEnabled())
{ {

View File

@@ -44,7 +44,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import sonia.scm.AbstractTestBase; import sonia.scm.AbstractTestBase;
import sonia.scm.HandlerEvent; import sonia.scm.HandlerEventType;
import sonia.scm.user.User; import sonia.scm.user.User;
import sonia.scm.user.UserEvent; import sonia.scm.user.UserEvent;
@@ -101,7 +101,7 @@ public class GuavaScmEventBusTest extends AbstractTestBase
} }
}); });
eventBus.post(new UserEvent(new User("test"), HandlerEvent.CREATE)); eventBus.post(new UserEvent(HandlerEventType.CREATE, new User("test")));
assertNotEquals(thread, currentThread); assertNotEquals(thread, currentThread);
} }

View File

@@ -41,7 +41,7 @@ import org.mockito.InOrder;
import org.mockito.Mock; import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner; import org.mockito.runners.MockitoJUnitRunner;
import sonia.scm.HandlerEvent; import sonia.scm.HandlerEventType;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
@@ -118,7 +118,7 @@ public class UserEventHackTest
*/ */
private void fireEvent(UserManager u) private void fireEvent(UserManager u)
{ {
UserEventHack.fireEvent(u, new User(), HandlerEvent.CREATE); UserEventHack.fireEvent(u, HandlerEventType.CREATE, new User());
} }
/** /**
@@ -129,8 +129,8 @@ public class UserEventHackTest
*/ */
private void verify(int count) private void verify(int count)
{ {
verifier.verify(userManager, calls(count)).fireEvent(any(User.class), verifier.verify(userManager,
any(HandlerEvent.class)); calls(count)).fireEvent(any(HandlerEventType.class), any(User.class));
} }
//~--- fields --------------------------------------------------------------- //~--- fields ---------------------------------------------------------------