summaryrefslogtreecommitdiff
path: root/qpid/java
diff options
context:
space:
mode:
authorMartin Ritchie <ritchiem@apache.org>2009-08-12 18:17:26 +0000
committerMartin Ritchie <ritchiem@apache.org>2009-08-12 18:17:26 +0000
commit0f4bde67479c5ee459cd2687903f932bcd0dd8c6 (patch)
treeaed449bf36ba32e841c65770a6b750c7c3548c7a /qpid/java
parent3cd183b2e170ab0c7f190ff45a0a55bcd3478007 (diff)
downloadqpid-python-0f4bde67479c5ee459cd2687903f932bcd0dd8c6.tar.gz
QPID-2002 : Addition of JMX Management interface logging using the new Logging Interfaces
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@803649 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/java')
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java24
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java7
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java7
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java7
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java9
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java2
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java39
-rw-r--r--qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBinding.java2
-rw-r--r--qpid/java/systests/src/main/java/org/apache/qpid/management/jmx/ManagementActorLoggingTest.java666
9 files changed, 745 insertions, 18 deletions
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java
index 14f64d2879..2afd3c1dc3 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQBrokerManagerMBean.java
@@ -65,6 +65,8 @@ import org.apache.qpid.server.queue.AMQQueueMBean;
import org.apache.qpid.server.queue.QueueRegistry;
import org.apache.qpid.server.store.MessageStore;
import org.apache.qpid.server.virtualhost.VirtualHost;
+import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.actors.ManagementActor;
/**
* This MBean implements the broker management interface and exposes the
@@ -79,7 +81,7 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
private final MessageStore _messageStore;
private final VirtualHost.VirtualHostMBean _virtualHostMBean;
-
+
@MBeanConstructor("Creates the Broker Manager MBean")
public AMQBrokerManagerMBean(VirtualHost.VirtualHostMBean virtualHostMBean) throws JMException
{
@@ -189,6 +191,7 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
*/
public void createNewExchange(String exchangeName, String type, boolean durable) throws JMException
{
+ CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger()));
try
{
synchronized (_exchangeRegistry)
@@ -210,6 +213,10 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
{
throw new MBeanException(ex, "Error in creating exchange " + exchangeName);
}
+ finally
+ {
+ CurrentActor.remove();
+ }
}
/**
@@ -225,6 +232,7 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
// boolean inUse = false;
// Check if there are queue-bindings with the exchange and unregister
// when there are no bindings.
+ CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger()));
try
{
_exchangeRegistry.unregisterExchange(new AMQShortString(exchangeName), false);
@@ -233,6 +241,10 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
{
throw new MBeanException(ex, "Error in unregistering exchange " + exchangeName);
}
+ finally
+ {
+ CurrentActor.remove();
+ }
}
/**
@@ -252,6 +264,7 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
throw new JMException("The queue \"" + queueName + "\" already exists.");
}
+ CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger()));
try
{
AMQShortString ownerShortString = null;
@@ -275,6 +288,10 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
jme.initCause(ex);
throw new MBeanException(jme, "Error in creating queue " + queueName);
}
+ finally
+ {
+ CurrentActor.remove();
+ }
}
private VirtualHost getVirtualHost()
@@ -296,6 +313,7 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
throw new JMException("The Queue " + queueName + " is not a registerd queue.");
}
+ CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger()));
try
{
queue.delete();
@@ -308,6 +326,10 @@ public class AMQBrokerManagerMBean extends AMQManagedObject implements ManagedBr
jme.initCause(ex);
throw new MBeanException(jme, "Error in deleting queue " + queueName);
}
+ finally
+ {
+ CurrentActor.remove();
+ }
}
public ManagedObject getParentObject()
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java
index 4b609f592b..3567cdff85 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/DirectExchange.java
@@ -43,6 +43,8 @@ import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.server.queue.IncomingMessage;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.virtualhost.VirtualHost;
+import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.actors.ManagementActor;
public class DirectExchange extends AbstractExchange
{
@@ -129,6 +131,7 @@ public class DirectExchange extends AbstractExchange
throw new JMException("Queue \"" + queueName + "\" is not registered with the exchange.");
}
+ CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger()));
try
{
queue.bind(DirectExchange.this, new AMQShortString(binding), null);
@@ -137,6 +140,10 @@ public class DirectExchange extends AbstractExchange
{
throw new MBeanException(ex);
}
+ finally
+ {
+ CurrentActor.remove();
+ }
}
}// End of MBean class
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java
index fcaec8bdd0..7fa438587c 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/FanoutExchange.java
@@ -31,6 +31,8 @@ import org.apache.qpid.framing.FieldTable;
import org.apache.qpid.server.queue.IncomingMessage;
import org.apache.qpid.server.queue.AMQQueue;
import org.apache.qpid.server.virtualhost.VirtualHost;
+import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.actors.ManagementActor;
import javax.management.JMException;
import javax.management.MBeanException;
@@ -102,6 +104,7 @@ public class FanoutExchange extends AbstractExchange
throw new JMException("Queue \"" + queueName + "\" is not registered with the exchange.");
}
+ CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger()));
try
{
queue.bind(FanoutExchange.this, new AMQShortString(BINDING_KEY_SUBSTITUTE), null);
@@ -110,6 +113,10 @@ public class FanoutExchange extends AbstractExchange
{
throw new MBeanException(ex);
}
+ finally
+ {
+ CurrentActor.remove();
+ }
}
} // End of MBean class
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java
index be7a1dc196..31db1148c6 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/exchange/TopicExchange.java
@@ -37,6 +37,8 @@ import org.apache.qpid.server.exchange.topic.TopicParser;
import org.apache.qpid.server.exchange.topic.TopicMatcherResult;
import org.apache.qpid.server.filter.MessageFilter;
import org.apache.qpid.server.filter.JMSSelectorFilter;
+import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.actors.ManagementActor;
import javax.management.JMException;
import javax.management.MBeanException;
@@ -351,6 +353,7 @@ public class TopicExchange extends AbstractExchange
throw new JMException("Queue \"" + queueName + "\" is not registered with the exchange.");
}
+ CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger()));
try
{
queue.bind(TopicExchange.this, new AMQShortString(binding), null);
@@ -359,6 +362,10 @@ public class TopicExchange extends AbstractExchange
{
throw new MBeanException(ex);
}
+ finally
+ {
+ CurrentActor.remove();
+ }
}
} // End of MBean class
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java
index c6e07f6f48..594ae24502 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/management/AMQManagedObject.java
@@ -20,6 +20,10 @@
*/
package org.apache.qpid.server.management;
+import org.apache.qpid.server.logging.actors.ManagementActor;
+import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.LogActor;
+
import javax.management.ListenerNotFoundException;
import javax.management.MBeanInfo;
import javax.management.MBeanNotificationInfo;
@@ -50,10 +54,15 @@ public abstract class AMQManagedObject extends DefaultManagedObject
protected MBeanInfo _mbeanInfo;
+ protected LogActor _logActor;
+
protected AMQManagedObject(Class<?> managementInterface, String typeName, int version)
throws NotCompliantMBeanException
{
super(managementInterface, typeName, version);
+ // CurrentActor will be defined as these objects are created during
+ // broker startup.
+ _logActor = new ManagementActor(CurrentActor.get().getRootMessageLogger());
buildMBeanInfo();
}
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java
index e8ea56bafd..dc12fdeff7 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQMinaProtocolSession.java
@@ -659,7 +659,7 @@ public class AMQMinaProtocolSession implements AMQProtocolSession, Managable
{
_closed = true;
- _actor.message(ConnectionMessages.CON_1002());
+ CurrentActor.get().message(_logSubject, ConnectionMessages.CON_1002());
if (_virtualHost != null)
{
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java
index 225a01386b..81dbeeded2 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java
@@ -66,7 +66,9 @@ import org.apache.qpid.management.common.mbeans.annotations.MBeanDescription;
import org.apache.qpid.protocol.AMQConstant;
import org.apache.qpid.server.AMQChannel;
import org.apache.qpid.server.logging.actors.CurrentActor;
+import org.apache.qpid.server.logging.actors.ManagementActor;
import org.apache.qpid.server.logging.LogActor;
+import org.apache.qpid.server.logging.RootMessageLogger;
import org.apache.qpid.server.management.AMQManagedObject;
import org.apache.qpid.server.management.ManagedObject;
@@ -187,7 +189,7 @@ public class AMQProtocolSessionMBean extends AMQManagedObject implements Managed
*/
public void commitTransactions(int channelId) throws JMException
{
- CurrentActor.set(getLogActor());
+ CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger()));
try
{
AMQChannel channel = _session.getChannel(channelId);
@@ -216,7 +218,7 @@ public class AMQProtocolSessionMBean extends AMQManagedObject implements Managed
*/
public void rollbackTransactions(int channelId) throws JMException
{
- CurrentActor.set(getLogActor());
+ CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger()));
try
{
AMQChannel channel = _session.getChannel(channelId);
@@ -281,7 +283,22 @@ public class AMQProtocolSessionMBean extends AMQManagedObject implements Managed
0,
0);
- CurrentActor.set(getLogActor());
+ // This seems ugly but because we use closeConnection in both normal
+ // broker operation and as part of the management interface it cannot
+ // be avoided. The Current Actor will be null when this method is
+ // called via the Management interface. This is because we allow the
+ // Local API connection with JConsole. If we did not allow that option
+ // then the CurrentActor could be set in our JMX Proxy object.
+ // As it is we need to set the CurrentActor on all MBean methods
+ // Ideally we would not have a single method that can be called from
+ // two contexts.
+ boolean removeActor = false;
+ if (CurrentActor.get() == null)
+ {
+ removeActor = true;
+ CurrentActor.set(new ManagementActor(_logActor.getRootMessageLogger()));
+ }
+
try
{
_session.writeFrame(responseBody.generateFrame(0));
@@ -298,21 +315,13 @@ public class AMQProtocolSessionMBean extends AMQManagedObject implements Managed
}
finally
{
- CurrentActor.remove();
+ if (removeActor)
+ {
+ CurrentActor.remove();
+ }
}
}
- /**
- * Return the LogActor for this MBean Session
- * //fixme currently simply returning the managed sessions LogActor, should
- * be the ManagementActor
- * @return
- */
- private LogActor getLogActor()
- {
- return _session.getLogActor();
- }
-
@Override
public MBeanNotificationInfo[] getNotificationInfo()
{
diff --git a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBinding.java b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBinding.java
index 7584a3b7cc..6e87cfbb76 100644
--- a/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBinding.java
+++ b/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/ExchangeBinding.java
@@ -45,7 +45,7 @@ public class ExchangeBinding
_arguments = arguments == null ? EMPTY_ARGUMENTS : arguments;
_logSubject = new BindingLogSubject(routingKey,exchange,queue);
- CurrentActor.get().message(_logSubject, BindingMessages.BND_1001(_arguments.toString(), arguments != null));
+ CurrentActor.get().message(_logSubject, BindingMessages.BND_1001(String.valueOf(_arguments), arguments != null));
}
diff --git a/qpid/java/systests/src/main/java/org/apache/qpid/management/jmx/ManagementActorLoggingTest.java b/qpid/java/systests/src/main/java/org/apache/qpid/management/jmx/ManagementActorLoggingTest.java
new file mode 100644
index 0000000000..74dd7e9964
--- /dev/null
+++ b/qpid/java/systests/src/main/java/org/apache/qpid/management/jmx/ManagementActorLoggingTest.java
@@ -0,0 +1,666 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.management.jmx;
+
+import org.apache.qpid.commands.objects.AllObjects;
+import org.apache.qpid.management.common.JMXConnnectionFactory;
+import org.apache.qpid.management.common.mbeans.ManagedBroker;
+import org.apache.qpid.management.common.mbeans.ManagedConnection;
+import org.apache.qpid.management.common.mbeans.ManagedExchange;
+import org.apache.qpid.server.logging.AbstractTestLogging;
+import org.apache.qpid.server.logging.subjects.AbstractTestLogSubject;
+
+import javax.jms.Connection;
+import javax.management.JMException;
+import javax.management.MBeanException;
+import javax.management.MBeanServerConnection;
+import javax.management.MBeanServerInvocationHandler;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnector;
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Test class to test if any change in the broker JMX code is affesting the management console
+ * There are some hardcoding of management feature names and parameter names to create a customized
+ * look in the console.
+ */
+public class ManagementActorLoggingTest extends AbstractTestLogging
+{
+ MBeanServerConnection _mbsc;
+ JMXConnector _jmxc;
+ private static final String USER = "admin";
+
+ @Override
+ public void setUp() throws Exception
+ {
+ setConfigurationProperty("management.enabled", "true");
+ super.setUp();
+
+ if (isExternalBroker())
+ {
+ _jmxc = JMXConnnectionFactory.getJMXConnection(
+ 5000, "127.0.0.1",
+ getManagementPort(getPort()), USER, USER);
+
+ _mbsc = _jmxc.getMBeanServerConnection();
+ }
+ }
+
+ @Override
+ public void tearDown() throws Exception
+ {
+ if (isExternalBroker())
+ {
+ _jmxc.close();
+ }
+ super.tearDown();
+ }
+
+ /**
+ * Description:
+ * When a JMX Management connection is made then this will be logged out.
+ *
+ * Input:
+ *
+ * 1. Running Broker
+ * 2. Connect Management client via JMX
+ * Output:
+ *
+ * <date> MNG-1007 : Open <user>
+ *
+ * Validation Steps:
+ * 1. The MNG ID is correct
+ * 2. The user is correct
+ *
+ * On connection close a MNG-1008 is expected
+ *
+ * * <date> MNG-1008 : Close
+ *
+ * Validation Steps:
+ * 1. The MNG ID is correct
+ *
+ * @throws java.io.IOException - if there is a problem reseting the log monitor
+ */
+ public void testJMXManagementConsoleConnection() throws IOException
+ {
+ if (isExternalBroker())
+ {
+ List<String> results = _monitor.findMatches("MNG-1007");
+
+ assertEquals("Unexpected Management Connection count", 1, results.size());
+
+ String log = getLog(results.get(0));
+
+ validateMessageID("MNG-1007", log);
+
+ assertTrue("User not in log message:" + log, log.endsWith(USER));
+ // Extract the id from the log string
+ // MESSAGE [mng:1(rmi://169.24.29.116)] MNG-1007 : Open : User admin
+ int connectionID = Integer.parseInt(fromActor(getLog(results.get(0))).charAt(4) + "");
+
+ results = _monitor.findMatches("MNG-1008");
+
+ assertEquals("Unexpected Management Connection close count", 0, results.size());
+
+ _jmxc.close();
+
+ results = _monitor.findMatches("MNG-1008");
+
+ assertEquals("Unexpected Management Connection count", 1, results.size());
+
+ assertEquals("Close does not have same id as open,", connectionID,
+ Integer.parseInt(fromActor(getLog(results.get(0))).charAt(4) + ""));
+ }
+ }
+
+ /**
+ * Description:
+ * When a connected client has its connection closed via the Management Console this will be logged as a CON-1002 message.
+ * Input:
+ *
+ * 1. Running Broker
+ * 2. Connected Client
+ * 3. Connection is closed via Management Console
+ * Output:
+ *
+ * <date> CON-1002 : Close
+ *
+ * Validation Steps:
+ * 4. The CON ID is correct
+ * 5. This must be the last CON message for the Connection
+ * 6. It must be preceded by a CON-1001 for this Connection
+ *
+ * @throws Exception - {@see ManagedConnection.closeConnection and #getConnection}
+ * @throws java.io.IOException - if there is a problem reseting the log monitor
+ */
+ public void testConnectionCloseViaManagement() throws IOException, Exception
+ {
+ if (isExternalBroker())
+ {
+
+ //Create a connection to the broker
+ Connection connection = getConnection();
+
+ // Get all active AMQP connections
+ AllObjects allObject = new AllObjects(_mbsc);
+ allObject.querystring = "org.apache.qpid:type=VirtualHost.Connection,*";
+
+ Set<ObjectName> objectNames = allObject.returnObjects();
+
+ assertEquals("More than one test connection returned", 1, objectNames.size());
+
+ ObjectName connectionName = objectNames.iterator().next();
+
+ ManagedConnection mangedConnection = MBeanServerInvocationHandler.
+ newProxyInstance(_mbsc, connectionName,
+ ManagedConnection.class, false);
+
+ //Close the connection
+ mangedConnection.closeConnection();
+
+ //Validate results
+ List<String> results = _monitor.findMatches("CON-1002");
+
+
+ assertEquals("Unexpected Connection Close count", 1, results.size());
+ }
+ }
+
+ /**
+ * Description:
+ * Exchange creation is possible from the Management Console.
+ * When an exchanged is created in this way then a EXH-1001 create message
+ * is expected to be logged.
+ * Input:
+ *
+ * 1. Running broker
+ * 2. Connected Management Console
+ * 3. Exchange Created via Management Console
+ * Output:
+ *
+ * EXH-1001 : Create : [Durable] Type:<value> Name:<value>
+ *
+ * Validation Steps:
+ * 4. The EXH ID is correct
+ * 5. The correct tags are present in the message based on the create options
+ *
+ * @throws java.io.IOException - if there is a problem reseting the log monitor
+ * @throws javax.management.JMException - {@see #createQueue and ManagedExchange.deleteQueue}
+ */
+ public void testCreateExchangeDirectTransientViaManagementConsole() throws IOException, JMException
+ {
+ if (isExternalBroker())
+ {
+ //Remove any previous exchange declares
+ _monitor.reset();
+
+ createExchange("direct");
+
+ // Validate
+
+ //1 - ID is correct
+ List<String> results = _monitor.findMatches("EXH-1001");
+
+ assertEquals("More than one exchange creation found", 1, results.size());
+
+ String log = getLog(results.get(0));
+
+ // Validate correct exchange name
+ assertTrue("Incorrect exchange name created:" + log, log.endsWith(getName()));
+
+ // Validate it was a management actor.
+ String actor = fromActor(log);
+ assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
+
+ }
+ }
+
+ public void testCreateExchangeTopicTransientViaManagementConsole() throws IOException, JMException
+ {
+ if (isExternalBroker())
+ {
+ //Remove any previous exchange declares
+ _monitor.reset();
+
+ createExchange("topic");
+
+ // Validate
+
+ //1 - ID is correct
+ List<String> results = _monitor.findMatches("EXH-1001");
+
+ assertEquals("More than one exchange creation found", 1, results.size());
+
+ String log = getLog(results.get(0));
+
+ // Validate correct exchange name
+ assertTrue("Incorrect exchange name created:" + log, log.endsWith(getName()));
+
+ // Validate it was a management actor.
+ String actor = fromActor(log);
+ assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
+
+ }
+ }
+
+ public void testCreateExchangeFanoutTransientViaManagementConsole() throws IOException, JMException
+ {
+ if (isExternalBroker())
+ {
+ //Remove any previous exchange declares
+ _monitor.reset();
+
+ createExchange("fanout");
+
+ // Validate
+
+ //1 - ID is correct
+ List<String> results = _monitor.findMatches("EXH-1001");
+
+ assertEquals("More than one exchange creation found", 1, results.size());
+
+ String log = getLog(results.get(0));
+
+ // Validate correct exchange name
+ assertTrue("Incorrect exchange name created:" + log, log.endsWith(getName()));
+
+ // Validate it was a management actor.
+ String actor = fromActor(log);
+ assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
+
+ }
+ }
+
+ public void testCreateExchangeHeadersTransientViaManagementConsole() throws IOException, JMException
+ {
+ if (isExternalBroker())
+ {
+ //Remove any previous exchange declares
+ _monitor.reset();
+
+ createExchange("headers");
+
+ // Validate
+
+ //1 - ID is correct
+ List<String> results = _monitor.findMatches("EXH-1001");
+
+ assertEquals("More than one exchange creation found", 1, results.size());
+
+ String log = getLog(results.get(0));
+
+ // Validate correct exchange name
+ assertTrue("Incorrect exchange name created:" + log, log.endsWith(getName()));
+
+ // Validate it was a management actor.
+ String actor = fromActor(log);
+ assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
+
+ }
+ }
+
+ /**
+ * Description:
+ * Queue creation is possible from the Management Console. When a queue is created in this way then a QUE-1001 create message is expected to be logged.
+ * Input:
+ *
+ * 1. Running broker
+ * 2. Connected Management Console
+ * 3. Queue Created via Management Console
+ * Output:
+ *
+ * <date> QUE-1001 : Create : Transient Owner:<name>
+ *
+ * Validation Steps:
+ * 4. The QUE ID is correct
+ * 5. The correct tags are present in the message based on the create options
+ *
+ * @throws java.io.IOException - if there is a problem reseting the log monitor
+ * @throws javax.management.JMException - {@see #createQueue and ManagedExchange.deleteQueue}
+ */
+ public void testCreateQueueTransientViaManagementConsole() throws IOException, JMException
+ {
+ if (isExternalBroker())
+ {
+ //Remove any previous queue declares
+ _monitor.reset();
+
+ createQueue();
+
+ // Validate
+
+ List<String> results = _monitor.findMatches("QUE-1001");
+
+ assertEquals("More than one queue creation found", 1, results.size());
+
+ String log = getLog(results.get(0));
+
+ // Validate correct queue name
+ String subject = fromSubject(log);
+ assertEquals("Incorrect queue name created", getName(), AbstractTestLogSubject.getSlice("qu", subject));
+
+ // Validate it was a management actor.
+ String actor = fromActor(log);
+ assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
+ }
+ }
+
+ /**
+ * Description:
+ * The ManagementConsole can be used to delete a queue. When this is done a QUE-1002 Deleted message must be logged.
+ * Input:
+ *
+ * 1. Running Broker
+ * 2. Queue created on the broker with no subscribers
+ * 3. Management Console connected
+ * 4. Queue is deleted via Management Console
+ * Output:
+ *
+ * <date> QUE-1002 : Deleted
+ *
+ * Validation Steps:
+ * 5. The QUE ID is correct
+ *
+ * @throws java.io.IOException - if there is a problem reseting the log monitor
+ * @throws javax.management.JMException - {@see #createQueue and ManagedExchange.deleteQueue}
+ */
+ public void testQueueDeleteViaManagementConsole() throws IOException, JMException
+ {
+ if (isExternalBroker())
+ {
+ //Remove any previous queue declares
+ _monitor.reset();
+
+ createQueue();
+
+ ManagedBroker managedBroker = MBeanServerInvocationHandler.
+ newProxyInstance(_mbsc, getVirtualHostManagerObjectName(),
+ ManagedBroker.class, false);
+
+ managedBroker.deleteQueue(getName());
+
+ List<String> results = _monitor.findMatches("QUE-1002");
+
+ assertEquals("More than one queue deletion found", 1, results.size());
+
+ String log = getLog(results.get(0));
+
+ // Validate correct binding
+ String subject = fromSubject(log);
+ assertEquals("Incorrect queue named in delete", getName(), AbstractTestLogSubject.getSlice("qu", subject));
+
+ // Validate it was a management actor.
+ String actor = fromActor(log);
+ assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
+
+ }
+ }
+
+ /**
+ * Description:
+ * The binding of a Queue and an Exchange is done via a Binding. When this Binding is created via the Management Console a BND-1001 Create message will be logged.
+ * Input:
+ *
+ * 1. Running Broker
+ * 2. Connected Management Console
+ * 3. Use Management Console to perform binding
+ * Output:
+ *
+ * <date> BND-1001 : Create
+ *
+ * Validation Steps:
+ * 4. The BND ID is correct
+ * 5. This will be the first message for the given binding
+ *
+ * @throws java.io.IOException - if there is a problem reseting the log monitor
+ * @throws javax.management.JMException - {@see #createQueue and ManagedExchange.createNewBinding}
+ */
+ public void testBindingCreateOnDirectViaManagementConsole() throws IOException, JMException
+ {
+ if (isExternalBroker())
+ {
+ //Remove any previous queue declares
+ _monitor.reset();
+
+ createQueue();
+
+ ManagedExchange managedExchange = MBeanServerInvocationHandler.
+ newProxyInstance(_mbsc, getExchange("amq.direct"),
+ ManagedExchange.class, false);
+
+ managedExchange.createNewBinding(getName(), getName());
+
+ List<String> results = _monitor.findMatches("BND-1001");
+
+ assertEquals("More than one bind creation found", 1, results.size());
+
+ String log = getLog(results.get(0));
+
+ // Validate correct binding
+ String subject = fromSubject(log);
+ assertEquals("Incorrect queue named in create", getName(), AbstractTestLogSubject.getSlice("qu", subject));
+ assertEquals("Incorrect routing key in create", getName(), AbstractTestLogSubject.getSlice("rk", subject));
+
+ // Validate it was a management actor.
+ String actor = fromActor(log);
+ assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
+ }
+ }
+
+ public void testBindingCreateOnTopicViaManagementConsole() throws IOException, JMException
+ {
+ if (isExternalBroker())
+ {
+ //Remove any previous queue declares
+ _monitor.reset();
+
+ createQueue();
+
+ ManagedExchange managedExchange = MBeanServerInvocationHandler.
+ newProxyInstance(_mbsc, getExchange("amq.topic"),
+ ManagedExchange.class, false);
+
+ managedExchange.createNewBinding(getName(), getName());
+
+ List<String> results = _monitor.findMatches("BND-1001");
+
+ assertEquals("More than one bind creation found", 1, results.size());
+
+ String log = getLog(results.get(0));
+
+ // Validate correct binding
+ String subject = fromSubject(log);
+ assertEquals("Incorrect queue named in create", getName(), AbstractTestLogSubject.getSlice("qu", subject));
+ assertEquals("Incorrect routing key in create", getName(), AbstractTestLogSubject.getSlice("rk", subject));
+
+ // Validate it was a management actor.
+ String actor = fromActor(log);
+ assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
+ }
+ }
+
+ public void testBindingCreateOnFanoutViaManagementConsole() throws IOException, JMException
+ {
+ if (isExternalBroker())
+ {
+ //Remove any previous queue declares
+ _monitor.reset();
+
+ createQueue();
+
+ ManagedExchange managedExchange = MBeanServerInvocationHandler.
+ newProxyInstance(_mbsc, getExchange("amq.fanout"),
+ ManagedExchange.class, false);
+
+ managedExchange.createNewBinding(getName(), getName());
+
+ List<String> results = _monitor.findMatches("BND-1001");
+
+ assertEquals("More than one bind creation found", 1, results.size());
+
+ String log = getLog(results.get(0));
+
+ // Validate correct binding
+ String subject = fromSubject(log);
+ assertEquals("Incorrect queue named in create", getName(), AbstractTestLogSubject.getSlice("qu", subject));
+ assertEquals("Incorrect routing key in create", "*", AbstractTestLogSubject.getSlice("rk", subject));
+
+ // Validate it was a management actor.
+ String actor = fromActor(log);
+ assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
+ }
+ }
+
+ /**
+ * Description:
+ * Bindings can be deleted so that a queue can be rebound with a different set of values. This can be performed via the Management Console
+ * Input:
+ *
+ * 1. Running Broker
+ * 2. Management Console connected
+ * 3. Management Console is used to perform unbind.
+ * Output:
+ *
+ * <date> BND-1002 : Deleted
+ *
+ * Validation Steps:
+ * 4. The BND ID is correct
+ * 5. There must have been a BND-1001 Create message first.
+ * 6. This will be the last message for the given binding
+ *
+ * @throws java.io.IOException - if there is a problem reseting the log monitor or an issue with the JMX Connection
+ * @throws javax.management.JMException - {@see #createExchange and ManagedBroker.unregisterExchange}
+ */
+ public void testUnRegisterExchangeViaManagementConsole() throws IOException, JMException
+ {
+ if (isExternalBroker())
+ {
+
+ //Remove any previous queue declares
+ _monitor.reset();
+
+ createExchange("direct");
+
+ ManagedBroker managedBroker = MBeanServerInvocationHandler.
+ newProxyInstance(_mbsc, getVirtualHostManagerObjectName(),
+ ManagedBroker.class, false);
+
+ managedBroker.unregisterExchange(getName());
+
+ List<String> results = _monitor.findMatches("EXH-1002");
+
+ assertEquals("More than one exchange deletion found", 1, results.size());
+
+ String log = getLog(results.get(0));
+
+ // Validate correct binding
+ String subject = fromSubject(log);
+ assertEquals("Incorrect exchange named in delete", "direct/" + getName(), AbstractTestLogSubject.getSlice("ex", subject));
+
+ // Validate it was a management actor.
+ String actor = fromActor(log);
+ assertTrue("Actor is not a manangement actor:" + actor, actor.startsWith("mng"));
+ }
+ }
+
+ /**
+ * Create a non-durable test exchange with the current test name
+ *
+ * @throws JMException - is thrown if a exchange with this testName already exists
+ * @throws IOException - if there is a problem with the JMX Connection
+ * @throws javax.management.MBeanException
+ * - if there is another problem creating the exchange
+ */
+ private void createExchange(String type)
+ throws JMException, IOException, MBeanException
+ {
+ ManagedBroker managedBroker = MBeanServerInvocationHandler.
+ newProxyInstance(_mbsc, getVirtualHostManagerObjectName(),
+ ManagedBroker.class, false);
+
+ managedBroker.createNewExchange(getName(), type, false);
+ }
+
+ /**
+ * Create a non-durable queue (with no owner) that is named after the
+ * creating test.
+ *
+ * @throws JMException - is thrown if a queue with this testName already exists
+ * @throws IOException - if there is a problem with the JMX Connection
+ */
+ private void createQueue()
+ throws JMException, IOException
+ {
+ ManagedBroker managedBroker = MBeanServerInvocationHandler.
+ newProxyInstance(_mbsc, getVirtualHostManagerObjectName(),
+ ManagedBroker.class, false);
+
+ managedBroker.createNewQueue(getName(), null, false);
+ }
+
+ /**
+ * Retrive the ObjectName for the test Virtualhost.
+ *
+ * This is then use to create aproxy to the ManagedBroker MBean.
+ *
+ * @return the ObjectName for the 'test' VirtualHost.
+ */
+ private ObjectName getVirtualHostManagerObjectName()
+ {
+ // Get the name of the test manager
+ AllObjects allObject = new AllObjects(_mbsc);
+ allObject.querystring = "org.apache.qpid:type=VirtualHost.VirtualHostManager,VirtualHost=test,*";
+
+ Set<ObjectName> objectNames = allObject.returnObjects();
+
+ assertEquals("Incorrect number test vhosts returned", 1, objectNames.size());
+
+ // We have verified we have only one value in objectNames so return it
+ return objectNames.iterator().next();
+ }
+
+ /**
+ * Retrive the ObjectName for the given Exchange on the test Virtualhost.
+ *
+ * This is then use to create aproxy to the ManagedExchange MBean.
+ *
+ * @param exchange The exchange to retireve e.g. 'direct'
+ *
+ * @return the ObjectName for the given exchange on the test VirtualHost.
+ */
+ private ObjectName getExchange(String exchange)
+ {
+ // Get the name of the test manager
+ AllObjects allObject = new AllObjects(_mbsc);
+ allObject.querystring = "org.apache.qpid:type=VirtualHost.Exchange,VirtualHost=test,name=" + exchange + ",*";
+
+ Set<ObjectName> objectNames = allObject.returnObjects();
+
+ assertEquals("Incorrect number of exchange with name '" + exchange +
+ "' returned", 1, objectNames.size());
+
+ // We have verified we have only one value in objectNames so return it
+ return objectNames.iterator().next();
+ }
+
+}