Author: ivol37 at gmail.com
Date: Tue Feb 15 12:50:49 2011
New Revision: 785

Log:
[AMDATU-296] Separated config from FS UserAdmin implementation. Added 
integration test for FS UserAdmin and fixed issue AMDATU-241 which was still 
present in the FS implementation.

Added:
   
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageConfig.java
   
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageConfigImpl.java
   
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/UserAdminStoreTestBase.java
   
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminCassandraStoreTest.java
      - copied, changed from r784, 
/trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminStoreTest.java
   
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminFSStoreTest.java
Removed:
   
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminStoreTest.java
Modified:
   
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivator.java
   
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageProvider.java
   
trunk/amdatu-core/useradminstore-fs/src/test/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivatorTest.java
   
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/IntegrationTestBase.java

Modified: 
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivator.java
==============================================================================
--- 
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivator.java
   (original)
+++ 
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivator.java
   Tue Feb 15 12:50:49 2011
@@ -1,5 +1,4 @@
 /*
-/*
     Copyright (C) 2010 Amdatu.org
 
     This program is free software: you can redistribute it and/or modify
@@ -21,12 +20,15 @@
 import java.util.Hashtable;
 
 import org.amdatu.core.tenant.Tenant;
+import org.amdatu.core.useradminstore.fs.service.FSUserAdminStorageConfig;
+import org.amdatu.core.useradminstore.fs.service.FSUserAdminStorageConfigImpl;
 import org.amdatu.core.useradminstore.fs.service.FSUserAdminStorageProvider;
 import org.apache.felix.dm.DependencyActivatorBase;
 import org.apache.felix.dm.DependencyManager;
 import org.ops4j.pax.useradmin.service.spi.StorageProvider;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
+import org.osgi.service.cm.ManagedService;
 import org.osgi.service.log.LogService;
 
 /**
@@ -36,15 +38,21 @@
 
     @Override
     public void init(BundleContext context, DependencyManager manager) throws 
Exception {
-       // We register the FS tenant store as an adapter service for tenant, 
which makes it tenant aware.
-       // An instance of this store will be available for each tenant.
+        manager.add(
+            createComponent()
+            .setImplementation(FSUserAdminStorageConfigImpl.class)
+            .setInterface(new 
String[]{FSUserAdminStorageConfig.class.getName(), 
ManagedService.class.getName()}, null)
+            
.add(createConfigurationDependency().setPid(FSUserAdminStorageConfigImpl.CONFIGURATION_PID)));
+
+        // We register the FS tenant store as an adapter service for tenant, 
which makes it tenant aware.
+        // An instance of this store will be available for each tenant.
         Dictionary<String, Object> properties = new Hashtable<String, 
Object>();
         properties.put(Constants.SERVICE_RANKING, 0);
         manager.add(
             createAdapterService(Tenant.class, null)
             .setImplementation(FSUserAdminStorageProvider.class)
             .setInterface(StorageProvider.class.getName(), properties)
-            
.add(createConfigurationDependency().setPid(FSUserAdminStorageProvider.CONFIGURATION_PID))
+            
.add(createServiceDependency().setService(FSUserAdminStorageConfig.class).setRequired(true))
             
.add(createServiceDependency().setService(LogService.class).setRequired(false)));
     }
 

Added: 
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageConfig.java
==============================================================================
--- (empty file)
+++ 
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageConfig.java
   Tue Feb 15 12:50:49 2011
@@ -0,0 +1,30 @@
+/*
+    Copyright (C) 2010 Amdatu.org
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.amdatu.core.useradminstore.fs.service;
+
+/**
+ * Interface for the configuration of the FS User Admin storage provider 
service.
+ * 
+ * @author ivol
+ */
+public interface FSUserAdminStorageConfig {
+    /**
+     * Returns the directory name to store the persistent files in.
+     * @return the directory name.
+     */
+    String getDataDirectoryName();
+}

Added: 
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageConfigImpl.java
==============================================================================
--- (empty file)
+++ 
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageConfigImpl.java
       Tue Feb 15 12:50:49 2011
