You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by or...@apache.org on 2019/11/26 11:21:58 UTC

[qpid-broker-j] branch master updated (c417254 -> 393ef36)

This is an automated email from the ASF dual-hosted git repository.

orudyy pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-broker-j.git.


    from c417254  QPID-8381: [Broker-J] Update reference file
     new 005ba41  QPID-8374: [Broker-J][ACL] Allow case insensitive mapping of group members to groups in existing GroupProvider
     new 5faf991  Revert "QPID-8381: [Broker-J] Upgrade Oracle BDB JE dependency to version 7.5.11"
     new 393ef36  Revert "QPID-8381: [Broker-J] Update reference file"

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../dependency-verification/DEPENDENCIES_REFERENCE |   2 +-
 ...atisticUnit.java => AbstractGroupProvider.java} |  24 +-
 .../apache/qpid/server/model/GroupProvider.java    |   5 +-
 .../model/adapter/FileBasedGroupProviderImpl.java  |  13 +-
 .../server/security/group/FileGroupDatabase.java   |  91 +++--
 .../server/security/group/GroupProviderImpl.java   |  18 +-
 ...oundryDashboardManagementGroupProviderImpl.java |   6 +-
 .../FileGroupDatabaseCaseInsensitiveTest.java      | 409 +++++++++++++++++++++
 .../security/group/FileGroupDatabaseTest.java      | 331 ++++++++---------
 .../server/security/group/GroupProviderUtil.java   |  80 ++++
 .../src/main/java/resources/addGroupProvider.html  |  22 +-
 .../java/resources/js/qpid/management/Broker.js    |  13 +-
 .../resources/js/qpid/management/GroupProvider.js  |  11 +-
 .../src/main/java/resources/showGroupProvider.html |  16 +-
 pom.xml                                            |   2 +-
 15 files changed, 787 insertions(+), 256 deletions(-)
 copy broker-core/src/main/java/org/apache/qpid/server/model/{StatisticUnit.java => AbstractGroupProvider.java} (63%)
 create mode 100644 broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseCaseInsensitiveTest.java
 create mode 100644 broker-core/src/test/java/org/apache/qpid/server/security/group/GroupProviderUtil.java


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[qpid-broker-j] 02/03: Revert "QPID-8381: [Broker-J] Upgrade Oracle BDB JE dependency to version 7.5.11"

Posted by or...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

orudyy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-broker-j.git

commit 5faf99120d2356ff4468db641c54d995c00bc8b0
Author: Alex Rudyy <or...@apache.org>
AuthorDate: Tue Nov 26 11:21:15 2019 +0000

    Revert "QPID-8381: [Broker-J] Upgrade Oracle BDB JE dependency to version 7.5.11"
    
    This reverts commit d5ae00b256914fb8af0ead9a2362f9476c59218c.
---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 702ae7d..a71fe16 100644
--- a/pom.xml
+++ b/pom.xml
@@ -101,7 +101,7 @@
     <dollar.sign>$</dollar.sign>
     <at.sign>@</at.sign>
 
-    <bdb-version>7.5.11</bdb-version>
+    <bdb-version>7.4.5</bdb-version>
     <derby-version>10.14.2.0</derby-version>
     <logback-version>1.2.3</logback-version>
     <guava-version>27.0-jre</guava-version>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[qpid-broker-j] 03/03: Revert "QPID-8381: [Broker-J] Update reference file"

Posted by or...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

orudyy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-broker-j.git

commit 393ef367c36f49598528053edead7e1ffd2c3870
Author: Alex Rudyy <or...@apache.org>
AuthorDate: Tue Nov 26 11:21:57 2019 +0000

    Revert "QPID-8381: [Broker-J] Update reference file"
    
    This reverts commit c417254a227e46da167996680d6c37319b54b2cd.
---
 .../src/main/assembly/dependency-verification/DEPENDENCIES_REFERENCE    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/apache-qpid-broker-j/src/main/assembly/dependency-verification/DEPENDENCIES_REFERENCE b/apache-qpid-broker-j/src/main/assembly/dependency-verification/DEPENDENCIES_REFERENCE
