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/05/03 13:20:55 UTC

svn commit: r1478731 - in /qpid/trunk/qpid/java: broker-plugins/management-http/src/main/java/resources/ broker-plugins/management-http/src/main/java/resources/js/qpid/management/ broker/src/main/java/org/apache/qpid/server/configuration/store/ broker/...

Author: orudyy
Date: Fri May  3 11:20:54 2013
New Revision: 1478731

URL: http://svn.apache.org/r1478731
Log:
QPID-4802: In management mode set state to ERRORED for failing to activate authentication providers, group providers and acl providers in order to allow editing of attributes preventing normal startup

Added:
    qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/ConfiguredObjectStateTransitionTest.java
Modified:
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AccessControlProvider.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js
    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/Port.js
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showAccessControlProvider.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showAuthProvider.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html
    qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showPort.html
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandler.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AccessControlProviderAdapter.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.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/model/adapter/PortAdapter.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/AccessControlProviderRestTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/AuthenticationProviderRestTest.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/GroupProviderRestTest.java

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AccessControlProvider.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AccessControlProvider.js?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AccessControlProvider.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AccessControlProvider.js Fri May  3 11:20:54 2013
@@ -100,6 +100,7 @@ define(["dojo/_base/xhr",
                this.controller = controller;
                this.name = query(".name", node)[0];
                this.type = query(".type", node)[0];
+               this.state = query(".state", node)[0];
                this.query = "rest/accesscontrolprovider/"+encodeURIComponent(groupProviderObj.name);
 
                var that = this;
@@ -125,6 +126,7 @@ define(["dojo/_base/xhr",
            {
                this.name.innerHTML = this.accessControlProviderData[ "name" ];
                this.type.innerHTML = this.accessControlProviderData[ "type" ];
+               this.state.innerHTML = this.accessControlProviderData[ "state" ];
            };
 
            return AccessControlProvider;

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js Fri May  3 11:20:54 2013
@@ -115,11 +115,9 @@ define(["dojo/_base/xhr",
                this.controller = controller;
                this.name = query(".name", node)[0];
                this.type = query(".type", node)[0];
+               this.state = query(".state", node)[0];
                this.authenticationProvider = authenticationProvider;
-               /*this.state = dom.byId("state");
-               this.durable = dom.byId("durable");
-               this.lifetimePolicy = dom.byId("lifetimePolicy");
-               */
+
                this.query = "rest/authenticationprovider/" + encodeURIComponent(authProviderObj.name);
 
                var that = this;
@@ -155,10 +153,7 @@ define(["dojo/_base/xhr",
                this.authenticationProvider.name = this.authProviderData[ "name" ]
                this.name.innerHTML = this.authProviderData[ "name" ];
                this.type.innerHTML = this.authProviderData[ "type" ];
-    /*           this.state.innerHTML = this.brokerData[ "state" ];
-               this.durable.innerHTML = this.brokerData[ "durable" ];
-               this.lifetimePolicy.innerHTML = this.brokerData[ "lifetimePolicy" ];
-*/
+               this.state.innerHTML = this.authProviderData[ "state" ];
            };
 
            AuthProviderUpdater.prototype.update = function()

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=1478731&r1=1478730&r2=1478731&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 May  3 11:20:54 2013
@@ -576,14 +576,15 @@ define(["dojo/_base/xhr",
 
                              that.authenticationProvidersGrid =
                                  new UpdatableStore(that.brokerData.authenticationproviders, query(".broker-authentication-providers")[0],
-                                                 [ { name: "Name",    field: "name",      width: "100%"},
-                                                     { name: "Type", field: "type", width: "300px"},
-                                                     { name: "User Management", field: "type", width: "200px",
+                                                 [ { name: "Name",    field: "name",      width: "30%"},
+                                                   { name: "State",    field: "state",      width: "20%"},
+                                                     { name: "Type", field: "type", width: "20%"},
+                                                     { name: "User Management", field: "type", width: "20%",
                                                              formatter: function(val){
                                                                  return "<input type='radio' disabled='disabled' "+(util.isProviderManagingUsers(val)?"checked='checked'": "")+" />";
                                                              }
                                                      },
-                                                     { name: "Default", field: "name", width: "100px",
+                                                     { name: "Default", field: "name", width: "10%",
                                                          formatter: function(val){
                                                              return "<input type='radio' disabled='disabled' "+(val == that.brokerData.defaultAuthenticationProvider ? "checked='checked'": "")+" />";
                                                          }
@@ -637,8 +638,9 @@ define(["dojo/_base/xhr",
                                                }, 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%"}
+                                               [ { name: "Name",    field: "name",      width: "40%"},
+                                                 { name: "State", field: "state", width: "30%"},
+                                                 { name: "Type", field: "type", width: "30%"}
                                                ], function(obj) {
                                                        connect.connect(obj.grid, "onRowDblClick", obj.grid,
                                                        function(evt){
@@ -651,8 +653,9 @@ define(["dojo/_base/xhr",
                              var aclData = that.brokerData.accesscontrolproviders ? that.brokerData.accesscontrolproviders :[];
                              that.accessControlProvidersGrid =
                                new UpdatableStore(aclData, query(".broker-access-control-providers")[0],
-                                               [ { name: "Name",    field: "name",      width: "60%"},
-                                                 { name: "Type", field: "type", width: "40%"}
+                                               [ { name: "Name",  field: "name",  width: "40%"},
+                                                 { name: "State", field: "state", width: "30%"},
+                                                 { name: "Type",  field: "type", width: "30%"}
                                                ], function(obj) {
                                                        connect.connect(obj.grid, "onRowDblClick", obj.grid,
                                                        function(evt){

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=1478731&r1=1478730&r2=1478731&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 May  3 11:20:54 2013
@@ -106,6 +106,7 @@ define(["dojo/_base/xhr",
                this.controller = controller;
                this.name = query(".name", node)[0];
                this.type = query(".type", node)[0];
+               this.state = query(".state", node)[0];
                this.query = "rest/groupprovider/"+encodeURIComponent(groupProviderObj.name);
                this.typeUI ={"GroupFile": "FileGroupManager"};
                var that = this;
@@ -134,6 +135,7 @@ define(["dojo/_base/xhr",
            {
                this.name.innerHTML = this.groupProviderData[ "name" ];
                this.type.innerHTML = this.groupProviderData[ "type" ];
+               this.state.innerHTML = this.groupProviderData[ "state" ];
            };
 
            GroupProviderUpdater.prototype.update = function()

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Port.js
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Port.js?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Port.js (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Port.js Fri May  3 11:20:54 2013
@@ -128,6 +128,7 @@ define(["dojo/dom",
                }
 
                storeNodes(["nameValue",
+                           "stateValue",
                            "portValue",
                            "authenticationProviderValue",
                            "protocolsValue",
@@ -169,6 +170,7 @@ define(["dojo/dom",
                }
 
               this.nameValue.innerHTML = this.keyStoreData[ "name" ];
+              this.stateValue.innerHTML = this.keyStoreData[ "state" ];
               this.portValue.innerHTML = this.keyStoreData[ "port" ];
               this.authenticationProviderValue.innerHTML = this.keyStoreData[ "authenticationProvider" ] ? this.keyStoreData[ "authenticationProvider" ] : "";
               this.protocolsValue.innerHTML = printArray( "protocols", this.keyStoreData);

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showAccessControlProvider.html
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showAccessControlProvider.html?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showAccessControlProvider.html (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showAccessControlProvider.html Fri May  3 11:20:54 2013
@@ -23,6 +23,8 @@
     <br/>
     <span style="">Type:</span><span class="type" style="position:absolute; left:6em"></span>
     <br/>
+    <span style="">State:</span><span class="state" style="position:absolute; left:6em"></span>
+    <br/>
     <div class="providerDetails"></div>
     <div class="dijitDialogPaneActionBar">
         <input class="deleteAccessControlProviderButton" type="button" value="Delete Access Control provider" label="Delete Access Control Provider" dojoType="dijit.form.Button" />

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showAuthProvider.html
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showAuthProvider.html?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showAuthProvider.html (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showAuthProvider.html Fri May  3 11:20:54 2013
@@ -23,6 +23,8 @@
     <br/>
     <span style="">Type:</span><span class="type" style="position:absolute; left:6em"></span>
     <br/>
+    <span style="">State:</span><span class="state" style="position:absolute; left:6em"></span>
+    <br/>
     <button data-dojo-type="dijit.form.Button" class="editAuthenticationProviderButton">Edit</button>
     <button data-dojo-type="dijit.form.Button" class="deleteAuthenticationProviderButton">Delete</button>
 </div>
\ No newline at end of file

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=1478731&r1=1478730&r2=1478731&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 May  3 11:20:54 2013
@@ -23,6 +23,8 @@
     <br/>
     <span style="">Type:</span><span class="type" style="position:absolute; left:6em"></span>
     <br/>
+    <span style="">State:</span><span class="state" style="position:absolute; left:6em"></span>
+    <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" />

Modified: qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showPort.html
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showPort.html?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showPort.html (original)
+++ qpid/trunk/qpid/java/broker-plugins/management-http/src/main/java/resources/showPort.html Fri May  3 11:20:54 2013
@@ -18,14 +18,23 @@
  - under the License.
  -
  -->
-<div class="port">
+<div>
     <div class="portContainer">
 
-       <div class="formLabel-labelCell" style="float:left; width: 250px;">Name:</div>
-       <div class="nameValue" style="float:left;"></div><br/>
+       <div class="name" style="clear:both">
+           <div class="formLabel-labelCell" style="float:left; width: 250px;">Name:</div>
+           <div class="nameValue" style="float:left;"></div><br/>
+       </div>
+
+       <div class="state" style="clear:both">
+           <div class="formLabel-labelCell" style="float:left; width: 250px;">State:</div>
+           <div class="stateValue" style="float:left;"></div><br/>
+       </div>
 
-       <div class="formLabel-labelCell" style="float:left; width: 250px;">Port Number:</div>
-       <div class="portValue" style="float:left;"></div><br/>
+       <div class="port" style="clear:both">
+           <div class="formLabel-labelCell" style="float:left; width: 250px;">Port Number:</div>
+           <div class="portValue" style="float:left;"></div><br/>
+       </div>
 
        <div class="authenticationProvider" style="clear:both">
            <div class="formLabel-labelCell" style="float:left; width: 250px;">Authentication Provider:</div>

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandler.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandler.java?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandler.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/configuration/store/ManagementModeStoreHandler.java Fri May  3 11:20:54 2013
@@ -13,6 +13,8 @@ import org.apache.qpid.server.configurat
 import org.apache.qpid.server.configuration.ConfigurationEntryStore;
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
 import org.apache.qpid.server.model.AccessControlProvider;
+import org.apache.qpid.server.model.AuthenticationProvider;
+import org.apache.qpid.server.model.GroupProvider;
 import org.apache.qpid.server.model.Port;
 import org.apache.qpid.server.model.Protocol;
 import org.apache.qpid.server.model.State;
@@ -27,9 +29,12 @@ public class ManagementModeStoreHandler 
     private static final String PORT_TYPE = Port.class.getSimpleName();
     private static final String VIRTUAL_HOST_TYPE = VirtualHost.class.getSimpleName();
     private static final String ACCESS_CONTROL_PROVIDER_TYPE = AccessControlProvider.class.getSimpleName();
+    private static final String GROUP_PROVIDER_TYPE = GroupProvider.class.getSimpleName();
+    private static final String AUTHENTICATION_PROVIDER_TYPE = AuthenticationProvider.class.getSimpleName();
     private static final String ATTRIBUTE_STATE = VirtualHost.STATE;
     private static final Object MANAGEMENT_MODE_AUTH_PROVIDER = "mm-auth";
 
+
     private final ConfigurationEntryStore _store;
     private final Map<UUID, ConfigurationEntry> _cliEntries;
     private final Map<UUID, Object> _quiescedEntries;
@@ -255,11 +260,7 @@ public class ManagementModeStoreHandler 
             {
                 quiesce = true;
             }
-            else if (ACCESS_CONTROL_PROVIDER_TYPE.equals(entryType))
-            {
-                quiesce = true;
-            }
-            else if (PORT_TYPE.equalsIgnoreCase(entryType))
+            else if (PORT_TYPE.equals(entryType))
             {
                 if (attributes == null)
                 {

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractAdapter.java?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AbstractAdapter.java Fri May  3 11:20:54 2013
@@ -351,15 +351,7 @@ abstract class AbstractAdapter implement
 
     protected void changeAttributes(final Map<String, Object> attributes)
     {
-        if (attributes.containsKey(ID))
-        {
-            UUID id = getId();
-            Object idAttributeValue = attributes.get(ID);
-            if (idAttributeValue != null && !idAttributeValue.equals(id))
-            {
-                throw new IllegalConfigurationException("Cannot change existing configured object id");
-            }
-        }
+        validateChangeAttributes(attributes);
         Collection<String> names = getAttributeNames();
         for (String name : names)
         {
@@ -375,6 +367,19 @@ abstract class AbstractAdapter implement
         }
     }
 
+    protected void validateChangeAttributes(final Map<String, Object> attributes)
+    {
+        if (attributes.containsKey(ID))
+        {
+            UUID id = getId();
+            Object idAttributeValue = attributes.get(ID);
+            if (idAttributeValue != null && !idAttributeValue.equals(id.toString()))
+            {
+                throw new IllegalConfigurationException("Cannot change existing configured object id");
+            }
+        }
+    }
+
     protected void authoriseSetDesiredState(State currentState, State desiredState) throws AccessControlException
     {
         // allowed by default

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AccessControlProviderAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AccessControlProviderAdapter.java?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AccessControlProviderAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AccessControlProviderAdapter.java Fri May  3 11:20:54 2013
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.atomic.AtomicReference;
 
+import org.apache.log4j.Logger;
 import org.apache.qpid.server.model.AccessControlProvider;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
@@ -43,6 +44,8 @@ import org.apache.qpid.server.util.MapVa
 
 public class AccessControlProviderAdapter extends AbstractAdapter implements AccessControlProvider
 {
+    private static final Logger LOGGER = Logger.getLogger(AccessControlProviderAdapter.class);
+
     protected AccessControl _accessControl;
     protected final Broker _broker;
 
@@ -217,8 +220,23 @@ public class AccessControlProviderAdapte
         {
             if ((state == State.INITIALISING || state == State.QUIESCED) && _state.compareAndSet(state, State.ACTIVE))
             {
-                _accessControl.open();
-                return true;
+                try
+                {
+                    _accessControl.open();
+                    return true;
+                }
+                catch(RuntimeException e)
+                {
+                    _state.compareAndSet(State.ACTIVE, State.ERRORED);
+                    if (_broker.isManagementMode())
+                    {
+                        LOGGER.warn("Failed to activate ACL provider: " + getName(), e);
+                    }
+                    else
+                    {
+                        throw e;
+                    }
+                }
             }
             else
             {
@@ -235,7 +253,6 @@ public class AccessControlProviderAdapte
 
             return false;
         }
-
         return false;
     }
 

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/AuthenticationProviderAdapter.java Fri May  3 11:20:54 2013
@@ -30,6 +30,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
+import java.util.concurrent.atomic.AtomicReference;
 
 import javax.security.auth.login.AccountNotFoundException;
 
@@ -58,6 +59,7 @@ import org.apache.qpid.server.security.a
 import org.apache.qpid.server.security.auth.manager.AuthenticationManager;
 import org.apache.qpid.server.security.auth.manager.PrincipalDatabaseAuthenticationManager;
 import org.apache.qpid.server.security.SecurityManager;
+import org.apache.qpid.server.util.MapValueConverter;
 
 public abstract class AuthenticationProviderAdapter<T extends AuthenticationManager> extends AbstractAdapter implements AuthenticationProvider
 {
@@ -68,6 +70,7 @@ public abstract class AuthenticationProv
 
     protected Collection<String> _supportedAttributes;
     protected Map<String, AuthenticationManagerFactory> _factories;
+    private AtomicReference<State> _state;
 
     private AuthenticationProviderAdapter(UUID id, Broker broker, final T authManager, Map<String, Object> attributes, Collection<String> attributeNames)
     {
@@ -76,6 +79,9 @@ public abstract class AuthenticationProv
         _broker = broker;
         _supportedAttributes = createSupportedAttributes(attributeNames);
         _factories = getAuthenticationManagerFactories();
+
+        State state = MapValueConverter.getEnumAttribute(State.class, STATE, attributes, State.INITIALISING);
+        _state = new AtomicReference<State>(state);
         addParent(Broker.class, broker);
 
         // set attributes now after all attribute names are known
@@ -117,7 +123,7 @@ public abstract class AuthenticationProv
     @Override
     public State getActualState()
     {
-        return null;
+        return _state.get();
     }
 
     @Override
@@ -191,7 +197,7 @@ public abstract class AuthenticationProv
         }
         else if(STATE.equals(name))
         {
-            return State.ACTIVE; // TODO
+            return getActualState();
         }
         else if(TIME_TO_LIVE.equals(name))
         {
@@ -214,6 +220,7 @@ public abstract class AuthenticationProv
     public boolean setState(State currentState, State desiredState)
             throws IllegalStateTransitionException, AccessControlException
     {
+        State state = _state.get();
         if(desiredState == State.DELETED)
         {
             String providerName = getName();
@@ -227,20 +234,66 @@ public abstract class AuthenticationProv
                     throw new IntegrityViolationException("Authentication provider '" + providerName + "' is set on port " + port.getName());
                 }
             }
-            _authManager.close();
-            _authManager.onDelete();
-            return true;
+
+            if ((state == State.INITIALISING || state == State.ACTIVE || state == State.STOPPED || state == State.QUIESCED  || state == State.ERRORED)
+                    && _state.compareAndSet(state, State.DELETED))
+            {
+                _authManager.close();
+                _authManager.onDelete();
+                return true;
+            }
+            else
+            {
+                throw new IllegalStateException("Cannot delete authentication provider in state: " + state);
+            }
         }
         else if(desiredState == State.ACTIVE)
         {
-            _authManager.initialise();
-            return true;
+            if ((state == State.INITIALISING || state == State.QUIESCED || state == State.STOPPED) && _state.compareAndSet(state, State.ACTIVE))
+            {
+                try
+                {
+                    _authManager.initialise();
+                    return true;
+                }
+                catch(RuntimeException e)
+                {
+                    _state.compareAndSet(State.ACTIVE, State.ERRORED);
+                    if (_broker.isManagementMode())
+                    {
+                        LOGGER.warn("Failed to activate authentication provider: " + getName(), e);
+                    }
+                    else
+                    {
+                        throw e;
+                    }
+                }
+            }
+            else
+            {
+                throw new IllegalStateException("Cannot activate authentication provider in state: " + state);
+            }
+        }
+        else if (desiredState == State.QUIESCED)
+        {
+            if (state == State.INITIALISING && _state.compareAndSet(state, State.QUIESCED))
+            {
+                return true;
+            }
         }
         else if(desiredState == State.STOPPED)
         {
-            _authManager.close();
-            return true;
+            if (_state.compareAndSet(state, State.STOPPED))
+            {
+                _authManager.close();
+                return true;
+            }
+            else
+            {
+                throw new IllegalStateException("Cannot stop authentication provider in state: " + state);
+            }
         }
+
         return false;
     }
 
@@ -256,11 +309,11 @@ public abstract class AuthenticationProv
         Map<String, Object> effectiveAttributes = super.generateEffectiveAttributes(attributes);
         AuthenticationManager manager = validateAttributes(effectiveAttributes);
         manager.initialise();
-        _authManager = (T)manager;
-        String type = (String)effectiveAttributes.get(AuthenticationManagerFactory.ATTRIBUTE_TYPE);
-        AuthenticationManagerFactory managerFactory = _factories.get(type);
-        _supportedAttributes = createSupportedAttributes(managerFactory.getAttributeNames());
         super.changeAttributes(attributes);
+        _authManager = (T)manager;
+
+        // if provider was previously in ERRORED state then set its state to ACTIVE
+        _state.compareAndSet(State.ERRORED, State.ACTIVE);
     }
 
     private Map<String, AuthenticationManagerFactory> getAuthenticationManagerFactories()
@@ -287,6 +340,8 @@ public abstract class AuthenticationProv
 
     protected AuthenticationManager validateAttributes(Map<String, Object> attributes)
     {
+        super.validateChangeAttributes(attributes);
+
         String newName = (String)attributes.get(NAME);
         String currentName = getName();
         if (!currentName.equals(newName))

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=1478731&r1=1478730&r2=1478731&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 May  3 11:20:54 2013
@@ -28,7 +28,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
+import java.util.concurrent.atomic.AtomicReference;
 
+import org.apache.log4j.Logger;
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Group;
@@ -43,13 +45,17 @@ import org.apache.qpid.server.configurat
 import org.apache.qpid.server.security.access.Operation;
 import org.apache.qpid.server.security.group.GroupManager;
 import org.apache.qpid.server.security.SecurityManager;
+import org.apache.qpid.server.util.MapValueConverter;
 
 public class GroupProviderAdapter extends AbstractAdapter implements
         GroupProvider
 {
+    private static Logger LOGGER = Logger.getLogger(GroupProviderAdapter.class);
+
     private final GroupManager _groupManager;
     private final Broker _broker;
     private Collection<String> _supportedAttributes;
+    private AtomicReference<State> _state;
 
     public GroupProviderAdapter(UUID id, Broker broker, GroupManager groupManager, Map<String, Object> attributes, Collection<String> attributeNames)
     {
@@ -62,6 +68,8 @@ public class GroupProviderAdapter extend
         _groupManager = groupManager;
         _broker = broker;
         _supportedAttributes = createSupportedAttributes(attributeNames);
+        State state = MapValueConverter.getEnumAttribute(State.class, STATE, attributes, State.INITIALISING);
+        _state = new AtomicReference<State>(state);
        addParent(Broker.class, broker);
 
        // set attributes now after all attribute names are known
@@ -104,7 +112,7 @@ public class GroupProviderAdapter extend
     @Override
     public State getActualState()
     {
-        return null;
+        return _state.get();
     }
 
     @Override
@@ -180,7 +188,7 @@ public class GroupProviderAdapter extend
         }
         else if (STATE.equals(name))
         {
-            return State.ACTIVE; // TODO
+            return getActualState();
         }
         else if (TIME_TO_LIVE.equals(name))
         {
@@ -252,21 +260,67 @@ public class GroupProviderAdapter extend
     @Override
     protected boolean setState(State currentState, State desiredState)
     {
+        State state = _state.get();
         if (desiredState == State.ACTIVE)
         {
-            _groupManager.open();
-            return true;
+            if ((state == State.INITIALISING || state == State.QUIESCED || state == State.STOPPED)
+                    && _state.compareAndSet(state, State.ACTIVE))
+            {
+                try
+                {
+                    _groupManager.open();
+                    return true;
+                }
+                catch(RuntimeException e)
+                {
+                    _state.compareAndSet(State.ACTIVE, State.ERRORED);
+                    if (_broker.isManagementMode())
+                    {
+                        LOGGER.warn("Failed to activate group provider: " + getName(), e);
+                    }
+                    else
+                    {
+                        throw e;
+                    }
+                }
+            }
+            else
+            {
+                throw new IllegalStateException("Cannot activate group provider in state: " + state);
+            }
         }
         else if (desiredState == State.STOPPED)
         {
-            _groupManager.close();
-            return true;
+            if (_state.compareAndSet(state, State.STOPPED))
+            {
+                _groupManager.close();
+                return true;
+            }
+            else
+            {
+                throw new IllegalStateException("Cannot stop group provider in state: " + state);
+            }
         }
         else if (desiredState == State.DELETED)
         {
-            _groupManager.close();
-            _groupManager.onDelete();
-            return true;
+            if ((state == State.INITIALISING || state == State.ACTIVE || state == State.STOPPED || state == State.QUIESCED || state == State.ERRORED)
+                    && _state.compareAndSet(state, State.DELETED))
+            {
+                _groupManager.close();
+                _groupManager.onDelete();
+                return true;
+            }
+            else
+            {
+                throw new IllegalStateException("Cannot delete group provider in state: " + state);
+            }
+        }
+        else if (desiredState == State.QUIESCED)
+        {
+            if (state == State.INITIALISING && _state.compareAndSet(state, State.QUIESCED))
+            {
+                return true;
+            }
         }
         return false;
     }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/model/adapter/PortAdapter.java Fri May  3 11:20:54 2013
@@ -309,7 +309,7 @@ public class PortAdapter extends Abstrac
         State state = _state.get();
         if (desiredState == State.DELETED)
         {
-            if (state == State.INITIALISING || state == State.ACTIVE || state == State.STOPPED || state == State.QUIESCED)
+            if (state == State.INITIALISING || state == State.ACTIVE || state == State.STOPPED || state == State.QUIESCED  || state == State.ERRORED)
             {
                 return _state.compareAndSet(state, State.DELETED);
             }
@@ -328,7 +328,7 @@ public class PortAdapter extends Abstrac
                 }
                 catch(RuntimeException e)
                 {
-                    _state.compareAndSet(State.ACTIVE, state);
+                    _state.compareAndSet(State.ACTIVE, State.ERRORED);
                     throw e;
                 }
                 return true;

Added: qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/ConfiguredObjectStateTransitionTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/ConfiguredObjectStateTransitionTest.java?rev=1478731&view=auto
==============================================================================
--- qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/ConfiguredObjectStateTransitionTest.java (added)
+++ qpid/trunk/qpid/java/broker/src/test/java/org/apache/qpid/server/model/ConfiguredObjectStateTransitionTest.java Fri May  3 11:20:54 2013
@@ -0,0 +1,245 @@
+package org.apache.qpid.server.model;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.qpid.server.BrokerOptions;
+import org.apache.qpid.server.configuration.ConfigurationEntry;
+import org.apache.qpid.server.configuration.ConfigurationEntryStore;
+import org.apache.qpid.server.configuration.ConfiguredObjectRecoverer;
+import org.apache.qpid.server.configuration.RecovererProvider;
+import org.apache.qpid.server.configuration.startup.DefaultRecovererProvider;
+import org.apache.qpid.server.configuration.updater.TaskExecutor;
+import org.apache.qpid.server.security.auth.manager.AnonymousAuthenticationManagerFactory;
+import org.apache.qpid.server.security.group.FileGroupManagerFactory;
+import org.apache.qpid.server.stats.StatisticsGatherer;
+import org.apache.qpid.server.util.BrokerTestHelper;
+import org.apache.qpid.test.utils.QpidTestCase;
+
+public class ConfiguredObjectStateTransitionTest extends QpidTestCase
+{
+    private Broker _broker;
+    private RecovererProvider _recovererProvider;
+    private ConfigurationEntryStore _store;
+    private File _resourceToDelete;
+
+    @Override
+    public void setUp() throws Exception
+    {
+        super.setUp();
+        BrokerTestHelper.setUp();
+
+        _broker = BrokerTestHelper.createBrokerMock();
+        StatisticsGatherer statisticsGatherer = mock(StatisticsGatherer.class);
+        TaskExecutor executor = mock(TaskExecutor.class);
+        when(executor.isTaskExecutorThread()).thenReturn(true);
+        when(_broker.getTaskExecutor()).thenReturn(executor);
+
+        _recovererProvider = new DefaultRecovererProvider(statisticsGatherer, _broker.getVirtualHostRegistry(),
+                _broker.getLogRecorder(), _broker.getRootMessageLogger(), executor, new BrokerOptions());
+
+        _store = mock(ConfigurationEntryStore.class);
+
+        _resourceToDelete = new File(TMP_FOLDER, getTestName());
+    }
+
+    @Override
+    public void tearDown() throws Exception
+    {
+        try
+        {
+            BrokerTestHelper.tearDown();
+            if (_resourceToDelete.exists())
+            {
+                _resourceToDelete.delete();
+            }
+        }
+        finally
+        {
+            super.tearDown();
+        }
+    }
+
+    public void testGroupProviderValidStateTransitions() throws Exception
+    {
+        ConfigurationEntry providerEntry = getGroupProviderConfigurationEntry();
+        ConfiguredObject provider = createConfiguredObject(providerEntry);
+        provider.setDesiredState(State.INITIALISING, State.QUIESCED);
+        assertValidStateTransition(provider, State.QUIESCED, State.STOPPED);
+
+        provider = createConfiguredObject(providerEntry);
+        assertValidStateTransition(provider, State.INITIALISING, State.DELETED);
+
+        providerEntry = getGroupProviderConfigurationEntry();
+        provider = createConfiguredObject(providerEntry);
+        provider.setDesiredState(State.INITIALISING, State.QUIESCED);
+        assertValidStateTransition(provider, State.QUIESCED, State.DELETED);
+
+        providerEntry = getGroupProviderConfigurationEntry();
+        provider = createConfiguredObject(providerEntry);
+        provider.setDesiredState(State.INITIALISING, State.ACTIVE);
+        assertValidStateTransition(provider, State.ACTIVE, State.DELETED);
+    }
+
+    public void testGroupProviderInvalidStateTransitions() throws Exception
+    {
+        ConfigurationEntry providerEntry = getGroupProviderConfigurationEntry();
+        assertAllInvalidStateTransitions(providerEntry);
+    }
+
+    public void testAuthenticationProviderValidStateTransitions()
+    {
+        ConfigurationEntry providerEntry = getAuthenticationProviderConfigurationEntry();
+        assertAllValidStateTransitions(providerEntry);
+    }
+
+    public void testAuthenticationProviderInvalidStateTransitions()
+    {
+        ConfigurationEntry providerEntry = getAuthenticationProviderConfigurationEntry();
+        assertAllInvalidStateTransitions(providerEntry);
+    }
+
+    public void testPortValidStateTransitions()
+    {
+        ConfigurationEntry providerEntry = getPortConfigurationEntry();
+        assertAllValidStateTransitions(providerEntry);
+    }
+
+    public void testPortInvalidStateTransitions()
+    {
+        ConfigurationEntry providerEntry = getPortConfigurationEntry();
+        assertAllInvalidStateTransitions(providerEntry);
+    }
+
+    private void assertAllInvalidStateTransitions(ConfigurationEntry providerEntry)
+    {
+        ConfiguredObject provider = createConfiguredObject(providerEntry);
+        assertInvalidStateTransition(provider, State.INITIALISING, State.REPLICA);
+
+        provider.setDesiredState(State.INITIALISING, State.QUIESCED);
+        assertInvalidStateTransition(provider, State.QUIESCED, State.INITIALISING);
+
+        provider.setDesiredState(State.QUIESCED, State.ACTIVE);
+        assertInvalidStateTransition(provider, State.ACTIVE, State.INITIALISING);
+
+        provider.setDesiredState(State.ACTIVE, State.DELETED);
+        assertInvalidStateTransition(provider, State.DELETED, State.INITIALISING);
+        assertInvalidStateTransition(provider, State.DELETED, State.QUIESCED);
+        assertInvalidStateTransition(provider, State.DELETED, State.ACTIVE);
+        assertInvalidStateTransition(provider, State.DELETED, State.REPLICA);
+        assertInvalidStateTransition(provider, State.DELETED, State.ERRORED);
+    }
+
+    private void assertAllValidStateTransitions(ConfigurationEntry providerEntry)
+    {
+        ConfiguredObject provider = createConfiguredObject(providerEntry);
+        assertNormalStateTransition(provider);
+
+        provider = createConfiguredObject(providerEntry);
+        provider.setDesiredState(State.INITIALISING, State.QUIESCED);
+        assertValidStateTransition(provider, State.QUIESCED, State.STOPPED);
+
+        provider = createConfiguredObject(providerEntry);
+        assertValidStateTransition(provider, State.INITIALISING, State.DELETED);
+
+        provider = createConfiguredObject(providerEntry);
+        provider.setDesiredState(State.INITIALISING, State.QUIESCED);
+        assertValidStateTransition(provider, State.QUIESCED, State.DELETED);
+
+        provider = createConfiguredObject(providerEntry);
+        provider.setDesiredState(State.INITIALISING, State.ACTIVE);
+        assertValidStateTransition(provider, State.ACTIVE, State.DELETED);
+    }
+
+    private void assertInvalidStateTransition(ConfiguredObject object, State initialState, State... invalidStates)
+    {
+        assertEquals("Unepxceted state", initialState, object.getActualState());
+        for (State state : invalidStates)
+        {
+            try
+            {
+                object.setDesiredState(initialState, state);
+            }
+            catch (IllegalStateException e)
+            {
+                // expected
+            }
+            assertEquals("Transition from state " + initialState + " into state " + state + " did occur", initialState,
+                    object.getActualState());
+        }
+    }
+
+    private void assertValidStateTransition(ConfiguredObject object, State initialState, State... validStateSequence)
+    {
+        assertEquals("Unexpected state", initialState, object.getActualState());
+        State currentState = initialState;
+        for (State state : validStateSequence)
+        {
+            object.setDesiredState(currentState, state);
+            assertEquals("Transition from state " + currentState + " into state " + state + " did not occur", state,
+                    object.getActualState());
+            currentState = state;
+        }
+    }
+
+    private void assertNormalStateTransition(ConfiguredObject object)
+    {
+        assertValidStateTransition(object, State.INITIALISING, State.QUIESCED, State.ACTIVE, State.STOPPED, State.DELETED);
+    }
+
+    private ConfiguredObject createConfiguredObject(ConfigurationEntry entry)
+    {
+        @SuppressWarnings("unchecked")
+        ConfiguredObjectRecoverer<ConfiguredObject> recoverer =
+                (ConfiguredObjectRecoverer<ConfiguredObject>)_recovererProvider.getRecoverer(entry.getType());
+        return recoverer.create(_recovererProvider, entry, _broker);
+    }
+
+    private ConfigurationEntry createConfigurationEntry(String type, Map<String, Object> attributes, ConfigurationEntryStore store)
+    {
+        return new ConfigurationEntry(UUID.randomUUID(), type, attributes, Collections.<UUID>emptySet(), store);
+    }
+
+    private ConfigurationEntry getAuthenticationProviderConfigurationEntry()
+    {
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(AuthenticationProvider.NAME, getTestName());
+        attributes.put(AuthenticationProvider.TYPE, AnonymousAuthenticationManagerFactory.PROVIDER_TYPE);
+        return createConfigurationEntry(AuthenticationProvider.class.getSimpleName(), attributes , _store);
+    }
+
+    private ConfigurationEntry getGroupProviderConfigurationEntry() throws Exception
+    {
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(GroupProvider.NAME, getTestName());
+        attributes.put(GroupProvider.TYPE, FileGroupManagerFactory.GROUP_FILE_PROVIDER_TYPE);
+        attributes.put(FileGroupManagerFactory.PATH, _resourceToDelete.getAbsolutePath());
+        if (!_resourceToDelete.exists())
+        {
+            _resourceToDelete.createNewFile();
+        }
+        return createConfigurationEntry(GroupProvider.class.getSimpleName(), attributes , _store);
+    }
+
+    private ConfigurationEntry getPortConfigurationEntry()
+    {
+        ConfigurationEntry authProviderEntry = getAuthenticationProviderConfigurationEntry();
+        AuthenticationProvider authProvider = (AuthenticationProvider)createConfiguredObject(authProviderEntry);
+
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(Port.NAME, getTestName());
+        attributes.put(Port.PROTOCOLS, Collections.<Protocol>singleton(Protocol.HTTP));
+        attributes.put(Port.AUTHENTICATION_PROVIDER, authProvider.getName());
+        attributes.put(Port.PORT, 0);
+
+        when(_broker.findAuthenticationProviderByName(authProvider.getName())).thenReturn(authProvider);
+        return createConfigurationEntry(Port.class.getSimpleName(), attributes , _store);
+    }
+
+}

Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/AccessControlProviderRestTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/AccessControlProviderRestTest.java?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/AccessControlProviderRestTest.java (original)
+++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/AccessControlProviderRestTest.java Fri May  3 11:20:54 2013
@@ -25,10 +25,13 @@ import java.io.IOException;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 
 import org.apache.commons.configuration.ConfigurationException;
+import org.apache.qpid.server.BrokerOptions;
 import org.apache.qpid.server.management.plugin.HttpManagement;
 import org.apache.qpid.server.model.AccessControlProvider;
+import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.security.access.FileAccessControlProviderConstants;
 import org.apache.qpid.test.utils.TestBrokerConfiguration;
 import org.apache.qpid.test.utils.TestFileUtils;
@@ -230,6 +233,34 @@ public class AccessControlProviderRestTe
         assertCanAccessManagementInterface(accessControlProviderName2, true);
     }
 
+    public void testRemovalOfAccessControlProviderInErrorStateUsingManagementMode() throws Exception
+    {
+        stopBroker();
+
+        File file = new File(TMP_FOLDER, getTestName());
+        if (file.exists())
+        {
+            file.delete();
+        }
+        assertFalse("ACL file should not exist", file.exists());
+        UUID id = getBrokerConfiguration().addAclFileConfiguration(file.getAbsolutePath());
+        getBrokerConfiguration().setSaved(false);
+        startBroker(0, true);
+
+        getRestTestHelper().setUsernameAndPassword(BrokerOptions.MANAGEMENT_MODE_USER_NAME, MANAGEMENT_MODE_PASSWORD);
+
+        Map<String, Object> acl = getRestTestHelper().getJsonAsSingletonList("/rest/accesscontrolprovider/" + TestBrokerConfiguration.ENTRY_NAME_ACL_FILE);
+        assertEquals("Unexpected id", id.toString(), acl.get(AccessControlProvider.ID));
+        assertEquals("Unexpected path", file.getAbsolutePath() , acl.get(FileAccessControlProviderConstants.PATH));
+        assertEquals("Unexpected state", State.ERRORED.name() , acl.get(AccessControlProvider.STATE));
+
+        int status = getRestTestHelper().submitRequest("/rest/accesscontrolprovider/" + TestBrokerConfiguration.ENTRY_NAME_ACL_FILE, "DELETE", null);
+        assertEquals("ACL was not deleted", 200, status);
+
+        List<Map<String, Object>> acls = getRestTestHelper().getJsonAsList("/rest/accesscontrolprovider/" + TestBrokerConfiguration.ENTRY_NAME_ACL_FILE);
+        assertEquals("ACL exists", 0, acls.size());
+    }
+
     private void assertCanAccessManagementInterface(String accessControlProviderName, boolean canAccess) throws Exception
     {
         int expected = canAccess ? 200 : 403;

Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/AuthenticationProviderRestTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/AuthenticationProviderRestTest.java?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/AuthenticationProviderRestTest.java (original)
+++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/AuthenticationProviderRestTest.java Fri May  3 11:20:54 2013
@@ -26,6 +26,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
+import org.apache.qpid.server.BrokerOptions;
 import org.apache.qpid.server.model.AuthenticationProvider;
 import org.apache.qpid.server.model.LifetimePolicy;
 import org.apache.qpid.server.model.Port;
@@ -156,6 +157,103 @@ public class AuthenticationProviderRestT
         assertEquals("Unexpected number of providers", 0, providerDetails.size());
     }
 
+    public void testRemovalOfAuthenticationProviderInErrorStateUsingManagementMode() throws Exception
+    {
+        stopBroker();
+
+        File file = new File(TMP_FOLDER, getTestName());
+        if (file.exists())
+        {
+            file.delete();
+        }
+        assertFalse("Group file should not exist", file.exists());
+
+        TestBrokerConfiguration config = getBrokerConfiguration();
+
+        String providerName = getTestName();
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(AuthenticationProvider.TYPE, PlainPasswordFileAuthenticationManagerFactory.PROVIDER_TYPE);
+        attributes.put(AuthenticationProvider.NAME, providerName);
+        attributes.put(PlainPasswordFileAuthenticationManagerFactory.ATTRIBUTE_PATH, file.getAbsoluteFile());
+
+        UUID id = config.addAuthenticationProviderConfiguration(attributes);
+        config.setSaved(false);
+        startBroker(0, true);
+
+        getRestTestHelper().setUsernameAndPassword(BrokerOptions.MANAGEMENT_MODE_USER_NAME, MANAGEMENT_MODE_PASSWORD);
+
+        Map<String, Object> provider = getRestTestHelper().getJsonAsSingletonList("/rest/authenticationprovider/" + providerName);
+        assertEquals("Unexpected id", id.toString(), provider.get(AuthenticationProvider.ID));
+        assertEquals("Unexpected name", providerName, provider.get(AuthenticationProvider.NAME));
+        assertEquals("Unexpected path", file.getAbsolutePath() , provider.get(PlainPasswordFileAuthenticationManagerFactory.ATTRIBUTE_PATH));
+        assertEquals("Unexpected state", State.ERRORED.name() , provider.get(AuthenticationProvider.STATE));
+
+        int status = getRestTestHelper().submitRequest("/rest/authenticationprovider/" + providerName, "DELETE", null);
+        assertEquals("ACL was not deleted", 200, status);
+
+        List<Map<String, Object>> providers = getRestTestHelper().getJsonAsList("/rest/authenticationprovider/" + providerName);
+        assertEquals("Provider exists", 0, providers.size());
+    }
+
+    public void testUpdateOfAuthenticationProviderInErrorStateUsingManagementMode() throws Exception
+    {
+        stopBroker();
+
+        File file = new File(TMP_FOLDER, getTestName());
+        if (file.exists())
+        {
+            file.delete();
+        }
+        assertFalse("Group file should not exist", file.exists());
+
+        TestBrokerConfiguration config = getBrokerConfiguration();
+
+        String providerName = getTestName();
+        Map<String, Object> attributes = new HashMap<String, Object>();
+        attributes.put(AuthenticationProvider.TYPE, PlainPasswordFileAuthenticationManagerFactory.PROVIDER_TYPE);
+        attributes.put(AuthenticationProvider.NAME, providerName);
+        attributes.put(PlainPasswordFileAuthenticationManagerFactory.ATTRIBUTE_PATH, file.getAbsoluteFile());
+
+        UUID id = config.addAuthenticationProviderConfiguration(attributes);
+        config.setSaved(false);
+        startBroker(0, true);
+
+        getRestTestHelper().setUsernameAndPassword(BrokerOptions.MANAGEMENT_MODE_USER_NAME, MANAGEMENT_MODE_PASSWORD);
+
+        Map<String, Object> provider = getRestTestHelper().getJsonAsSingletonList("/rest/authenticationprovider/" + providerName);
+        assertEquals("Unexpected id", id.toString(), provider.get(AuthenticationProvider.ID));
+        assertEquals("Unexpected name", providerName, provider.get(AuthenticationProvider.NAME));
+        assertEquals("Unexpected path", file.getAbsolutePath() , provider.get(PlainPasswordFileAuthenticationManagerFactory.ATTRIBUTE_PATH));
+        assertEquals("Unexpected state", State.ERRORED.name() , provider.get(AuthenticationProvider.STATE));
+
+        File principalDatabase = null;
+        try
+        {
+            principalDatabase = getRestTestHelper().createTemporaryPasswdFile(new String[]{"admin2", "guest2", "test2"});
+            attributes = new HashMap<String, Object>();
+            attributes.put(AuthenticationProvider.NAME, providerName);
+            attributes.put(AuthenticationProvider.ID, id);
+            attributes.put(AuthenticationProvider.TYPE, PlainPasswordFileAuthenticationManagerFactory.PROVIDER_TYPE);
+            attributes.put(PlainPasswordFileAuthenticationManagerFactory.ATTRIBUTE_PATH, principalDatabase.getAbsolutePath());
+
+            int status = getRestTestHelper().submitRequest("/rest/authenticationprovider/" + providerName, "PUT", attributes);
+            assertEquals("ACL was not deleted", 200, status);
+
+            provider = getRestTestHelper().getJsonAsSingletonList("/rest/authenticationprovider/" + providerName);
+            assertEquals("Unexpected id", id.toString(), provider.get(AuthenticationProvider.ID));
+            assertEquals("Unexpected name", providerName, provider.get(AuthenticationProvider.NAME));
+            assertEquals("Unexpected path", principalDatabase.getAbsolutePath() , provider.get(PlainPasswordFileAuthenticationManagerFactory.ATTRIBUTE_PATH));
+            assertEquals("Unexpected state", State.ACTIVE.name() , provider.get(AuthenticationProvider.STATE));
+        }
+        finally
+        {
+            if (principalDatabase != null)
+            {
+                principalDatabase.delete();
+            }
+        }
+    }
+
     public void testCreateAndDeletePasswordAuthenticationProviderWithNonExistingFile() throws Exception
     {
         stopBroker();

Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/GroupProviderRestTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/GroupProviderRestTest.java?rev=1478731&r1=1478730&r2=1478731&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/GroupProviderRestTest.java (original)
+++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/systest/rest/GroupProviderRestTest.java Fri May  3 11:20:54 2013
@@ -26,7 +26,9 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
+import java.util.UUID;
 
+import org.apache.qpid.server.BrokerOptions;
 import org.apache.qpid.server.model.Group;
 import org.apache.qpid.server.model.GroupProvider;
 import org.apache.qpid.server.model.LifetimePolicy;
@@ -285,6 +287,37 @@ public class GroupProviderRestTest exten
         }
     }
 
+    public void testRemovalOfGroupProviderInErrorStateUsingManagementMode() throws Exception
+    {
+        stopBroker();
+
+        File file = new File(TMP_FOLDER, getTestName());
+        if (file.exists())
+        {
+            file.delete();
+        }
+        assertFalse("Group file should not exist", file.exists());
+
+        TestBrokerConfiguration config = getBrokerConfiguration();
+        config.removeObjectConfiguration(TestBrokerConfiguration.ENTRY_NAME_GROUP_FILE);
+        UUID id = config.addGroupFileConfiguration(file.getAbsolutePath());
+        config.setSaved(false);
+        startBroker(0, true);
+
+        getRestTestHelper().setUsernameAndPassword(BrokerOptions.MANAGEMENT_MODE_USER_NAME, MANAGEMENT_MODE_PASSWORD);
+
+        Map<String, Object> groupProvider = getRestTestHelper().getJsonAsSingletonList("/rest/groupprovider/" + TestBrokerConfiguration.ENTRY_NAME_GROUP_FILE);
+        assertEquals("Unexpected id", id.toString(), groupProvider.get(GroupProvider.ID));
+        assertEquals("Unexpected path", file.getAbsolutePath() , groupProvider.get(FileGroupManagerFactory.PATH));
+        assertEquals("Unexpected state", State.ERRORED.name() , groupProvider.get(GroupProvider.STATE));
+
+        int status = getRestTestHelper().submitRequest("/rest/groupprovider/" + TestBrokerConfiguration.ENTRY_NAME_GROUP_FILE, "DELETE", null);
+        assertEquals("ACL was not deleted", 200, status);
+
+        List<Map<String, Object>> providers = getRestTestHelper().getJsonAsList("/rest/groupprovider/" + TestBrokerConfiguration.ENTRY_NAME_GROUP_FILE);
+        assertEquals("Provider exists", 0, providers.size());
+    }
+
     private void assertProvider(String name, String type, Map<String, Object> provider)
     {
         Asserts.assertAttributesPresent(provider, GroupProvider.AVAILABLE_ATTRIBUTES,



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