diff --git a/scm-core/src/main/java/sonia/scm/group/GroupManagerDecorator.java b/scm-core/src/main/java/sonia/scm/group/GroupManagerDecorator.java index ab9b22990f..ea5649b7aa 100644 --- a/scm-core/src/main/java/sonia/scm/group/GroupManagerDecorator.java +++ b/scm-core/src/main/java/sonia/scm/group/GroupManagerDecorator.java @@ -30,6 +30,7 @@ */ + package sonia.scm.group; //~--- non-JDK imports -------------------------------------------------------- @@ -117,6 +118,19 @@ public class GroupManagerDecorator //~--- get methods ---------------------------------------------------------- + /** + * Returns the decorated {@link GroupManager}. + * + * + * @return decorated {@link GroupManager} + * + * @since 1.34 + */ + public GroupManager getDecorated() + { + return decorated; + } + /** * {@inheritDoc} * diff --git a/scm-core/src/main/java/sonia/scm/repository/RepositoryManagerDecorator.java b/scm-core/src/main/java/sonia/scm/repository/RepositoryManagerDecorator.java index 73b086c0b0..5493783c0b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/RepositoryManagerDecorator.java +++ b/scm-core/src/main/java/sonia/scm/repository/RepositoryManagerDecorator.java @@ -30,12 +30,14 @@ */ + package sonia.scm.repository; //~--- non-JDK imports -------------------------------------------------------- import sonia.scm.ManagerDecorator; import sonia.scm.Type; +import sonia.scm.group.GroupManager; //~--- JDK imports ------------------------------------------------------------ @@ -267,6 +269,19 @@ public class RepositoryManagerDecorator return decorated.getConfiguredTypes(); } + /** + * Returns the decorated {@link RepositoryManager}. + * + * + * @return decorated {@link RepositoryManager} + * + * @since 1.34 + */ + public RepositoryManager getDecorated() + { + return decorated; + } + /** * {@inheritDoc} * diff --git a/scm-core/src/main/java/sonia/scm/user/UserManagerDecorator.java b/scm-core/src/main/java/sonia/scm/user/UserManagerDecorator.java index 76957dd9d6..a84aebba1b 100644 --- a/scm-core/src/main/java/sonia/scm/user/UserManagerDecorator.java +++ b/scm-core/src/main/java/sonia/scm/user/UserManagerDecorator.java @@ -30,6 +30,7 @@ */ + package sonia.scm.user; //~--- non-JDK imports -------------------------------------------------------- @@ -131,6 +132,19 @@ public class UserManagerDecorator extends ManagerDecorator //~--- get methods ---------------------------------------------------------- + /** + * Returns the decorated {@link UserManager}. + * + * + * @return decorated {@link UserManager} + * + * @since 1.34 + */ + public UserManager getDecorated() + { + return decorated; + } + /** * {@inheritDoc} * diff --git a/scm-webapp/src/main/java/sonia/scm/user/UserEventHack.java b/scm-webapp/src/main/java/sonia/scm/user/UserEventHack.java index ade5d3a26d..e3194db449 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/UserEventHack.java +++ b/scm-webapp/src/main/java/sonia/scm/user/UserEventHack.java @@ -74,13 +74,44 @@ public final class UserEventHack public static void fireEvent(UserManager userManager, User user, HandlerEvent event) { - if (userManager instanceof AbstractUserManager) + AbstractUserManager abstractUserManager = + getAbstractUserManager(userManager); + + if (abstractUserManager != null) { - ((AbstractUserManager) userManager).fireEvent(user, event); + abstractUserManager.fireEvent(user, event); } else if (logger.isWarnEnabled()) { logger.warn("user manager is not an instance of AbstractUserManager"); } } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param userManager + * + * @return + */ + private static AbstractUserManager getAbstractUserManager( + UserManager userManager) + { + AbstractUserManager abstractUserManager = null; + + if (userManager instanceof UserManagerDecorator) + { + abstractUserManager = getAbstractUserManager( + ((UserManagerDecorator) userManager).getDecorated()); + } + else if (userManager instanceof AbstractUserManager) + { + abstractUserManager = (AbstractUserManager) userManager; + } + + return abstractUserManager; + } } diff --git a/scm-webapp/src/test/java/sonia/scm/user/UserEventHackTest.java b/scm-webapp/src/test/java/sonia/scm/user/UserEventHackTest.java new file mode 100644 index 0000000000..3bda4439cf --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/user/UserEventHackTest.java @@ -0,0 +1,144 @@ +/** + * 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.user; + +//~--- non-JDK imports -------------------------------------------------------- + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.mockito.InOrder; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import sonia.scm.HandlerEvent; + +import static org.mockito.Mockito.*; + +/** + * + * @author Sebastian Sdorra + */ +@RunWith(MockitoJUnitRunner.class) +public class UserEventHackTest +{ + + /** + * Method description + * + */ + @Before + public void before() + { + verifier = inOrder(userManager); + } + + /** + * Method description + * + */ + @Test + public void testFireEvent() + { + fireEvent(userManager); + + verify(1); + } + + /** + * Method description + * + */ + @Test + public void testFireEventDecorated() + { + + UserManager u = new UserManagerDecorator(userManager); + + fireEvent(u); + + verify(1); + } + + /** + * Method description + * + */ + @Test + public void testFireEventMultiDecorated() + { + + UserManager u = new UserManagerDecorator(userManager); + + u = new UserManagerDecorator(u); + u = new UserManagerDecorator(u); + u = new UserManagerDecorator(u); + u = new UserManagerDecorator(u); + + fireEvent(u); + + verify(1); + } + + /** + * Method description + * + * + * @param u + */ + private void fireEvent(UserManager u) + { + UserEventHack.fireEvent(u, new User(), HandlerEvent.CREATE); + } + + /** + * Method description + * + * + * @param count + */ + private void verify(int count) + { + verifier.verify(userManager, calls(count)).fireEvent(any(User.class), + any(HandlerEvent.class)); + } + + //~--- fields --------------------------------------------------------------- + + /** Field description */ + @Mock + private AbstractUserManager userManager; + + /** Field description */ + private InOrder verifier; +}