index 656d9e8..d2f6fee 100644
--- a/apache-qpid-broker-j/src/main/assembly/dependency-verification/DEPENDENCIES_REFERENCE
+++ b/apache-qpid-broker-j/src/main/assembly/dependency-verification/DEPENDENCIES_REFERENCE
@@ -53,7 +53,7 @@ From: 'JolBox' (http://jolbox.com)
     License: Apache v2  (http://www.apache.org/licenses/LICENSE-2.0.html)
 
 From: 'Oracle Corporation' (http://www.oracle.com/)
-  - je  com.sleepycat:je:jar:7.5.11
+  - je  com.sleepycat:je:jar:7.4.5
     License: Apache License, Version 2.0  (https://www.apache.org/licenses/LICENSE-2.0.txt)
 
 From: 'QOS.ch' (http://www.qos.ch)


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org


[qpid-broker-j] 01/03: QPID-8374: [Broker-J][ACL] Allow case insensitive mapping of group members to groups in existing GroupProvider

Posted by or...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

orudyy pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/qpid-broker-j.git

commit 005ba4184de60a02824038648f3584332f861de1
Author: Stanislav Khomytskyi <Re...@protonmail.com>
AuthorDate: Mon Nov 18 17:18:59 2019 +0100

    QPID-8374: [Broker-J][ACL] Allow case insensitive mapping of group members to groups in existing GroupProvider
---
 ...oupProvider.java => AbstractGroupProvider.java} |  25 +-
 .../apache/qpid/server/model/GroupProvider.java    |   5 +-
 .../model/adapter/FileBasedGroupProviderImpl.java  |  13 +-
 .../server/security/group/FileGroupDatabase.java   |  91 +++--
 .../server/security/group/GroupProviderImpl.java   |  18 +-
 ...oundryDashboardManagementGroupProviderImpl.java |   6 +-
 .../FileGroupDatabaseCaseInsensitiveTest.java      | 409 +++++++++++++++++++++
 .../security/group/FileGroupDatabaseTest.java      | 331 ++++++++---------
 .../server/security/group/GroupProviderUtil.java   |  80 ++++
 .../src/main/java/resources/addGroupProvider.html  |  22 +-
 .../java/resources/js/qpid/management/Broker.js    |  13 +-
 .../resources/js/qpid/management/GroupProvider.js  |  11 +-
 .../src/main/java/resources/showGroupProvider.html |  16 +-
 13 files changed, 793 insertions(+), 247 deletions(-)

diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractGroupProvider.java
similarity index 60%
copy from broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
copy to broker-core/src/main/java/org/apache/qpid/server/model/AbstractGroupProvider.java
index 23ea1d6..00f97a8 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractGroupProvider.java
@@ -1,4 +1,5 @@
 /*
+ *
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -19,11 +20,25 @@
  */
 package org.apache.qpid.server.model;
 
-import java.security.Principal;
-import java.util.Set;
+import java.util.Map;
 
-@ManagedObject
-public interface GroupProvider<X extends GroupProvider<X>> extends ConfiguredObject<X>
+public abstract class AbstractGroupProvider<X extends AbstractGroupProvider<X>>
+        extends AbstractConfiguredObject<X> implements GroupProvider<X>
 {
-    Set<Principal> getGroupPrincipalsForUser(Principal userPrincipal);
+    private final Container<?> _container;
+
+    @ManagedAttributeField
+    private boolean _caseSensitive;
+
+    protected AbstractGroupProvider(Container<?> container, Map<String, Object> attributes)
+    {
+        super(container, attributes);
+        _container = container;
+    }
+
+    @Override
+    public boolean isCaseSensitive()
+    {
+        return _caseSensitive;
+    }
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java b/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
index 23ea1d6..1dfa3dd 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
@@ -26,4 +26,7 @@ import java.util.Set;
 public interface GroupProvider<X extends GroupProvider<X>> extends ConfiguredObject<X>
 {
     Set<Principal> getGroupPrincipalsForUser(Principal userPrincipal);
-}
+
+    @ManagedAttribute(defaultValue = "true", description = "Allow to choose CaseSensitive or CaseInsensitive search of Groups and Users")
+    boolean isCaseSensitive();
+}
\ No newline at end of file
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java b/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
index f592c76..f08ed53 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
@@ -63,6 +63,9 @@ public class FileBasedGroupProviderImpl
     private FileGroupDatabase _groupDatabase;
 
     @ManagedAttributeField
+    private boolean _caseSensitive;
+
+    @ManagedAttributeField
     private String _path;
 
     @ManagedObjectFactoryConstructor
@@ -106,7 +109,7 @@ public class FileBasedGroupProviderImpl
     protected void onOpen()
     {
         super.onOpen();
-        FileGroupDatabase groupDatabase = new FileGroupDatabase();
+        FileGroupDatabase groupDatabase = new FileGroupDatabase(isCaseSensitive());
         try
         {
             groupDatabase.setGroupFile(getPath());
@@ -176,7 +179,7 @@ public class FileBasedGroupProviderImpl
                 throw new IllegalConfigurationException(String.format("Cannot read groups file '%s'. Please check permissions.", _path));
             }
 
-            FileGroupDatabase groupDatabase = new FileGroupDatabase();
+            FileGroupDatabase groupDatabase = new FileGroupDatabase(isCaseSensitive());
             try
             {
                 groupDatabase.setGroupFile(_path);
@@ -309,6 +312,12 @@ public class FileBasedGroupProviderImpl
         }
     }
 
+    @Override
+    public boolean isCaseSensitive()
+    {
+        return _caseSensitive;
+    }
+
     private class GroupAdapter extends AbstractConfiguredObject<GroupAdapter> implements Group<GroupAdapter>
     {
         public GroupAdapter(Map<String, Object> attributes)
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/group/FileGroupDatabase.java b/broker-core/src/main/java/org/apache/qpid/server/security/group/FileGroupDatabase.java
index 90efc5f..0e9a608 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/group/FileGroupDatabase.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/group/FileGroupDatabase.java
@@ -42,7 +42,7 @@ import org.apache.qpid.server.util.ServerScopedRuntimeException;
 
 /**
  * A group database that reads/writes the following file format:
- *
+ * <p>
  * group1.users=user1,user2
  * group2.users=user2,user3
  */
@@ -50,9 +50,20 @@ public class FileGroupDatabase implements GroupDatabase
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(FileGroupDatabase.class);
 
-    private Map<String, Set<String>> _groupToUserMap = new ConcurrentHashMap<String, Set<String>>();
-    private Map<String, Set<String>> _userToGroupMap = new ConcurrentHashMap<String, Set<String>>();
+    private final Map<String, Set<String>> _groupToUserMap;
+    private final Map<String, Set<String>> _userToGroupMap;
     private String _groupFile;
+    private final boolean _caseSensitive;
+
+    /**
+     * @param caseSensitive provides information if search of Users and Groups is CaseSensitive or CaseInsensitive;
+     */
+    public FileGroupDatabase(boolean caseSensitive)
+    {
+        this._caseSensitive = caseSensitive;
+        _groupToUserMap = new ConcurrentHashMap<>();
+        _userToGroupMap = new ConcurrentHashMap<>();
+    }
 
     @Override
     public Set<String> getAllGroups()
@@ -66,8 +77,7 @@ public class FileGroupDatabase implements GroupDatabase
 
         if (!file.canRead())
         {
-            throw new FileNotFoundException(groupFile
-                    + " cannot be found or is not readable");
+            throw new FileNotFoundException(groupFile + " cannot be found or is not readable");
         }
 
         readGroupFile(groupFile);
@@ -82,7 +92,7 @@ public class FileGroupDatabase implements GroupDatabase
             return Collections.emptySet();
         }
 
-        Set<String> set = _groupToUserMap.get(group);
+        Set<String> set = _groupToUserMap.get(keySearch(_groupToUserMap.keySet(), group));
         if (set == null)
         {
             return Collections.emptySet();
@@ -96,21 +106,25 @@ public class FileGroupDatabase implements GroupDatabase
     @Override
     public synchronized void addUserToGroup(String user, String group)
     {
-        Set<String> users = _groupToUserMap.get(group);
+        Set<String> users = _groupToUserMap.get(keySearch(_groupToUserMap.keySet(), group));
         if (users == null)
         {
-            throw new IllegalArgumentException("Group " + group + " does not exist so could not add " + user + " to it");
+            throw new IllegalArgumentException("Group "
+                                               + group
+                                               + " does not exist so could not add "
+                                               + user
+                                               + " to it");
         }
 
-        users.add(user);
+        users.add(keySearch(users, user));
 
-        Set<String> groups = _userToGroupMap.get(user);
+        Set<String> groups = _userToGroupMap.get(keySearch(_userToGroupMap.keySet(), user));
         if (groups == null)
         {
             groups = new ConcurrentSkipListSet<String>();
             _userToGroupMap.put(user, groups);
         }
-        groups.add(group);
+        groups.add(keySearch(_groupToUserMap.keySet(), group));
 
         update();
     }
@@ -118,18 +132,22 @@ public class FileGroupDatabase implements GroupDatabase
     @Override
     public synchronized void removeUserFromGroup(String user, String group)
     {
-        Set<String> users = _groupToUserMap.get(group);
+        Set<String> users = _groupToUserMap.get(keySearch(_groupToUserMap.keySet(), group));
         if (users == null)
         {
-            throw new IllegalArgumentException("Group " + group + " does not exist so could not remove " + user + " from it");
+            throw new IllegalArgumentException("Group "
+                                               + group
+                                               + " does not exist so could not remove "
+                                               + user
+                                               + " from it");
         }
 
-        users.remove(user);
+        users.remove(keySearch(users, user));
 
-        Set<String> groups = _userToGroupMap.get(user);
+        Set<String> groups = _userToGroupMap.get(keySearch(_userToGroupMap.keySet(), user));
         if (groups != null)
         {
-            groups.remove(group);
+            groups.remove(keySearch(groups, group));
         }
 
         update();
@@ -138,13 +156,13 @@ public class FileGroupDatabase implements GroupDatabase
     @Override
     public Set<String> getGroupsForUser(String user)
     {
-        if(user == null)
+        if (user == null)
         {
             LOGGER.warn("Requested group set for null user. Returning empty set.");
             return Collections.emptySet();
         }
 
-        Set<String> groups = _userToGroupMap.get(user);
+        Set<String> groups = _userToGroupMap.get(keySearch(_userToGroupMap.keySet(), user));
         if (groups == null)
         {
             return Collections.emptySet();
@@ -167,10 +185,10 @@ public class FileGroupDatabase implements GroupDatabase
     @Override
     public synchronized void removeGroup(String group)
     {
-        _groupToUserMap.remove(group);
+        _groupToUserMap.remove(keySearch(_groupToUserMap.keySet(), group));
         for (Set<String> groupsForUser : _userToGroupMap.values())
         {
-            groupsForUser.remove(group);
+            groupsForUser.remove(keySearch(groupsForUser, group));
         }
 
         update();
@@ -186,7 +204,7 @@ public class FileGroupDatabase implements GroupDatabase
             }
             catch (IOException e)
             {
-                throw new ServerScopedRuntimeException("Unable to persist change to file " + _groupFile,e);
+                throw new ServerScopedRuntimeException("Unable to persist change to file " + _groupFile, e);
             }
         }
     }
@@ -197,7 +215,8 @@ public class FileGroupDatabase implements GroupDatabase
         _groupToUserMap.clear();
         _userToGroupMap.clear();
         Properties propertiesFile = new Properties();
-        try (FileInputStream fileInputStream = new FileInputStream(groupFile)) {
+        try (FileInputStream fileInputStream = new FileInputStream(groupFile))
+        {
             propertiesFile.load(fileInputStream);
         }
 
@@ -214,7 +233,7 @@ public class FileGroupDatabase implements GroupDatabase
 
             for (String userName : userSet)
             {
-                Set<String> groupsForThisUser = _userToGroupMap.get(userName);
+                Set<String> groupsForThisUser = _userToGroupMap.get(keySearch(_userToGroupMap.keySet(), userName));
 
                 if (groupsForThisUser == null)
                 {
@@ -233,20 +252,19 @@ public class FileGroupDatabase implements GroupDatabase
 
         for (String group : _groupToUserMap.keySet())
         {
-            Set<String> users = _groupToUserMap.get(group);
+            Set<String> users = _groupToUserMap.get(keySearch(_groupToUserMap.keySet(), group));
             final String userList = Joiner.on(",").useForNull("").join(users);
 
             propertiesFile.setProperty(group + ".users", userList);
         }
 
-
         new FileHelper().writeFileSafely(new File(groupFile).toPath(), new BaseAction<File, IOException>()
         {
             @Override
             public void performAction(File file) throws IOException
             {
                 String comment = "Written " + new Date();
-                try(FileOutputStream fileOutputStream = new FileOutputStream(file))
+                try (FileOutputStream fileOutputStream = new FileOutputStream(file))
                 {
                     propertiesFile.store(fileOutputStream, comment);
                 }
@@ -258,10 +276,9 @@ public class FileGroupDatabase implements GroupDatabase
     {
         if (!propertyName.endsWith(".users"))
         {
-            throw new IllegalArgumentException(
-                    "Invalid definition with name '"
-                            + propertyName
-                            + "'. Group definitions must end with suffix '.users'");
+            throw new IllegalArgumentException("Invalid definition with name '"
+                                               + propertyName
+                                               + "'. Group definitions must end with suffix '.users'");
         }
     }
 
@@ -280,4 +297,18 @@ public class FileGroupDatabase implements GroupDatabase
         return userSet;
     }
 
+    private String keySearch(Set<String> set, String requiredKey)
+    {
+        if (!_caseSensitive)
+        {
+            for (String key : set)
+            {
+                if (key.equalsIgnoreCase(requiredKey))
+                {
+                    return key;
+                }
+            }
+        }
+        return requiredKey;
+    }
 }
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java b/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java
index dfd55da..352104d 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java
@@ -29,7 +29,7 @@ import java.util.Set;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 
-import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.AbstractGroupProvider;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Container;
 import org.apache.qpid.server.model.Group;
@@ -42,17 +42,16 @@ import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.StateTransition;
 
 @ManagedObject(category = false, type = GroupProviderImpl.CONFIG_TYPE)
-public class GroupProviderImpl extends AbstractConfiguredObject<GroupProviderImpl> implements GroupProvider<GroupProviderImpl>, GroupManagingGroupProvider
+public class GroupProviderImpl extends AbstractGroupProvider<GroupProviderImpl>
+        implements GroupProvider<GroupProviderImpl>, GroupManagingGroupProvider
 {
 
     public static final String CONFIG_TYPE = "ManagedGroupProvider";
-    private final Container<?> _container;
 
     @ManagedObjectFactoryConstructor
     public GroupProviderImpl(Map<String, Object> attributes, Container<?> container)
     {
         super(container, attributes);
-        _container = container;
     }
 
 
@@ -62,11 +61,11 @@ public class GroupProviderImpl extends AbstractConfiguredObject<GroupProviderImp
         Set<Principal> principals = new HashSet<>();
 
         final Collection<Group> groups = getChildren(Group.class);
-        for(Group<?> group : groups)
+        for (Group<?> group : groups)
         {
-            for(GroupMember<?> member : group.getChildren(GroupMember.class))
+            for (GroupMember<?> member : group.getChildren(GroupMember.class))
             {
-                if(member.getName().equals(userPrincipal.getName()))
+                if (member.getName().equals(userPrincipal.getName()))
                 {
                     principals.add(new GroupPrincipal(group.getName(), this));
                 }
@@ -79,10 +78,9 @@ public class GroupProviderImpl extends AbstractConfiguredObject<GroupProviderImp
     protected <C extends ConfiguredObject> ListenableFuture<C> addChildAsync(final Class<C> childClass,
                                                                              final Map<String, Object> attributes)
     {
-        if(childClass == Group.class)
+        if (childClass == Group.class)
         {
             return getObjectFactory().createAsync(childClass, attributes, this);
-
         }
         else
         {
@@ -90,7 +88,7 @@ public class GroupProviderImpl extends AbstractConfiguredObject<GroupProviderImp
         }
     }
 
-    @StateTransition( currentState = { State.UNINITIALIZED, State.QUIESCED, State.ERRORED }, desiredState = State.ACTIVE )
+    @StateTransition(currentState = {State.UNINITIALIZED, State.QUIESCED, State.ERRORED}, desiredState = State.ACTIVE)
     private ListenableFuture<Void> activate()
     {
         setState(State.ACTIVE);
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/group/cloudfoundry/CloudFoundryDashboardManagementGroupProviderImpl.java b/broker-core/src/main/java/org/apache/qpid/server/security/group/cloudfoundry/CloudFoundryDashboardManagementGroupProviderImpl.java
index 88659b5..99e3212 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/group/cloudfoundry/CloudFoundryDashboardManagementGroupProviderImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/group/cloudfoundry/CloudFoundryDashboardManagementGroupProviderImpl.java
@@ -49,7 +49,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
-import org.apache.qpid.server.model.AbstractConfiguredObject;
+import org.apache.qpid.server.model.AbstractGroupProvider;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Container;
 import org.apache.qpid.server.model.ManagedAttributeField;
@@ -70,14 +70,13 @@ import org.apache.qpid.server.util.ServerScopedRuntimeException;
  * See the CloudFoundry docs for more information:
  * http://docs.cloudfoundry.org/services/dashboard-sso.html#checking-user-permissions
  */
-public class CloudFoundryDashboardManagementGroupProviderImpl extends AbstractConfiguredObject<CloudFoundryDashboardManagementGroupProviderImpl>
+public class CloudFoundryDashboardManagementGroupProviderImpl extends AbstractGroupProvider<CloudFoundryDashboardManagementGroupProviderImpl>
         implements CloudFoundryDashboardManagementGroupProvider<CloudFoundryDashboardManagementGroupProviderImpl>
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(CloudFoundryDashboardManagementGroupProviderImpl.class);
     private static final String UTF8 = StandardCharsets.UTF_8.name();
 
     private final ObjectMapper _objectMapper = new ObjectMapper();
-    private final Container<?> _container;
 
     @ManagedAttributeField
     private URI _cloudFoundryEndpointURI;
@@ -99,7 +98,6 @@ public class CloudFoundryDashboardManagementGroupProviderImpl extends AbstractCo
     public CloudFoundryDashboardManagementGroupProviderImpl(Map<String, Object> attributes, Container<?> container)
     {
         super(container, attributes);
-        _container = container;
     }
 
     @Override
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseCaseInsensitiveTest.java b/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseCaseInsensitiveTest.java
new file mode 100644
index 0000000..d393c3a
--- /dev/null
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseCaseInsensitiveTest.java
@@ -0,0 +1,409 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.security.group;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Set;
+
+import org.junit.After;
+import org.junit.Test;
+
+import org.apache.qpid.test.utils.UnitTestBase;
+
+public class FileGroupDatabaseCaseInsensitiveTest extends UnitTestBase
+{
+    private static final String USER1 = "user1";
+    private static final String USER2 = "user2";
+    private static final String USER3 = "user3";
+
+    private static final String MY_GROUP = "myGroup";
+    private static final String MY_GROUP2 = "myGroup2";
+    private static final String MY_GROUP1 = "myGroup1";
+
+    private static final boolean CASE_SENSITIVE = false;
+    private static final FileGroupDatabase FILE_GROUP_DATABASE = new FileGroupDatabase(CASE_SENSITIVE);
+    private static final GroupProviderUtil UTIL;
+    private static final String GROUP_FILE;
+
+    static
+    {
+        try
+        {
+            UTIL = new GroupProviderUtil(FILE_GROUP_DATABASE);
+            GROUP_FILE = UTIL.getGroupFile();
+        }
+        catch (IOException e)
+        {
+           throw new RuntimeException(e);
+        }
+    }
+
+    @Test
+    public void testGetUsersInGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2,user3");
+        FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertNotNull(users);
+        assertEquals(3, users.size());
+        Set<String> users2 = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users2);
+        assertEquals(3, users2.size());
+        Set<String> users3 = FILE_GROUP_DATABASE.getUsersInGroup("MyGrouP");
+        assertNotNull(users3);
+        assertEquals(3, users3.size());
+    }
+
+    @Test
+    public void testDuplicateUsersInGroupAreConflatedCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user1,user3,user1");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertEquals(2, users.size());
+    }
+
+    @Test
+    public void testGetUsersWithEmptyGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertTrue(users.isEmpty());
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForUserWhenUserBelongsToOneGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
+
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(1, groups.size());
+        assertTrue(groups.contains(MY_GROUP));
+
+        Set<String> groups2 = FILE_GROUP_DATABASE.getGroupsForUser("User2");
+        assertEquals(1, groups2.size());
+        assertTrue(groups2.contains(MY_GROUP));
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForUserWhenUserBelongsToTwoGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2",
+                                  "myGroup1.users", "user1,user3",
+                                  "myGroup2.users", "user2,user3");
+        FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
+
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(2, groups.size());
+        assertTrue(groups.contains(MY_GROUP));
+        assertTrue(groups.contains(MY_GROUP1));
+
+        Set<String> groups2 = FILE_GROUP_DATABASE.getGroupsForUser("User2");
+        assertEquals(2, groups2.size());
+        assertTrue(groups2.contains(MY_GROUP));
+        assertTrue(groups2.contains(MY_GROUP2));
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForUserWhenUserAddedToGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", USER2);
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(1, groups.size());
+        assertTrue(groups.contains(MY_GROUP1));
+
+        FILE_GROUP_DATABASE.addUserToGroup(USER1, MY_GROUP2.toUpperCase());
+
+        groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(2, groups.size());
+        assertTrue(groups.contains(MY_GROUP1));
+        assertTrue(groups.contains(MY_GROUP2));
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP2.toUpperCase());
+        assertEquals(2, users.size());
+        assertTrue(users.contains(USER1));
+        assertTrue(users.contains(USER2));
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForUserWhenUserRemovedFromGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(2, groups.size());
+        assertTrue(groups.contains(MY_GROUP1));
+        assertTrue(groups.contains(MY_GROUP2));
+
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP2);
+
+        groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(1, groups.size());
+        assertTrue(groups.contains(MY_GROUP1));
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForUserWhenUserAddedToGroupTheyAreAlreadyInCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
+        FILE_GROUP_DATABASE.addUserToGroup(USER1, MY_GROUP);
+
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+
+        assertEquals(1, groups.size());
+        assertTrue(groups.contains(MY_GROUP));
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertEquals(1, users.size());
+        assertTrue(users.contains(USER1));
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForUserWhenUserNotKnownCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER3.toUpperCase());
+        assertTrue(groups.isEmpty());
+    }
+
+    @Test
+    public void testGetGroupPrincipalsForNullUserCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile();
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(null).isEmpty());
+    }
+
+    @Test
+    public void testAddUserToExistingGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertEquals(2, users.size());
+
+        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
+
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertEquals(3, users.size());
+    }
+
+    @Test
+    public void testAddUserToEmptyGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertTrue(users.isEmpty());
+
+        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP.toUpperCase());
+
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertNotNull(users);
+        assertEquals(1, users.size());
+    }
+
+    @Test
+    public void testAddUserToNonExistentGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile();
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertTrue(users.isEmpty());
+
+        try
+        {
+            FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
+            fail("Expected exception not thrown");
+        }
+        catch (IllegalArgumentException e)
+        {
+            // pass
+        }
+
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertNotNull(users);
+        assertTrue(users.isEmpty());
+    }
+
+    @Test
+    public void testRemoveUserFromExistingGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertNotNull(users);
+        assertEquals(2, users.size());
+
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER2.toUpperCase(), MY_GROUP.toUpperCase());
+
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertNotNull(users);
+        assertEquals(1, users.size());
+    }
+
+    @Test
+    public void testRemoveUserFromNonexistentGroupCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile();
+
+        try
+        {
+            FILE_GROUP_DATABASE.removeUserFromGroup(USER1.toUpperCase(), MY_GROUP);
+            fail("Expected exception not thrown");
+        }
+        catch (IllegalArgumentException e)
+        {
+            // pass
+        }
+
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase()).isEmpty());
+    }
+
+    @Test
+    public void testRemoveUserFromGroupTwiceCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).contains(USER1));
+
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP.toUpperCase());
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
+
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER1.toUpperCase(), MY_GROUP);
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
+    }
+
+    @Test
+    public void testAddUserPersistedToFileCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertEquals(2, users.size());
+
+        FILE_GROUP_DATABASE.addUserToGroup(USER3.toUpperCase(), MY_GROUP);
+        assertEquals(3, users.size());
+
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
+
+        Set<String> newUsers = newGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertEquals(users.size(), newUsers.size());
+    }
+
+    @Test
+    public void testRemoveUserPersistedToFileCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertEquals(2, users.size());
+
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER2.toUpperCase(), MY_GROUP);
+        assertEquals(1, users.size());
+
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
+
+        Set<String> newUsers = newGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
+        assertEquals(users.size(), newUsers.size());
+    }
+
+    @Test
+    public void testCreateGroupPersistedToFileCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile();
+
+        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertTrue(groups.isEmpty());
+
+        FILE_GROUP_DATABASE.createGroup(MY_GROUP);
+
+        groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(1, groups.size());
+        assertTrue(groups.contains(MY_GROUP));
+
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
+
+        Set<String> newGroups = newGroupDatabase.getAllGroups();
+        assertEquals(1, newGroups.size());
+        assertTrue(newGroups.contains(MY_GROUP));
+    }
+
+    @Test
+    public void testRemoveGroupPersistedToFileCaseInsensitive() throws Exception
+    {
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
+
+        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(2, groups.size());
+
+        Set<String> groupsForUser1 = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(2, groupsForUser1.size());
+
+        FILE_GROUP_DATABASE.removeGroup(MY_GROUP1.toUpperCase());
+
+        groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(1, groups.size());
+        assertTrue(groups.contains(MY_GROUP2));
+
+        groupsForUser1 = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(1, groupsForUser1.size());
+
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
+
+        Set<String> newGroups = newGroupDatabase.getAllGroups();
+        assertEquals(1, newGroups.size());
+        assertTrue(newGroups.contains(MY_GROUP2));
+
+        Set<String> newGroupsForUser1 = newGroupDatabase.getGroupsForUser(USER1.toUpperCase());
+        assertEquals(1, newGroupsForUser1.size());
+        assertTrue(newGroupsForUser1.contains(MY_GROUP2));
+    }
+
+    @After
+    public void tearDown() throws Exception
+    {
+
+        if (GROUP_FILE != null)
+        {
+            File groupFile = new File(GROUP_FILE);
+            if (groupFile.exists())
+            {
+                groupFile.delete();
+            }
+        }
+    }
+}
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseTest.java b/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseTest.java
index a9fb9ab..408fa7d 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseTest.java
@@ -26,13 +26,10 @@ import static org.junit.Assert.fail;
 
 import java.io.File;
 import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.IOException;
