You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by kw...@apache.org on 2015/01/27 16:00:16 UTC

svn commit: r1655057 [5/8] - in /qpid/branches/QPID-6262-JavaBrokerNIO: ./ qpid/ qpid/cpp/examples/messaging/ qpid/cpp/src/ qpid/cpp/src/qpid/amqp_0_10/ qpid/cpp/src/qpid/broker/ qpid/cpp/src/qpid/broker/amqp/ qpid/cpp/src/qpid/client/amqp0_10/ qpid/cp...

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProviderImplTest.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProviderImplTest.java?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProviderImplTest.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/access-control/src/test/java/org/apache/qpid/server/security/access/plugins/ACLFileAccessControlProviderImplTest.java Tue Jan 27 15:00:13 2015
@@ -73,7 +73,7 @@ public class ACLFileAccessControlProvide
         }
         catch (IllegalConfigurationException e)
         {
-            assertEquals("Unexpected exception message:" + e.getMessage(), String.format("ACL file '%s' is not found", aclFilePath ), e.getMessage());
+            assertEquals("Unexpected exception message:" + e.getMessage(), String.format("Cannot convert %s to a readable resource", aclFilePath ), e.getMessage());
         }
     }
 

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/amqp-0-8-protocol/src/main/java/org/apache/qpid/server/protocol/v0_8/AMQChannel.java Tue Jan 27 15:00:13 2015
@@ -122,6 +122,8 @@ public class AMQChannel
     public static final int DEFAULT_PREFETCH = 4096;
 
     private static final Logger _logger = Logger.getLogger(AMQChannel.class);
+    private final DefaultQueueAssociationClearingTask
+            _defaultQueueAssociationClearingTask = new DefaultQueueAssociationClearingTask();
 
     //TODO use Broker property to configure message authorization requirements
     private boolean _messageAuthorizationRequired = Boolean.getBoolean(BrokerProperties.PROPERTY_MSG_AUTH);
@@ -139,7 +141,7 @@ public class AMQChannel
     private long _deliveryTag = 0;
 
     /** A channel has a default queue (the last declared) that is used when no queue name is explicitly set */
-    private AMQQueue _defaultQueue;
+    private volatile AMQQueue<?> _defaultQueue;
 
     /** This tag is unique per subscription to a queue. The server returns this in response to a basic.consume request. */
     private int _consumerTag;
@@ -180,11 +182,9 @@ public class AMQChannel
     private LogSubject _logSubject;
     private volatile boolean _rollingBack;
 
-    private static final Runnable NULL_TASK = new Runnable() { public void run() {} };
     private List<MessageInstance> _resendList = new ArrayList<MessageInstance>();
     private static final
     AMQShortString IMMEDIATE_DELIVERY_REPLY_TEXT = new AMQShortString("Immediate delivery is not possible.");
-    private long _createTime = System.currentTimeMillis();
 
     private final ClientDeliveryMethod _clientDeliveryMethod;
 
@@ -829,7 +829,7 @@ public class AMQChannel
         getVirtualHost().getEventLogger().message(_logSubject, operationalLogMessage);
 
         unsubscribeAllConsumers();
-
+        setDefaultQueue(null);
         for (Action<? super AMQChannel> task : _taskList)
         {
             task.performAction(this);
@@ -1291,17 +1291,6 @@ public class AMQChannel
         return "("+ _suspended.get() + ", " + _closing.get() + ", " + _connection.isClosing() + ") "+"["+ _connection.toString()+":"+_channelId+"]";
     }
 
-    public void setDefaultQueue(AMQQueue queue)
-    {
-        _defaultQueue = queue;
-    }
-
-    public AMQQueue getDefaultQueue()
-    {
-        return _defaultQueue;
-    }
-
-
     public boolean isClosing()
     {
         return _closing.get();
@@ -2123,32 +2112,32 @@ public class AMQChannel
             catch (AMQQueue.ExistingExclusiveConsumer e)
             {
                 _connection.closeConnection(AMQConstant.ACCESS_REFUSED,
-                                            "Cannot subscribe to queue "
+                                            "Cannot subscribe to queue '"
                                                                     + queue1.getName()
-                                                                    + " as it already has an existing exclusive consumer", _channelId);
+                                                                    + "' as it already has an existing exclusive consumer", _channelId);
 
             }
             catch (AMQQueue.ExistingConsumerPreventsExclusive e)
             {
                 _connection.closeConnection(AMQConstant.ACCESS_REFUSED,
-                                            "Cannot subscribe to queue "
+                                            "Cannot subscribe to queue '"
                                                                     + queue1.getName()
-                                                                    + " exclusively as it already has a consumer", _channelId);
+                                                                    + "' exclusively as it already has a consumer", _channelId);
 
             }
             catch (AccessControlException e)
             {
-                _connection.closeConnection(AMQConstant.ACCESS_REFUSED, "Cannot subscribe to queue "
+                _connection.closeConnection(AMQConstant.ACCESS_REFUSED, "Cannot subscribe to queue '"
                                                                     + queue1.getName()
-                                                                    + " permission denied", _channelId);
+                                                                    + "' permission denied", _channelId);
 
             }
             catch (MessageSource.ConsumerAccessRefused consumerAccessRefused)
             {
                 _connection.closeConnection(AMQConstant.ACCESS_REFUSED,
-                                            "Cannot subscribe to queue "
+                                            "Cannot subscribe to queue '"
                                                                     + queue1.getName()
-                                                                    + " as it already has an incompatible exclusivity policy", _channelId);
+                                                                    + "' as it already has an incompatible exclusivity policy", _channelId);
 
             }
 
