You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2012/06/22 17:53:59 UTC

svn commit: r1352938 - in /qpid/branches/java-config-and-management/qpid/java: broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/ broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/re...

Author: rgodfrey
Date: Fri Jun 22 15:53:57 2012
New Revision: 1352938

URL: http://svn.apache.org/viewvc?rev=1352938&view=rev
Log:
QPID-3999 : Add user management to web console

Added:
    qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/
    qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/addUser.html
      - copied, changed from r1352496, qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/addExchange.html
    qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html
    qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/AuthenticationProvider.js
      - copied, changed from r1352496, qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js
    qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/authenticationprovider/
    qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js
    qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/showAuthProvider.html
    qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java
Modified:
    qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java
    qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
    qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js
    qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/controller.js
    qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/treeView.js
    qpid/branches/java-config-and-management/qpid/java/broker-web/src/main/resources/WEB-INF/web.xml
    qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java
    qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java
    qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java

Modified: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/Management.java Fri Jun 22 15:53:57 2012
@@ -92,6 +92,8 @@ public class Management
 
         addRestServlet(root, "broker", socketAddress);
         addRestServlet(root, "virtualhost", socketAddress, VirtualHost.class);
+        addRestServlet(root, "authenticationprovider", socketAddress, AuthenticationProvider.class);
+        addRestServlet(root, "user", socketAddress, AuthenticationProvider.class, User.class);
         addRestServlet(root, "exchange", socketAddress, VirtualHost.class, Exchange.class);
         addRestServlet(root, "queue", socketAddress, VirtualHost.class, Queue.class);
         addRestServlet(root, "connection", socketAddress, VirtualHost.class, Connection.class);

Modified: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java Fri Jun 22 15:53:57 2012
@@ -3,16 +3,19 @@ package org.apache.qpid.server.managemen
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.net.SocketAddress;
+import java.security.AccessControlException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import java.util.Set;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
@@ -22,6 +25,7 @@ import org.apache.qpid.AMQSecurityExcept
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Model;
+import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.Statistics;
 import org.codehaus.jackson.map.ObjectMapper;
 import org.codehaus.jackson.map.SerializationConfig;
@@ -50,6 +54,10 @@ public class RestServlet extends Abstrac
     private static final String HIERARCHY_INIT_PARAMETER = "hierarchy";
 
     public static final String DEPTH_PARAM = "depth";
+    public static final String SORT_PARAM = "sort";
+
+    public static final Set<String> RESERVED_PARAMS = new HashSet<String>(Arrays.asList(DEPTH_PARAM, SORT_PARAM));
+
     private Class<? extends ConfiguredObject>[] _hierarchy;
 
     private volatile boolean initializationRequired = false;
@@ -214,7 +222,47 @@ public class RestServlet extends Abstrac
             }
         }
 
-        return parents;
+        return filter(parents, request);
+    }
+
+    private Collection<ConfiguredObject> filter(Collection<ConfiguredObject> objects, HttpServletRequest request)
+    {
+
+
+        Map<String, Collection<String>> filters = new HashMap<String, Collection<String>>();
+
+        for(String param : (Collection<String>) Collections.list(request.getParameterNames()))
+        {
+            if(!RESERVED_PARAMS.contains(param))
+            {
+                filters.put(param, Arrays.asList(request.getParameterValues(param)));
+            }
+        }
+
+        if(filters.isEmpty())
+        {
+            return objects;
+        }
+
+        Collection<ConfiguredObject> filteredObj = new ArrayList<ConfiguredObject>(objects);
+
+        Iterator<ConfiguredObject> iter = filteredObj.iterator();
+
+        while(iter.hasNext())
+        {
+            ConfiguredObject obj = iter.next();
+            for(Map.Entry<String, Collection<String>> entry : filters.entrySet())
+            {
+                Object value = obj.getAttribute(entry.getKey());
+                if(!entry.getValue().contains(String.valueOf(value)))
+                {
+                    iter.remove();
+                }
+            }
+
+        }
+
+        return filteredObj;
     }
 
     private Collection<? extends ConfiguredObject> getAncestors(Class<? extends ConfiguredObject> childType,
@@ -369,7 +417,6 @@ public class RestServlet extends Abstrac
         response.setContentType("application/json");
 
         ObjectMapper mapper = new ObjectMapper();
-
         @SuppressWarnings("unchecked")
         Map<String,Object> providedObject = mapper.readValue(request.getInputStream(), LinkedHashMap.class);
 
@@ -463,7 +510,6 @@ public class RestServlet extends Abstrac
             }
             ConfiguredObject theParent = parents.remove(0);
             ConfiguredObject[] otherParents = parents.toArray(new ConfiguredObject[parents.size()]);
-
             try
             {
                 theParent.createChild(objClass, providedObject, otherParents);
@@ -491,4 +537,28 @@ public class RestServlet extends Abstrac
         }
     }
 