-import java.util.Properties;
 import java.util.Set;
 
 import org.junit.After;
-import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.qpid.test.utils.UnitTestBase;
@@ -47,26 +44,41 @@ public class FileGroupDatabaseTest extends UnitTestBase
     private static final String MY_GROUP2 = "myGroup2";
     private static final String MY_GROUP1 = "myGroup1";
 
-    private FileGroupDatabase _groupDatabase = new FileGroupDatabase();
-    private String _groupFile;
+    private static final boolean CASE_SENSITIVE = true;
+    private static final FileGroupDatabase FILE_GROUP_DATABASE = new FileGroupDatabase(CASE_SENSITIVE);
+    private static final GroupProviderUtil UTIL;
+    private static final String GROUP_FILE;
+
+    static
+    {
+        try
+        {
+            UTIL = new GroupProviderUtil(FILE_GROUP_DATABASE);
+            GROUP_FILE = UTIL.getGroupFile();
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
 
     @Test
     public void testGetAllGroups() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", USER1);
+        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
 
-        Set<String> groups = _groupDatabase.getAllGroups();
-        assertEquals((long) 1, (long) groups.size());
+        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
     }
 
     @Test
     public void testGetAllGroupsWhenGroupFileEmpty() throws Exception
     {
-        _groupDatabase.setGroupFile(_groupFile);
+        FILE_GROUP_DATABASE.setGroupFile(UTIL.createEmptyTestGroupFile());
 
-        Set<String> groups = _groupDatabase.getAllGroups();
-        assertEquals((long) 0, (long) groups.size());
+        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertTrue(groups.isEmpty());
     }
 
     @Test
@@ -74,7 +86,7 @@ public class FileGroupDatabaseTest extends UnitTestBase
     {
         try
         {
-            _groupDatabase.setGroupFile("/not/a/file");
+            FILE_GROUP_DATABASE.setGroupFile("/not/a/file");
             fail("Exception not thrown");
         }
         catch (FileNotFoundException fnfe)
@@ -86,11 +98,11 @@ public class FileGroupDatabaseTest extends UnitTestBase
     @Test
     public void testInvalidFormat() throws Exception
     {
-        writeGroupFile("name.notvalid", USER1);
+        UTIL.writeGroupFile("name.notvalid", USER1);
 
         try
         {
-            _groupDatabase.setGroupFile(_groupFile);
+            FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
             fail("Exception not thrown");
         }
         catch (IllegalArgumentException gde)
@@ -102,31 +114,31 @@ public class FileGroupDatabaseTest extends UnitTestBase
     @Test
     public void testGetUsersInGroup() throws Exception
     {
-        writeGroupFile("myGroup.users", "user1,user2,user3");
+        UTIL.writeGroupFile("myGroup.users", "user1,user2,user3");
 
-        _groupDatabase.setGroupFile(_groupFile);
+        FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 3, (long) users.size());
+        assertEquals(3, users.size());
     }
 
     @Test
     public void testDuplicateUsersInGroupAreConflated() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user1,user3,user1");
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user1,user3,user1");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 2, (long) users.size());
+        assertEquals(2, users.size());
     }
 
     @Test
     public void testGetUsersWithEmptyGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "");
