1   package com.atlassian.user.impl.delegation;
2   
3   import com.atlassian.user.Group;
4   import com.atlassian.user.GroupManager;
5   import com.atlassian.user.User;
6   import com.atlassian.user.UserManager;
7   import com.atlassian.user.generic.AbstractTestExternalGroupManager;
8   
9   import java.util.Arrays;
10  import java.util.Iterator;
11  
12  /**
13   * Tests the rather unusual combination of running Hibernate and OSUser in a delegation chain.
14   * Both repositories are read-write, so testing this combination shows off some interesting
15   * quirks in the delegating repository mechanism.
16   * <p/>
17   * This configuration is used in Confluence for migrating from OSUser to Hibernate.
18   */
19  public class TestDelegatingGroupManagerWithHibernateAndOSUser extends AbstractTestExternalGroupManager
20  {
21      private GroupManager osuGroupManager;
22      private UserManager osuUserManager;
23      private GroupManager hibernateGroupManager;
24      private UserManager hibernateUserManager;
25      private GroupManager delegatingGroupManager;
26      private UserManager delegatingUserManager;
27  
28      protected String[] getConfigLocations()
29      {
30          return new String[]{
31              "classpath:com/atlassian/user/impl/osuser/osuserTestContext.xml",
32              "classpath:com/atlassian/user/impl/hibernate/hibernateTestContext.xml",
33              "classpath:com/atlassian/user/dataSourceTestContext.xml"
34          };
35      }
36  
37      public void setOsuGroupManager(GroupManager osuGroupManager)
38      {
39          this.osuGroupManager = osuGroupManager;
40      }
41  
42      public void setOsuUserManager(UserManager osuUserManager)
43      {
44          this.osuUserManager = osuUserManager;
45      }
46  
47      public void setHibernateGroupManager(GroupManager hibernateGroupManager)
48      {
49          this.hibernateGroupManager = hibernateGroupManager;
50      }
51  
52      public void setHibernateUserManager(UserManager hibernateUserManager)
53      {
54          this.hibernateUserManager = hibernateUserManager;
55      }
56  
57      public void onSetUp() throws Exception
58      {
59          super.onSetUp();
60          delegatingGroupManager = new DelegatingGroupManager(Arrays.asList(new GroupManager[]{
61              osuGroupManager,
62              hibernateGroupManager,
63          }));
64          delegatingUserManager = new DelegatingUserManager(Arrays.asList(new UserManager[]{
65              osuUserManager,
66              hibernateUserManager,
67          }));
68      }
69  
70      protected void onTearDown() throws Exception
71      {
72          for (Iterator i = osuGroupManager.getGroups().iterator(); i.hasNext();)
73          {
74              Group group = (Group) i.next();
75              osuGroupManager.removeGroup(group);
76          }
77          for (Iterator i = osuUserManager.getUsers().iterator(); i.hasNext();)
78          {
79              User user = (User) i.next();
80              osuUserManager.removeUser(user);
81          }
82  
83          super.onTearDown();
84      }
85  
86      protected UserManager getUserManager()
87      {
88          return delegatingUserManager;
89      }
90  
91      protected GroupManager getGroupManager()
92      {
93          return delegatingGroupManager;
94      }
95  
96      protected GroupManager getExternalGroupManager()
97      {
98          return hibernateGroupManager;
99      }
100 
101     public void testCreateGroupUsesFirstWritableRepository() throws Exception
102     {
103         assertTrue(osuGroupManager.isCreative());
104         assertTrue(hibernateGroupManager.isCreative());
105 
106         Group group = getGroupManager().createGroup("group");
107 
108         assertEquals(group, osuGroupManager.getGroup("group"));
109         assertNull(hibernateGroupManager.getGroup("group"));
110     }
111 
112     public void testGetGroupScansAllRepositories() throws Exception
113     {
114         Group group = hibernateGroupManager.createGroup("group");
115 
116         assertNull(osuGroupManager.getGroup("group"));
117         assertEquals(group, hibernateGroupManager.getGroup("group"));
118         assertEquals(group, delegatingGroupManager.getGroup("group"));
119     }
120 }