@@ -2257,7 +2246,7 @@ public class AMQChannel
             // if the exchange does not exist we raise a channel exception
             if (destination == null)
             {
-                closeChannel(AMQConstant.NOT_FOUND, "Unknown exchange name: " + exchangeName);
+                closeChannel(AMQConstant.NOT_FOUND, "Unknown exchange name: '" + exchangeName + "'");
             }
             else
             {
@@ -2815,15 +2804,14 @@ public class AMQChannel
                 exchange = virtualHost.getExchange(exchangeName.toString());
                 if (exchange == null)
                 {
-                    closeChannel(AMQConstant.NOT_FOUND, "Unknown exchange: " + exchangeName);
+                    closeChannel(AMQConstant.NOT_FOUND, "Unknown exchange: '" + exchangeName + "'");
                 }
                 else if (!(type == null || type.length() == 0) && !exchange.getType().equals(type.asString()))
                 {
 
-                    _connection.closeConnection(AMQConstant.NOT_ALLOWED, "Attempt to redeclare exchange: "
-                                                                         +
-                                                                         exchangeName
-                                                                         + " of type "
+                    _connection.closeConnection(AMQConstant.NOT_ALLOWED, "Attempt to redeclare exchange: '"
+                                                                         + exchangeName
+                                                                         + "' of type "
                                                                          + exchange.getType()
                                                                          + " to "
                                                                          + type
@@ -2850,7 +2838,6 @@ public class AMQChannel
                     {
                         attributes.putAll(FieldTable.convertToMap(arguments));
                     }
-                    attributes.put(Exchange.ID, null);
                     attributes.put(Exchange.NAME, name);
                     attributes.put(Exchange.TYPE, typeString);
                     attributes.put(Exchange.DURABLE, durable);
@@ -2875,8 +2862,8 @@ public class AMQChannel
                 catch (ReservedExchangeNameException e)
                 {
                     _connection.closeConnection(AMQConstant.NOT_ALLOWED,
-                                                "Attempt to declare exchange: " + exchangeName +
-                                                                         " which begins with reserved prefix.", getChannelId());
+                                                "Attempt to declare exchange: '" + exchangeName +
+                                                                         "' which begins with reserved prefix.", getChannelId());
 
 
                 }
@@ -2885,8 +2872,8 @@ public class AMQChannel
                     exchange = e.getExistingExchange();
                     if (!new AMQShortString(exchange.getType()).equals(type))
                     {
-                        _connection.closeConnection(AMQConstant.NOT_ALLOWED, "Attempt to redeclare exchange: "
-                                                                                 + exchangeName + " of type "
+                        _connection.closeConnection(AMQConstant.NOT_ALLOWED, "Attempt to redeclare exchange: '"
+                                                                                 + exchangeName + "' of type "
                                                                                  + exchange.getType()
                                                                                  + " to " + type + ".", getChannelId());
 
@@ -2922,7 +2909,7 @@ public class AMQChannel
                     // note - since 0-8/9/9-1 can't set the alt. exchange this exception should never occur
                     final String message = "Unknown alternate exchange "
                                            + (e.getName() != null
-                            ? "name: \"" + e.getName() + "\""
+                            ? "name: '" + e.getName() + "'"
                             : "id: " + e.getId());
                     _connection.closeConnection(AMQConstant.NOT_FOUND, message, getChannelId());
 
@@ -2968,7 +2955,7 @@ public class AMQChannel
                 final ExchangeImpl exchange = virtualHost.getExchange(exchangeName);
                 if (exchange == null)
                 {
-                    closeChannel(AMQConstant.NOT_FOUND, "No such exchange: " + exchangeStr);
+                    closeChannel(AMQConstant.NOT_FOUND, "No such exchange: '" + exchangeStr + "'");
                 }
                 else
                 {
@@ -3045,7 +3032,7 @@ public class AMQChannel
         else if (isDefaultExchange(exchange))
         {
             _connection.closeConnection(AMQConstant.NOT_ALLOWED,
-                                        "Cannot bind the queue " + queueName + " to the default exchange", getChannelId());
+                                        "Cannot bind the queue '" + queueName + "' to the default exchange", getChannelId());
 
         }
         else
@@ -3057,7 +3044,7 @@ public class AMQChannel
             if (exch == null)
             {
                 closeChannel(AMQConstant.NOT_FOUND,
-                             "Exchange " + exchangeName + " does not exist.");
+                             "Exchange '" + exchangeName + "' does not exist.");
             }
             else
             {
@@ -3137,7 +3124,7 @@ public class AMQChannel
             queueName = queueStr.intern();
         }
 
-        AMQQueue queue;
+        AMQQueue<?> queue;
 
         //TODO: do we need to check that the queue already exists with exactly the same "configuration"?
 
@@ -3148,19 +3135,19 @@ public class AMQChannel
             if (queue == null)
             {
                 closeChannel(AMQConstant.NOT_FOUND,
-                                                     "Queue: "
+                                                     "Queue: '"
                                                      + queueName
-                                                     + " not found on VirtualHost("
-                                                     + virtualHost
-                                                     + ").");
+                                                     + "' not found on VirtualHost '"
+                                                     + virtualHost.getName()
+                                                     + "'.");
             }
             else
             {
                 if (!queue.verifySessionAccess(this))
                 {
-                    _connection.closeConnection(AMQConstant.NOT_ALLOWED, "Queue "
+                    _connection.closeConnection(AMQConstant.NOT_ALLOWED, "Queue '"
                                                 + queue.getName()
-                                                + " is exclusive, but not created on this Connection.", getChannelId());
+                                                + "' is exclusive, but not created on this Connection.", getChannelId());
                 }
                 else
                 {
@@ -3190,7 +3177,6 @@ public class AMQChannel
                         QueueArgumentsConverter.convertWireArgsToModel(FieldTable.convertToMap(arguments));
                 final String queueNameString = AMQShortString.toString(queueName);
                 attributes.put(Queue.NAME, queueNameString);
-                attributes.put(Queue.ID, UUID.randomUUID());
                 attributes.put(Queue.DURABLE, durable);
 
                 LifetimePolicy lifetimePolicy;
@@ -3237,9 +3223,9 @@ public class AMQChannel
 
                 if (!queue.verifySessionAccess(this))
                 {
-                    _connection.closeConnection(AMQConstant.NOT_ALLOWED, "Queue "
+                    _connection.closeConnection(AMQConstant.NOT_ALLOWED, "Queue '"
                                                 + queue.getName()
-                                                + " is exclusive, but not created on this Connection.", getChannelId());
+                                                + "' is exclusive, but not created on this Connection.", getChannelId());
 
                 }
                 else if (queue.isExclusive() != exclusive)
@@ -3333,27 +3319,27 @@ public class AMQChannel
 
         if (queue == null)
         {
-            closeChannel(AMQConstant.NOT_FOUND, "Queue " + queueName + " does not exist.");
+            closeChannel(AMQConstant.NOT_FOUND, "Queue '" + queueName + "' does not exist.");
 
         }
         else
         {
             if (ifEmpty && !queue.isEmpty())
             {
-                closeChannel(AMQConstant.IN_USE, "Queue: " + queueName + " is not empty.");
+                closeChannel(AMQConstant.IN_USE, "Queue: '" + queueName + "' is not empty.");
             }
             else if (ifUnused && !queue.isUnused())
             {
                 // TODO - Error code
-                closeChannel(AMQConstant.IN_USE, "Queue: " + queueName + " is still used.");
+                closeChannel(AMQConstant.IN_USE, "Queue: '" + queueName + "' is still used.");
             }
             else
             {
                 if (!queue.verifySessionAccess(this))
                 {
-                    _connection.closeConnection(AMQConstant.NOT_ALLOWED, "Queue "
+                    _connection.closeConnection(AMQConstant.NOT_ALLOWED, "Queue '"
                                                 + queue.getName()
-                                                + " is exclusive, but not created on this Connection.", getChannelId());
+                                                + "' is exclusive, but not created on this Connection.", getChannelId());
 
                 }
                 else
@@ -3393,7 +3379,7 @@ public class AMQChannel
         }
         else if ((queueName != null) && (queue = virtualHost.getQueue(queueName.toString())) == null)
         {
-            closeChannel(AMQConstant.NOT_FOUND, "Queue " + queueName + " does not exist.");
+            closeChannel(AMQConstant.NOT_FOUND, "Queue '" + queueName + "' does not exist.");
         }
         else if (!queue.verifySessionAccess(this))
         {
@@ -3426,14 +3412,14 @@ public class AMQChannel
     @Override
     public void receiveQueueUnbind(final AMQShortString queueName,
                                    final AMQShortString exchange,
-                                   final AMQShortString routingKey,
+                                   final AMQShortString bindingKey,
                                    final FieldTable arguments)
     {
         if(_logger.isDebugEnabled())
         {
             _logger.debug("RECV[" + _channelId + "] QueueUnbind[" +" queue: " + queueName +
                           " exchange: " + exchange +
-                          " bindingKey: " + routingKey +
+                          " bindingKey: " + bindingKey +
                           " arguments: " + arguments + " ]");
         }
 
@@ -3450,14 +3436,14 @@ public class AMQChannel
         {
             String message = useDefaultQueue
                     ? "No default queue defined on channel and queue was null"
-                    : "Queue " + queueName + " does not exist.";
+                    : "Queue '" + queueName + "' does not exist.";
             closeChannel(AMQConstant.NOT_FOUND, message);
         }
         else if (isDefaultExchange(exchange))
         {
-            _connection.closeConnection(AMQConstant.NOT_ALLOWED, "Cannot unbind the queue "
+            _connection.closeConnection(AMQConstant.NOT_ALLOWED, "Cannot unbind the queue '"
                                                          + queue.getName()
-                                                         + " from the default exchange", getChannelId());
+                                                         + "' from the default exchange", getChannelId());
 
         }
         else
@@ -3467,9 +3453,9 @@ public class AMQChannel
 
             if (exch == null)
             {
-                closeChannel(AMQConstant.NOT_FOUND, "Exchange " + exchange + " does not exist.");
+                closeChannel(AMQConstant.NOT_FOUND, "Exchange '" + exchange + "' does not exist.");
             }
-            else if (!exch.hasBinding(String.valueOf(routingKey), queue))
+            else if (!exch.hasBinding(String.valueOf(bindingKey), queue))
             {
                 closeChannel(AMQConstant.NOT_FOUND, "No such binding");
             }
@@ -3477,7 +3463,7 @@ public class AMQChannel
             {
                 try
                 {
-                    exch.deleteBinding(String.valueOf(routingKey), queue);
+                    exch.deleteBinding(String.valueOf(bindingKey), queue);
 
                     final AMQMethodBody responseBody = _connection.getMethodRegistry().createQueueUnbindOkBody();
                     sync();
@@ -3598,4 +3584,37 @@ public class AMQChannel
         return exchangeName == null || AMQShortString.EMPTY_STRING.equals(exchangeName);
     }
 
+    private void setDefaultQueue(AMQQueue<?> queue)
+    {
+        AMQQueue<?> currentDefaultQueue = _defaultQueue;
+        if (queue != currentDefaultQueue)
+        {
+            if (currentDefaultQueue != null)
+            {
+                currentDefaultQueue.removeDeleteTask(_defaultQueueAssociationClearingTask);
+            }
+            if (queue != null)
+            {
+                queue.addDeleteTask(_defaultQueueAssociationClearingTask);
+            }
+        }
+        _defaultQueue = queue;
+    }
+
+    private AMQQueue getDefaultQueue()
+    {
+        return _defaultQueue;
+    }
+
+    private class DefaultQueueAssociationClearingTask implements Action<AMQQueue>
+    {
+        @Override
+        public void performAction(final AMQQueue queue)
+        {
+            if ( queue == _defaultQueue)
+            {
+                _defaultQueue = null;
+            }
+        }
+    }
 }

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Session_1_0.java Tue Jan 27 15:00:13 2015
@@ -518,6 +518,11 @@ public class Session_1_0 implements Sess
         }
 
         _connection.sessionEnded(this);
+        performCloseTasks();
+        if(_modelObject != null)
+        {
+            _modelObject.delete();
+        }
 
     }
 

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbySystemConfigImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbySystemConfigImpl.java?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbySystemConfigImpl.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/store/derby/DerbySystemConfigImpl.java Tue Jan 27 15:00:13 2015
@@ -20,7 +20,8 @@
  */
 package org.apache.qpid.server.store.derby;
 
-import org.apache.qpid.server.BrokerOptions;
+import java.util.Map;
+
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.logging.LogRecorder;
@@ -48,10 +49,10 @@ public class DerbySystemConfigImpl exten
     public DerbySystemConfigImpl(final TaskExecutor taskExecutor,
                                  final EventLogger eventLogger,
                                  final LogRecorder logRecorder,
-                                 final BrokerOptions brokerOptions,
+                                 final Map<String,Object> attributes,
                                  final BrokerShutdownProvider brokerShutdownProvider)
     {
-        super(taskExecutor, eventLogger, logRecorder, brokerOptions, brokerShutdownProvider);
+        super(taskExecutor, eventLogger, logRecorder, attributes, brokerShutdownProvider);
     }
 
     @Override

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNodeImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNodeImpl.java?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNodeImpl.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/derby-store/src/main/java/org/apache/qpid/server/virtualhostnode/derby/DerbyVirtualHostNodeImpl.java Tue Jan 27 15:00:13 2015
@@ -21,6 +21,8 @@
 
 package org.apache.qpid.server.virtualhostnode.derby;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Map;
 
 import org.apache.qpid.server.logging.messages.ConfigStoreMessages;
@@ -33,7 +35,9 @@ import org.apache.qpid.server.store.Dura
 import org.apache.qpid.server.store.derby.DerbyConfigurationStore;
 import org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode;
 
-@ManagedObject( category = false, type = DerbyVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE )
+@ManagedObject( category = false,
+                type = DerbyVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE,
+                validChildTypes = "org.apache.qpid.server.virtualhostnode.derby.DerbyVirtualHostNodeImpl#getSupportedChildTypes()" )
 public class DerbyVirtualHostNodeImpl extends AbstractStandardVirtualHostNode<DerbyVirtualHostNodeImpl> implements DerbyVirtualHostNode<DerbyVirtualHostNodeImpl>
 {
     public static final String VIRTUAL_HOST_NODE_TYPE = "DERBY";
@@ -70,4 +74,10 @@ public class DerbyVirtualHostNodeImpl ex
     {
         return getClass().getSimpleName() + " [id=" + getId() + ", name=" + getName() + ", storePath=" + getStorePath() + "]";
     }
+
+
+    public static Map<String, Collection<String>> getSupportedChildTypes()
+    {
+        return Collections.singletonMap(VirtualHost.class.getSimpleName(), getSupportedVirtualHostTypes(true));
+    }
 }

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCSystemConfigImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCSystemConfigImpl.java?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCSystemConfigImpl.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/store/jdbc/JDBCSystemConfigImpl.java Tue Jan 27 15:00:13 2015
@@ -20,7 +20,8 @@
  */
 package org.apache.qpid.server.store.jdbc;
 
-import org.apache.qpid.server.BrokerOptions;
+import java.util.Map;
+
 import org.apache.qpid.server.configuration.updater.TaskExecutor;
 import org.apache.qpid.server.logging.EventLogger;
 import org.apache.qpid.server.logging.LogRecorder;
@@ -50,10 +51,10 @@ public class JDBCSystemConfigImpl extend
     public JDBCSystemConfigImpl(final TaskExecutor taskExecutor,
                                 final EventLogger eventLogger,
                                 final LogRecorder logRecorder,
-                                final BrokerOptions brokerOptions,
+                                final Map<String,Object> attributes,
                                 final BrokerShutdownProvider brokerShutdownProvider)
     {
-        super(taskExecutor, eventLogger, logRecorder, brokerOptions, brokerShutdownProvider);
+        super(taskExecutor, eventLogger, logRecorder, attributes, brokerShutdownProvider);
     }
 
     @Override

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/jdbc-store/src/main/java/org/apache/qpid/server/virtualhostnode/jdbc/JDBCVirtualHostNodeImpl.java Tue Jan 27 15:00:13 2015
@@ -20,6 +20,8 @@
  */
 package org.apache.qpid.server.virtualhostnode.jdbc;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.Map;
 
 import org.apache.qpid.server.model.Broker;
@@ -31,7 +33,8 @@ import org.apache.qpid.server.store.Dura
 import org.apache.qpid.server.store.jdbc.GenericJDBCConfigurationStore;
 import org.apache.qpid.server.virtualhostnode.AbstractStandardVirtualHostNode;
 
-@ManagedObject(type = JDBCVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE, category = false )
+@ManagedObject(type = JDBCVirtualHostNodeImpl.VIRTUAL_HOST_NODE_TYPE, category = false ,
+               validChildTypes = "org.apache.qpid.server.virtualhostnode.jdbc.JDBCVirtualHostNodeImpl#getSupportedChildTypes()")
 public class JDBCVirtualHostNodeImpl extends AbstractStandardVirtualHostNode<JDBCVirtualHostNodeImpl> implements JDBCVirtualHostNode<JDBCVirtualHostNodeImpl>
 {
     public static final String VIRTUAL_HOST_NODE_TYPE = "JDBC";
@@ -97,4 +100,10 @@ public class JDBCVirtualHostNodeImpl ext
                                         ", connectionPoolType=" + getConnectionPoolType() +
                                         ", username=" + getUsername() + "]";
     }
+
+
+    public static Map<String, Collection<String>> getSupportedChildTypes()
+    {
+        return Collections.singletonMap(VirtualHost.class.getSimpleName(), getSupportedVirtualHostTypes(true));
+    }
 }

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/HelperServlet.java Tue Jan 27 15:00:13 2015
@@ -54,9 +54,6 @@ public class HelperServlet extends Abstr
         _mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
 
         Action[] supportedActions = {
-                new ListBrokerAttribute(Broker.SUPPORTED_VIRTUALHOSTNODE_TYPES, "ListVirtualHostNodeTypes"),
-                new ListBrokerAttribute(Broker.SUPPORTED_VIRTUALHOST_TYPES, "ListVirtualHostTypes"),
-                new ListBrokerAttribute(Broker.SUPPORTED_PREFERENCES_PROVIDER_TYPES, "ListPreferencesProvidersTypes"),
                 new ListBrokerAttribute(Broker.PRODUCT_VERSION, "version"),
                 new ListGroupProviderAttributes(),
                 new ListAccessControlProviderAttributes(),

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/MetaDataServlet.java Tue Jan 27 15:00:13 2015
@@ -24,6 +24,7 @@ import java.io.IOException;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -101,9 +102,24 @@ public class MetaDataServlet extends Abs
         Map<String,Object> typeDetails = new LinkedHashMap<>();
         typeDetails.put("attributes", processAttributes(type));
         typeDetails.put("managedInterfaces", getManagedInterfaces(type));
+        typeDetails.put("validChildTypes", getValidChildTypes(type));
         return typeDetails;
     }
 
+    private Map<String, Collection<String>> getValidChildTypes(final Class<? extends ConfiguredObject> type)
+    {
+        Map<String, Collection<String>> validChildTypes = new HashMap<>();
+        for(Class<? extends ConfiguredObject> childType : _instance.getChildTypes(ConfiguredObjectTypeRegistry.getCategory(type)))
+        {
+            Collection<String> validValues = _instance.getTypeRegistry().getValidChildTypes(type, childType);
+            if(validValues != null)
+            {
+                validChildTypes.put(childType.getSimpleName(), validValues);
+            }
+        }
+        return validChildTypes;
+    }
+
     private Set<String> getManagedInterfaces(Class<? extends ConfiguredObject> type)
     {
         Set<String> interfaces = new HashSet<>();

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/org/apache/qpid/server/management/plugin/servlet/rest/RestServlet.java Tue Jan 27 15:00:13 2015
@@ -36,7 +36,6 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.Part;
-import javax.xml.bind.DatatypeConverter;
 
 import org.apache.log4j.Logger;
 import org.codehaus.jackson.map.ObjectMapper;
@@ -46,6 +45,7 @@ import org.apache.qpid.server.configurat
 import org.apache.qpid.server.model.Broker;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.util.urlstreamhandler.data.Handler;
+import org.apache.qpid.util.DataUrlUtils;
 
 public class RestServlet extends AbstractServlet
 {
@@ -62,13 +62,20 @@ public class RestServlet extends Abstrac
     public static final String INHERITED_ACTUALS_PARAM = "inheritedActuals";
     public static final String EXTRACT_INITIAL_CONFIG_PARAM = "extractInitialConfig";
 
+    /**
+     * Signifies that the agent wishes the servlet to set the Content-Disposition on the
+     * response with the value attachment.  This filename will be derived from the parameter value.
+     */
+    public static final String CONTENT_DISPOSITION_ATTACHMENT_FILENAME_PARAM = "contentDispositionAttachmentFilename";
+
     public static final Set<String> RESERVED_PARAMS =
             new HashSet<>(Arrays.asList(DEPTH_PARAM,
                                         SORT_PARAM,
                                         ACTUALS_PARAM,
                                         INCLUDE_SYS_CONTEXT_PARAM,
                                         EXTRACT_INITIAL_CONFIG_PARAM,
-                                        INHERITED_ACTUALS_PARAM));
+                                        INHERITED_ACTUALS_PARAM,
+                                        CONTENT_DISPOSITION_ATTACHMENT_FILENAME_PARAM));
 
     private Class<? extends ConfiguredObject>[] _hierarchy;
 
@@ -316,19 +323,29 @@ public class RestServlet extends Abstrac
     @Override
     protected void doGetWithSubjectAndActor(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
     {
+        // TODO - sort special params, everything else should act as a filter
+        String attachmentFilename = request.getParameter(CONTENT_DISPOSITION_ATTACHMENT_FILENAME_PARAM);
+        boolean extractInitialConfig = getBooleanParameterFromRequest(request, EXTRACT_INITIAL_CONFIG_PARAM);
+
         response.setContentType("application/json");
         response.setStatus(HttpServletResponse.SC_OK);
 
-        setCachingHeadersOnResponse(response);
+        if (attachmentFilename == null)
+        {
+            setCachingHeadersOnResponse(response);
+        }
+        else
+        {
+            setContentDispositionHeaderIfNecessary(response, attachmentFilename);
+        }
 
         Collection<ConfiguredObject<?>> allObjects = getObjects(request);
 
-        // TODO - sort special params, everything else should act as a filter
-        boolean extractInitialConfig = getBooleanParameterFromRequest(request, EXTRACT_INITIAL_CONFIG_PARAM);
         int depth;
         boolean actuals;
         boolean includeSystemContext;
         boolean inheritedActuals;
+
         if(extractInitialConfig)
         {
             depth = Integer.MAX_VALUE;
@@ -344,20 +361,35 @@ public class RestServlet extends Abstrac
             inheritedActuals = getBooleanParameterFromRequest(request, INHERITED_ACTUALS_PARAM);
         }
 
-        List<Map<String, Object>> output = new ArrayList<Map<String, Object>>();
+        List<Map<String, Object>> output = new ArrayList<>();
         for(ConfiguredObject configuredObject : allObjects)
         {
             output.add(_objectConverter.convertObjectToMap(configuredObject, getConfiguredClass(),
                     depth, actuals, inheritedActuals, includeSystemContext, extractInitialConfig));
         }
 
+
         Writer writer = getOutputWriter(request, response);
         ObjectMapper mapper = new ObjectMapper();
         mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true);
         mapper.writeValue(writer, extractInitialConfig && output.size() == 1 ? output.get(0) : output);
+    }
 
-        response.setContentType("application/json");
-        response.setStatus(HttpServletResponse.SC_OK);
+    private void setContentDispositionHeaderIfNecessary(final HttpServletResponse response,
+                                                        final String attachmentFilename)
+    {
+        if (attachmentFilename != null)
+        {
+            String filenameRfc2183 = ensureFilenameIsRfc2183(attachmentFilename);
+            if (filenameRfc2183.length() > 0)
+            {
+                response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", filenameRfc2183));
+            }
+            else
+            {
+                response.setHeader("Content-disposition", String.format("attachment"));  // Agent will allow user to choose a name
+            }
+        }
     }
 
     private Class<? extends ConfiguredObject> getConfiguredClass()
@@ -407,8 +439,7 @@ public class RestServlet extends Abstrac
                 {
                     byte[] data = new byte[(int) part.getSize()];
                     part.getInputStream().read(data);
-                    StringBuilder inlineURL = new StringBuilder("data:;base64,");
-                    inlineURL.append(DatatypeConverter.printBase64Binary(data));
+                    String inlineURL = DataUrlUtils.getDataUrlForBytes(data);
                     fileUploads.put(part.getName(),inlineURL.toString());
                 }
             }
@@ -671,4 +702,10 @@ public class RestServlet extends Abstrac
         return Boolean.parseBoolean(request.getParameter(paramName));
     }
 
+    private String ensureFilenameIsRfc2183(final String requestedFilename)
+    {
+        String fileNameRfc2183 = requestedFilename.replaceAll("[\\P{InBasic_Latin}\\\\:/]", "");
+        return fileNameRfc2183;
+    }
+
 }

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/addVirtualHostNodeAndVirtualHost.html
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/addVirtualHostNodeAndVirtualHost.html?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/addVirtualHostNodeAndVirtualHost.html (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/addVirtualHostNodeAndVirtualHost.html Tue Jan 27 15:00:13 2015
@@ -59,6 +59,34 @@
 
                     <div id="addVirtualHostNode.typeFields"></div>
 
+                    <div id="addVirtualHostNode.uploadFields" class="clear">
+                      <div class="formLabel-labelCell">
+                          <label for="addVirtualHostNode.upload">Upload virtualhost configuration from file:</label>
+                      </div>
+                      <div class="formLabel-controlCell">
+                          <input id="addVirtualHostNode.upload" type="checkbox"
+                                 data-dojo-type="dijit.form.CheckBox"
+                                 data-dojo-props="
+                                  name: 'upload'" />
+                      </div>
+                      <div id="addVirtualHostNode.fileFields" class="clear">
+                          <div class="formLabel-labelCell">
+                              <label for="addVirtualHostNode.file">Select JSON file*:</label>
+                          </div>
+                          <div class="tableContainer-valueCell formLabel-controlCell">
+                              <input type="file" id="addVirtualHostNode.file"
+                                      multiple="false"
+                                      data-dojo-type="dojox.form.Uploader"
+                                      data-dojo-props="
+                                      label: 'Select'"/>
+                              <span id="addVirtualHostNode.selectedFile" class="infoMessage"></span>
+                              <span id="addVirtualHostNode.selectedFileStatus"></span>
+                          </div>
+                      </div>
+                    </div>
+
+                    <div class="clear"></div>
+
                     <div data-dojo-type="dijit/TitlePane" data-dojo-props="title: 'Context variables',  open: false">
                         <div id="addVirtualHostNode.context"></div>
                     </div>

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/css/common.css
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/css/common.css?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/css/common.css (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/css/common.css Tue Jan 27 15:00:13 2015
@@ -215,6 +215,30 @@ div .messages {
     height: 16px;
 }
 
+.loadingIcon
+{
+    background: url("../dojo/dojox/image/resources/images/loading.gif") no-repeat;
+    width: 16px;
+    height: 16px;
+    background-size: contain;
+    display: inline-block;
+}
+
+.loadedIcon
+{
+    background: url("../dojo/dijit/icons/images/commonIconsObjActEnabled_rtl.png") no-repeat;
+    background-position: -352px -0px;
+    width: 16px;
+    height: 16px;
+    display: inline-block;
+}
+
+.fileUpload
+{
+    float: right;
+    padding: 5px;
+}
+
 .infoMessage
 {
     padding: 5px;

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/index.html
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/index.html?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/index.html (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/index.html Tue Jan 27 15:00:13 2015
@@ -25,6 +25,7 @@
     <link rel="stylesheet" href="dojo/dojox/grid/enhanced/resources/claro/EnhancedGrid.css">
     <link rel="stylesheet" href="dojo/dojox/grid/enhanced/resources/EnhancedGrid_rtl.css">
     <link rel="stylesheet" href="dojo/dojox/form/resources/CheckedMultiSelect.css">
+    <link rel="stylesheet" href="dojo/dojox/form/resources/FileInput.css" />
     <link rel="stylesheet" href="css/common.css" media="screen">
     <script>
         function getContextPath()

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/common/metadata.js Tue Jan 27 15:00:13 2015
@@ -69,7 +69,13 @@ define(["dojo/_base/xhr",
      implementsManagedInterface: function (category, type, managedInterfaceName)
      {
         return this.getMetaData(category, type).managedInterfaces.indexOf(managedInterfaceName) >= 0;
+     },
+     validChildTypes: function (category, type, childCategory)
+     {
+       var metaData = this.getMetaData(category, type);
+       return metaData ? metaData.validChildTypes[childCategory] : [];
      }
+
    };
 
    metadata._init();

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/AuthenticationProvider.js Tue Jan 27 15:00:13 2015
@@ -159,8 +159,8 @@ define(["dojo/_base/xhr",
                this.deletePreferencesProviderButton = query(".deletePreferencesProviderButton", node)[0];
                this.preferencesProviderAttributes = dom.byId("preferencesProviderAttributes")
                this.preferencesNode = query(".preferencesProviderDetails", node)[0];
-               this.authenticationProviderDetailsContainer = query(".authenticationProviderDetails", node)[0];
 
+this.authenticationProviderDetailsContainer = query(".authenticationProviderDetails", node)[0];
                this.query = "api/latest/authenticationprovider/" + encodeURIComponent(authProviderObj.name);
 
            }

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js Tue Jan 27 15:00:13 2015
@@ -23,6 +23,7 @@ define(["dojo/_base/xhr",
         "dojo/query",
         "dojo/json",
         "dojo/_base/connect",
+        "dojo/store/Memory",
         "qpid/common/properties",
         "qpid/common/updater",
         "qpid/common/util",
@@ -33,7 +34,7 @@ define(["dojo/_base/xhr",
         "qpid/management/addAuthenticationProvider",
         "qpid/management/addVirtualHostNodeAndVirtualHost",
         "qpid/management/addPort",
-        "qpid/management/addKeystore",
+        "qpid/management/addStore",
         "qpid/management/addGroupProvider",
         "qpid/management/addAccessControlProvider",
         "qpid/management/editBroker",
@@ -50,8 +51,8 @@ define(["dojo/_base/xhr",
         "dijit/Menu",
         "dijit/MenuItem",
         "dojo/domReady!"],
-       function (xhr, parser, query, json, connect, properties, updater, util, UpdatableStore, EnhancedGrid, registry, entities,
-        addAuthenticationProvider, addVirtualHostNodeAndVirtualHost, addPort, addKeystore, addGroupProvider, addAccessControlProvider, editBroker) {
+       function (xhr, parser, query, json, connect, memory, properties, updater, util, UpdatableStore, EnhancedGrid, registry, entities,
+        addAuthenticationProvider, addVirtualHostNodeAndVirtualHost, addPort, addStore, addGroupProvider, addAccessControlProvider, editBroker) {
 
            var brokerAttributeNames = ["name", "operatingSystem", "platform", "productVersion", "modelVersion",
                                         "defaultVirtualHost", "statisticsReportingPeriod", "statisticsReportingResetEnabled",
@@ -153,7 +154,11 @@ define(["dojo/_base/xhr",
 
                             var addKeystoreButton = query(".addKeystore", contentPane.containerNode)[0];
                             connect.connect(registry.byNode(addKeystoreButton), "onClick",
-                                function(evt){ addKeystore.showKeystoreDialog() });
+                                function(evt)
+                                {
+                                    addStore.setupTypeStore("KeyStore");
+                                    addStore.show();
+                                });
 
                             var deleteKeystore = query(".deleteKeystore", contentPane.containerNode)[0];
                             connect.connect(registry.byNode(deleteKeystore), "onClick",
@@ -168,7 +173,11 @@ define(["dojo/_base/xhr",
 
                             var addTruststoreButton = query(".addTruststore", contentPane.containerNode)[0];
                             connect.connect(registry.byNode(addTruststoreButton), "onClick",
-                                function(evt){ addKeystore.showTruststoreDialog() });
+                                function(evt)
+                                {
+                                    addStore.setupTypeStore("TrustStore");
+                                    addStore.show();
+                                });
 
                             var deleteTruststore = query(".deleteTruststore", contentPane.containerNode)[0];
                             connect.connect(registry.byNode(deleteTruststore), "onClick",

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/KeyStore.js
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/KeyStore.js?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/KeyStore.js (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/KeyStore.js Tue Jan 27 15:00:13 2015
@@ -29,16 +29,15 @@ define(["dojo/dom",
         "qpid/common/updater",
         "qpid/common/util",
         "qpid/common/formatter",
-        "qpid/management/addKeystore",
+        "qpid/management/addStore",
         "dojo/domReady!"],
-       function (dom, xhr, parser, query, connect, registry, entities, properties, updater, util, formatter, addKeystore) {
+       function (dom, xhr, parser, query, connect, registry, entities, properties, updater, util, formatter, addStore) {
 
-           function KeyStore(name, parent, controller, objectType) {
+           function KeyStore(name, parent, controller) {
                this.keyStoreName = name;
                this.controller = controller;
                this.modelObj = { type: "keystore", name: name, parent: parent};
                this.url = "api/latest/keystore/" + encodeURIComponent(name);
-               this.dialog =  addKeystore.showKeystoreDialog;
            }
 
            KeyStore.prototype.getTitle = function() {
@@ -48,7 +47,7 @@ define(["dojo/dom",
            KeyStore.prototype.open = function(contentPane) {
                var that = this;
                this.contentPane = contentPane;
-               xhr.get({url: "showKeyStore.html",
+               xhr.get({url: "showStore.html",
                         sync: true,
                         load:  function(data) {
                             contentPane.containerNode.innerHTML = data;
@@ -60,22 +59,22 @@ define(["dojo/dom",
 
                             that.keyStoreUpdater.update();
 
-                            var deleteKeyStoreButton = query(".deleteKeyStoreButton", contentPane.containerNode)[0];
+                            var deleteKeyStoreButton = query(".deleteStoreButton", contentPane.containerNode)[0];
                             var node = registry.byNode(deleteKeyStoreButton);
                             connect.connect(node, "onClick",
                                 function(evt){
                                     that.deleteKeyStore();
                                 });
 
-                            var editKeyStoreButton = query(".editKeyStoreButton", contentPane.containerNode)[0];
+                            var editKeyStoreButton = query(".editStoreButton", contentPane.containerNode)[0];
                             var node = registry.byNode(editKeyStoreButton);
                             connect.connect(node, "onClick",
                                 function(evt){
                                   xhr.get({url: that.url, sync: properties.useSyncGet, handleAs: "json", content: { actuals: true }})
                                     .then(function(data)
                                     {
-                                      // calls showKeystoreDialog
-                                      that.dialog(data[0], that.url);
+                                      addStore.setupTypeStore("KeyStore");
+                                      addStore.show(data[0], that.url);
                                     });
                                 });
                         }});
@@ -88,9 +87,10 @@ define(["dojo/dom",
            function KeyStoreUpdater(containerNode, keyStoreObj, controller, url)
            {
                var that = this;
+               this.keyStoreDetailsContainer = query(".typeFieldsContainer", containerNode)[0];
 
                function findNode(name) {
-                   return query("." + name + "Value", containerNode)[0];
+                   return query("." + name, containerNode)[0];
                }
 
                function storeNodes(names)
@@ -101,12 +101,8 @@ define(["dojo/dom",
                }
 
                storeNodes(["name",
-                           "path",
-                           "keyStoreType",
-                           "keyStoreState",
-                           "keyManagerFactoryAlgorithm",
-                           "certificateAlias",
-                           "peersOnly"
+                           "type",
+                           "state"
                            ]);
 
                this.query = url;
@@ -122,22 +118,27 @@ define(["dojo/dom",
            KeyStoreUpdater.prototype.updateHeader = function()
            {
               this.name.innerHTML = entities.encode(String(this.keyStoreData[ "name" ]));
-              this.path.innerHTML = entities.encode(String(this.keyStoreData[ "path" ]));
-              this.keyStoreType.innerHTML = entities.encode(String(this.keyStoreData[ "keyStoreType" ]));
-              this.keyStoreState.innerHTML = entities.encode(String(this.keyStoreData[ "state" ]));
-              this.keyManagerFactoryAlgorithm.innerHTML = entities.encode(String(this.keyStoreData[ "keyManagerFactoryAlgorithm" ]));
-              this.certificateAlias.innerHTML = this.keyStoreData[ "certificateAlias" ] ? entities.encode(String( this.keyStoreData[ "certificateAlias" ])) : "";
+              this.type.innerHTML = entities.encode(String(this.keyStoreData[ "type" ]));
+              this.state.innerHTML = entities.encode(String(this.keyStoreData[ "state" ]));
            };
 
            KeyStoreUpdater.prototype.update = function()
            {
 
-              var thisObj = this;
+              var that = this;
 
               xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}).then(function(data)
                    {
-                      thisObj.keyStoreData = data[0];
-                      thisObj.updateHeader();
+                      that.keyStoreData = data[0];
+                      that.updateHeader();
+
+                      require(["qpid/management/store/" + encodeURIComponent(that.keyStoreData.type.toLowerCase()) + "/show"],
+                           function(DetailsUI)
+                           {
+                             that.details = new DetailsUI({containerNode:that.keyStoreDetailsContainer, parent: that});
+                             that.details.update(that.keyStoreData);
+                           }
+                         );
                    });
            };
 

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/TrustStore.js
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/TrustStore.js?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/TrustStore.js (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/TrustStore.js Tue Jan 27 15:00:13 2015
@@ -29,16 +29,15 @@ define(["dojo/dom",
         "qpid/common/updater",
         "qpid/common/util",
         "qpid/common/formatter",
-        "qpid/management/addKeystore",
+        "qpid/management/addStore",
         "dojo/domReady!"],
-       function (dom, xhr, parser, query, connect, registry, entities, properties, updater, util, formatter, addKeystore) {
+       function (dom, xhr, parser, query, connect, registry, entities, properties, updater, util, formatter, addStore) {
 
            function TrustStore(name, parent, controller) {
                this.keyStoreName = name;
                this.controller = controller;
                this.modelObj = { type: "truststore", name: name, parent: parent};
                this.url = "api/latest/truststore/" + encodeURIComponent(name);
-               this.dialog =  addKeystore.showTruststoreDialog;
            }
 
            TrustStore.prototype.getTitle = function() {
@@ -48,7 +47,7 @@ define(["dojo/dom",
            TrustStore.prototype.open = function(contentPane) {
                var that = this;
                this.contentPane = contentPane;
-               xhr.get({url: "showTrustStore.html",
+               xhr.get({url: "showStore.html",
                         sync: true,
                         load:  function(data) {
                             contentPane.containerNode.innerHTML = data;
@@ -60,28 +59,27 @@ define(["dojo/dom",
 
                             that.keyStoreUpdater.update();
 
-                            var deleteTrustStoreButton = query(".deleteTrustStoreButton", contentPane.containerNode)[0];
+                            var deleteTrustStoreButton = query(".deleteStoreButton", contentPane.containerNode)[0];
                             var node = registry.byNode(deleteTrustStoreButton);
                             connect.connect(node, "onClick",
                                 function(evt){
                                     that.deleteKeyStore();
                                 });
 
-                            var editTrustStoreButton = query(".editTrustStoreButton", contentPane.containerNode)[0];
+                            var editTrustStoreButton = query(".editStoreButton", contentPane.containerNode)[0];
                             var node = registry.byNode(editTrustStoreButton);
                             connect.connect(node, "onClick",
                                 function(evt){
                                     xhr.get({url: that.url, sync: properties.useSyncGet, handleAs: "json", content: { actuals: true }})
                                     .then(function(data)
                                     {
-                                      that.dialog(data[0], that.url);
+                                      addStore.setupTypeStore("TrustStore");
+                                      addStore.show(data[0], that.url);
                                     });
                                 });
                         }});
            };
 
-
-
            TrustStore.prototype.close = function() {
                updater.remove( this.keyStoreUpdater );
            };
@@ -89,9 +87,10 @@ define(["dojo/dom",
            function KeyStoreUpdater(containerNode, keyStoreObj, controller, url)
            {
                var that = this;
+               this.keyStoreDetailsContainer = query(".typeFieldsContainer", containerNode)[0];
 
                function findNode(name) {
-                   return query("." + name + "Value", containerNode)[0];
+                   return query("." + name , containerNode)[0];
                }
 
                function storeNodes(names)
@@ -102,12 +101,8 @@ define(["dojo/dom",
                }
 
                storeNodes(["name",
-                           "path",
-                           "trustStoreType",
-                           "trustStoreState",
-                           "trustManagerFactoryAlgorithm",
-                           "certificateAlias",
-                           "peersOnly"
+                           "type",
+                           "state"
                            ]);
 
                this.query = url;
@@ -123,23 +118,26 @@ define(["dojo/dom",
            KeyStoreUpdater.prototype.updateHeader = function()
            {
               this.name.innerHTML = entities.encode(String(this.keyStoreData[ "name" ]));
-              this.path.innerHTML = entities.encode(String(this.keyStoreData[ "path" ]));
-              this.trustStoreType.innerHTML = entities.encode(String(this.keyStoreData[ "trustStoreType" ]));
-              this.trustStoreState.innerHTML = entities.encode(String(this.keyStoreData[ "state" ]));
-              this.trustManagerFactoryAlgorithm.innerHTML = entities.encode(String(this.keyStoreData[ "trustManagerFactoryAlgorithm" ]));
-              this.peersOnly.innerHTML = "<input type='checkbox' disabled='disabled' "+(this.keyStoreData[ "peersOnly" ] ? "checked='checked'": "")+" />" ;
+              this.type.innerHTML = entities.encode(String(this.keyStoreData[ "type" ]));
+              this.state.innerHTML = entities.encode(String(this.keyStoreData[ "state" ]));
            };
 
            KeyStoreUpdater.prototype.update = function()
            {
-
-              var thisObj = this;
-
+              var that = this;
               xhr.get({url: this.query, sync: properties.useSyncGet, handleAs: "json"}).then(function(data)
-                   {
-                      thisObj.keyStoreData = data[0];
-                      thisObj.updateHeader();
-                   });
+               {
+                  that.trustStoreData = data[0];
+                  that.updateHeader();
+
+                  require(["qpid/management/store/" + encodeURIComponent(that.trustStoreData.type.toLowerCase()) + "/show"],
+                       function(DetailsUI)
+                       {
+                         that.details = new DetailsUI({containerNode:that.keyStoreDetailsContainer, parent: that});
+                         that.details.update(that.trustStoreData);
+                       }
+                     );
+               });
            };
 
            TrustStore.prototype.deleteKeyStore = function() {

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/VirtualHost.js Tue Jan 27 15:00:13 2015
@@ -93,6 +93,19 @@ define(["dojo/_base/xhr",
                             that.stopButton = registry.byNode(query(".stopButton", containerNode)[0]);
                             that.startButton = registry.byNode(query(".startButton", containerNode)[0]);
                             that.editButton = registry.byNode(query(".editButton", containerNode)[0]);
+                            that.downloadButton = registry.byNode(query(".downloadButton", containerNode)[0]);
+                            that.downloadButton.on("click",
+                              function(e)
+                              {
+                                var iframe = document.createElement('iframe');
+                                iframe.id = "downloader_" + that.name;
+                                document.body.appendChild(iframe);
+                                var suggestedAttachmentName = encodeURIComponent(that.name + ".json");
+                                iframe.src = "/api/latest/virtualhost/" + encodeURIComponent(that.modelObj.parent.name) + "/" + encodeURIComponent(that.name) + "?extractInitialConfig=true&contentDispositionAttachmentFilename=" + suggestedAttachmentName;
+                                // It seems there is no way to remove this iframe in a manner that is cross browser compatible.
+                              }
+                            );
+
                             that.deleteButton = registry.byNode(query(".deleteButton", containerNode)[0]);
                             that.deleteButton.on("click",
                                  function(e)
@@ -344,6 +357,7 @@ define(["dojo/_base/xhr",
                 this.virtualHost.startButton.set("disabled", !this.vhostData.state || this.vhostData.state != "STOPPED");
                 this.virtualHost.stopButton.set("disabled", !this.vhostData.state || this.vhostData.state != "ACTIVE");
                 this.virtualHost.editButton.set("disabled", !this.vhostData.state || this.vhostData.state == "UNAVAILABLE");
+                this.virtualHost.downloadButton.set("disabled", !this.vhostData.state || this.vhostData.state != "ACTIVE");
                 this.virtualHost.deleteButton.set("disabled", !this.vhostData.state);
 
                        util.flattenStatistics( thisObj.vhostData );

Modified: qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAccessControlProvider.js
URL: http://svn.apache.org/viewvc/qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAccessControlProvider.js?rev=1655057&r1=1655056&r2=1655057&view=diff
==============================================================================
--- qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAccessControlProvider.js (original)
+++ qpid/branches/QPID-6262-JavaBrokerNIO/qpid/java/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addAccessControlProvider.js Tue Jan 27 15:00:13 2015
@@ -26,8 +26,10 @@ define(["dojo/_base/lang",
         "dojo/parser",
         "dojo/_base/array",
         "dojo/_base/event",
-        'dojo/_base/json',
+        'dojo/json',
         "qpid/common/util",
+        "qpid/common/metadata",
+        "dojo/text!addAccessControlProvider.html",
         "dojo/store/Memory",
         "dojox/validate/us",
         "dojox/validate/web",
@@ -42,140 +44,124 @@ define(["dojo/_base/lang",
         "dijit/layout/ContentPane",
         "dojox/layout/TableContainer",
         "dojo/domReady!"],
-    function (lang, xhr, dom, construct, registry, parser, array, event, json, util) {
+    function (lang, xhr, dom, construct, registry, parser, array, event, json, util, metadata, template)
+    {
 
-        var addAccessControlProvider = {};
-
-        addAccessControlProvider.show = function(accessControlProvider) {
-          var fields = [{
-              name: "name",
-              createWidget: function(accessControlProvider) {
-                  return new dijit.form.ValidationTextBox({
-                    required: true,
-                    value: accessControlProvider.name,
-                    disabled: accessControlProvider.name ? true : false,
-                    label: "Name*:",
-                    regexp: "^[\x20-\x2e\x30-\x7F]{1,255}$",
-                    promptMessage: "Name of access control provider.",
-                    placeHolder: "name",
-                    name: "name"});
-              }
-          }, {
-              name: "type",
-              createWidget: function(accessControlProvider) {
-
-                  var typeContainer = construct.create("div");
-
-                  var typeListContainer = new dojox.layout.TableContainer({
-                      cols: 1,
-                      "labelWidth": "300",
-                      customClass: "formLabel",
-                      showLabels: true,
-                      orientation: "horiz"
-                  });
-
-                  typeContainer.appendChild(typeListContainer.domNode);
-
-                  var providers =  [];
-                  var fieldSetContainers = {};
-                  xhr.get({
-                    url: "service/helper?action=ListAccessControlProviderAttributes",
-                    handleAs: "json",
-                    sync: true
-                  }).then(
-                  function(data) {
-                       var providerIndex = 0;
-
-                       for (var providerType in data) {
-                           if (data.hasOwnProperty(providerType)) {
-                               providers[providerIndex++] = {id: providerType, name: providerType};
-
-                               var attributes = data[providerType].attributes;
-                               var descriptions = data[providerType].descriptions;
-
-                               var layout = new dojox.layout.TableContainer( {
-                                   cols: 1,
-                                   "labelWidth": "300",
-                                   customClass: "formLabel",
-                                   showLabels: true,
-                                   orientation: "horiz"
-                               });
-
-                               for(var i=0; i < attributes.length; i++) {
-                                   if ("type" == attributes[i])
-                                   {
-                                       continue;
-                                   }
-                                   var labelValue = attributes[i];
-                                   if (descriptions && descriptions[attributes[i]])
-                                   {
-                                       labelValue = descriptions[attributes[i]];
-                                   }
-                                   var text = new dijit.form.TextBox({
-                                       label: labelValue + ":",
-                                       name: attributes[i]
-                                   });
-                                   layout.addChild(text);
-                               }
-
-                               typeContainer.appendChild(layout.domNode);
-                               fieldSetContainers[providerType] = layout;
-                           }
-                       }
-                });
-
-                var providersStore = new dojo.store.Memory({ data: providers });
-
-                var typeList = new dijit.form.FilteringSelect({
-                  required: true,
-                  value: accessControlProvider.type,
-                  store: providersStore,
-                  label: "Type*:",
-                  name: "type"});
-
-                typeListContainer.addChild(typeList);
-
-                var onChangeHandler = function onChangeHandler(newValue){
-                  for (var i in fieldSetContainers) {
-                    var container = fieldSetContainers[i];
-                    var descendants = container.getChildren();
-                    for(var i in descendants){
-                      var descendant = descendants[i];
-                      var propName = descendant.name;
-                      if (propName) {
-                        descendant.set("disabled", true);
-                      }
+        var addAccessControlProvider =
+        {
+            init: function()
+            {
+                var that=this;
+                this.containerNode = construct.create("div", {innerHTML: template});
+                parser.parse(this.containerNode);
+
+                this.accessControlProviderName = registry.byId("addAccessControlProvider.name");
+                this.accessControlProviderName.set("regExpGen", util.nameOrContextVarRegexp);
+
+                this.dialog = registry.byId("addAccessControlProvider");
+                this.addButton = registry.byId("addAccessControlProvider.addButton");
+                this.cancelButton = registry.byId("addAccessControlProvider.cancelButton");
+                this.cancelButton.on("click", function(e){that._cancel(e);});
+                this.addButton.on("click", function(e){that._add(e);});
+
+                this.accessControlProviderTypeFieldsContainer = dom.byId("addAccessControlProvider.typeFields");
+                this.accessControlProviderForm = registry.byId("addAccessControlProvider.form");
+                this.accessControlProviderType = registry.byId("addAccessControlProvider.type");
+                this.supportedAccessControlProviderTypes = metadata.getTypesForCategory("AccessControlProvider");
+                this.supportedAccessControlProviderTypes.sort();
+                var accessControlProviderTypeStore = util.makeTypeStore(this.supportedAccessControlProviderTypes);
+                this.accessControlProviderType.set("store", accessControlProviderTypeStore);
+                this.accessControlProviderType.on("change", function(type){that._accessControlProviderTypeChanged(type);});
+            },
+            show: function(effectiveData)
+            {
+                this.accessControlProviderForm.reset();
+                this.dialog.show();
+            },
+            _cancel: function(e)
+            {
+                event.stop(e);
+                if (this.reader)
+                {
+                    this.reader.abort();
+                }
+                this.dialog.hide();
+            },
+            _add: function(e)
+            {
+                event.stop(e);
+                this._submit();
+            },
+            _submit: function()
+            {
+                if (this.accessControlProviderForm.validate())
+                {
+                    var success = false,failureReason=null;
+
+                    var accessControlProviderData = util.getFormWidgetValues(this.accessControlProviderForm, this.initialData);
+                    var encodedAccessControlProviderName = encodeURIComponent(this.accessControlProviderName.value);
+
+                    xhr.put(
+                    {
+                        url: "api/latest/accesscontrolprovider/" + encodedAccessControlProviderName,
+                        sync: true,
+                        handleAs: "json",
+                        headers: { "Content-Type": "application/json"},
+                        putData: json.stringify(accessControlProviderData),
+                        load: function(x) {success = true; },
+                        error: function(error) {success = false; failureReason = error;}
+                    });
+
+                    if (success == true)
+                    {
+                        this.dialog.hide();
                     }
-                    container.domNode.style.display = "none";
-                  }
-                  var container = fieldSetContainers[newValue];
-                  if (container)
-                  {
-                    container.domNode.style.display = "block";
-                    var descendants = container.getChildren();
-                    for(var i in descendants){
-                      var descendant = descendants[i];
-                      var propName = descendant.name;
-                      if (propName) {
-                        descendant.set("disabled", false);
-                      }
+                    else
+                    {
+                        util.xhrErrorHandler(failureReason);
                     }
-                  }
-                };
-                typeList.on("change", onChangeHandler);
-                onChangeHandler(typeList.value);
-                return new dijit.layout.ContentPane({content: typeContainer, style:{padding: 0}});
-              }
-              }];
-
-          util.showSetAttributesDialog(
-              fields,
-              accessControlProvider ? accessControlProvider : {},
-              "api/latest/accesscontrolprovider" + (name ? "/" + encodeURIComponent(name.name) : ""),
-              accessControlProvider ? "Edit access control provider - " + accessControlProvider.name : "Add access control provider",
-              "AccessControlProvider",
-              accessControlProvider && accessControlProvider.type ? accessControlProvider.type : "AclFile",
-              accessControlProvider ? false : true);
+                }
+                else
+                {
+                    alert('Form contains invalid data. Please correct first');
+                }
+            },
+            _accessControlProviderTypeChanged: function(type)
+            {
+                this._typeChanged(type, this.accessControlProviderTypeFieldsContainer, "qpid/management/accesscontrolprovider/", "AccessControlProvider" );
+            },
+            _typeChanged: function(type, typeFieldsContainer, baseUrl, category )
+            {
+                 var widgets = registry.findWidgets(typeFieldsContainer);
+                 array.forEach(widgets, function(item) { item.destroyRecursive();});
+                 construct.empty(typeFieldsContainer);
+
+                 if (type)
+                 {
+                     var that = this;
+                     require([ baseUrl + type.toLowerCase() + "/add"], function(typeUI)
+                     {
+                         try
+                         {
+                             typeUI.show({containerNode:typeFieldsContainer, parent: that, data: that.initialData, effectiveData: that.effectiveData});
+                             util.applyMetadataToWidgets(typeFieldsContainer, category, type);
+                         }
+                         catch(e)
+                         {
+                             console.warn(e);
+                         }
+                     });
+                 }
+            }
         };
+
+        try
+        {
+            addAccessControlProvider.init();
+        }
+        catch(e)
+        {
+            console.warn(e);
+        }
         return addAccessControlProvider;
-    });
\ No newline at end of file
+    });



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