+        UTIL.writeAndSetGroupFile("myGroup.users", "");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertTrue(users.isEmpty());
     }
@@ -134,9 +146,9 @@ public class FileGroupDatabaseTest extends UnitTestBase
     @Test
     public void testGetUsersInNonExistentGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2,user3");
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2,user3");
 
-        Set<String> users = _groupDatabase.getUsersInGroup("groupDoesntExist");
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup("groupDoesntExist");
         assertNotNull(users);
         assertTrue(users.isEmpty());
     }
@@ -144,26 +156,25 @@ public class FileGroupDatabaseTest extends UnitTestBase
     @Test
     public void testGetUsersInNullGroup() throws Exception
     {
-        writeAndSetGroupFile();
-        assertTrue(_groupDatabase.getUsersInGroup(null).isEmpty());
+        UTIL.writeAndSetGroupFile();
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(null).isEmpty());
     }
 
     @Test
     public void testGetGroupPrincipalsForUserWhenUserBelongsToOneGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2");
-        Set<String> groups = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 1, (long) groups.size());
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
     }
 
     @Test
     public void testGetGroupPrincipalsForUserWhenUserBelongsToTwoGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup1.users", "user1,user2",
-                             "myGroup2.users", "user1,user3");
-        Set<String> groups = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 2, (long) groups.size());
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user3");
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(2, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
         assertTrue(groups.contains(MY_GROUP2));
     }
