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 2013/04/19 17:50:22 UTC

svn commit: r1469916 [1/2] - in /qpid/trunk/qpid/java: broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/ broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/res...

Author: orudyy
Date: Fri Apr 19 15:50:21 2013
New Revision: 1469916

URL: http://svn.apache.org/r1469916
Log:
QPID-4752: Make the GroupProvider a full broker-level configuration entry instead of a broker attribute.

Added:
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/action/ListGroupProviderAttributes.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderFactory.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/group/FileGroupProviderAttributeDescriptions.properties
Modified:
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showFileGroupManager.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showBroker.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProvider.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/GroupProviderRecoverer.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Broker.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugin/GroupManagerFactory.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/FileGroupManager.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/FileGroupManagerFactory.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/GroupManager.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/BrokerRecovererTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/GroupProviderRecovererTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/group/FileGroupManagerFactoryTest.java
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/group/FileGroupManagerTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/security/acl/AbstractACLTestCase.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/BrokerRestHttpsTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/BrokerRestTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/GroupProviderRestTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/GroupRestTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/acl/BrokerACLTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/acl/GroupRestACLTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/acl/UserRestACLTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/test/utils/TestBrokerConfiguration.java

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java Fri Apr 19 15:50:21 2013
@@ -32,6 +32,7 @@ import javax.servlet.http.HttpServletReq
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.qpid.server.management.plugin.servlet.rest.action.ListAuthenticationProviderAttributes;
+import org.apache.qpid.server.management.plugin.servlet.rest.action.ListGroupProviderAttributes;
 import org.apache.qpid.server.management.plugin.servlet.rest.action.ListMessageStoreTypes;
 import org.codehaus.jackson.map.ObjectMapper;
 import org.codehaus.jackson.map.SerializationConfig;
@@ -52,6 +53,8 @@ public class HelperServlet extends Abstr
         _actions.put(listProviderAttributes.getName(), listProviderAttributes);
         Action listMessageStoreTypes = new ListMessageStoreTypes();
         _actions.put(listMessageStoreTypes.getName(), listMessageStoreTypes);
+        Action groupProviderAttributes = new ListGroupProviderAttributes();
+        _actions.put(groupProviderAttributes.getName(), groupProviderAttributes);
     }
 
     @Override