+    @Override
+    protected void onDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+    {
+        response.setContentType("application/json");
+        response.setStatus(HttpServletResponse.SC_OK);
+
+        response.setHeader("Cache-Control","no-cache");
+        response.setHeader("Pragma","no-cache");
+        response.setDateHeader ("Expires", 0);
+        try
+        {
+            Collection<ConfiguredObject> allObjects = getObjects(request);
+            for(ConfiguredObject o : allObjects)
+            {
+                o.setDesiredState(o.getActualState(), State.DELETED);
+            }
+
+            response.setStatus(HttpServletResponse.SC_OK);
+        }
+        catch(RuntimeException e)
+        {
+            setResponseStatus(response, e);
+        }
+    }
 }

Copied: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/addUser.html (from r1352496, qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/addExchange.html)
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/addUser.html?p2=qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/addUser.html&p1=qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/addExchange.html&r1=1352496&r2=1352938&rev=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/addExchange.html (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/addUser.html Fri Jun 22 15:53:57 2012
@@ -19,34 +19,23 @@
  -
  -->
 <div class="dijitHidden">
-    <div data-dojo-type="dijit.Dialog" style="width:600px;" data-dojo-props="title:'Add Exchange'" id="addExchange">
-        <form id="formAddExchange" method="post" dojoType="dijit.form.Form">
+    <div data-dojo-type="dijit.Dialog" style="width:600px;" data-dojo-props="title:'Add User'" id="addUser">
+        <form id="formAddUser" method="post" dojoType="dijit.form.Form">
             <table cellpadding="0" cellspacing="2">
                 <tr>
-                    <td valign="top"><strong>Exchange Name*: </strong></td>
-                    <td><input type="text" required="true" name="name" id="formAddExchange.name" placeholder="Exchange Name"
+                    <td valign="top"><strong>User Name*: </strong></td>
+                    <td><input type="text" required="true" name="name" id="formAddUser.name" placeholder="User Name"
                         dojoType="dijit.form.ValidationTextBox" missingMessage="A name must be supplied" /></td>
                 </tr>
                 <tr>
-                    <td valign="top"><strong>Durable? </strong></td>
-                    <td><input type="checkbox" name="durable" id="formAddExchange.durable" value="durable" checked="checked" dojoType="dijit.form.CheckBox" /></td>
-                </tr>
-                <tr>
-                    <td valign="top"><strong>Exchange Type: </strong></td>
-                    <td>
-                        <select name="type" id="formAddExchange.type" dojoType="dijit.form.FilteringSelect">
-                            <option value="direct">direct</option>
-                            <option value="topic">topic</option>
-                            <option value="headers">headers</option>
-                            <option value="fanout">fanout</option>
-                        </select>
-                    </td>
+                    <td valign="top"><strong>Password*</strong></td>
+                    <td><input type="password" required="true" name="password" id="formAddUser.password" dojoType="dijit.form.ValidationTextBox"/></td>
                 </tr>
             </table>
             <br/>
 
             <!-- submit buttons -->
-            <input type="submit" value="Create Exchange" label="Create Exchange" dojoType="dijit.form.Button" />
+            <input type="submit" value="Create User" label="Create User" dojoType="dijit.form.Button" />
 
         </form>
     </div>

Added: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html?rev=1352938&view=auto
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html (added)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/authenticationprovider/showPrincipalDatabaseAuthenticationManager.html Fri Jun 22 15:53:57 2012
@@ -0,0 +1,29 @@
+<!--
+ -
+ - 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.
+ -
+ -->
+<div class="PrincipalDatabaseAuthenticationManager">
+    <div data-dojo-type="dijit.TitlePane" data-dojo-props="title: 'Users'">
+        <div class="users"></div>
+        <button data-dojo-type="dijit.form.Button" class="addUserButton">Add User</button>
+        <button data-dojo-type="dijit.form.Button" class="deleteUserButton">Delete Users</button>
+
+    </div>
+
+</div>

Copied: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/AuthenticationProvider.js (from r1352496, qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js)
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/AuthenticationProvider.js?p2=qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/AuthenticationProvider.js&p1=qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js&r1=1352496&r2=1352938&rev=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/AuthenticationProvider.js Fri Jun 22 15:53:57 2012
@@ -32,174 +32,91 @@ define(["dojo/_base/xhr",
         "dojo/domReady!"],
        function (xhr, parser, query, connect, properties, updater, util, UpdatableStore, EnhancedGrid) {
 
-           function Broker(name, parent, controller) {
+           function AuthenticationProvider(name, parent, controller) {
                this.name = name;
                this.controller = controller;
-               this.modelObj = { type: "broker", name: name };
+               this.modelObj = { type: "authenticationprovider", name: name };
                if(parent) {
                     this.modelObj.parent = {};
                     this.modelObj.parent[ parent.type] = parent;
                 }
            }
 
-           Broker.prototype.getTitle = function()
-           {
-               return "Broker";
+           AuthenticationProvider.prototype.getTitle = function() {
+               return "AuthenticationProvider";
            };
 
-           Broker.prototype.open = function(contentPane) {
+           AuthenticationProvider.prototype.open = function(contentPane) {
                var that = this;
                this.contentPane = contentPane;
-               xhr.get({url: "showBroker.html",
+               xhr.get({url: "showAuthProvider.html",
                         sync: true,
                         load:  function(data) {
                             contentPane.containerNode.innerHTML = data;
                             parser.parse(contentPane.containerNode);
 
-                            that.brokerUpdater = new BrokerUpdater(contentPane.containerNode, that.modelObj, that.controller);
+                            that.authProviderAdapter = new AuthProviderUpdater(contentPane.containerNode, that.modelObj, that.controller);
 
-                            updater.add( that.brokerUpdater );
+                            updater.add( that.authProviderAdapter );
 
-                            that.brokerUpdater.update();
+                            that.authProviderAdapter.update();
 
                         }});
            };
 
-           Broker.prototype.close = function() {
-               updater.remove( this.brokerUpdater );
+           AuthenticationProvider.prototype.close = function() {
+               updater.remove( this.authProviderAdapter );
            };
 
-           function BrokerUpdater(node, brokerObj, controller)
+           function AuthProviderUpdater(node, authProviderObj, controller)
            {
                this.controller = controller;
-               this.name = query(".broker-name", node)[0];
+               this.name = query(".name", node)[0];
                /*this.state = dom.byId("state");
                this.durable = dom.byId("durable");
                this.lifetimePolicy = dom.byId("lifetimePolicy");
                */
-               this.query = "rest/broker";
+               this.query = "rest/authenticationprovider/"+encodeURIComponent(authProviderObj.name);
 
                var that = this;
 
                xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"})
                    .then(function(data)
                          {
-                             that.brokerData = data[0];
+                             that.authProviderData = data[0];
 
-                             util.flattenStatistics( that.brokerData );
+                             util.flattenStatistics( that.authProviderData );
 
                              that.updateHeader();
-                             that.vhostsGrid =
-                                new UpdatableStore(that.brokerData.vhosts, query(".broker-virtualhosts")[0],
-                                                [ { name: "Virtual Host",    field: "name",      width: "120px"},
-                                                    { name: "Connections",    field: "connectionCount",      width: "80px"},
-                                                    { name: "Queues",    field: "queueCount",      width: "80px"},
-                                                    { name: "Exchanges",    field: "exchangeCount",      width: "100%"}
-                                                ], 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("virtualhost", name, brokerObj);
-                                                        });
-                                                });
-
-                             that.portsGrid =
-                                new UpdatableStore(that.brokerData.ports, query(".broker-ports")[0],
-                                                [ { name: "Address",    field: "bindingAddress",      width: "70px"},
-                                                    { name: "Port", field: "port", width: "70px"},
-                                                    { name: "Transports", field: "transports", width: "150px"},
-                                                    { name: "Protocols", field: "protocols", width: "100%"}
-                                                ], 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("port", name, brokerObj);
-                                                        });
-                                                });
-
-                         });
 
-               xhr.get({url: "rest/logrecords", sync: properties.useSyncGet, handleAs: "json"})
-                   .then(function(data)
-                         {
-                             that.logData = data;
+                             require(["qpid/management/authenticationprovider/"+that.authProviderData.type],
+                                 function(SpecificProvider) {
+                                 that.details = new SpecificProvider(node, authProviderObj, controller);
+                                 that.details.update();
+                             });
 
-                             var gridProperties = {
-                                 height: 400,
-                                 plugins: {
-                                          pagination: {
-                                              pageSizes: ["10", "25", "50", "100"],
-                                              description: true,
-                                              sizeSwitch: true,
-                                              pageStepper: true,
-                                              gotoButton: true,
-                                              maxPageStep: 4,
-                                              position: "bottom"
-                                          }
-                                 }};
-
-
-                             that.logfileGrid =
-                                new UpdatableStore(that.logData, query(".broker-logfile")[0],
-                                                [   { name: "Timestamp", field: "timestamp", width: "200px",
-                                                        formatter: function(val) {
-                                                        var d = new Date(0);
-                                                        d.setUTCSeconds(val/1000);
-
-                                                        return d.toLocaleString();
-                                                    }},
-                                                    { name: "Level", field: "level", width: "60px"},
-                                                    { name: "Logger", field: "logger", width: "280px"},
-                                                    { name: "Thread", field: "thread", width: "120px"},
-                                                    { name: "Log Message", field: "message", width: "100%"}
-
-                                                ], null, gridProperties, EnhancedGrid);
                          });
+
            }
 
-           BrokerUpdater.prototype.updateHeader = function()
+           AuthProviderUpdater.prototype.updateHeader = function()
            {
-               this.name.innerHTML = this.brokerData[ "name" ];
+               this.name.innerHTML = this.authProviderData[ "name" ];
     /*           this.state.innerHTML = this.brokerData[ "state" ];
                this.durable.innerHTML = this.brokerData[ "durable" ];
                this.lifetimePolicy.innerHTML = this.brokerData[ "lifetimePolicy" ];
 */
            };
 
-           BrokerUpdater.prototype.update = function()
+           AuthProviderUpdater.prototype.update = function()
            {
 
                var that = this;
 
-               xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}).then(function(data)
-                                                                                   {
-                                                                                       that.brokerData = data[0];
-                                                                                       util.flattenStatistics( that.brokerData );
-
-                                                                                       that.updateHeader();
-
-                                                                                       that.vhostsGrid.update(that.brokerData.virtualhosts);
-
-                                                                                       that.portsGrid.update(that.brokerData.ports);
-
-
-                                                                                   });
-
-
-               xhr.get({url: "rest/logrecords", sync: properties.useSyncGet, handleAs: "json"})
-                   .then(function(data)
-                         {
-                             that.logData = data;
-                             that.logfileGrid.update(that.logData);
-                         });
 
            };
 
 
 
-           return Broker;
-       });
\ No newline at end of file
+           return AuthenticationProvider;
+       });