@@ -171,21 +182,21 @@ public class FileGroupDatabaseTest extends UnitTestBase
     @Test
     public void testGetGroupPrincipalsForUserWhenUserAddedToGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup1.users", "user1,user2",
-                             "myGroup2.users", USER2);
-        Set<String> groups = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 1, (long) groups.size());
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", USER2);
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
 
-        _groupDatabase.addUserToGroup(USER1, MY_GROUP2);
+        FILE_GROUP_DATABASE.addUserToGroup(USER1, MY_GROUP2);
 
-        groups = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 2, (long) groups.size());
+        groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(2, groups.size());
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase()).isEmpty());
         assertTrue(groups.contains(MY_GROUP1));
         assertTrue(groups.contains(MY_GROUP2));
 
-        Set<String> users =  _groupDatabase.getUsersInGroup(MY_GROUP2);
-        assertEquals((long) 2, (long) users.size());
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP2);
+        assertEquals(2, users.size());
         assertTrue(users.contains(USER1));
         assertTrue(users.contains(USER2));
     }
@@ -193,298 +204,258 @@ public class FileGroupDatabaseTest extends UnitTestBase
     @Test
     public void testGetGroupPrincipalsForUserWhenUserRemovedFromGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup1.users", "user1,user2",
-                             "myGroup2.users", "user1,user2");
-        Set<String> groups = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 2, (long) groups.size());
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(2, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
         assertTrue(groups.contains(MY_GROUP2));
 
-        _groupDatabase.removeUserFromGroup(USER1, MY_GROUP2);
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP2);
 