@@ -0,0 +1,51 @@
+/*
+    Copyright (C) 2010 Amdatu.org
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.amdatu.core.useradminstore.fs.service;
+
+import java.util.Dictionary;
+
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedService;
+
+/**
+ * This class manages the configuration of the FS User Admin storage provider. 
Note that the FSUserAdminStorageProvider
+ * cannot be a ManagedService itself, since it is also an adapter service for 
Tenant. A service cannot be both an
+ * adapter service and a managed service (see 
http://jira.amdatu.org/jira/browse/AMDATU-296).
+ * 
+ * @author ivol
+ */
+public class FSUserAdminStorageConfigImpl implements ManagedService, 
FSUserAdminStorageConfig {
+    // The PID and configuration properties
+    public static final String CONFIGURATION_PID = 
"org.amdatu.core.useradminstore-fs";
+    public final static String DATA_DIRECTORY = "datadir";
+
+    private String m_dataDirectoryName;
+
+    @SuppressWarnings("unchecked")
+    public void updated(Dictionary properties) throws ConfigurationException {
+        if (properties != null) {
+            m_dataDirectoryName = (String) properties.get(DATA_DIRECTORY);
+            if (m_dataDirectoryName == null || "".equals(m_dataDirectoryName)) 
{
+                throw new ConfigurationException(DATA_DIRECTORY, "Missing 
mandatory data directory configuration");
+            }
+        }
+    }
+
+    public String getDataDirectoryName() {
+        return m_dataDirectoryName;
+    }
+}

Modified: 
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageProvider.java
==============================================================================
--- 
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageProvider.java
 (original)
+++ 
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageProvider.java
 Tue Feb 15 12:50:49 2011
@@ -1,3 +1,19 @@
+/*
+    Copyright (C) 2010 Amdatu.org
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
 package org.amdatu.core.useradminstore.fs.service;
 
 import java.io.File;
@@ -25,7 +41,6 @@
 import org.osgi.framework.Filter;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.log.LogService;
 import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
@@ -36,17 +51,12 @@
  * This service is tenant aware.
  */
 public final class FSUserAdminStorageProvider implements StorageProvider {
-
-    // The PID and configuration properties
-    public static final String CONFIGURATION_PID = 
"org.amdatu.core.useradminstore-fs";
-    public final static String DATA_DIRECTORY = "datadir";
-
+    private volatile FSUserAdminStorageConfig m_config;
     private volatile LogService m_logService;
     private volatile Tenant m_tenant;
     private volatile Component m_component;
-    
+
     private FSRoleStorage m_storage;
-    private String m_dataDirectoryName;
 
     public FSUserAdminStorageProvider() throws StorageException {
     }
@@ -54,38 +64,30 @@
     public FSRoleStorage getFSStorage() {
         return m_storage;
     }
-    
+
     @SuppressWarnings("unchecked")
-       public void init() throws StorageException {
-        // Postfix tenantid to the data directory, making it tenant specific
-        // FIXME bad.. 
-        m_dataDirectoryName += "/" + m_tenant.getId();
-        
+    public void init() throws StorageException {
+        // Postfix tenantid to the data directory, making it tenant specific
+        // FIXME bad..
+        String dirName = m_config.getDataDirectoryName() + "/" + 
m_tenant.getId();
         Dictionary properties = m_component.getServiceProperties();
         properties.put(UserAdminConstants.STORAGEPROVIDER_TYPE, "FS_" + 
m_tenant.getId());
         properties.put(Tenant.TENANT_ID_SERVICEPROPERTY, m_tenant.getId());
         m_component.setServiceProperties(properties);
-        
-       File dataDirectory = new File(m_dataDirectoryName);
+
+        File dataDirectory = new File(dirName);
         setDataDirectory(dataDirectory);
     }
 
     public synchronized void start() throws StorageException {
-        if (m_logService != null)
+        if (m_logService != null) {
             m_logService.log(LogService.LOG_INFO, "Filesystem UserAdmin 
storage provider started for tenant '" + m_tenant.getId() + "'");
+        }
     }
 
     public synchronized void stop() {
-        if (m_logService != null)
+        if (m_logService != null) {
             m_logService.log(LogService.LOG_INFO, "Filesystem UserAdmin 
storage provider stopped for tenant '" + m_tenant.getId() + "'");
-    }
-
-    public synchronized void updated(Dictionary<String, Object> dictionary) 
throws ConfigurationException {
-        if (dictionary != null) {
-               m_dataDirectoryName = (String) dictionary.get(DATA_DIRECTORY);
-            if (m_dataDirectoryName == null || "".equals(m_dataDirectoryName)) 
{
-                throw new ConfigurationException(DATA_DIRECTORY, "Missing 
mandatory data directory configuration");
-            }
         }
     }
 
@@ -95,7 +97,7 @@
             dataDirectory = new File(userDirectory, dataDirectory.getPath());
         }
         if (!((dataDirectory.exists() && dataDirectory.canRead() && 
dataDirectory.canWrite()) || dataDirectory
-            .mkdirs())) {
+                        .mkdirs())) {
             throw new StorageException("Unable to access data directory: "
                 + dataDirectory.getAbsolutePath());
         }
@@ -105,9 +107,10 @@
         catch (IOException e) {
             throw new StorageException(e.getMessage());
         }
-        if (m_logService != null)
+        if (m_logService != null) {
             m_logService.log(LogService.LOG_DEBUG, "Datadirectory set to: "
                 + m_storage.getDataDirectory().getAbsolutePath());
+        }
     }
 
     /*
@@ -165,7 +168,7 @@
         try {
             FSRole internalRole = m_storage.getEntity(user.getName());
             if (internalRole != null && internalRole.getType() == Role.USER
-                                && ((FSUser) internalRole).getCredentials() != 
null) {
+                            && ((FSUser) internalRole).getCredentials() != 
null) {
                 ((FSUser) internalRole).setCredentials(null);
                 m_storage.addEntity(internalRole);
             }
@@ -176,7 +179,7 @@
     }
 
     public Group createGroup(final UserAdminFactory userAdminFactory, final 
String groupName)
-        throws StorageException {
+    throws StorageException {
         checkState();
         final Group group = userAdminFactory.createGroup(groupName, null, 
null);
         try {
@@ -189,7 +192,7 @@
     }
 
     public User createUser(final UserAdminFactory userAdminFactory, final 
String userName)
-        throws StorageException {
+    throws StorageException {
         checkState();
         final User user = userAdminFactory.createUser(userName, null, null);
         try {
@@ -205,8 +208,12 @@
         checkState();
         try {
             FSRole internalRole = m_storage.removeEntity(role.getName());
-            if (internalRole != null)
+            if (role.getType() == Role.USER) {
+                removeUserFromAllGroups(role);
+            }
+            if (internalRole != null) {
                 return true;
+            }
             return false;
         }
         catch (IOException e) {
@@ -215,7 +222,7 @@
     }
 
     public Collection<Role> findRoles(final UserAdminFactory userAdminFactory, 
final String filterString)
-        throws StorageException {
+    throws StorageException {
         checkState();
         List<Role> matchingRoles = new LinkedList<Role>();
         try {
@@ -237,7 +244,7 @@
     }
 
     public Collection<Role> getMembers(final UserAdminFactory 
userAdminFactory, final Group group)
-        throws StorageException {
+    throws StorageException {
         checkState();
         Set<Role> members = new HashSet<Role>();
         try {
@@ -246,14 +253,14 @@
                 for (Role role : ((FSGroup) internalRole).getMembers()) {
                     if (role.getType() == Role.USER) {
                         User newuser =
-                                    
userAdminFactory.createUser(role.getName(), 
dictionaryToMap(role.getProperties()),
-                                        dictionaryToMap(((User) 
role).getCredentials()));
+                            userAdminFactory.createUser(role.getName(), 
dictionaryToMap(role.getProperties()),
+                                dictionaryToMap(((User) 
role).getCredentials()));
                         members.add(newuser);
                     }
                     else if (role.getType() == Role.GROUP) {
                         Group newgroup =
-                                    
userAdminFactory.createGroup(role.getName(), 
dictionaryToMap(role.getProperties()),
-                                        dictionaryToMap(((Group) 
role).getCredentials()));
+                            userAdminFactory.createGroup(role.getName(), 
dictionaryToMap(role.getProperties()),
+                                dictionaryToMap(((Group) 
role).getCredentials()));
                         members.add(newgroup);
                     }
                 }
@@ -266,7 +273,7 @@
     }
 
     public Collection<Role> getRequiredMembers(final UserAdminFactory 
userAdminFactory, final Group group)
-        throws StorageException {
+    throws StorageException {
         checkState();
         Set<Role> members = new HashSet<Role>();
         try {
@@ -275,15 +282,15 @@
                 for (Role role : ((FSGroup) 
internalRole).getRequiredMembers()) {
                     if (role.getType() == Role.USER) {
                         User newuser =
-                                    
userAdminFactory.createUser(role.getName(), 
dictionaryToMap(role.getProperties()),
-                                        dictionaryToMap(((User) 
role).getCredentials()));
+                            userAdminFactory.createUser(role.getName(), 
dictionaryToMap(role.getProperties()),
+                                dictionaryToMap(((User) 
role).getCredentials()));
                         members.add(newuser);
                     }
                     else if (role.getType() == Role.GROUP) {
 
                         Group newgroup = 
userAdminFactory.createGroup(internalRole.getName(),
-                                dictionaryToMap(internalRole.getProperties()),
-                                dictionaryToMap(((Group) 
internalRole).getCredentials()));
+                            dictionaryToMap(internalRole.getProperties()),
+                            dictionaryToMap(((Group) 
internalRole).getCredentials()));
                         for (Role member : ((FSGroup) 
internalRole).getMembers()) {
                             newgroup.addMember(getRole(userAdminFactory, 
member.getName()));
                         }
@@ -302,20 +309,20 @@
     }
 
     public Role getRole(final UserAdminFactory userAdminFactory, final String 
roleName)
-        throws StorageException {
+    throws StorageException {
         checkState();
         try {
             FSRole internalRole = m_storage.getEntity(roleName);
             if (internalRole != null) {
                 if (internalRole.getType() == Role.USER) {
                     return userAdminFactory.createUser(internalRole.getName(),
-                                dictionaryToMap(internalRole.getProperties()),
-                                dictionaryToMap(((User) 
internalRole).getCredentials()));
+                        dictionaryToMap(internalRole.getProperties()),
+                        dictionaryToMap(((User) 
internalRole).getCredentials()));
                 }
                 else if (internalRole.getType() == Role.GROUP) {
                     Group newgroup = 
userAdminFactory.createGroup(internalRole.getName(),
-                            dictionaryToMap(internalRole.getProperties()),
-                            dictionaryToMap(((Group) 
internalRole).getCredentials()));
+                        dictionaryToMap(internalRole.getProperties()),
+                        dictionaryToMap(((Group) 
internalRole).getCredentials()));
                     for (Role member : ((FSGroup) internalRole).getMembers()) {
                         newgroup.addMember(getRole(userAdminFactory, 
member.getName()));
                     }
@@ -333,7 +340,7 @@
     }
 
     public User getUser(final UserAdminFactory userAdminFactory, final String 
key, final String value)
-        throws StorageException {
+    throws StorageException {
         checkState();
         List<User> matchingUsers = new LinkedList<User>();
         try {
@@ -363,7 +370,7 @@
         try {
             FSRole internalRole = m_storage.getEntity(group.getName());
             if (internalRole != null && internalRole.getType() == Role.GROUP
-                                && ((FSGroup) 
internalRole).removeMember(role)) {
+                            && ((FSGroup) internalRole).removeMember(role)) {
                 m_storage.addEntity(internalRole);
                 return true;
             }
@@ -408,7 +415,7 @@
     }
 
     public void setRoleAttribute(final Role role, final String key, final 
Object value)
-        throws StorageException {
+    throws StorageException {
         checkState();
         try {
             FSRole internalRole = m_storage.getEntity(role.getName());
@@ -423,7 +430,7 @@
     }
 
     public void setUserCredential(final User user, final String key, final 
Object value)
-        throws StorageException {
+    throws StorageException {
         checkState();
         try {
             FSRole internalRole = m_storage.getEntity(user.getName());
@@ -451,8 +458,20 @@
     }
 
     private void checkState() throws StorageException {
-        if (m_storage == null)
+        if (m_storage == null) {
             throw new StorageException("Storage backend is not configured");
+        }
     }
 
+    private void removeUserFromAllGroups(Role user) throws IOException {
+        List<FSRole> fsRoles = m_storage.getAll();
+        for (FSRole fsRole : fsRoles) {
+            if (fsRole instanceof FSGroup) {
+                // This is  a group, remove the user as member of this group 
(if it is a member)
+                if (((FSGroup) fsRole).removeMember(user)) {
+                    m_storage.addEntity(fsRole);
+                }
+            }
+        }
+    }
 }
\ No newline at end of file

Modified: 
trunk/amdatu-core/useradminstore-fs/src/test/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivatorTest.java
==============================================================================
--- 
trunk/amdatu-core/useradminstore-fs/src/test/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivatorTest.java
       (original)
+++ 
trunk/amdatu-core/useradminstore-fs/src/test/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivatorTest.java
       Tue Feb 15 12:50:49 2011
@@ -27,6 +27,8 @@
 import junit.framework.Assert;
 
 import org.amdatu.core.tenant.Tenant;
+import org.amdatu.core.useradminstore.fs.service.FSUserAdminStorageConfig;
+import org.amdatu.core.useradminstore.fs.service.FSUserAdminStorageConfigImpl;
 import org.amdatu.core.useradminstore.fs.service.FSUserAdminStorageProvider;
 import org.amdatu.core.useradminstore.fs.service.mock.MockUserAdminFactory;
 import org.apache.felix.dm.ComponentDeclaration;
@@ -88,6 +90,9 @@
         final Tenant tenantService = mockContext.mock(Tenant.class);
         final Bundle tenantBundle = mockContext.mock(Bundle.class);
         final ServiceReference tenantServiceReference = 
mockContext.mock(ServiceReference.class);
+        final FSUserAdminStorageConfig configService = 
mockContext.mock(FSUserAdminStorageConfig.class);
+        final ServiceReference configServiceReference = 
mockContext.mock(ServiceReference.class, "configServiceReference");
+        final Bundle configBundle = mockContext.mock(Bundle.class, 
"configBundle");
 
         final File bundleStorageDir = new File(m_absoluteTestRootDirectory, 
m_testName.getMethodName());
         bundleStorageDir.mkdir();
@@ -128,6 +133,25 @@
                 
allowing(bundleContext).getService(with(tenantServiceReference));
                 will(returnValue(tenantService));
 
+                // setup expected calls to config service
+                allowing(configService).getDataDirectoryName();
+                will(returnValue(bundleStorageDir.getAbsolutePath()));
+
+                allowing(configServiceReference).getPropertyKeys();
+                will(returnValue(new String[] {}));
+                
allowing(configServiceReference).getProperty(Constants.SERVICE_ID);
+                will(returnValue(1234));
+                allowing(configServiceReference).getBundle();
+                will(returnValue(configBundle));
+
+                // assert that the service will get the config service
+                
allowing(bundleContext).getServiceReference(with(FSUserAdminStorageConfig.class.getName()));
+                will(returnValue(configServiceReference));
+                
allowing(bundleContext).getServiceReferences(with(FSUserAdminStorageConfig.class.getName()),
 with(any(String.class)));
+                will(returnValue(new ServiceReference[] { 
configServiceReference }));
+                
allowing(bundleContext).getService(with(configServiceReference));
+                will(returnValue(configService));
+
                 // assert that DM registers a component and store it for 
callback
                 
allowing(bundleContext).registerService(with(ComponentDeclaration.class.getName()),
                     with(aNonNull(Object.class)), with(any(Dictionary.class)));
@@ -141,6 +165,11 @@
                 one(bundleContext).registerService(with(new String[] { 
StorageProvider.class.getName() }),
                     with(aNonNull(FSUserAdminStorageProvider.class)), 
with(any(Dictionary.class)));
                 will(addRegisteredService());
+
+                // assert that the FSUserAdminStorageConfig is registered and 
store it for callback
+                one(bundleContext).registerService(with(new String[] { 
FSUserAdminStorageConfig.class.getName(), ManagedService.class.getName() }),
+                    with(aNonNull(FSUserAdminStorageConfigImpl.class)), 
with(any(Dictionary.class)));
+                will(addRegisteredService());
             }
         });
 
@@ -150,12 +179,12 @@
 
         // simulate config admin callback
         Dictionary<String, String> dict = new Hashtable<String, String>();
-        dict.put(FSUserAdminStorageProvider.DATA_DIRECTORY, 
bundleStorageDir.getAbsolutePath());
+        dict.put(FSUserAdminStorageConfigImpl.DATA_DIRECTORY, 
bundleStorageDir.getAbsolutePath());
         ((ManagedService) m_registeredServices.get(0)).updated(dict);
-        ((ManagedService) m_registeredServices.get(1)).updated(dict);
+        ((ManagedService) m_registeredServices.get(2)).updated(dict);
 
         // invoke the storage provider to get it persist something
-        StorageProvider provider = (StorageProvider) 
m_registeredServices.get(2);
+        StorageProvider provider = (StorageProvider) 
m_registeredServices.get(1);
         provider.createUser(new MockUserAdminFactory(), "Bram");
 
         // assert that the bundleContext storage directory was used
@@ -174,6 +203,9 @@
         final Tenant tenantService = mockContext.mock(Tenant.class);
         final Bundle tenantBundle = mockContext.mock(Bundle.class);
         final ServiceReference tenantServiceReference = 
mockContext.mock(ServiceReference.class);
+        final FSUserAdminStorageConfig configService = 
mockContext.mock(FSUserAdminStorageConfig.class);
+        final ServiceReference configServiceReference = 
mockContext.mock(ServiceReference.class, "configServiceReference");
+        final Bundle configBundle = mockContext.mock(Bundle.class, 
"configBundle");
 
         final String relativeStorageDirectoryPath =
             m_relativeTestRootDirectory + File.separator + 
m_testName.getMethodName();
@@ -216,6 +248,25 @@
                 
allowing(bundleContext).getService(with(tenantServiceReference));
                 will(returnValue(tenantService));
 
+                // setup expected calls to config service
+                allowing(configService).getDataDirectoryName();
+                
will(returnValue(absolutebundleStorageDirectory.getAbsolutePath()));
+
+                allowing(configServiceReference).getPropertyKeys();
+                will(returnValue(new String[] {}));
+                
allowing(configServiceReference).getProperty(Constants.SERVICE_ID);
+                will(returnValue(1234));
+                allowing(configServiceReference).getBundle();
+                will(returnValue(configBundle));
+
+                // assert that the service will get the config service
+                
allowing(bundleContext).getServiceReference(with(FSUserAdminStorageConfig.class.getName()));
+                will(returnValue(configServiceReference));
+                
allowing(bundleContext).getServiceReferences(with(FSUserAdminStorageConfig.class.getName()),
 with(any(String.class)));
+                will(returnValue(new ServiceReference[] { 
configServiceReference }));
+                
allowing(bundleContext).getService(with(configServiceReference));
+                will(returnValue(configService));
+
                 // assert that DM registers a component and store it for 
callback
                 
allowing(bundleContext).registerService(with(ComponentDeclaration.class.getName()),
                     with(aNonNull(Object.class)), with(any(Dictionary.class)));
@@ -229,6 +280,11 @@
                 one(bundleContext).registerService(with(new String[] { 
StorageProvider.class.getName() }),
                     with(aNonNull(FSUserAdminStorageProvider.class)), 
with(any(Dictionary.class)));
                 will(addRegisteredService());
+
+                // assert that the FSUserAdminStorageConfig is registered and 
store it for callback
+                one(bundleContext).registerService(with(new String[] { 
FSUserAdminStorageConfig.class.getName(), ManagedService.class.getName() }),
+                    with(aNonNull(FSUserAdminStorageConfigImpl.class)), 
with(any(Dictionary.class)));
+                will(addRegisteredService());
             }
         });
 
@@ -239,12 +295,12 @@
         // simulate config admin callback with relative dir
         System.setProperty("user.dir", JAVA_IO_TMPDIR);
         Dictionary<String, String> dict = new Hashtable<String, String>();
-        dict.put(FSUserAdminStorageProvider.DATA_DIRECTORY, 
relativeStorageDirectoryPath);
+        dict.put(FSUserAdminStorageConfigImpl.DATA_DIRECTORY, 
relativeStorageDirectoryPath);
         ((ManagedService) m_registeredServices.get(0)).updated(dict);
-        ((ManagedService) m_registeredServices.get(1)).updated(dict);
+        ((ManagedService) m_registeredServices.get(2)).updated(dict);
 
         // invoke the storage provider to get it persist something
-        StorageProvider provider = (StorageProvider) 
m_registeredServices.get(2);
+        StorageProvider provider = (StorageProvider) 
m_registeredServices.get(1);
         provider.createUser(new MockUserAdminFactory(), "Bram");
 
         // assert that the correct storage directory was actually used
@@ -273,8 +329,8 @@
 
     public void describeTo(Description description) {
         description.appendText("adds ")
-                   .appendValueList("", ", ", "", m_services)
-                   .appendText(" to a collection");
+        .appendValueList("", ", ", "", m_services)
+        .appendText(" to a collection");
     }
 
     public Object invoke(Invocation invocation) throws Throwable {

Modified: 
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/IntegrationTestBase.java
==============================================================================
--- 
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/IntegrationTestBase.java
     (original)
+++ 
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/IntegrationTestBase.java
     Tue Feb 15 12:50:49 2011
@@ -301,19 +301,19 @@
 
     // //////////////////////////////////////////////////////////
     // A load of Pax Exam definitions for easier (typo-free) provisioning
-    
+
     protected static MavenArtifactProvisionOption amdatuDispatcher() {
         return 
mavenBundle().groupId("org.amdatu.web").artifactId("dispatcher").versionAsInProject();
     }
-    
+
     protected static MavenArtifactProvisionOption 
amdatuHostnameTenantResolver() {
         return 
mavenBundle().groupId("org.amdatu.web").artifactId("tenantresolver-hostname").versionAsInProject();
     }
-    
+
     protected static MavenArtifactProvisionOption amdatuParameterResolver() {
         return 
mavenBundle().groupId("org.amdatu.web").artifactId("tenantresolver-parameter").versionAsInProject();
     }
-    
+
     protected static MavenArtifactProvisionOption amdatuJaxRs() {
         return 
mavenBundle().groupId("org.amdatu.web.rest").artifactId("jaxrs").versionAsInProject();
     }
@@ -337,7 +337,7 @@
     protected static MavenArtifactProvisionOption amdatuTenantService() {
         return 
mavenBundle().groupId("org.amdatu.core").artifactId("tenant").versionAsInProject();
     }
-    
+
     protected static MavenArtifactProvisionOption 
amdatuTenantUserAdminDecoratorService() {
         return 
mavenBundle().groupId("org.amdatu.core").artifactId("tenantuseradmindecorator").versionAsInProject();
     }
@@ -429,7 +429,7 @@
     protected static MavenArtifactProvisionOption felixHttpServiceJetty() {
         return 
mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.http.jetty").versionAsInProject();
     }
-    
+
     protected static MavenArtifactProvisionOption felixLog() {
         return 
mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.log").versionAsInProject();
     }

Added: 
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/UserAdminStoreTestBase.java
==============================================================================
--- (empty file)
+++ 
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/UserAdminStoreTestBase.java
  Tue Feb 15 12:50:49 2011
@@ -0,0 +1,215 @@
+package org.amdatu.test.integration.base;
+
+import junit.framework.Assert;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.junit.Test;
+import org.ops4j.pax.exam.Inject;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.useradmin.Group;
+import org.osgi.service.useradmin.Role;
+import org.osgi.service.useradmin.User;
+import org.osgi.service.useradmin.UserAdmin;
+
+public abstract class UserAdminStoreTestBase extends IntegrationTestBase {
+    //Amount of milliseconds to wait between WRITE and READ operations 
concerning the same row and same column.
+    // See AMDATU-137.
+    private static int WAIT = 20;
+
+    private final static String ADMIN_USER = "TestAdministrator";
+    private final static String EDITOR_USER = "TestEditor";
+    private final static String GUEST_USER = "TestGuest";
+
+    private final static String ADMIN_GROUP = "TestAdminUsers";
+    private final static String EDITOR_GROUP = "TestEditUsers";
+    private final static String GUEST_GROUP = "TestGuestUsers";
+
+    @Inject
+    protected volatile ConfigurationAdmin m_configAdmin;
+    protected volatile UserAdmin m_userAdmin;
+
+    @Configuration
+    public Option[] configure() {
+        return super.configure();
+    }
+
+    public Component[] getDependencies(DependencyManager manager) {
+        return new Component[] {
+            manager.createComponent().setImplementation(this)
+            
.add(manager.createServiceDependency().setService(ConfigurationAdmin.class).setRequired(true))
+            .add(manager.createServiceDependency().setService(UserAdmin.class))
+        };
+    }
+
+    private void sleep() throws InterruptedException {
+        // Wait for 100 milliseconds, remember that Cassandra write operations 
are asynchronously
+        Thread.sleep(WAIT);
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void testAdminStore() throws Exception {
+        // Start the test, first remove all existing roles
+        Role[] allRoles = m_userAdmin.getRoles(null);
+        if (allRoles != null) {
+            for (Role role : allRoles) {
+                String roleName = role.getName();
+                m_userAdmin.removeRole(roleName);
+                sleep();
+                Assert.assertTrue("Role '" + roleName + "' removed but still 
returned", m_userAdmin
+                    .getRole(roleName) == null);
+            }
+        }
+
+        // Test if all roles have been removed
+        Assert.assertTrue("All roles were removed, but getRoles() still 
returns roles",
+            m_userAdmin.getRoles(null) == null
+            || m_userAdmin.getRoles(null).length == 0);
+
+        // Create three test users and set the credentials
+        User adminUser = (User) m_userAdmin.createRole(ADMIN_USER, Role.USER);
+        User editorUser = (User) m_userAdmin.createRole(EDITOR_USER, 
Role.USER);
+        User guestUser = (User) m_userAdmin.createRole(GUEST_USER, Role.USER);
+
+        Assert.assertTrue("All users were removed, but still creating a user 
failed since it already exists",
+            adminUser != null && editorUser != null && guestUser != null);
+        adminUser.getCredentials().put("password", "adminpasswd");
+        editorUser.getCredentials().put("password", "editorpasswd");
+        guestUser.getCredentials().put("password", "guestpasswd");
+
+        // Now see if we can find these users from credentials
+        sleep();
+        Assert.assertTrue("TestAdmin user could not be found", 
m_userAdmin.getRole(ADMIN_USER) != null);
+        Assert.assertTrue("TestEditor user could not be found", 
m_userAdmin.getRole(EDITOR_USER) != null);
+        Assert.assertTrue("TestGuest user could not be found", 
m_userAdmin.getRole(GUEST_USER) != null);
+
+        // Set user properties of admin
+        adminUser.getProperties().put("firstName", "John".getBytes());
+        adminUser.getProperties().put("lastName", "Doe".getBytes());
+
+        // And check if they were set correctly
+        sleep();
+        byte[] firstName = (byte[]) 
m_userAdmin.getRole(ADMIN_USER).getProperties().get("firstName");
+        Assert.assertTrue("firstName not properly set", new String(firstName, 
"UTF-8").equals("John"));
+        byte[] lastName = (byte[]) 
m_userAdmin.getRole(ADMIN_USER).getProperties().get("lastName");
+        Assert.assertTrue("lastName not properly set", new String(lastName, 
"UTF-8").equals("Doe"));
+
+        // Remove last name
+        adminUser.getProperties().remove("lastName");
+        sleep();
+        Assert.assertTrue("lastName not properly removed from property set",
+            m_userAdmin.getRole(ADMIN_USER).getProperties().get("lastName") == 
null);
+
+        // Now create "Administrator", "Editor" and "Guest" group and do some 
assignments
+        Group adminGroup = (Group) m_userAdmin.createRole(ADMIN_GROUP, 
Role.GROUP);
+        Group editorGroup = (Group) m_userAdmin.createRole(EDITOR_GROUP, 
Role.GROUP);
+        Group guestGroup = (Group) m_userAdmin.createRole(GUEST_GROUP, 
Role.GROUP);
+        adminGroup.addMember(adminUser);
+        adminGroup.addRequiredMember(adminUser);
+
+        // Excessive test of TestEditUsers group since this failed before
+        sleep();
+        assertBasicMemberCount(EDITOR_GROUP, 0);
+        assertRequiredMemberCount(EDITOR_GROUP, 0);
+        editorGroup.addMember(adminUser);
+        sleep();
+        assertBasicMemberCount(EDITOR_GROUP, 1);
+        assertRequiredMemberCount(EDITOR_GROUP, 0);
+        editorGroup.addMember(editorUser);
+        sleep();
+        assertBasicMemberCount(EDITOR_GROUP, 2);
+        assertRequiredMemberCount(EDITOR_GROUP, 0);
+        editorGroup.addRequiredMember(adminUser);
+        sleep();
+        assertBasicMemberCount(EDITOR_GROUP, 2);
+        assertRequiredMemberCount(EDITOR_GROUP, 1);
+        editorGroup.addRequiredMember(editorUser);
+        sleep();
+        assertBasicMemberCount(EDITOR_GROUP, 2);
+        assertRequiredMemberCount(EDITOR_GROUP, 2);
+
+        guestGroup.addMember(adminUser);
+        sleep();
+        guestGroup.addMember(editorUser);
+        sleep();
+        guestGroup.addMember(guestUser);
+        sleep();
+
+        assertBasicMemberCount(ADMIN_GROUP, 1);
+        assertRequiredMemberCount(ADMIN_GROUP, 1);
+        assertBasicMemberCount(EDITOR_GROUP, 2);
+        assertRequiredMemberCount(EDITOR_GROUP, 2);
+        assertBasicMemberCount(GUEST_GROUP, 3);
+        assertRequiredMemberCount(GUEST_GROUP, 0);
+
+        // Now remove some members
+        guestGroup.removeMember(adminUser);
+        sleep();
+        assertBasicMemberCount(GUEST_GROUP, 2);
+
+        // Remove the editor user, is it removed from the admin group?
+        m_userAdmin.removeRole(EDITOR_USER);
+        sleep();
+        assertBasicMemberCount(EDITOR_GROUP, 1);
+        assertRequiredMemberCount(EDITOR_GROUP, 1);
+        Assert.assertTrue("TestEditor should have been removed", 
m_userAdmin.getRole(EDITOR_USER) == null);
+
+        // Now remove a user and verify that it is also removed as member of 
all groups it was member of
+        m_userAdmin.removeRole(ADMIN_USER);
+        assertBasicMemberCount(ADMIN_GROUP, 0);
+        assertRequiredMemberCount(ADMIN_GROUP, 0);
+        assertBasicMemberCount(GUEST_GROUP, 1);
+
+        m_userAdmin.removeRole(GUEST_USER);
+        assertBasicMemberCount(GUEST_GROUP, 0);
+
+        // Finally, remove all test users and groups
+        allRoles = m_userAdmin.getRoles(null);
+        if (allRoles != null) {
+            for (Role role : allRoles) {
+                String roleName = role.getName();
+                m_userAdmin.removeRole(roleName);
+                sleep();
+                Assert.assertTrue("Role '" + roleName + "' removed but still 
returned", m_userAdmin
+                    .getRole(roleName) == null);
+            }
+        }
+    }
+
+    private void assertBasicMemberCount(String group, int expected) {
+        Assert.assertTrue("Group '" + group + "' is unknown by UserAdmin", 
m_userAdmin.getRole(group) != null);
+        int count =
+            ((Group) m_userAdmin.getRole(group)).getMembers() != null ? 
((Group) m_userAdmin.getRole(group))
+                .getMembers().length : 0;
+                if (count != expected) {
+                    Role[] members = ((Group) 
m_userAdmin.getRole(group)).getMembers();
+                    String sMembers = toString(members);
+                    Assert.assertTrue("Group '" + group + "' has " + count + " 
basic members. Expected: " + expected
+                        + ". Members found: " + sMembers, false);
+                }
+    }
+
+    private void assertRequiredMemberCount(String group, int expected) {
+        Assert.assertTrue("Group '" + group + "' is unknown by UserAdmin", 
m_userAdmin.getRole(group) != null);
+        int count =
+            ((Group) m_userAdmin.getRole(group)).getRequiredMembers() != null 
? ((Group) m_userAdmin.getRole(group))
+                .getRequiredMembers().length : 0;
+                if (count != expected) {
+                    Role[] members = ((Group) 
m_userAdmin.getRole(group)).getRequiredMembers();
+                    String sMembers = toString(members);
+                    Assert.assertTrue("Group '" + group + "' has " + count + " 
required members. Expected: " + expected
+                        + ". Members found: " + sMembers, false);
+                }
+    }
+
+    private String toString(Role[] members) {
+        String sMembers = "";
+        for (Role role : members) {
+            sMembers += role.getName() + " ";
+        }
+        return sMembers;
+    }
+}

Copied: 
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminCassandraStoreTest.java
 (from r784, 
/trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminStoreTest.java)
==============================================================================
--- 
/trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminStoreTest.java
    (original)
+++ 
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminCassandraStoreTest.java
    Tue Feb 15 12:50:49 2011
@@ -20,50 +20,32 @@
 
 import java.io.IOException;
 
-import junit.framework.Assert;
-
 import org.amdatu.test.integration.base.ConfigProvider;
-import org.amdatu.test.integration.base.IntegrationTestBase;
-import org.apache.felix.dm.Component;
-import org.apache.felix.dm.DependencyManager;
-import org.junit.Test;
+import org.amdatu.test.integration.base.UserAdminStoreTestBase;
 import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.Inject;
 import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.junit.Configuration;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.service.useradmin.Group;
-import org.osgi.service.useradmin.Role;
-import org.osgi.service.useradmin.User;
 import org.osgi.service.useradmin.UserAdmin;
 
 /**
- * This class provides an integration test for testing the User Admin store.
+ * This class provides an integration test for testing the User Admin 
Cassandra store.
  * 
  * @author ivol
  */
 @RunWith(JUnit4TestRunner.class)
-public class UserAdminStoreTest extends IntegrationTestBase {
-    // Amount of milliseconds to wait between WRITE and READ operations 
concerning the same row and same column.
-    // See AMDATU-137.
-    private static int WAIT = 20;
-
-    private final static String ADMIN_USER = "TestAdministrator";
-    private final static String EDITOR_USER = "TestEditor";
-    private final static String GUEST_USER = "TestGuest";
-
-    private final static String ADMIN_GROUP = "TestAdminUsers";
-    private final static String EDITOR_GROUP = "TestEditUsers";
-    private final static String GUEST_GROUP = "TestGuestUsers";
+public class UserAdminCassandraStoreTest extends UserAdminStoreTestBase {
+    protected void initConfiguration() throws IOException {
+        m_configAdmin = getService(ConfigurationAdmin.class);
 
-    @Inject
-    private volatile ConfigurationAdmin m_configAdmin;
-    private volatile UserAdmin m_userAdmin;
+        // Add cassandra and templates configs
+        ConfigProvider configProvider = new ConfigProvider();
+        configProvider.addTenantConfig(m_configAdmin);
+        configProvider.addFSTenantStoreConfig(m_configAdmin);
+        configProvider.addCassandraConfig(m_configAdmin);
+        configProvider.addTemplateConfig(m_configAdmin);
 
-    @Configuration
-    public Option[] configure() {
-        return super.configure();
+        m_userAdmin = getService(UserAdmin.class);
     }
 
     protected Option provisionBundles() {
@@ -83,195 +65,4 @@
             paxUserAdmin(),
             amdatuUserAdminCassandraStore());
     }
-
-    public Component[] getDependencies(DependencyManager manager) {
-        return new Component[] {
-            manager.createComponent().setImplementation(this)
-            
.add(manager.createServiceDependency().setService(ConfigurationAdmin.class).setRequired(true))
-            .add(manager.createServiceDependency().setService(UserAdmin.class))
-        };
-    }
-
-    private void sleep() throws InterruptedException {
-        // Wait for 100 milliseconds, remember that Cassandra write operations 
are asynchronously
-        Thread.sleep(WAIT);
-    }
-
-    protected void initConfiguration() throws IOException {
-        m_configAdmin = getService(ConfigurationAdmin.class);
-
-        // Add cassandra and templates configs
-        ConfigProvider configProvider = new ConfigProvider();
-        configProvider.addTenantConfig(m_configAdmin);
-        configProvider.addFSTenantStoreConfig(m_configAdmin);
-        configProvider.addCassandraConfig(m_configAdmin);
-        configProvider.addTemplateConfig(m_configAdmin);
-
-        m_userAdmin = getService(UserAdmin.class);
-    }
-
-    @SuppressWarnings("unchecked")
-    @Test
-    public void testAdminStore() throws Exception {
-        // Start the test, first remove all existing roles
-        Role[] allRoles = m_userAdmin.getRoles(null);
-        if (allRoles != null) {
-            for (Role role : allRoles) {
-                String roleName = role.getName();
-                m_userAdmin.removeRole(roleName);
-                sleep();
-                Assert.assertTrue("Role '" + roleName + "' removed but still 
returned", m_userAdmin
-                    .getRole(roleName) == null);
-            }
-        }
-
-        // Test if all roles have been removed
-        Assert.assertTrue("All roles were removed, but getRoles() still 
returns roles",
-            m_userAdmin.getRoles(null) == null
-            || m_userAdmin.getRoles(null).length == 0);
-
-        // Create three test users and set the credentials
-        User adminUser = (User) m_userAdmin.createRole(ADMIN_USER, Role.USER);
-        User editorUser = (User) m_userAdmin.createRole(EDITOR_USER, 
Role.USER);
-        User guestUser = (User) m_userAdmin.createRole("TestGuest", Role.USER);
-
-        Assert.assertTrue("All users were removed, but still creating a user 
failed since it already exists",
-            adminUser != null && editorUser != null && guestUser != null);
-        adminUser.getCredentials().put("password", "adminpasswd");
-        editorUser.getCredentials().put("password", "editorpasswd");
-        guestUser.getCredentials().put("password", "guestpasswd");
-
-        // Now see if we can find these users from credentials
-        sleep();
-        Assert
-        .assertTrue("TestAdmin user could not be found", 
m_userAdmin.getUser("name", ADMIN_USER) != null);
-        Assert.assertTrue("TestEditor user could not be found", 
m_userAdmin.getUser("name", EDITOR_USER) != null);
-        Assert.assertTrue("TestGuest user could not be found", 
m_userAdmin.getUser("name", GUEST_USER) != null);
-
-        // Set user properties of admin
-        adminUser.getProperties().put("firstName", "John".getBytes());
-        adminUser.getProperties().put("lastName", "Doe".getBytes());
-
-        // And check if they were set correctly
-        sleep();
-        byte[] firstName = (byte[]) m_userAdmin.getUser("name", 
ADMIN_USER).getProperties().get("firstName");
-        Assert.assertTrue("firstName not properly set", new String(firstName, 
"UTF-8").equals("John"));
-        byte[] lastName = (byte[]) m_userAdmin.getUser("name", 
ADMIN_USER).getProperties().get("lastName");
-        Assert.assertTrue("lastName not properly set", new String(lastName, 
"UTF-8").equals("Doe"));
-
-        // Remove last name
-        adminUser.getProperties().remove("lastName");
-        sleep();
-        Assert.assertTrue("lastName not properly removed from property set",
-            m_userAdmin.getUser("name", 
ADMIN_USER).getProperties().get("lastName") == null);
-
-        // Now create "Administrator", "Editor" and "Guest" group and do some 
assignments
-        Group adminGroup = (Group) m_userAdmin.createRole(ADMIN_GROUP, 
Role.GROUP);
-        Group editorGroup = (Group) m_userAdmin.createRole(EDITOR_GROUP, 
Role.GROUP);
-        Group guestGroup = (Group) m_userAdmin.createRole(GUEST_GROUP, 
Role.GROUP);
-        adminGroup.addMember(adminUser);
-        adminGroup.addRequiredMember(adminUser);
-
-        // Excessive test of TestEditUsers group since this failed before
-        sleep();
-        assertBasicMemberCount(EDITOR_GROUP, 0);
-        assertRequiredMemberCount(EDITOR_GROUP, 0);
-        editorGroup.addMember(adminUser);
-        sleep();
-        assertBasicMemberCount(EDITOR_GROUP, 1);
-        assertRequiredMemberCount(EDITOR_GROUP, 0);
-        editorGroup.addMember(editorUser);
-        sleep();
-        assertBasicMemberCount(EDITOR_GROUP, 2);
-        assertRequiredMemberCount(EDITOR_GROUP, 0);
-        editorGroup.addRequiredMember(adminUser);
-        sleep();
-        assertBasicMemberCount(EDITOR_GROUP, 2);
-        assertRequiredMemberCount(EDITOR_GROUP, 1);
-        editorGroup.addRequiredMember(editorUser);
-        sleep();
-        assertBasicMemberCount(EDITOR_GROUP, 2);
-        assertRequiredMemberCount(EDITOR_GROUP, 2);
-
-        guestGroup.addMember(adminUser);
-        sleep();
-        guestGroup.addMember(editorUser);
-        sleep();
-        guestGroup.addMember(guestUser);
-        sleep();
-
-        assertBasicMemberCount(ADMIN_GROUP, 1);
-        assertRequiredMemberCount(ADMIN_GROUP, 1);
-        assertBasicMemberCount(EDITOR_GROUP, 2);
-        assertRequiredMemberCount(EDITOR_GROUP, 2);
-        assertBasicMemberCount(GUEST_GROUP, 3);
-        assertRequiredMemberCount(GUEST_GROUP, 0);
-
-        // Now remove some members
-        guestGroup.removeMember(adminUser);
-        sleep();
-        assertBasicMemberCount(GUEST_GROUP, 2);
-
-        // Remove the editor user, is it removed from the admin group?
-        m_userAdmin.removeRole(EDITOR_USER);
-        sleep();
-        assertBasicMemberCount(EDITOR_GROUP, 1);
-        assertRequiredMemberCount(EDITOR_GROUP, 1);
-        Assert.assertTrue("TestEditor should have been removed", 
m_userAdmin.getRole(EDITOR_USER) == null);
-
-        // Now remove a user and verify that it is also removed as member of 
all groups it was member of
-        m_userAdmin.removeRole(ADMIN_USER);
-        assertBasicMemberCount(ADMIN_GROUP, 0);
-        assertRequiredMemberCount(ADMIN_GROUP, 0);
-        assertBasicMemberCount(GUEST_GROUP, 1);
-
-        m_userAdmin.removeRole(GUEST_USER);
-        assertBasicMemberCount(GUEST_GROUP, 0);
-
-        // Finally, remove all test users and groups
-        allRoles = m_userAdmin.getRoles(null);
-        if (allRoles != null) {
-            for (Role role : allRoles) {
-                String roleName = role.getName();
-                m_userAdmin.removeRole(roleName);
-                sleep();
-                Assert.assertTrue("Role '" + roleName + "' removed but still 
returned", m_userAdmin
-                    .getRole(roleName) == null);
-            }
-        }
-    }
-
-    private void assertBasicMemberCount(String group, int expected) {
-        Assert.assertTrue("Group '" + group + "' is unknown by UserAdmin", 
m_userAdmin.getRole(group) != null);
-        int count =
-            ((Group) m_userAdmin.getRole(group)).getMembers() != null ? 
((Group) m_userAdmin.getRole(group))
-                .getMembers().length : 0;
-                if (count != expected) {
-                    Role[] members = ((Group) 
m_userAdmin.getRole(group)).getMembers();
-                    String sMembers = toString(members);
-                    Assert.assertTrue("Group '" + group + "' has " + count + " 
basic members. Expected: " + expected
-                        + ". Members found: " + sMembers, false);
-                }
-    }
-
-    private void assertRequiredMemberCount(String group, int expected) {
-        Assert.assertTrue("Group '" + group + "' is unknown by UserAdmin", 
m_userAdmin.getRole(group) != null);
-        int count =
-            ((Group) m_userAdmin.getRole(group)).getRequiredMembers() != null 
? ((Group) m_userAdmin.getRole(group))
-                .getRequiredMembers().length : 0;
-                if (count != expected) {
-                    Role[] members = ((Group) 
m_userAdmin.getRole(group)).getRequiredMembers();
-                    String sMembers = toString(members);
-                    Assert.assertTrue("Group '" + group + "' has " + count + " 
required members. Expected: " + expected
-                        + ". Members found: " + sMembers, false);
-                }
-    }
-
-    private String toString(Role[] members) {
-        String sMembers = "";
-        for (Role role : members) {
-            sMembers += role.getName() + " ";
-        }
-        return sMembers;
-    }
 }

Added: 
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminFSStoreTest.java
==============================================================================
--- (empty file)
+++ 
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminFSStoreTest.java
   Tue Feb 15 12:50:49 2011
@@ -0,0 +1,68 @@
+/*
+    Copyright (C) 2010 Amdatu.org
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.amdatu.test.integration.tests;
+
+import static org.ops4j.pax.exam.CoreOptions.provision;
+
+import java.io.IOException;
+
+import org.amdatu.test.integration.base.ConfigProvider;
+import org.amdatu.test.integration.base.UserAdminStoreTestBase;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.useradmin.UserAdmin;
+
+/**
+ * This class provides an integration test for testing the User Admin 
Cassandra store.
+ * 
+ * @author ivol
+ */
+ at RunWith(JUnit4TestRunner.class)
+public class UserAdminFSStoreTest extends UserAdminStoreTestBase {
+    protected void initConfiguration() throws IOException {
+        m_configAdmin = getService(ConfigurationAdmin.class);
+
+        // Add cassandra and templates configs
+        ConfigProvider configProvider = new ConfigProvider();
+        configProvider.addTenantConfig(m_configAdmin);
+        configProvider.addFSTenantStoreConfig(m_configAdmin);
+        configProvider.addFSUserAdminConfig(m_configAdmin);
+        configProvider.addTemplateConfig(m_configAdmin);
+
+        m_userAdmin = getService(UserAdmin.class);
+    }
+
+    protected Option provisionBundles() {
+        return provision(
+            amdatuTenantService(),
+            amdatuTenantStoreFSService(),
+            amdatuTenantUserAdminDecoratorService(),
+            javaxServlet(), // Required if the httpservice is not deployed
+            amdatuConfigTemplateManager(), // Required for placeholders in 
cassandra.yaml
+            amdatuHttpContext(), // needed by cassandra useradmin store
+            amdatuJaxRs(), // needed by cassandra useradmin store
+            amdatuCassandraApplication(),
+            amdatuCassandraListener(),
+            amdatuCassandraPersistenceManager(),
+            slingCommons(),
+            slingMime(),
+            paxUserAdmin(),
+            amdatuUserAdminFSStore());
+    }
+}

Reply via email to