Modified: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/Broker.js Fri Jun 22 15:53:57 2012
@@ -84,9 +84,9 @@ define(["dojo/_base/xhr",
                xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"})
                    .then(function(data)
                          {
-                             that.brokerData = data[0];
+                             that.brokerData= data[0];
 
-                             util.flattenStatistics( that.brokerData );
+                             util.flattenStatistics( that.brokerData);
 
                              that.updateHeader();
                              that.vhostsGrid =
@@ -202,4 +202,4 @@ define(["dojo/_base/xhr",
 
 
            return Broker;
-       });
\ No newline at end of file
+       });

Added: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js?rev=1352938&view=auto
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js (added)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/authenticationprovider/PrincipalDatabaseAuthenticationManager.js Fri Jun 22 15:53:57 2012
@@ -0,0 +1,260 @@
+/*
+ *
+ * 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/xhr",
+        "dojo/dom",
+        "dojo/parser",
+        "dojo/query",
+        "dojo/dom-construct",
+        "dojo/_base/connect",
+        "dojo/_base/window",
+        "dojo/_base/event",
+        "dojo/_base/json",
+        "dijit/registry",
+        "qpid/common/util",
+        "qpid/common/properties",
+        "qpid/common/updater",
+        "qpid/common/UpdatableStore",
+        "dojox/grid/EnhancedGrid",
+        "dojox/grid/enhanced/plugins/Pagination",
+        "dojox/grid/enhanced/plugins/IndirectSelection",
+        "dojox/validate/us", "dojox/validate/web",
+        "dijit/Dialog",
+        "dijit/form/TextBox",
+        "dijit/form/ValidationTextBox",
+        "dijit/form/TimeTextBox", "dijit/form/Button",
+        "dijit/form/Form",
+        "dijit/form/DateTextBox",
+        "dojo/domReady!"],
+    function (xhr, dom, parser, query, construct, connect, win, event, json, registry, util, properties, updater, UpdatableStore, EnhancedGrid) {
+        function DatabaseAuthManager(containerNode, authProviderObj, controller) {
+            var node = construct.create("div", null, containerNode, "last");
+            var that = this;
+            this.name = authProviderObj.name;
+            xhr.get({url: "authenticationprovider/showPrincipalDatabaseAuthenticationManager.html",
+                                    sync: true,
+                                    load:  function(data) {
+                                        node.innerHTML = data;
+                                        parser.parse(node);
+
+
+                                        that.authDatabaseUpdater= new AuthProviderUpdater(node, authProviderObj, controller);
+
+                                        updater.add( that.authDatabaseUpdater);
+
+                                        that.authDatabaseUpdater.update();
+
+
+                                    }});
+        }
+
+        DatabaseAuthManager.prototype.update = function() {
+            this.authDatabaseUpdater.update();
+        };
+
+        DatabaseAuthManager.prototype.close = function() {
+            updater.remove( this.authDatabaseUpdater );
+        };
+
+        function AuthProviderUpdater(node, authProviderObj, controller)
+        {
+            this.controller = controller;
+            this.query = "rest/authenticationprovider/"+encodeURIComponent(authProviderObj.name);
+            this.name = authProviderObj.name;
+            var that = this;
+
+            xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"})
+               .then(function(data) {
+                     that.authProviderData = data[0];
+
+                     util.flattenStatistics( that.authProviderData );
+
+                     var userDiv = query(".users")[0];
+
+                     var gridProperties = {
+                                            height: 400,
+                                            keepSelection: true,
+                                            plugins: {
+                                                      pagination: {
+                                                          pageSizes: ["10", "25", "50", "100"],
+                                                          description: true,
+                                                          sizeSwitch: true,
+                                                          pageStepper: true,
+                                                          gotoButton: true,
+                                                          maxPageStep: 4,
+                                                          position: "bottom"
+                                                      },
+                                                      indirectSelection: true
+
+                                             }};
+
+
+                     that.usersGrid =
+                        new UpdatableStore(that.authProviderData.users, userDiv,
+                                        [ { name: "User Name",    field: "name",      width: "100%" }
+                                        ], 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("virtualhost", name, brokerObj);
+                                                });
+                                        }, gridProperties, EnhancedGrid);
+
+
+                     var addUserButton = query(".addUserButton", node)[0];
+                     connect.connect(registry.byNode(addUserButton), "onClick", function(evt){ addUser.show(authProviderObj.name) });
+
+                     var deleteMessagesButton = query(".deleteUserButton", node)[0];
+                                                var deleteWidget = registry.byNode(deleteMessagesButton);
+                                                connect.connect(deleteWidget, "onClick",
+                                                                function(evt){
+                                                                    event.stop(evt);
+                                                                    that.deleteUsers();
+                                                                });
+                });
+        }
+
+        AuthProviderUpdater.prototype.deleteUsers = function()
+        {
+            var grid = this.usersGrid.grid;
+            var data = grid.selection.getSelected();
+            if(data.length) {
+                var that = this;
+                if(confirm("Delete " + data.length + " users?")) {
+                    var i, queryParam;
+                    for(i = 0; i<data.length; i++) {
+                        if(queryParam) {
+                            queryParam += "&";
+                        } else {
+                            queryParam = "?";
+                        }
+
+                        queryParam += "id=" + data[i].id;
+                    }
+                    var query = "rest/user/"+ encodeURIComponent(that.name)
+                       + queryParam;
+                    that.success = true
+                    xhr.del({url: query, sync: true, handleAs: "json"}).then(
+                        function(data) {
+                            grid.setQuery({id: "*"});
+                            grid.selection.deselectAll();
+                            that.update();
+                        },
+                        function(error) {that.success = false; that.failureReason = error;});
+                    if(!that.success ) {
+                        alert("Error:" + this.failureReason);
+                    }
+                }
+}
+        };
+
+        AuthProviderUpdater.prototype.update = function()
+        {
+
+            var that = this;
+
+            xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"})
+                .then(function(data) {
+                    that.authProviderData = data[0];
+                    util.flattenStatistics( that.authProviderData );
+
+                    that.usersGrid.update(that.authProviderData.users);
+
+                });
+
+
+        };
+
+        var addUser = {};
+
+        var node = construct.create("div", null, win.body(), "last");
+
+        var convertToUser = function convertToUser(formValues) {
+                var newUser = {};
+                newUser.name = formValues.name;
+                for(var propName in formValues)
+                {
+                    if(formValues.hasOwnProperty(propName)) {
+                            if(formValues[ propName ] !== "") {
+                                newUser[ propName ] = formValues[propName];
+                            }
+                    }
+                }
+
+                return newUser;
+            };
+
+
+        xhr.get({url: "authenticationprovider/addUser.html",
+                 sync: true,
+                 load:  function(data) {
+                            var theForm;
+                            node.innerHTML = data;
+                            addUser.dialogNode = dom.byId("addUser");
+                            parser.instantiate([addUser.dialogNode]);
+
+                            var that = this;
+
+                            theForm = registry.byId("formAddUser");
+                            theForm.on("submit", function(e) {
+
+                                event.stop(e);
+                                if(theForm.validate()){
+
+                                    var newUser = convertToUser(theForm.getValues());
+
+
+                                    var url = "rest/user/"+encodeURIComponent(addUser.authProvider) +
+                                        "/"+encodeURIComponent(newUser.name);
+
+                                    xhr.put({url: url, sync: true, handleAs: "json",
+                                             headers: { "Content-Type": "application/json"},
+                                             putData: json.toJson(newUser),
+                                             load: function(x) {that.success = true; },
+                                             error: function(error) {that.success = false; that.failureReason = error;}});
+
+                                    if(this.success === true) {
+                                        registry.byId("addUser").hide();
+                                    } else {
+                                        alert("Error:" + this.failureReason);
+                                    }
+
+                                    return false;
+
+
+                                }else{
+                                    alert('Form contains invalid data.  Please correct first');
+                                    return false;
+                                }
+
+                            });
+                        }});
+
+        addUser.show = function(authProvider) {
+                            addUser.authProvider = authProvider;
+                            registry.byId("formAddUser").reset();
+                            registry.byId("addUser").show();
+                        };
+
+
+        return DatabaseAuthManager;
+    });

Modified: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/controller.js
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/controller.js?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/controller.js (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/controller.js Fri Jun 22 15:53:57 2012
@@ -26,12 +26,14 @@ define(["dojo/dom",
         "qpid/management/Exchange",
         "qpid/management/Queue",
         "qpid/management/Connection",
+        "qpid/management/AuthenticationProvider",
         "dojo/ready",
         "dojo/domReady!"],
-       function (dom, registry, ContentPane, Broker, VirtualHost, Exchange, Queue, Connection, ready) {
+       function (dom, registry, ContentPane, Broker, VirtualHost, Exchange, Queue, Connection, AuthProvider, ready) {
            var controller = {};
 
-           var constructors = { broker: Broker, virtualhost: VirtualHost, exchange: Exchange, queue: Queue, connection: Connection };
+           var constructors = { broker: Broker, virtualhost: VirtualHost, exchange: Exchange,
+                                queue: Queue, connection: Connection, authenticationprovider: AuthProvider };
 
            var tabDiv = dom.byId("managedViews");
 

Modified: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/treeView.js
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/treeView.js?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/treeView.js (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/js/qpid/management/treeView.js Fri Jun 22 15:53:57 2012
@@ -271,9 +271,12 @@ define(["dojo/_base/xhr",
                    controller.show("connection", details.connection, { type: "virtualhost", name: details.virtualhost, parent: {broker: {type:"broker", name:""}}});
                } else if (details.type == 'port') {
                    controller.show("port", details.port, { type: "virtualhost", name: details.virtualhost, parent: {broker: {type:"broker", name:""}}});
+               } else if (details.type == 'authenticationprovider') {
+                   controller.show("authenticationprovider", details.authenticationprovider, {broker: {type:"broker", name:""}});
                }
 
 
+
            };
 
            TreeViewModel.prototype.update = function () {

Added: qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/showAuthProvider.html
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/showAuthProvider.html?rev=1352938&view=auto
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/showAuthProvider.html (added)
+++ qpid/branches/java-config-and-management/qpid/java/broker-plugins/management/src/main/java/resources/showAuthProvider.html Fri Jun 22 15:53:57 2012
@@ -0,0 +1,25 @@
+<!--
+ -
+ - 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.
+ -
+ -->
+<div class="authorizationProvider">
+    <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

Modified: qpid/branches/java-config-and-management/qpid/java/broker-web/src/main/resources/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker-web/src/main/resources/WEB-INF/web.xml?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker-web/src/main/resources/WEB-INF/web.xml (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker-web/src/main/resources/WEB-INF/web.xml Fri Jun 22 15:53:57 2012
@@ -54,6 +54,16 @@ xsi:schemaLocation="http://java.sun.com/
   </servlet>
 
   <servlet>
+    <display-name>AuthenticationProviderRestServlet</display-name>
+    <servlet-name>AuthenticationProviderRestServlet</servlet-name>
+    <servlet-class>org.apache.qpid.server.management.plugin.servlet.rest.RestServlet</servlet-class>
+    <init-param>
+     <param-name>hierarchy</param-name>
+     <param-value>AuthenticationProvider</param-value>
+   </init-param>
+  </servlet>
+
+  <servlet>
     <display-name>ExchangeRestServlet</display-name>
     <servlet-name>ExchangeRestServlet</servlet-name>
     <servlet-class>org.apache.qpid.server.management.plugin.servlet.rest.RestServlet</servlet-class>
@@ -164,6 +174,11 @@ xsi:schemaLocation="http://java.sun.com/
   </servlet-mapping>
 
   <servlet-mapping>
+    <servlet-name>AuthenticationProviderRestServlet</servlet-name>
+    <url-pattern>/rest/authenticationprovider/*</url-pattern>
+  </servlet-mapping>
+
+  <servlet-mapping>
     <servlet-name>ExchangeRestServlet</servlet-name>
     <url-pattern>/rest/exchange/*</url-pattern>
   </servlet-mapping>

Modified: qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/AuthenticationProvider.java Fri Jun 22 15:53:57 2012
@@ -20,10 +20,36 @@
  */
 package org.apache.qpid.server.model;
 
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 
 public interface AuthenticationProvider extends ConfiguredObject
 {
+
+    public static final String ID = "id";
+    public static final String DESCRIPTION = "description";
+    public static final String NAME = "name";
+    public static final String STATE = "state";
+    public static final String DURABLE = "durable";
+    public static final String LIFETIME_POLICY = "lifetimePolicy";
+    public static final String TIME_TO_LIVE = "timeToLive";
+    public static final String CREATED = "created";
+    public static final String UPDATED = "updated";
+    public static final String TYPE = "type";
+
+    public static final Collection<String> AVAILABLE_ATTRIBUTES =
+            Collections.unmodifiableList(
+                    Arrays.asList(ID,
+                                  NAME,
+                                  DESCRIPTION,
+                                  STATE,
+                                  DURABLE,
+                                  LIFETIME_POLICY,
+                                  TIME_TO_LIVE,
+                                  CREATED,
+                                  UPDATED,
+                                  TYPE));
     //children
     Collection<VirtualHostAlias> getVirtualHostPortBindings();
 }

Modified: qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/Model.java Fri Jun 22 15:53:57 2012
@@ -66,6 +66,8 @@ public class Model
         addRelationship(VirtualHost.class, Connection.class);
         addRelationship(VirtualHost.class, VirtualHostAlias.class);
 
+        addRelationship(AuthenticationProvider.class, User.class);
+
         addRelationship(Connection.class, Session.class);
 
         addRelationship(Exchange.class, Binding.class);

Added: qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java?rev=1352938&view=auto
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java (added)
+++ qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/User.java Fri Jun 22 15:53:57 2012
@@ -0,0 +1,59 @@
+/*
+ *
+ * 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;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+
+public interface User extends ConfiguredObject
+{
+    String CREATED         = "created";
+    String DURABLE         = "durable";
+    String ID              = "id";
+    String LIFETIME_POLICY = "lifetimePolicy";
+    String NAME            = "name";
+    String STATE           = "state";
+    String TIME_TO_LIVE    = "timeToLive";
+    String UPDATED         = "updated";
+    String PASSWORD        = "password";
+
+    // Attributes
+    public static final Collection<String> AVAILABLE_ATTRIBUTES =
+           Collections.unmodifiableList(
+                   Arrays.asList(
+                           ID,
+                           NAME,
+                           STATE,
+                           DURABLE,
+                           LIFETIME_POLICY,
+                           TIME_TO_LIVE,
+                           CREATED,
+                           UPDATED,
+                           PASSWORD
+                   ));
+
+    public String getPassword();
+
+    public void setPassword(String password);
+
+}

Modified: qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java
URL: http://svn.apache.org/viewvc/qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java?rev=1352938&r1=1352937&r2=1352938&view=diff
==============================================================================
--- qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java (original)
+++ qpid/branches/java-config-and-management/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java Fri Jun 22 15:53:57 2012
@@ -22,18 +22,17 @@ package org.apache.qpid.server.model.ada
 
 import java.security.AccessControlException;
 import java.security.Principal;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import javax.security.auth.login.AccountNotFoundException;
-import org.apache.qpid.server.model.AuthenticationProvider;
-import org.apache.qpid.server.model.ConfiguredObject;
-import org.apache.qpid.server.model.LifetimePolicy;
-import org.apache.qpid.server.model.PasswordCredentialManagingAuthenticationProvider;
-import org.apache.qpid.server.model.State;
-import org.apache.qpid.server.model.Statistics;
-import org.apache.qpid.server.model.VirtualHostAlias;
+import org.apache.qpid.server.model.*;
+import org.apache.qpid.server.model.User;
+import org.apache.qpid.server.registry.ApplicationRegistry;
+import org.apache.qpid.server.security.access.Operation;
 import org.apache.qpid.server.security.auth.database.PrincipalDatabase;
 import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
 import org.apache.qpid.server.security.auth.manager.PrincipalDatabaseAuthenticationManager;
@@ -134,6 +133,54 @@ public abstract class AuthenticationProv
     }
 
     @Override
+    public Collection<String> getAttributeNames()
+    {
+        return AuthenticationProvider.AVAILABLE_ATTRIBUTES;
+    }
+
+    @Override
+    public Object getAttribute(String name)
+    {
+        if(TYPE.equals(name))
+        {
+            return _authManager.getClass().getSimpleName();
+        }
+        else if(CREATED.equals(name))
+        {
+            // TODO
+        }
+        else if(DURABLE.equals(name))
+        {
+            return true;
+        }
+        else if(ID.equals(name))
+        {
+            return getId();
+        }
+        else if(LIFETIME_POLICY.equals(name))
+        {
+            return LifetimePolicy.PERMANENT;
+        }
+        else if(NAME.equals(name))
+        {
+            return getName();
+        }
+        else if(STATE.equals(name))
+        {
+            return State.ACTIVE; // TODO
+        }
+        else if(TIME_TO_LIVE.equals(name))
+        {
+            // TODO
+        }
+        else if(UPDATED.equals(name))
+        {
+            // TODO
+        }
+        return super.getAttribute(name);    //To change body of overridden methods use File | Settings | File Templates.
+    }
+
+    @Override
     public <C extends ConfiguredObject> Collection<C> getChildren(Class<C> clazz)
     {
         return null;  //To change body of implemented methods use File | Settings | File Templates.
@@ -175,7 +222,22 @@ public abstract class AuthenticationProv
         @Override
         public void deleteUser(String username) throws AccountNotFoundException
         {
-            getPrincipalDatabase().deletePrincipal(new UsernamePrincipal(username));
+            if(getSecurityManager().authoriseMethod(Operation.DELETE,
+                                                    "UserManagement",
+                                                    "deleteUser"))
+            {
+
+                getPrincipalDatabase().deletePrincipal(new UsernamePrincipal(username));
+            }
+            else
+            {
+                throw new AccessControlException("Cannot delete user " + username);
+            }
+        }
+
+        private org.apache.qpid.server.security.SecurityManager getSecurityManager()
+        {
+            return ApplicationRegistry.getInstance().getSecurityManager();
         }
 
         private PrincipalDatabase getPrincipalDatabase()
@@ -200,5 +262,212 @@ public abstract class AuthenticationProv
             }
             return users;
         }
+
+        @Override
+        public <C extends ConfiguredObject> C createChild(Class<C> childClass,
+                                                          Map<String, Object> attributes,
+                                                          ConfiguredObject... otherParents)
+        {
+            if(childClass == User.class)
+            {
+                Principal p = new UsernamePrincipal((String) attributes.get("name"));
+                if(getSecurityManager().authoriseMethod(Operation.UPDATE, "UserManagement", "createUser"))
+                {
+                    if(getPrincipalDatabase().createPrincipal(p, ((String)attributes.get("password")).toCharArray()))
+                    {
+                        return (C) new PrincipalAdapter(p);
+                    }
+                }
+                else
+                {
+                    throw new AccessControlException("Do not have permission to create a new user");
+                }
+
+            }
+
+            return super.createChild(childClass, attributes, otherParents);
+        }
+
+        @Override
+        public <C extends ConfiguredObject> Collection<C> getChildren(Class<C> clazz)
+        {
+            if(clazz == User.class)
+            {
+                List<Principal> users = getPrincipalDatabase().getUsers();
+                Collection<User> principals = new ArrayList<User>(users.size());
+                for(Principal user : users)
+                {
+                    principals.add(new PrincipalAdapter(user));
+                }
+                return (Collection<C>) Collections.unmodifiableCollection(principals);
+            }
+            else
+            {
+                return super.getChildren(clazz);
+            }
+        }
+
+        private class PrincipalAdapter extends AbstractAdapter implements User
+        {
+            private final Principal _user;
+
+
+            public PrincipalAdapter(Principal user)
+            {
+                super(PrincipalDatabaseAuthenticationManagerAdapter.this.getName(), user.getName());
+                _user = user;
+
+            }
+
+            @Override
+            public String getPassword()
+            {
+                return null;
+            }
+
+            @Override
+            public void setPassword(String password)
+            {
+                try
+                {
+                    PrincipalDatabaseAuthenticationManagerAdapter.this.setPassword(_user.getName(), password);
+                }
+                catch (AccountNotFoundException e)
+                {
+                    throw new IllegalStateException(e);
+                }
+            }
+
+            @Override
+            public String getName()
+            {
+                return _user.getName();
+            }
+
+            @Override
+            public String setName(String currentName, String desiredName)
+                    throws IllegalStateException, AccessControlException
+            {
+                throw new IllegalStateException("Names cannot be updated");
+            }
+
+            @Override
+            public State getActualState()
+            {
+                return State.ACTIVE;
+            }
+
+            @Override
+            public boolean isDurable()
+            {
+                return true;
+            }
+
+            @Override
+            public void setDurable(boolean durable)
+                    throws IllegalStateException, AccessControlException, IllegalArgumentException
+            {
+                throw new IllegalStateException("Durability cannot be updated");
+            }
+
+            @Override
+            public LifetimePolicy getLifetimePolicy()
+            {
+                return LifetimePolicy.PERMANENT;
+            }
+
+            @Override
+            public LifetimePolicy setLifetimePolicy(LifetimePolicy expected, LifetimePolicy desired)
+                    throws IllegalStateException, AccessControlException, IllegalArgumentException
+            {
+                throw new IllegalStateException("LifetimePolicy cannot be updated");
+            }
+
+            @Override
+            public long getTimeToLive()
+            {
+                return 0;
+            }
+
+            @Override
+            public long setTimeToLive(long expected, long desired)
+                    throws IllegalStateException, AccessControlException, IllegalArgumentException
+            {
+                throw new IllegalStateException("ttl cannot be updated");
+            }
+
+            @Override
+            public Statistics getStatistics()
+            {
+                return NoStatistics.getInstance();
+            }
+
+            @Override
+            public <C extends ConfiguredObject> Collection<C> getChildren(Class<C> clazz)
+            {
+                return null;
+            }
+
+            @Override
+            public <C extends ConfiguredObject> C createChild(Class<C> childClass,
+                                                              Map<String, Object> attributes,
+                                                              ConfiguredObject... otherParents)
+            {
+                return null;
+            }
+
+            @Override
+            public Collection<String> getAttributeNames()
+            {
+                return User.AVAILABLE_ATTRIBUTES;
+            }
+
+            @Override
+            public Object getAttribute(String name)
+            {
+                if(ID.equals(name))
+                {
+                    return getId();
+                }
+                else if(NAME.equals(name))
+                {
+                    return getName();
+                }
+                return super.getAttribute(name);    //To change body of overridden methods use File | Settings | File Templates.
+            }
+
+            @Override
+            public Object setAttribute(String name, Object expected, Object desired)
+                    throws IllegalStateException, AccessControlException, IllegalArgumentException
+            {
+                if(name.equals(PASSWORD))
+                {
+                    setPassword((String)desired);
+                }
+                return super.setAttribute(name,
+                                          expected,
+                                          desired);
+            }
+
+            @Override
+            public State setDesiredState(State currentState, State desiredState)
+                    throws IllegalStateTransitionException, AccessControlException
+            {
+                if(desiredState == State.DELETED)
+                {
+                    try
+                    {
+                        deleteUser(_user.getName());
+                    }
+                    catch (AccountNotFoundException e)
+                    {
+                        // TODO - log?
+                    }
+                    return State.DELETED;
+                }
+                return super.setDesiredState(currentState,
+                                             desiredState);    //To change body of overridden methods use File | Settings | File Templates.
+            }
+        }
     }
 }



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