-        groups = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 1, (long) groups.size());
+        groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase()).isEmpty());
     }
 
     @Test
     public void testGetGroupPrincipalsForUserWhenUserAddedToGroupTheyAreAlreadyIn() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", USER1);
-        _groupDatabase.addUserToGroup(USER1, MY_GROUP);
+        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
+        FILE_GROUP_DATABASE.addUserToGroup(USER1, MY_GROUP);
 
-        Set<String> groups = _groupDatabase.getGroupsForUser(USER1);
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
 
-        assertEquals((long) 1, (long) groups.size());
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
-        assertEquals((long) 1, (long) users.size());
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertEquals(1, users.size());
         assertTrue(users.contains(USER1));
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(MY_GROUP.toUpperCase()).isEmpty());
     }
 
     @Test
     public void testGetGroupPrincipalsForUserWhenUserNotKnown() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2");
-        Set<String> groups = _groupDatabase.getGroupsForUser(USER3);
-        assertEquals((long) 0, (long) groups.size());
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER3);
+        assertTrue(groups.isEmpty());
     }
 
     @Test
     public void testGetGroupPrincipalsForNullUser() throws Exception
     {
-        writeAndSetGroupFile();
-        assertTrue(_groupDatabase.getGroupsForUser(null).isEmpty());
+        UTIL.writeAndSetGroupFile();
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(null).isEmpty());
     }
 
     @Test
     public void testAddUserToExistingGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2");
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 2, (long) users.size());
+        assertEquals(2, users.size());
 
-        _groupDatabase.addUserToGroup(USER3, MY_GROUP);
+        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
 
-        users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 3, (long) users.size());
+        assertEquals(3, users.size());
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(MY_GROUP.toUpperCase()).isEmpty());
     }
 
     @Test
     public void testAddUserToEmptyGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "");
+        UTIL.writeAndSetGroupFile("myGroup.users", "");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 0, (long) users.size());
+        assertTrue(users.isEmpty());
 
-        _groupDatabase.addUserToGroup(USER3, MY_GROUP);
+        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
 
-        users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 1, (long) users.size());
+        assertEquals(1, users.size());
+        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(MY_GROUP.toUpperCase()).isEmpty());
     }
 
     @Test
     public void testAddUserToNonExistentGroup() throws Exception
     {
-        writeAndSetGroupFile();
+        UTIL.writeAndSetGroupFile();
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 0, (long) users.size());
+        assertTrue(users.isEmpty());
 
         try
         {
-            _groupDatabase.addUserToGroup(USER3, MY_GROUP);
+            FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
             fail("Expected exception not thrown");
         }
-        catch(IllegalArgumentException e)
+        catch (IllegalArgumentException e)
         {
             // pass
         }
 
-        users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 0, (long) users.size());
+        assertTrue(users.isEmpty());
     }
 
     @Test
     public void testRemoveUserFromExistingGroup() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2");
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 2, (long) users.size());
+        assertEquals(2, users.size());
 
-        _groupDatabase.removeUserFromGroup(USER2, MY_GROUP);
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER2, MY_GROUP);
 
-        users = _groupDatabase.getUsersInGroup(MY_GROUP);
+        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
-        assertEquals((long) 1, (long) users.size());
+        assertEquals(1, users.size());
     }
 
     @Test
     public void testRemoveUserFromNonexistentGroup() throws Exception
     {
-        writeAndSetGroupFile();
+        UTIL.writeAndSetGroupFile();
 
         try
         {
-            _groupDatabase.removeUserFromGroup(USER1, MY_GROUP);
+            FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP);
             fail("Expected exception not thrown");
         }
-        catch(IllegalArgumentException e)
+        catch (IllegalArgumentException e)
         {
             // pass
         }
 
-        assertTrue(_groupDatabase.getUsersInGroup(MY_GROUP).isEmpty());
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
     }
 
     @Test
     public void testRemoveUserFromGroupTwice() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", USER1);
-        assertTrue(_groupDatabase.getUsersInGroup(MY_GROUP).contains(USER1));
+        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).contains(USER1));
 
-        _groupDatabase.removeUserFromGroup(USER1, MY_GROUP);
-        assertTrue(_groupDatabase.getUsersInGroup(MY_GROUP).isEmpty());
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP);
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
 
-        _groupDatabase.removeUserFromGroup(USER1, MY_GROUP);
-        assertTrue(_groupDatabase.getUsersInGroup(MY_GROUP).isEmpty());
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP);
+        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
     }
 
     @Test
     public void testAddUserPersistedToFile() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2");
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
-        assertEquals((long) 2, (long) users.size());
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertEquals(2, users.size());
 
-        _groupDatabase.addUserToGroup(USER3, MY_GROUP);
-        assertEquals((long) 3, (long) users.size());
+        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
+        assertEquals(3, users.size());
 
-        FileGroupDatabase newGroupDatabase = new FileGroupDatabase();
-        newGroupDatabase.setGroupFile(_groupFile);
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
 
         Set<String> newUsers = newGroupDatabase.getUsersInGroup(MY_GROUP);