Added: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/action/ListGroupProviderAttributes.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/action/ListGroupProviderAttributes.java?rev=1469916&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/action/ListGroupProviderAttributes.java (added)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/action/ListGroupProviderAttributes.java Fri Apr 19 15:50:21 2013
@@ -0,0 +1,76 @@
+/*
+ *  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.management.plugin.servlet.rest.action;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.qpid.server.management.plugin.servlet.rest.Action;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.plugin.GroupManagerFactory;
+import org.apache.qpid.server.plugin.QpidServiceLoader;
+
+public class ListGroupProviderAttributes implements Action
+{
+    private static final String ATTRIBUTES = "attributes";
+    private static final String DESCRIPTIONS = "descriptions";
+    private Map<String, GroupManagerFactory> _factories;
+
+    public ListGroupProviderAttributes()
+    {
+        _factories = new TreeMap<String, GroupManagerFactory>();
+        Iterable<GroupManagerFactory> factories = new QpidServiceLoader<GroupManagerFactory>()
+                .instancesOf(GroupManagerFactory.class);
+        for (GroupManagerFactory factory : factories)
+        {
+            _factories.put(factory.getType(), factory);
+        }
+    }
+
+    @Override
+    public String getName()
+    {
+        return ListGroupProviderAttributes.class.getSimpleName();
+    }
+
+    @Override
+    public Object perform(Map<String, Object> request, Broker broker)
+    {
+        Map<String, Object> attributes = new TreeMap<String, Object>();
+        for (String providerType : _factories.keySet())
+        {
+            GroupManagerFactory factory = _factories.get(providerType);
+
+            Map<String, Object> data = new HashMap<String, Object>();
+            data.put(ATTRIBUTES, factory.getAttributeNames());
+            Map<String, String> resources = factory.getAttributeDescriptions();
+            if (resources != null)
+            {
+                data.put(DESCRIPTIONS, resources);
+            }
+
+            attributes.put(factory.getType(), data);
+        }
+        return attributes;
+    }
+
+}

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showFileGroupManager.html
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showFileGroupManager.html?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showFileGroupManager.html (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/groupprovider/showFileGroupManager.html Fri Apr 19 15:50:21 2013
@@ -19,6 +19,8 @@
  -
  -->
 <div class="FileGroupManager">
+    <span style="">Path:</span><span class="path" style="position:absolute; left:6em"></span>
+    <br/>
     <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Groups'">
         <div class="groups"></div>
         <button data-dojo-type="dijit.form.Button" class="addGroupButton">Add Group</button>

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js Fri Apr 19 15:50:21 2013
@@ -32,6 +32,7 @@ define(["dojo/_base/xhr",
         "qpid/management/addVirtualHost",
         "qpid/management/addPort",
         "qpid/management/addKeystore",
+        "qpid/management/addGroupProvider",
         "dojox/grid/enhanced/plugins/Pagination",
         "dojox/grid/enhanced/plugins/IndirectSelection",
         "dijit/layout/AccordionContainer",
@@ -42,7 +43,7 @@ define(["dojo/_base/xhr",
         "dijit/form/CheckBox",
         "dojo/store/Memory",
         "dojo/domReady!"],
-       function (xhr, parser, query, connect, properties, updater, util, UpdatableStore, EnhancedGrid, registry, addAuthenticationProvider, addVirtualHost, addPort, addKeystore) {
+       function (xhr, parser, query, connect, properties, updater, util, UpdatableStore, EnhancedGrid, registry, addAuthenticationProvider, addVirtualHost, addPort, addKeystore, addGroupProvider) {
 
            function Broker(name, parent, controller) {
                this.name = name;
@@ -88,16 +89,6 @@ define(["dojo/_base/xhr",
                             name: "aclFile"})
                        }
                }, {
-                       name: "groupFile",
-                       createWidget: function(brokerData)
-                       {
-                           return new dijit.form.ValidationTextBox({
-                             required: false,
-                             value: brokerData.groupFile,
-                             label: "Group file location:",
-                             name: "groupFile"});
-                       }
-               }, {
                        name: "statisticsReportingPeriod",
                        createWidget: function(brokerData) {
                          return new dijit.form.ValidationTextBox({
@@ -453,6 +444,35 @@ define(["dojo/_base/xhr",
                                                 "Are you sure you want to delete trust store");
                                 }
                             );
+
+                            var addGroupProviderButton = query(".addGroupProvider", contentPane.containerNode)[0];
+                            connect.connect(registry.byNode(addGroupProviderButton), "onClick",
+                                function(evt){addGroupProvider.show();});
+
+                            var deleteGroupProvider = query(".deleteGroupProvider", contentPane.containerNode)[0];
+                            connect.connect(registry.byNode(deleteGroupProvider), "onClick",
+                                    function(evt){
+                                        var warning = "";
+                                        var data = that.brokerUpdater.groupProvidersGrid.grid.selection.getSelected();
+                                        if(data.length && data.length > 0)
+                                        {
+                                          for(var i = 0; i<data.length; i++)
+                                          {
+                                              if (data[i].type.indexOf("File") != -1)
+                                              {
+                                                warning = "NOTE: provider deletion will also remove the group file on disk.\n\n"
+                                                break;
+                                              }
+                                          }
+                                        }
+
+                                        util.deleteGridSelections(
+                                                that.brokerUpdater,
+                                                that.brokerUpdater.groupProvidersGrid.grid,
+                                                "rest/groupprovider",
+                                                warning + "Are you sure you want to delete group provider");
+                                }
+                            );
                         }});
            };
 
@@ -559,7 +579,7 @@ define(["dojo/_base/xhr",
                              that.keyStoresGrid =
                                new UpdatableStore(that.brokerData.keystores, query(".broker-key-stores")[0],
                                                [ { name: "Name",    field: "name",      width: "20%"},
-                                                 { name: "Path", field: "path", width: "50%"},
+                                                 { name: "Path", field: "path", width: "40%"},
                                                  { name: "Type", field: "type", width: "5%"},
                                                  { name: "Key Manager Algorithm", field: "keyManagerFactoryAlgorithm", width: "20%"},
                                                  { name: "Alias", field: "certificateAlias", width: "15%"}
@@ -576,10 +596,10 @@ define(["dojo/_base/xhr",
                              that.trustStoresGrid =
                                new UpdatableStore(that.brokerData.truststores, query(".broker-trust-stores")[0],
                                                [ { name: "Name",    field: "name",      width: "20%"},
-                                                 { name: "Path", field: "path", width: "50%"},
+                                                 { name: "Path", field: "path", width: "40%"},
                                                  { name: "Type", field: "type", width: "5%"},
-                                                 { name: "Trust Manager Algorithm", field: "trustManagerFactoryAlgorithm", width: "20%"},
-                                                 { name: "Peers only", field: "peersOnly", width: "15%",
+                                                 { name: "Trust Manager Algorithm", field: "trustManagerFactoryAlgorithm", width: "25%"},
+                                                 { name: "Peers only", field: "peersOnly", width: "10%",
                                                    formatter: function(val){
                                                      return "<input type='radio' disabled='disabled' "+(val ? "checked='checked'": "")+" />";
                                                    }
@@ -593,6 +613,19 @@ define(["dojo/_base/xhr",
                                                            that.controller.show("truststore", name, brokerObj);
                                                        });
                                                }, gridProperties, EnhancedGrid);
+                             that.groupProvidersGrid =
+                               new UpdatableStore(that.brokerData.groupproviders, query(".broker-group-providers")[0],
+                                               [ { name: "Name",    field: "name",      width: "50%"},
+                                                 { name: "Type", field: "type", width: "50%"}
+                                               ], function(obj) {
+                                                       connect.connect(obj.grid, "onRowDblClick", obj.grid,
+                                                       function(evt){
+                                                           var idx = evt.rowIndex,
+                                                               theItem = this.getItem(idx);
+                                                           var name = obj.dataStore.getValue(theItem,"name");
+                                                           that.controller.show("groupprovider", name, brokerObj);
+                                                       });
+                                               }, gridProperties, EnhancedGrid);
 
                          });
 
@@ -688,6 +721,10 @@ define(["dojo/_base/xhr",
                                                                                        {
                                                                                          that.trustStoresGrid.update(that.brokerData.truststores);
                                                                                        }
+                                                                                       if (that.groupProvidersGrid)
+                                                                                       {
+                                                                                         that.groupProvidersGrid.update(that.brokerData.groupproviders);
+                                                                                       }
                                                                                    });
 
 

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js Fri Apr 19 15:50:21 2013
@@ -27,10 +27,12 @@ define(["dojo/_base/xhr",
         "qpid/common/util",
         "qpid/common/UpdatableStore",
         "dojox/grid/EnhancedGrid",
+        "dijit/registry",
+        "dojo/_base/event",
         "dojox/grid/enhanced/plugins/Pagination",
         "dojox/grid/enhanced/plugins/IndirectSelection",
         "dojo/domReady!"],
-       function (xhr, parser, query, connect, properties, updater, util, UpdatableStore, EnhancedGrid) {
+       function (xhr, parser, query, connect, properties, updater, util, UpdatableStore, EnhancedGrid, registry, event) {
 
            function GroupProvider(name, parent, controller) {
                this.name = name;
@@ -43,7 +45,7 @@ define(["dojo/_base/xhr",
            }
 
            GroupProvider.prototype.getTitle = function() {
-               return "GroupProvider";
+               return "GroupProvider: " + this.name ;
            };
 
            GroupProvider.prototype.open = function(contentPane) {
@@ -61,6 +63,13 @@ define(["dojo/_base/xhr",
 
                             that.groupProviderAdapter.update();
 
+                            var deleteButton = query(".deleteGroupProviderButton", contentPane.containerNode)[0];
+                            var deleteWidget = registry.byNode(deleteButton);
+                            connect.connect(deleteWidget, "onClick",
+                                            function(evt){
+                                                event.stop(evt);
+                                                that.deleteGroupProvider();
+                                            });
                         }});
            };
 
@@ -68,12 +77,37 @@ define(["dojo/_base/xhr",
                updater.remove( this.groupProviderAdapter );
            };
 
+           GroupProvider.prototype.deleteGroupProvider = function() {
+             var warnMessage = "";
+             if (this.groupProviderAdapter.groupProviderData && this.groupProviderAdapter.groupProviderData.type.indexOf("File") != -1)
+             {
+               warnMessage = "NOTE: provider deletion will also remove the group file on disk.\n\n";
+             }
+             if(confirm(warnMessage + "Are you sure you want to delete group provider '" + this.name + "'?")) {
+                 var query = "rest/groupprovider/" +encodeURIComponent(this.name);
+                 this.success = true
+                 var that = this;
+                 xhr.del({url: query, sync: true, handleAs: "json"}).then(
+                     function(data) {
+                         that.close();
+                         that.contentPane.onClose()
+                         that.controller.tabContainer.removeChild(that.contentPane);
+                         that.contentPane.destroyRecursive();
+                     },
+                     function(error) {that.success = false; that.failureReason = error;});
+                 if(!this.success ) {
+                     alert("Error:" + this.failureReason);
+                 }
+             }
+         };
+
            function GroupProviderUpdater(node, groupProviderObj, controller)
            {
                this.controller = controller;
                this.name = query(".name", node)[0];
+               this.type = query(".type", node)[0];
                this.query = "rest/groupprovider/"+encodeURIComponent(groupProviderObj.name);
-
+               this.typeUI ={"GroupFile": "FileGroupManager"};
                var that = this;
 
                xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"})
@@ -85,9 +119,10 @@ define(["dojo/_base/xhr",
 
                              that.updateHeader();
 
-                             require(["qpid/management/groupprovider/"+that.groupProviderData.type],
+                             var ui = that.typeUI[that.groupProviderData.type];
+                             require(["qpid/management/groupprovider/"+ ui],
                                  function(SpecificProvider) {
-                                 that.details = new SpecificProvider(node, groupProviderObj, controller);
+                                 that.details = new SpecificProvider(query(".providerDetails", node)[0], groupProviderObj, controller);
                                  that.details.update();
                              });
 
@@ -98,6 +133,7 @@ define(["dojo/_base/xhr",
            GroupProviderUpdater.prototype.updateHeader = function()
            {
                this.name.innerHTML = this.groupProviderData[ "name" ];
+               this.type.innerHTML = this.groupProviderData[ "type" ];
            };
 
            GroupProviderUpdater.prototype.update = function()

Added: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js?rev=1469916&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js (added)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js Fri Apr 19 15:50:21 2013
@@ -0,0 +1,177 @@
+/*
+ *
+ * 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.
+ *
+ */
+define(["dojo/_base/lang",
+        "dojo/_base/xhr",
+        "dojo/dom",
+        "dojo/dom-construct",
+        "dijit/registry",
+        "dojo/parser",
+        "dojo/_base/array",
+        "dojo/_base/event",
+        'dojo/_base/json',
+        "qpid/common/util",
+        "dojo/store/Memory",
+        "dojox/validate/us",
+        "dojox/validate/web",
+        "dijit/Dialog",
+        "dijit/form/CheckBox",
+        "dijit/form/Textarea",
+        "dijit/form/ComboBox",
+        "dijit/form/TextBox",
+        "dijit/form/ValidationTextBox",
+        "dijit/form/Button",
+        "dijit/form/Form",
+        "dijit/layout/ContentPane",
+        "dojox/layout/TableContainer",
+        "dojo/domReady!"],
+    function (lang, xhr, dom, construct, registry, parser, array, event, json, util) {
+
+        var addGroupProvider = {};
+
+        addGroupProvider.show = function(groupProvider) {
+          var fields = [{
+              name: "name",
+              createWidget: function(groupProvider) {
+                  return new dijit.form.ValidationTextBox({
+                    required: true,
+                    value: groupProvider.name,
+                    disabled: groupProvider.name ? true : false,
+                    label: "Name*:",
+                    regexp: "^[\x20-\x2e\x30-\x7F]{1,255}$",
+                    name: "name"});
+              }
+          }, {
+              name: "type",
+              createWidget: function(groupProvider) {
+
+                  var typeContainer = construct.create("div");
+
+                  var typeListContainer = new dojox.layout.TableContainer({
+                      cols: 1,
+                      "labelWidth": "300",
+                      customClass: "formLabel",
+                      showLabels: true,
+                      orientation: "horiz"
+                  });
+
+                  typeContainer.appendChild(typeListContainer.domNode);
+
+                  var providers =  [];
+                  var fieldSetContainers = {};
+                  xhr.get({
+                    url: "rest/helper?action=ListGroupProviderAttributes",
+                    handleAs: "json",
+                    sync: true
+                  }).then(
+                  function(data) {
+                       var providerIndex = 0;
+
+                       for (var providerType in data) {
+                           if (data.hasOwnProperty(providerType)) {
+                               providers[providerIndex++] = {id: providerType, name: providerType};
+
+                               var attributes = data[providerType].attributes;
+                               var descriptions = data[providerType].descriptions;
+
+                               var layout = new dojox.layout.TableContainer( {
+                                   cols: 1,
+                                   "labelWidth": "300",
+                                   customClass: "formLabel",
+                                   showLabels: true,
+                                   orientation: "horiz"
+                               });
+
+                               for(var i=0; i < attributes.length; i++) {
+                                   if ("type" == attributes[i])
+                                   {
+                                       continue;
+                                   }
+                                   var labelValue = attributes[i];
+                                   if (descriptions && descriptions[attributes[i]])
+                                   {
+                                       labelValue = descriptions[attributes[i]];
+                                   }
+                                   var text = new dijit.form.TextBox({
+                                       label: labelValue + ":",
+                                       name: attributes[i]
+                                   });
+                                   layout.addChild(text);
+                               }
+
+                               typeContainer.appendChild(layout.domNode);
+                               fieldSetContainers[providerType] = layout;
+                           }
+                       }
+                });
+
+                var providersStore = new dojo.store.Memory({ data: providers });
+
+                var typeList = new dijit.form.FilteringSelect({
+                  required: true,
+                  value: groupProvider.type,
+                  store: providersStore,
+                  label: "Type*:",
+                  name: "type"});
+
+                typeListContainer.addChild(typeList);
+
+                var onChangeHandler = function onChangeHandler(newValue){
+                  for (var i in fieldSetContainers) {
+                    var container = fieldSetContainers[i];
+                    var descendants = container.getChildren();
+                    for(var i in descendants){
+                      var descendant = descendants[i];
+                      var propName = descendant.name;
+                      if (propName) {
+                        descendant.set("disabled", true);
+                      }
+                    }
+                    container.domNode.style.display = "none";
+                  }
+                  var container = fieldSetContainers[newValue];
+                  if (container)
+                  {
+                    container.domNode.style.display = "block";
+                    var descendants = container.getChildren();
+                    for(var i in descendants){
+                      var descendant = descendants[i];
+                      var propName = descendant.name;
+                      if (propName) {
+                        descendant.set("disabled", false);
+                      }
+                    }
+                  }
+                };
+                typeList.on("change", onChangeHandler);
+                onChangeHandler(typeList.value);
+                return new dijit.layout.ContentPane({content: typeContainer, style:{padding: 0}});
+              }
+              }];
+
+          util.showSetAttributesDialog(
+              fields,
+              groupProvider ? groupProvider : {},
+              "rest/groupprovider" + (name ? "/" + encodeURIComponent(name.name) : ""),
+              groupProvider ? "Edit group provider - " + groupProvider.name : "Add group provider",
+              groupProvider ? false : true);
+        };
+        return addGroupProvider;
+    });
\ No newline at end of file

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/FileGroupManager.js Fri Apr 19 15:50:21 2013
@@ -82,11 +82,12 @@ define(["dojo/_base/xhr",
 
             xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"})
                .then(function(data) {
+                     that.path = query(".path", node)[0];
                      that.groupProviderData = data[0];
 
                      util.flattenStatistics( that.groupProviderData );
 
-                     var groupDiv = query(".groups")[0];
+                     var groupDiv = query(".groups", node)[0];
 
                      var gridProperties = {
                                             height: 400,
@@ -109,7 +110,15 @@ define(["dojo/_base/xhr",
                      that.groupsGrid =
                         new UpdatableStore(that.groupProviderData.groups, groupDiv,
                                         [ { name: "Group Name",    field: "name",      width: "100%" }
-                                        ], null, gridProperties, EnhancedGrid);
+                                        ], function(obj) {
+                                          connect.connect(obj.grid, "onRowDblClick", obj.grid,
+                                              function(evt){
+                                                  var idx = evt.rowIndex,
+                                                      theItem = this.getItem(idx);
+                                                  var name = obj.dataStore.getValue(theItem,"name");
+                                                  that.controller.show("group", name, groupProviderObj);
+                                              });
+                                      }, gridProperties, EnhancedGrid);
 
 
                      var addGroupButton = query(".addGroupButton", node)[0];
@@ -167,6 +176,7 @@ define(["dojo/_base/xhr",
             xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"})
                 .then(function(data) {
                     that.groupProviderData = data[0];
+                    that.path.innerHTML = that.groupProviderData.path;
                     util.flattenStatistics( that.groupProviderData );
 
                     that.groupsGrid.update(that.groupProviderData.groups);

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showBroker.html
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showBroker.html?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showBroker.html (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showBroker.html Fri Apr 19 15:50:21 2013
@@ -65,10 +65,6 @@
                 <div class="formLabel-labelCell" style="float:left; width: 250px;">ACL file location:</div>
                 <div id="brokerAttribute.aclFile" style="float:left;"></div>
             </div>
-            <div id="brokerAttribute.groupFile.container" style="display: none; clear:both">
-                <div class="formLabel-labelCell" style="float:left; width: 250px;">Group file location:</div>
-                <div id="brokerAttribute.groupFile" style="float:left;"></div>
-            </div>
             <div id="brokerAttribute.statisticsReportingPeriod.container" style="display: none; clear:both">
                 <div class="formLabel-labelCell" style="float:left; width: 250px;">Statistics reporting period:</div>
                 <div id="brokerAttribute.statisticsReportingPeriod" style="float:left;"></div>
@@ -189,6 +185,12 @@
         <button data-dojo-type="dijit.form.Button" class="deleteTruststore">Delete Trust Store</button>
     </div>
     <br/>
+    <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Group Providers'">
+        <div class="broker-group-providers"></div>
+        <button data-dojo-type="dijit.form.Button" class="addGroupProvider">Add Group Provider</button>
+        <button data-dojo-type="dijit.form.Button" class="deleteGroupProvider">Delete Group Provider</button>
+    </div>
+    <br/>
     <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Log File',  open: false">
         <div class="broker-logfile"></div>
     </div>

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html Fri Apr 19 15:50:21 2013
@@ -22,4 +22,10 @@
     <span style="">Name:</span><span class="name" style="position:absolute; left:6em"></span>
     <br/>
     <span style="">Type:</span><span class="type" style="position:absolute; left:6em"></span>
-</div>
\ No newline at end of file
+    <br/>
+    <div class="providerDetails"></div>
+    <div class="dijitDialogPaneActionBar">
+        <input class="deleteGroupProviderButton" type="button" value="Delete Group provider" label="Delete Group Provider" dojoType="dijit.form.Button" />
+    </div>
+</div>
+<br/>
\ No newline at end of file

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/BrokerRecoverer.java Fri Apr 19 15:50:21 2013
@@ -39,10 +39,10 @@ import org.apache.qpid.server.model.Auth
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.KeyStore;
-import org.apache.qpid.server.model.Port;
 import org.apache.qpid.server.model.TrustStore;
 import org.apache.qpid.server.model.adapter.AuthenticationProviderFactory;
 import org.apache.qpid.server.model.adapter.BrokerAdapter;
+import org.apache.qpid.server.model.adapter.GroupProviderFactory;
 import org.apache.qpid.server.model.adapter.PortFactory;
 import org.apache.qpid.server.stats.StatisticsGatherer;
 import org.apache.qpid.server.virtualhost.VirtualHostRegistry;
@@ -57,11 +57,13 @@ public class BrokerRecoverer implements 
     private final PortFactory _portFactory;
     private final TaskExecutor _taskExecutor;
     private final BrokerOptions _brokerOptions;
+    private final GroupProviderFactory _groupProviderFactory;
 
-    public BrokerRecoverer(AuthenticationProviderFactory authenticationProviderFactory, PortFactory portFactory,
-            StatisticsGatherer statisticsGatherer, VirtualHostRegistry virtualHostRegistry, LogRecorder logRecorder,
-            RootMessageLogger rootMessageLogger, TaskExecutor taskExecutor, BrokerOptions brokerOptions)
+    public BrokerRecoverer(AuthenticationProviderFactory authenticationProviderFactory, GroupProviderFactory groupProviderFactory,
+            PortFactory portFactory, StatisticsGatherer statisticsGatherer, VirtualHostRegistry virtualHostRegistry,
+            LogRecorder logRecorder, RootMessageLogger rootMessageLogger, TaskExecutor taskExecutor, BrokerOptions brokerOptions)
     {
+        _groupProviderFactory = groupProviderFactory;
         _portFactory = portFactory;
         _authenticationProviderFactory = authenticationProviderFactory;
         _statisticsGatherer = statisticsGatherer;
@@ -77,7 +79,8 @@ public class BrokerRecoverer implements 
     {
         StoreConfigurationChangeListener storeChangeListener = new StoreConfigurationChangeListener(entry.getStore());
         BrokerAdapter broker = new BrokerAdapter(entry.getId(), entry.getAttributes(), _statisticsGatherer, _virtualHostRegistry,
-                _logRecorder, _rootMessageLogger, _authenticationProviderFactory, _portFactory, _taskExecutor, entry.getStore(), _brokerOptions);
+                _logRecorder, _rootMessageLogger, _authenticationProviderFactory, _groupProviderFactory, _portFactory,
+                _taskExecutor, entry.getStore(), _brokerOptions);
 
         broker.addChangeListener(storeChangeListener);
 

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProvider.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProvider.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProvider.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/DefaultRecovererProvider.java Fri Apr 19 15:50:21 2013
@@ -34,6 +34,7 @@ import org.apache.qpid.server.model.Port
 import org.apache.qpid.server.model.TrustStore;
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.model.adapter.AuthenticationProviderFactory;
+import org.apache.qpid.server.model.adapter.GroupProviderFactory;
 import org.apache.qpid.server.model.adapter.PortFactory;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.plugin.AuthenticationManagerFactory;
@@ -52,7 +53,7 @@ public class DefaultRecovererProvider im
     private final RootMessageLogger _rootMessageLogger;
     private final AuthenticationProviderFactory _authenticationProviderFactory;
     private final PortFactory _portFactory;
-    private final QpidServiceLoader<GroupManagerFactory> _groupManagerServiceLoader;
+    private final GroupProviderFactory _groupProviderFactory;
     private final QpidServiceLoader<PluginFactory> _pluginFactoryServiceLoader;
     private final TaskExecutor _taskExecutor;
     private final BrokerOptions _brokerOptions;
@@ -61,12 +62,12 @@ public class DefaultRecovererProvider im
             LogRecorder logRecorder, RootMessageLogger rootMessageLogger, TaskExecutor taskExecutor, BrokerOptions brokerOptions)
     {
         _authenticationProviderFactory = new AuthenticationProviderFactory(new QpidServiceLoader<AuthenticationManagerFactory>());
+        _groupProviderFactory = new GroupProviderFactory(new QpidServiceLoader<GroupManagerFactory>());
         _portFactory = new PortFactory();
         _brokerStatisticsGatherer = brokerStatisticsGatherer;
         _virtualHostRegistry = virtualHostRegistry;
         _logRecorder = logRecorder;
         _rootMessageLogger = rootMessageLogger;
-        _groupManagerServiceLoader = new QpidServiceLoader<GroupManagerFactory>();
         _pluginFactoryServiceLoader = new QpidServiceLoader<PluginFactory>();
         _taskExecutor = taskExecutor;
         _brokerOptions = brokerOptions;
@@ -77,7 +78,7 @@ public class DefaultRecovererProvider im
     {
         if (Broker.class.getSimpleName().equals(type))
         {
-            return new BrokerRecoverer(_authenticationProviderFactory, _portFactory, _brokerStatisticsGatherer, _virtualHostRegistry,
+            return new BrokerRecoverer(_authenticationProviderFactory, _groupProviderFactory, _portFactory, _brokerStatisticsGatherer, _virtualHostRegistry,
                     _logRecorder, _rootMessageLogger, _taskExecutor, _brokerOptions);
         }
         else if(VirtualHost.class.getSimpleName().equals(type))
@@ -94,7 +95,7 @@ public class DefaultRecovererProvider im
         }
         else if(GroupProvider.class.getSimpleName().equals(type))
         {
-            return new GroupProviderRecoverer(_groupManagerServiceLoader);
+            return new GroupProviderRecoverer(_groupProviderFactory);
         }
         else if(KeyStore.class.getSimpleName().equals(type))
         {

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/GroupProviderRecoverer.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/GroupProviderRecoverer.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/GroupProviderRecoverer.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/startup/GroupProviderRecoverer.java Fri Apr 19 15:50:21 2013
@@ -24,24 +24,20 @@ import java.util.Map;
 
 import org.apache.qpid.server.configuration.ConfigurationEntry;
 import org.apache.qpid.server.configuration.ConfiguredObjectRecoverer;
-import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.configuration.RecovererProvider;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.GroupProvider;
-import org.apache.qpid.server.model.adapter.GroupProviderAdapter;
-import org.apache.qpid.server.plugin.GroupManagerFactory;
-import org.apache.qpid.server.plugin.QpidServiceLoader;
-import org.apache.qpid.server.security.group.GroupManager;
+import org.apache.qpid.server.model.adapter.GroupProviderFactory;
 
 public class GroupProviderRecoverer implements ConfiguredObjectRecoverer<GroupProvider>
 {
-    private QpidServiceLoader<GroupManagerFactory> _groupManagerServiceLoader;
+    private GroupProviderFactory _groupProviderFactory;
 
-    public GroupProviderRecoverer(QpidServiceLoader<GroupManagerFactory> groupManagerServiceLoader)
+    public GroupProviderRecoverer(GroupProviderFactory groupProviderFactory)
     {
         super();
-        _groupManagerServiceLoader = groupManagerServiceLoader;
+        _groupProviderFactory = groupProviderFactory;
     }
 
     @Override
@@ -49,26 +45,9 @@ public class GroupProviderRecoverer impl
     {
         Broker broker = RecovererHelper.verifyOnlyBrokerIsParent(parents);
         Map<String, Object> attributes = configurationEntry.getAttributes();
-        GroupManager groupManager = createGroupManager(attributes);
-        if (groupManager == null)
-        {
-            throw new IllegalConfigurationException("Cannot create GroupManager from attributes : " + attributes);
-        }
-        GroupProviderAdapter groupProviderAdapter = new GroupProviderAdapter(configurationEntry.getId(), groupManager, broker);
-        return groupProviderAdapter;
-    }
 
-    private GroupManager createGroupManager(Map<String, Object> attributes)
-    {
-        for(GroupManagerFactory factory : _groupManagerServiceLoader.instancesOf(GroupManagerFactory.class))
-        {
-            GroupManager groupManager = factory.createInstance(attributes);
-            if (groupManager != null)
-            {
-               return groupManager;
-            }
-        }
-        return null;
-    }
+        GroupProvider groupProvider = _groupProviderFactory.recover(configurationEntry.getId(), broker, attributes);
 
+        return groupProvider;
+    }
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Broker.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Broker.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Broker.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Broker.java Fri Apr 19 15:50:21 2013
@@ -86,12 +86,6 @@ public interface Broker extends Configur
      */
     String ACL_FILE = "aclFile";
 
-    /*
-     * A temporary attributes to set the broker group file.
-     * TODO: Remove them after adding a full support to configure authorization providers via management layers.
-     */
-    String GROUP_FILE = "groupFile";
-
     // Attributes
     Collection<String> AVAILABLE_ATTRIBUTES =
             Collections.unmodifiableList(
@@ -134,7 +128,6 @@ public interface Broker extends Configur
                               VIRTUALHOST_STORE_TRANSACTION_IDLE_TIMEOUT_WARN,
                               VIRTUALHOST_STORE_TRANSACTION_OPEN_TIMEOUT_CLOSE,
                               VIRTUALHOST_STORE_TRANSACTION_OPEN_TIMEOUT_WARN,
-                              GROUP_FILE,
                               ACL_FILE
                               ));
 

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/BrokerAdapter.java Fri Apr 19 15:50:21 2013
@@ -63,8 +63,6 @@ import org.apache.qpid.server.security.S
 import org.apache.qpid.server.security.access.Operation;
 import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
 import org.apache.qpid.server.security.auth.manager.SimpleAuthenticationManager;
-import org.apache.qpid.server.security.group.FileGroupManager;
-import org.apache.qpid.server.security.group.GroupManager;
 import org.apache.qpid.server.stats.StatisticsGatherer;
 import org.apache.qpid.server.store.MessageStoreCreator;
 import org.apache.qpid.server.util.MapValueConverter;
@@ -97,7 +95,6 @@ public class BrokerAdapter extends Abstr
         put(NAME, String.class);
         put(DEFAULT_VIRTUAL_HOST, String.class);
 
-        put(GROUP_FILE, String.class);
         put(VIRTUALHOST_STORE_TRANSACTION_IDLE_TIMEOUT_CLOSE, Long.class);
         put(VIRTUALHOST_STORE_TRANSACTION_IDLE_TIMEOUT_WARN, Long.class);
         put(VIRTUALHOST_STORE_TRANSACTION_OPEN_TIMEOUT_CLOSE, Long.class);
@@ -123,7 +120,6 @@ public class BrokerAdapter extends Abstr
     public static final long DEFAULT_STORE_TRANSACTION_IDLE_TIMEOUT_WARN = 0l;
     public static final long DEFAULT_STORE_TRANSACTION_OPEN_TIMEOUT_CLOSE = 0l;
     public static final long DEFAULT_STORE_TRANSACTION_OPEN_TIMEOUT_WARN = 0l;
-    private static final String DEFAULT_GROUP_PROVIDER_NAME = "defaultGroupProvider";
 
     @SuppressWarnings("serial")
     private static final Map<String, Object> DEFAULTS = Collections.unmodifiableMap(new HashMap<String, Object>(){{
@@ -170,6 +166,7 @@ public class BrokerAdapter extends Abstr
     private final Map<String, KeyStore> _keyStores = new HashMap<String, KeyStore>();
     private final Map<String, TrustStore> _trustStores = new HashMap<String, TrustStore>();
 
+    private final GroupProviderFactory _groupProviderFactory;
     private final AuthenticationProviderFactory _authenticationProviderFactory;
 
     private final PortFactory _portFactory;
@@ -183,7 +180,8 @@ public class BrokerAdapter extends Abstr
 
     public BrokerAdapter(UUID id, Map<String, Object> attributes, StatisticsGatherer statisticsGatherer, VirtualHostRegistry virtualHostRegistry,
             LogRecorder logRecorder, RootMessageLogger rootMessageLogger, AuthenticationProviderFactory authenticationProviderFactory,
-            PortFactory portFactory, TaskExecutor taskExecutor, ConfigurationEntryStore brokerStore, BrokerOptions brokerOptions)
+            GroupProviderFactory groupProviderFactory, PortFactory portFactory, TaskExecutor taskExecutor, ConfigurationEntryStore brokerStore,
+            BrokerOptions brokerOptions)
     {
         super(id, DEFAULTS,  MapValueConverter.convert(attributes, ATTRIBUTE_TYPES), taskExecutor);
         _statisticsGatherer = statisticsGatherer;
@@ -192,14 +190,13 @@ public class BrokerAdapter extends Abstr
         _rootMessageLogger = rootMessageLogger;
         _statistics = new StatisticsAdapter(statisticsGatherer);
         _authenticationProviderFactory = authenticationProviderFactory;
+        _groupProviderFactory = groupProviderFactory;
         _portFactory = portFactory;
         _securityManager = new SecurityManager((String)getAttribute(ACL_FILE));
         addChangeListener(_securityManager);
-        createBrokerChildrenFromAttributes();
         _supportedStoreTypes = new MessageStoreCreator().getStoreTypes();
         _brokerStore = brokerStore;
         _brokerOptions = brokerOptions;
-        createBrokerChildrenFromAttributes();
         if (_brokerOptions.isManagementMode())
         {
             AuthenticationManager authManager = new SimpleAuthenticationManager(BrokerOptions.MANAGEMENT_MODE_USER_NAME, _brokerOptions.getManagementModePassword());
@@ -209,32 +206,6 @@ public class BrokerAdapter extends Abstr
         }
     }
 
-    /*
-     * A temporary method to create broker children that can be only configured via broker attributes
-     */
-    private void createBrokerChildrenFromAttributes()
-    {
-        createGroupProvider();
-
-    }
-
-    private void createGroupProvider()
-    {
-        String groupFile = (String) getAttribute(GROUP_FILE);
-        if (groupFile != null)
-        {
-            GroupManager groupManager = new FileGroupManager(groupFile);
-            UUID groupProviderId = UUIDGenerator.generateBrokerChildUUID(GroupProvider.class.getSimpleName(),
-                    DEFAULT_GROUP_PROVIDER_NAME);
-            GroupProviderAdapter groupProviderAdapter = new GroupProviderAdapter(groupProviderId, groupManager, this);
-            _groupProviders.put(DEFAULT_GROUP_PROVIDER_NAME, groupProviderAdapter);
-        }
-        else
-        {
-            _groupProviders.remove(DEFAULT_GROUP_PROVIDER_NAME);
-        }
-    }
-
     public Collection<VirtualHost> getVirtualHosts()
     {
         synchronized(_vhostAdapters)
@@ -462,6 +433,10 @@ public class BrokerAdapter extends Abstr
         {
             return (C) createTrustStore(attributes);
         }
+        else if(childClass == GroupProvider.class)
+        {
+            return (C) createGroupProvider(attributes);
+        }
         else
         {
             throw new IllegalArgumentException("Cannot create child of class " + childClass.getSimpleName());
@@ -535,6 +510,14 @@ public class BrokerAdapter extends Abstr
         authenticationProvider.addChangeListener(this);
     }
 
+    private GroupProvider createGroupProvider(Map<String, Object> attributes)
+    {
+        GroupProvider groupProvider = _groupProviderFactory.create(UUID.randomUUID(), this, attributes);
+        groupProvider.setDesiredState(State.INITIALISING, State.ACTIVE);
+        addGroupProvider(groupProvider);
+        return groupProvider;
+    }
+
     private void addGroupProvider(GroupProvider groupProvider)
     {
         synchronized (_groupProviders)
@@ -549,9 +532,20 @@ public class BrokerAdapter extends Abstr
         groupProvider.addChangeListener(this);
     }
 
-    private boolean deleteGroupProvider(GroupProvider object)
+    private boolean deleteGroupProvider(GroupProvider groupProvider)
     {
-        throw new UnsupportedOperationException("Not implemented yet!");
+        GroupProvider removedGroupProvider = null;
+        synchronized (_groupProviders)
+        {
+            removedGroupProvider = _groupProviders.remove(groupProvider.getName());
+        }
+
+        if(removedGroupProvider != null)
+        {
+            removedGroupProvider.removeChangeListener(this);
+        }
+
+        return removedGroupProvider != null;
     }
 
     private KeyStore createKeyStore(Map<String, Object> attributes)
@@ -724,6 +718,12 @@ public class BrokerAdapter extends Abstr
         {
             removedPort = _portAdapters.remove(portAdapter.getPort());
         }
+
+        if (removedPort != null)
+        {
+            removedPort.removeChangeListener(this);
+        }
+
         return removedPort != null;
     }
 
@@ -734,6 +734,12 @@ public class BrokerAdapter extends Abstr
         {
             removedAuthenticationProvider = _authenticationProviders.remove(authenticationProvider.getId());
         }
+
+        if(removedAuthenticationProvider != null)
+        {
+            removedAuthenticationProvider.removeChangeListener(this);
+        }
+
         return removedAuthenticationProvider != null;
     }
 
@@ -1030,11 +1036,6 @@ public class BrokerAdapter extends Abstr
                 Object expected = getAttribute(name);
                 if (changeAttribute(name, expected, desired))
                 {
-                    if (GROUP_FILE.equals(name))
-                    {
-                        createGroupProvider();
-                    }
-
                     attributeSet(name, expected, desired);
                 }
             }
@@ -1049,12 +1050,6 @@ public class BrokerAdapter extends Abstr
             // create a security manager to validate the ACL specified in file
             new SecurityManager(aclFile);
         }
-        String groupFile = (String) convertedAttributes.get(GROUP_FILE);
-        if (groupFile != null)
-        {
-            // create a group manager to validate the groups specified in file
-            new FileGroupManager(groupFile);
-        }
 
         String defaultVirtualHost = (String) convertedAttributes.get(DEFAULT_VIRTUAL_HOST);
         if (defaultVirtualHost != null)

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderAdapter.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderAdapter.java Fri Apr 19 15:50:21 2013
@@ -24,6 +24,7 @@ import java.security.Principal;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
@@ -48,9 +49,11 @@ public class GroupProviderAdapter extend
 {
     private final GroupManager _groupManager;
     private final Broker _broker;
-    public GroupProviderAdapter(UUID id, GroupManager groupManager, Broker broker)
+    private Collection<String> _supportedAttributes;
+
+    public GroupProviderAdapter(UUID id, Broker broker, GroupManager groupManager, Map<String, Object> attributes, Collection<String> attributeNames)
     {
-        super(id, broker.getTaskExecutor());
+        super(id, null, null, broker.getTaskExecutor());
 
         if (groupManager == null)
         {
@@ -58,13 +61,37 @@ public class GroupProviderAdapter extend
         }
         _groupManager = groupManager;
         _broker = broker;
+        _supportedAttributes = createSupportedAttributes(attributeNames);
        addParent(Broker.class, broker);
+
+       // set attributes now after all attribute names are known
+       if (attributes != null)
+       {
+           for (String name : _supportedAttributes)
+           {
+               if (attributes.containsKey(name))
+               {
+                   changeAttribute(name, null, attributes.get(name));
+               }
+           }
+       }
+    }
+
+    protected Collection<String> createSupportedAttributes(Collection<String> factoryAttributes)
+    {
+        List<String> attributesNames = new ArrayList<String>(AVAILABLE_ATTRIBUTES);
+        if (factoryAttributes != null)
+        {
+            attributesNames.addAll(factoryAttributes);
+        }
+
+        return Collections.unmodifiableCollection(attributesNames);
     }
 
     @Override
     public String getName()
     {
-        return _groupManager.getClass().getSimpleName();
+        return (String)getAttribute(NAME);
     }
 
     @Override
@@ -129,17 +156,13 @@ public class GroupProviderAdapter extend
     @Override
     public Collection<String> getAttributeNames()
     {
-        return GroupProvider.AVAILABLE_ATTRIBUTES;
+        return _supportedAttributes;
     }
 
     @Override
     public Object getAttribute(String name)
     {
-        if (TYPE.equals(name))
-        {
-            return getName();
-        }
-        else if (CREATED.equals(name))
+        if (CREATED.equals(name))
         {
             // TODO
         }
@@ -155,10 +178,6 @@ public class GroupProviderAdapter extend
         {
             return LifetimePolicy.PERMANENT;
         }
-        else if (NAME.equals(name))
-        {
-            return getName();
-        }
         else if (STATE.equals(name))
         {
             return State.ACTIVE; // TODO
@@ -220,11 +239,91 @@ public class GroupProviderAdapter extend
         }
     }
 
+    public GroupManager getGroupManager()
+    {
+        return _groupManager;
+    }
+
     private SecurityManager getSecurityManager()
     {
         return _broker.getSecurityManager();
     }
 
+    @Override
+    protected boolean setState(State currentState, State desiredState)
+    {
+        if (desiredState == State.ACTIVE)
+        {
+            _groupManager.open();
+            return true;
+        }
+        else if (desiredState == State.STOPPED)
+        {
+            _groupManager.close();
+            return true;
+        }
+        else if (desiredState == State.DELETED)
+        {
+            _groupManager.close();
+            _groupManager.onDelete();
+            return true;
+        }
+        return false;
+    }
+
+    public Set<Principal> getGroupPrincipalsForUser(String username)
+    {
+        return _groupManager.getGroupPrincipalsForUser(username);
+    }
+
+    @Override
+    protected void childAdded(ConfiguredObject child)
+    {
+        // no-op, prevent storing groups in the broker store
+    }
+
+    @Override
+    protected void childRemoved(ConfiguredObject child)
+    {
+        // no-op, as per above, groups are not in the store
+    }
+
+    @Override
+    protected void authoriseSetDesiredState(State currentState, State desiredState) throws AccessControlException
+    {
+        if(desiredState == State.DELETED)
+        {
+            if (!_broker.getSecurityManager().authoriseConfiguringBroker(getName(), GroupProvider.class, Operation.DELETE))
+            {
+                throw new AccessControlException("Deletion of groups provider is denied");
+            }
+        }
+    }
+
+    @Override
+    protected void authoriseSetAttribute(String name, Object expected, Object desired) throws AccessControlException
+    {
+        if (!_broker.getSecurityManager().authoriseConfiguringBroker(getName(), GroupProvider.class, Operation.UPDATE))
+        {
+            throw new AccessControlException("Setting of group provider attributes is denied");
+        }
+    }
+
+    @Override
+    protected void authoriseSetAttributes(Map<String, Object> attributes) throws AccessControlException
+    {
+        if (!_broker.getSecurityManager().authoriseConfiguringBroker(getName(), GroupProvider.class, Operation.UPDATE))
+        {
+            throw new AccessControlException("Setting of group provider attributes is denied");
+        }
+    }
+
+    @Override
+    protected void changeAttributes(Map<String, Object> attributes)
+    {
+        throw new UnsupportedOperationException("Changing attributes on group providers is not supported.");
+    }
+
     private class GroupAdapter extends AbstractAdapter implements Group
     {
         private final String _group;
@@ -526,23 +625,5 @@ public class GroupProviderAdapter extend
         }
     }
 
-    @Override
-    protected boolean setState(State currentState, State desiredState)
-    {
-        if (desiredState == State.ACTIVE)
-        {
-            return true;
-        }
-        else if (desiredState == State.STOPPED)
-        {
-            return true;
-        }
-        // TODO: DELETE state is ignored for now
-        return false;
-    }
 
-    public Set<Principal> getGroupPrincipalsForUser(String username)
-    {
-        return _groupManager.getGroupPrincipalsForUser(username);
-    }
 }

Added: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderFactory.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderFactory.java?rev=1469916&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderFactory.java (added)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/GroupProviderFactory.java Fri Apr 19 15:50:21 2013
@@ -0,0 +1,118 @@
+/*
+ *
+ * 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.model.adapter;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.model.Broker;
+import org.apache.qpid.server.model.GroupProvider;
+import org.apache.qpid.server.plugin.GroupManagerFactory;
+import org.apache.qpid.server.plugin.QpidServiceLoader;
+import org.apache.qpid.server.security.group.GroupManager;
+
+public class GroupProviderFactory
+{
+    private final Map<String, GroupManagerFactory> _factories;
+    private Collection<String> _supportedGroupProviders;
+
+    public GroupProviderFactory(QpidServiceLoader<GroupManagerFactory> groupManagerFactoryServiceLoader)
+    {
+        Iterable<GroupManagerFactory> factories = groupManagerFactoryServiceLoader.instancesOf(GroupManagerFactory.class);
+
+        Map<String, GroupManagerFactory> registeredGroupProviderFactories = new HashMap<String, GroupManagerFactory>();
+        for (GroupManagerFactory factory : factories)
+        {
+            GroupManagerFactory existingFactory = registeredGroupProviderFactories.put(factory.getType(), factory);
+            if (existingFactory != null)
+            {
+                throw new IllegalConfigurationException("Group provider factory of the same type '" + factory.getType()
+                        + "' is already registered using class '" + existingFactory.getClass().getName()
+                        + "', can not register class '" + factory.getClass().getName() + "'");
+            }
+        }
+        _factories = registeredGroupProviderFactories;
+        _supportedGroupProviders = Collections.unmodifiableCollection(registeredGroupProviderFactories.keySet());
+    }
+
+    /**
+     * Creates {@link GroupProvider} for given ID, {@link Broker} and attributes.
+     * <p>
+     * The configured {@link GroupManagerFactory}'s are used to try to create the {@link GroupProvider}. The first non-null
+     * instance is returned. The factories are used in non-deterministic order.
+     */
+    public GroupProvider create(UUID id, Broker broker, Map<String, Object> attributes)
+    {
+        GroupProviderAdapter authenticationProvider = createGroupProvider(id, broker, attributes);
+        authenticationProvider.getGroupManager().onCreate();
+        return authenticationProvider;
+    }
+
+    /**
+     * Recovers {@link GroupProvider} with given ID, {@link Broker} and attributes.
+     * <p>
+     * The configured {@link GroupManagerFactory}'s are used to try to create the {@link GroupProvider}. The first non-null
+     * instance is returned. The factories are used in non-deterministic order.
+     */
+    public GroupProvider recover(UUID id, Broker broker, Map<String, Object> attributes)
+    {
+        return createGroupProvider(id, broker, attributes);
+    }
+
+    public Collection<String> getSupportedGroupProviders()
+    {
+        return _supportedGroupProviders;
+    }
+
+    private GroupProviderAdapter createGroupProvider(UUID id, Broker broker, Map<String, Object> attributes)
+    {
+        for (GroupManagerFactory factory : _factories.values())
+        {
+            GroupManager manager = factory.createInstance(attributes);
+            if (manager != null)
+            {
+                verifyGroupManager(manager, broker);
+                return new GroupProviderAdapter(id, broker, manager, attributes,factory.getAttributeNames());
+            }
+        }
+        throw new IllegalConfigurationException("No group provider factory found for configuration attributes " + attributes);
+    }
+
+    private void verifyGroupManager(GroupManager manager, Broker broker)
+    {
+        Collection<GroupProvider> groupProviders = broker.getGroupProviders();
+        for (GroupProvider groupProvider : groupProviders)
+        {
+            if (groupProvider instanceof GroupProviderAdapter)
+            {
+                GroupManager providerManager = ((GroupProviderAdapter) groupProvider).getGroupManager();
+                if (manager.equals(providerManager))
+                {
+                    throw new IllegalConfigurationException("A group provider with the same settings already exists");
+                }
+            }
+        }
+    }
+}

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugin/GroupManagerFactory.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugin/GroupManagerFactory.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugin/GroupManagerFactory.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/plugin/GroupManagerFactory.java Fri Apr 19 15:50:21 2013
@@ -18,11 +18,34 @@
  */
 package org.apache.qpid.server.plugin;
 
+import java.util.Collection;
 import java.util.Map;
 
+import org.apache.qpid.server.model.GroupProvider;
 import org.apache.qpid.server.security.group.GroupManager;
 
 public interface GroupManagerFactory
 {
+    public static final String ATTRIBUTE_TYPE = GroupProvider.TYPE;
+
     GroupManager createInstance(Map<String, Object> attributes);
+
+    /**
+     * Returns the authentication provider type
+     * @return authentication provider type
+     */
+    String getType();
+
+    /**
+     * Get the names of attributes the group manager which can be passed into {@link #createInstance(Map)} to create the
+     * group manager
+     *
+     * @return the collection of attribute names
+     */
+    Collection<String> getAttributeNames();
+
+    /**
+     * @return returns human readable descriptions for the attributes
+     */
+    Map<String, String> getAttributeDescriptions();
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/FileGroupManager.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/FileGroupManager.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/FileGroupManager.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/FileGroupManager.java Fri Apr 19 15:50:21 2013
@@ -19,6 +19,7 @@
  */
 package org.apache.qpid.server.security.group;
 
+import java.io.File;
 import java.io.IOException;
 import java.security.Principal;
 import java.util.Collections;
@@ -34,32 +35,26 @@ import org.apache.qpid.server.security.a
  * This plugin is configured in the following manner:
  * </p>
  * <pre>
- * &lt;file-group-manager&gt;
- *    &lt;attributes&gt;
- *       &lt;attribute&gt;
- *            &lt;name>groupFile&lt;/name&gt;
- *            &lt;value>${conf}/groups&lt;/value&gt;
- *        &lt;/attribute&gt;
- *    &lt;/attributes&gt;
- * &lt;/file-group-manager&gt;
+ * "groupproviders":[
+ * ...
+ * {
+ *  "name" : "...",
+ *  "type" : "GroupFile",
+ *  "path" : "path/to/file/with/groups",
+ * }
+ * ...
+ * ]
  * </pre>
  */
 public class FileGroupManager implements GroupManager
 {
     private final FileGroupDatabase _groupDatabase;
-
+    private final String _groupFile;
 
     public FileGroupManager(String groupFile)
     {
+        _groupFile = groupFile;
         _groupDatabase = new FileGroupDatabase();
-        try
-        {
-            _groupDatabase.setGroupFile(groupFile);
-        }
-        catch (IOException e)
-        {
-            throw new IllegalConfigurationException("Unable to set group file " + groupFile, e);
-        }
     }
 
     @Override
@@ -144,4 +139,101 @@ public class FileGroupManager implements
 
     }
 
+    @Override
+    public void onDelete()
+    {
+        File file = new File(_groupFile);
+        if (file.exists())
+        {
+            if (!file.delete())
+            {
+                throw new IllegalConfigurationException("Cannot delete group file");
+            }
+        }
+    }
+
+    @Override
+    public void onCreate()
+    {
+        File file = new File(_groupFile);
+        if (!file.exists())
+        {
+            File parent = file.getParentFile();
+            if (!parent.exists())
+            {
+                parent.mkdirs();
+            }
+            if (parent.exists())
+            {
+                try
+                {
+                    file.createNewFile();
+                }
+                catch (IOException e)
+                {
+                    throw new IllegalConfigurationException("Cannot create group file");
+                }
+            }
+            else
+            {
+                throw new IllegalConfigurationException("Cannot create group file");
+            }
+        }
+    }
+
+    @Override
+    public void open()
+    {
+        try
+        {
+            _groupDatabase.setGroupFile(_groupFile);
+        }
+        catch (IOException e)
+        {
+            throw new IllegalConfigurationException("Unable to set group file " + _groupFile, e);
+        }
+    }
+
+    @Override
+    public void close()
+    {
+        // no-op
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return ((_groupFile == null) ? 0 : _groupFile.hashCode());
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        if (this == obj)
+        {
+            return true;
+        }
+        if (obj == null)
+        {
+            return false;
+        }
+        if (getClass() != obj.getClass())
+        {
+            return false;
+        }
+        FileGroupManager other = (FileGroupManager) obj;
+        if (_groupFile == null)
+        {
+            if (other._groupFile != null)
+            {
+                return false;
+            }
+            else
+            {
+                return true;
+            }
+        }
+        return _groupFile.equals(other._groupFile);
+    }
+
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/FileGroupManagerFactory.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/FileGroupManagerFactory.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/FileGroupManagerFactory.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/FileGroupManagerFactory.java Fri Apr 19 15:50:21 2013
@@ -20,32 +20,60 @@ package org.apache.qpid.server.security.
 
 import static org.apache.qpid.server.util.MapValueConverter.getStringAttribute;
 
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Map;
 
-import org.apache.commons.lang.StringUtils;
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
-import org.apache.qpid.server.model.GroupProvider;
 import org.apache.qpid.server.plugin.GroupManagerFactory;
+import org.apache.qpid.server.util.ResourceBundleLoader;
 
 public class FileGroupManagerFactory implements GroupManagerFactory
 {
-    static final String FILE_GROUP_MANAGER_TYPE = "file-group-manager";
-    static final String FILE = "file";
+    public static final String RESOURCE_BUNDLE = "org.apache.qpid.server.security.group.FileGroupProviderAttributeDescriptions";
+
+    public static final String GROUP_FILE_PROVIDER_TYPE = "GroupFile";
+    public static final String PATH = "path";
+
+    public static final Collection<String> ATTRIBUTES = Collections.<String> unmodifiableList(Arrays.asList(
+            ATTRIBUTE_TYPE,
+            PATH
+            ));
 
     @Override
     public GroupManager createInstance(Map<String, Object> attributes)
     {
-        if(!FILE_GROUP_MANAGER_TYPE.equals(getStringAttribute(GroupProvider.TYPE, attributes, null)))
+        if(attributes == null || !GROUP_FILE_PROVIDER_TYPE.equals(attributes.get(ATTRIBUTE_TYPE)))
         {
             return null;
         }
 
-        String groupFile =  getStringAttribute(FILE, attributes, null);
-        if (StringUtils.isBlank(groupFile))
+        String groupFile =  getStringAttribute(PATH, attributes, null);
+        if (groupFile == null || "".equals(groupFile.trim()))
         {
             throw new IllegalConfigurationException("Path to file containing groups is not specified!");
         }
+
         return new FileGroupManager(groupFile);
     }
 
+    @Override
+    public String getType()
+    {
+        return GROUP_FILE_PROVIDER_TYPE;
+    }
+
+    @Override
+    public Collection<String> getAttributeNames()
+    {
+        return ATTRIBUTES;
+    }
+
+    @Override
+    public Map<String, String> getAttributeDescriptions()
+    {
+        return ResourceBundleLoader.getResources(RESOURCE_BUNDLE);
+    }
+
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/GroupManager.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/GroupManager.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/GroupManager.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/security/group/GroupManager.java Fri Apr 19 15:50:21 2013
@@ -37,4 +37,12 @@ public interface GroupManager
     void addUserToGroup(String user, String group);
 
     void removeUserFromGroup(String user, String group);
+
+    void open();
+
+    void close();
+
+    void onDelete();
+
+    void onCreate();
 }

Modified: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/BrokerRecovererTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/BrokerRecovererTest.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/BrokerRecovererTest.java (original)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/BrokerRecovererTest.java Fri Apr 19 15:50:21 2013
@@ -49,6 +49,7 @@ import org.apache.qpid.server.model.Port
 import org.apache.qpid.server.model.TrustStore;
 import org.apache.qpid.server.model.VirtualHost;
 import org.apache.qpid.server.model.adapter.AuthenticationProviderFactory;
+import org.apache.qpid.server.model.adapter.GroupProviderFactory;
 import org.apache.qpid.server.model.adapter.PortFactory;
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.stats.StatisticsGatherer;
@@ -70,7 +71,7 @@ public class BrokerRecovererTest extends
     {
         super.setUp();
 
-        _brokerRecoverer = new BrokerRecoverer(mock(AuthenticationProviderFactory.class), mock(PortFactory.class), mock(StatisticsGatherer.class),
+        _brokerRecoverer = new BrokerRecoverer(mock(AuthenticationProviderFactory.class), mock(GroupProviderFactory.class), mock(PortFactory.class), mock(StatisticsGatherer.class),
                 mock(VirtualHostRegistry.class), mock(LogRecorder.class), mock(RootMessageLogger.class), mock(TaskExecutor.class), mock(BrokerOptions.class));
         when(_brokerEntry.getId()).thenReturn(_brokerId);
         when(_brokerEntry.getChildren()).thenReturn(_brokerEntryChildren);

Modified: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/GroupProviderRecovererTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/GroupProviderRecovererTest.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/GroupProviderRecovererTest.java (original)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/configuration/startup/GroupProviderRecovererTest.java Fri Apr 19 15:50:21 2013
@@ -30,6 +30,7 @@ import org.apache.qpid.server.configurat
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.GroupProvider;
+import org.apache.qpid.server.model.adapter.GroupProviderFactory;
 import org.apache.qpid.server.plugin.GroupManagerFactory;
 import org.apache.qpid.server.plugin.QpidServiceLoader;
 import org.apache.qpid.server.security.group.GroupManager;
@@ -46,6 +47,7 @@ public class GroupProviderRecovererTest 
     private QpidServiceLoader<GroupManagerFactory> _groupManagerServiceLoader;
     private Broker _broker;
     private ConfigurationEntry _configurationEntry;
+    private GroupProviderFactory _groupProviderFactory;
 
     @SuppressWarnings("unchecked")
     protected void setUp() throws Exception
@@ -58,6 +60,7 @@ public class GroupProviderRecovererTest 
 
         _groupManagerServiceLoader = mock(QpidServiceLoader.class);
         when(_groupManagerServiceLoader.instancesOf(GroupManagerFactory.class)).thenReturn(Collections.singletonList(_factory ));
+        _groupProviderFactory = new GroupProviderFactory(_groupManagerServiceLoader);
 
         _broker = mock(Broker.class);
 
@@ -70,8 +73,9 @@ public class GroupProviderRecovererTest 
     {
         GroupManager groupManager = mock(GroupManager.class);
         String name = groupManager.getClass().getSimpleName();
+        _attributes.put(GroupProvider.NAME, name);
         when(_factory.createInstance(_attributes)).thenReturn(groupManager);
-        GroupProviderRecoverer groupProviderRecoverer = new GroupProviderRecoverer(_groupManagerServiceLoader);
+        GroupProviderRecoverer groupProviderRecoverer = new GroupProviderRecoverer(_groupProviderFactory);
         GroupProvider groupProvider = groupProviderRecoverer.create(null, _configurationEntry, _broker);
         assertNotNull("Null group provider", groupProvider);
         assertEquals("Unexpected name", name, groupProvider.getName());
@@ -82,7 +86,7 @@ public class GroupProviderRecovererTest 
     {
         when(_factory.createInstance(_attributes)).thenReturn(null);
 
-        GroupProviderRecoverer groupProviderRecoverer = new GroupProviderRecoverer(_groupManagerServiceLoader);
+        GroupProviderRecoverer groupProviderRecoverer = new GroupProviderRecoverer(_groupProviderFactory);
         try
         {
             groupProviderRecoverer.create(null, _configurationEntry, _broker);

Modified: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/group/FileGroupManagerFactoryTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/group/FileGroupManagerFactoryTest.java?rev=1469916&r1=1469915&r2=1469916&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/group/FileGroupManagerFactoryTest.java (original)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/security/group/FileGroupManagerFactoryTest.java Fri Apr 19 15:50:21 2013
@@ -35,8 +35,8 @@ public class FileGroupManagerFactoryTest
 
     public void testInstanceCreated() throws Exception
     {
-        _configuration.put(GroupProvider.TYPE, FileGroupManagerFactory.FILE_GROUP_MANAGER_TYPE);
-        _configuration.put(FileGroupManagerFactory.FILE, _emptyButValidGroupFile);
+        _configuration.put(GroupProvider.TYPE, FileGroupManagerFactory.GROUP_FILE_PROVIDER_TYPE);
+        _configuration.put(FileGroupManagerFactory.PATH, _emptyButValidGroupFile);
 
         GroupManager manager = _factory.createInstance(_configuration);
         assertNotNull(manager);
@@ -60,8 +60,8 @@ public class FileGroupManagerFactoryTest
 
     public void testRejectsConfigThatIsMissingAttributeValue() throws Exception
     {
-        _configuration.put(GroupProvider.TYPE, FileGroupManagerFactory.FILE_GROUP_MANAGER_TYPE);
-        _configuration.put(FileGroupManagerFactory.FILE, null);
+        _configuration.put(GroupProvider.TYPE, FileGroupManagerFactory.GROUP_FILE_PROVIDER_TYPE);
+        _configuration.put(FileGroupManagerFactory.PATH, null);
 
         try
         {



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