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: [email protected] For additional commands, e-mail: [email protected]