-        assertEquals((long) users.size(), (long) newUsers.size());
+        assertEquals(users.size(), newUsers.size());
     }
 
     @Test
     public void testRemoveUserPersistedToFile() throws Exception
     {
-        writeAndSetGroupFile("myGroup.users", "user1,user2");
+        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = _groupDatabase.getUsersInGroup(MY_GROUP);
-        assertEquals((long) 2, (long) users.size());
+        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        assertEquals(2, users.size());
 
-        _groupDatabase.removeUserFromGroup(USER2, MY_GROUP);
-        assertEquals((long) 1, (long) users.size());
+        FILE_GROUP_DATABASE.removeUserFromGroup(USER2, MY_GROUP);
+        assertEquals(1, users.size());
 
-        FileGroupDatabase newGroupDatabase = new FileGroupDatabase();
-        newGroupDatabase.setGroupFile(_groupFile);
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
 
         Set<String> newUsers = newGroupDatabase.getUsersInGroup(MY_GROUP);
-        assertEquals((long) users.size(), (long) newUsers.size());
+        assertEquals(users.size(), newUsers.size());
     }
 
     @Test
     public void testCreateGroupPersistedToFile() throws Exception
     {
-        writeAndSetGroupFile();
+        UTIL.writeAndSetGroupFile();
 
-        Set<String> groups = _groupDatabase.getAllGroups();
-        assertEquals((long) 0, (long) groups.size());
+        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertTrue(groups.isEmpty());
 
-        _groupDatabase.createGroup(MY_GROUP);
+        FILE_GROUP_DATABASE.createGroup(MY_GROUP);
 
-        groups = _groupDatabase.getAllGroups();
-        assertEquals((long) 1, (long) groups.size());
+        groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
 
-        FileGroupDatabase newGroupDatabase = new FileGroupDatabase();
-        newGroupDatabase.setGroupFile(_groupFile);
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
 
         Set<String> newGroups = newGroupDatabase.getAllGroups();
-        assertEquals((long) 1, (long) newGroups.size());
+        assertEquals(1, newGroups.size());
         assertTrue(newGroups.contains(MY_GROUP));
     }
 
     @Test
     public void testRemoveGroupPersistedToFile() throws Exception
     {
-        writeAndSetGroupFile("myGroup1.users", "user1,user2",
-                             "myGroup2.users", "user1,user2");
+        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
 
-        Set<String> groups = _groupDatabase.getAllGroups();
-        assertEquals((long) 2, (long) groups.size());
+        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(2, groups.size());
 
-        Set<String> groupsForUser1 = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 2, (long) groupsForUser1.size());
+        Set<String> groupsForUser1 = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(2, groupsForUser1.size());
 
-        _groupDatabase.removeGroup(MY_GROUP1);
+        FILE_GROUP_DATABASE.removeGroup(MY_GROUP1);
 
-        groups = _groupDatabase.getAllGroups();
-        assertEquals((long) 1, (long) groups.size());
+        groups = FILE_GROUP_DATABASE.getAllGroups();
+        assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP2));
 
-        groupsForUser1 = _groupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 1, (long) groupsForUser1.size());
+        groupsForUser1 = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        assertEquals(1, groupsForUser1.size());
 
-        FileGroupDatabase newGroupDatabase = new FileGroupDatabase();
-        newGroupDatabase.setGroupFile(_groupFile);
+        FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        newGroupDatabase.setGroupFile(GROUP_FILE);
 
         Set<String> newGroups = newGroupDatabase.getAllGroups();
-        assertEquals((long) 1, (long) newGroups.size());
+        assertEquals(1, newGroups.size());
         assertTrue(newGroups.contains(MY_GROUP2));
 
         Set<String> newGroupsForUser1 = newGroupDatabase.getGroupsForUser(USER1);
-        assertEquals((long) 1, (long) newGroupsForUser1.size());
+        assertEquals(1, newGroupsForUser1.size());
         assertTrue(newGroupsForUser1.contains(MY_GROUP2));
     }
 
-    @Before
-    public void setUp() throws Exception
-    {
-        _groupFile = createEmptyTestGroupFile();
-    }
-
-    private void writeAndSetGroupFile(String... groupAndUsers) throws Exception
-    {
-        writeGroupFile(groupAndUsers);
-        _groupDatabase.setGroupFile(_groupFile);
-    }
-
-    private void writeGroupFile(String... groupAndUsers) throws Exception
-    {
-        if (groupAndUsers.length % 2 != 0)
-        {
-            throw new IllegalArgumentException("Number of groupAndUsers must be even");
-        }
-
-        Properties props = new Properties();
-        for (int i = 0 ; i < groupAndUsers.length; i=i+2)
-        {
-            String group = groupAndUsers[i];
-            String users = groupAndUsers[i+1];
-            props.put(group, users);
-        }
-
-        try(FileOutputStream fileOutputStream = new FileOutputStream(_groupFile))
-        {
-            props.store(fileOutputStream, "test group file");
-        }
-    }
-
-    private String createEmptyTestGroupFile() throws IOException
-    {
-        File tmpGroupFile = File.createTempFile("groups", "grp");
-        tmpGroupFile.deleteOnExit();
-
-        return tmpGroupFile.getAbsolutePath();
-    }
-
     @After
     public void tearDown() throws Exception
     {
 
-        if (_groupFile != null)
+        if (GROUP_FILE != null)
         {
-            File groupFile = new File(_groupFile);
+            File groupFile = new File(GROUP_FILE);
             if (groupFile.exists())
             {
                 groupFile.delete();
             }
         }
     }
-
 }
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/group/GroupProviderUtil.java b/broker-core/src/test/java/org/apache/qpid/server/security/group/GroupProviderUtil.java
new file mode 100644
index 0000000..8d40e50
--- /dev/null
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/group/GroupProviderUtil.java
@@ -0,0 +1,80 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.security.group;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Properties;
+
+class GroupProviderUtil
+{
+
+    private final FileGroupDatabase _groupDatabase;
+    private final String _groupFile;
+
+    GroupProviderUtil(FileGroupDatabase groupDatabase) throws IOException
+    {
+        this._groupDatabase = groupDatabase;
+        this._groupFile = createEmptyTestGroupFile();
+    }
+
+    void writeAndSetGroupFile(String... groupAndUsers)
+            throws Exception
+    {
+        writeGroupFile(groupAndUsers);
+        _groupDatabase.setGroupFile(_groupFile);
+    }
+
+    void writeGroupFile(String... groupAndUsers) throws Exception
+    {
+        if (groupAndUsers.length % 2 != 0)
+        {
+            throw new IllegalArgumentException("Number of groupAndUsers must be even");
+        }
+
+        Properties props = new Properties();
+        for (int i = 0; i < groupAndUsers.length; i = i + 2)
+        {
+            String group = groupAndUsers[i];
+            String users = groupAndUsers[i + 1];
+            props.put(group, users);
+        }
+
+        try (FileOutputStream fileOutputStream = new FileOutputStream(_groupFile))
+        {
+            props.store(fileOutputStream, "test group file");
+        }
+    }
+
+    String createEmptyTestGroupFile() throws IOException
+    {
+        File tmpGroupFile = File.createTempFile("groups", "grp");
+        tmpGroupFile.deleteOnExit();
+
+        return tmpGroupFile.getAbsolutePath();
+    }
+
+    String getGroupFile()
+    {
+        return _groupFile;
+    }
+}
diff --git a/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html b/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html
index e8ded67..03dc091 100644
--- a/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html
+++ b/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html
@@ -32,7 +32,7 @@
                               placeHolder: 'group provider name',
                               required: true,
                               promptMessage: 'Name of group provider, must be unique',
-                              title: 'Enter a unique group provider name per broker'" />
+                              title: 'Enter a unique group provider name per broker'"/>
                         </div>
                     </div>
                     <div class="clear">
@@ -50,6 +50,20 @@
                         </div>
                     </div>
                     <div class="clear">
+                        <div class="formLabel-labelCell">Case Sensitive Group Search:</div>
+                        <div class="tableContainer-valueCell formLabel-controlCell">
+                            <input type="checkbox" id="addGroupProvider.caseSensitive" checked="checked" value="on"
+                                   data-dojo-type="dijit/form/CheckBox"
+                                   data-dojo-props="
+                            name: 'caseSensitive',
+                            checked: true,
+                            required: false,
+                            placeHolder: 'group provider caseSensitive',
+                            searchAttr: 'caseSensitive',
+                            title: 'Case Sensitive/Insensitive Search'"/>
+                        </div>
+                    </div>
+                    <div class="clear">
                         <div id="addGroupProvider.typeFields"></div>
                     </div>
                     <div class="editorPanel clear"
@@ -66,8 +80,10 @@
         </div>
 
         <div class="dijitDialogPaneActionBar qpidDialogPaneActionBar">
-            <button data-dojo-type="dijit/form/Button" id="addGroupProvider.addButton" data-dojo-props="label: 'Save'" type="submit"></button>
-            <button data-dojo-type="dijit/form/Button" id="addGroupProvider.cancelButton" data-dojo-props="label: 'Cancel'" ></button>
+            <button data-dojo-type="dijit/form/Button" id="addGroupProvider.addButton" data-dojo-props="label: 'Save'"
+                    type="submit"></button>
+            <button data-dojo-type="dijit/form/Button" id="addGroupProvider.cancelButton"
+                    data-dojo-props="label: 'Cancel'"></button>
         </div>
     </div>
 </div>
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
index 80e113c..ac57fab 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
@@ -820,11 +820,19 @@ define(["dojo/parser",
                 }, {
                     name: "State",
                     field: "state",
-                    width: "30%"
+                    width: "20%"
                 }, {
                     name: "Type",
                     field: "type",
-                    width: "30%"
+                    width: "20%"
+                }, {
+                    name: "Case Sensitive Group Search",
+                    field: "caseSensitive",
+                    width: "20%",
+                    formatter: function (val)
+                    {
+                        return "<input type='checkbox' disabled='disabled'" + (val ? "checked='checked'" : "") + " />";
+                    }
                 }], function (obj)
                 {
                     connect.connect(obj.grid, "onRowDblClick", obj.grid, function (evt)
@@ -934,7 +942,6 @@ define(["dojo/parser",
             }
         };
 
-        
         BrokerUpdater.prototype.update = function (callback)
         {
             if (!this.contentPane.selected && !callback)
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js
index c247bf6..9862246 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js
@@ -146,8 +146,8 @@ define(["dojo/parser",
         GroupProvider.prototype.deleteGroupProvider = function ()
         {
             var warnMessage = "";
-            if (this.groupProviderUpdater.groupProviderData && this.groupProviderUpdater.groupProviderData.type.indexOf(
-                    "File") != -1)
+            if (this.groupProviderUpdater.groupProviderData &&
+                this.groupProviderUpdater.groupProviderData.type.indexOf("File") !== -1)
             {
                 warnMessage = "NOTE: provider deletion will also remove the group file on disk.\n\n";
             }
@@ -158,7 +158,7 @@ define(["dojo/parser",
                     .then(function (data)
                     {
                         that.close();
-                        that.contentPane.onClose()
+                        that.contentPane.onClose();
                         that.controller.tabContainer.removeChild(that.contentPane);
                         that.contentPane.destroyRecursive();
                     }, util.xhrErrorHandler);
@@ -170,7 +170,7 @@ define(["dojo/parser",
             addGroupProvider.show(this.controller.management,
                 this.modelObj,
                 this.groupProviderUpdater.groupProviderData);
-        }
+        };
 
         function GroupProviderUpdater(groupProviderTab)
         {
@@ -185,6 +185,7 @@ define(["dojo/parser",
             this.name = query(".name", node)[0];
             this.type = query(".type", node)[0];
             this.state = query(".state", node)[0];
+            this.caseSensitive = query(".caseSensitive", node)[0];
             this.managedInterfaces = {};
             this.details = null;
         }
@@ -194,6 +195,8 @@ define(["dojo/parser",
             this.name.innerHTML = entities.encode(String(this.groupProviderData["name"]));
             this.type.innerHTML = entities.encode(String(this.groupProviderData["type"]));
             this.state.innerHTML = entities.encode(String(this.groupProviderData["state"]));
+            this.caseSensitive.innerHTML = "<input type='checkbox' disabled='disabled'" +
+                                           (this.groupProviderData["caseSensitive"] ? "checked='checked'" : "") + " />";
         };
 
         GroupProviderUpdater.prototype.update = function (callback)
diff --git a/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html b/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html
index a451fec..de3b84f 100644
--- a/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html
+++ b/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html
@@ -22,23 +22,29 @@
     <div class="groupProvider" data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Group Provider', open: true">
         <div class="clear">
             <div class="formLabel-labelCell">Name:</div>
-            <div class="name"></div>
+            <div class="formValue-valueCell name"></div>
         </div>
         <div class="clear">
             <div class="formLabel-labelCell">Type:</div>
-            <div class="type"></div>
+            <div class="formValue-valueCell type"></div>
         </div>
         <div class="clear">
             <div class="formLabel-labelCell">State:</div>
-            <div class="state"></div>
+            <div class="formValue-valueCell state"></div>
+        </div>
+        <div class="clear">
+            <div class="formLabel-labelCell">Case Sensitive Group Search:</div>
+            <div class="formValue-valueCell caseSensitive"></div>
         </div>
         <div class="clear"></div>
 
         <div class="providerDetails"></div>
         <br/>
         <div class="dijitDialogPaneActionBar">
-            <input class="editGroupProviderButton" type="button" value="Edit" label="Edit" data-dojo-type="dijit.form.Button"/>
-            <input class="deleteGroupProviderButton" type="button" value="Delete" label="Delete" data-dojo-type="dijit.form.Button" />
+            <input class="editGroupProviderButton" type="button" value="Edit" label="Edit"
+                   data-dojo-type="dijit.form.Button"/>
+            <input class="deleteGroupProviderButton" type="button" value="Delete" label="Delete"
+                   data-dojo-type="dijit.form.Button"/>
         </div>
     </div>
 </div>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org