You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ri...@apache.org on 2010/05/07 17:10:08 UTC

svn commit: r942102 - in /qpid/trunk/qpid/java: broker/src/main/java/org/apache/qpid/server/ broker/src/main/java/org/apache/qpid/server/handler/ broker/src/main/java/org/apache/qpid/server/protocol/ broker/src/main/java/org/apache/qpid/server/queue/ b...

Author: ritchiem
Date: Fri May  7 15:10:08 2010
New Revision: 942102

URL: http://svn.apache.org/viewvc?rev=942102&view=rev
Log:
QPID-2575 : Add getClientID to SessionModel and standardise use accross 0-8/0-10, 0-10 does not appear to provide a client ID so maintaining use of Principal Name. This means migration between 0-8 and 0-10 will not behave as expected.
Correct erroneous usages of session.getPrincipal when comparing with queue.getOwner is requried. Queue owners are the client id not the authenticated user.

Modified:
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQSessionModel.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueMBean.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/DerbyMessageStore.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java
    qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java
    qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/queue/ModelTest.java

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java?rev=942102&r1=942101&r2=942102&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/AMQChannel.java Fri May  7 15:10:08 2010
@@ -141,7 +141,6 @@ public class AMQChannel implements Sessi
     private final AtomicLong _txnRejects = new AtomicLong(0);
     private final AtomicLong _txnCount = new AtomicLong(0);
 
-    // Why do we need this reference ? - ritchiem
     private final AMQProtocolSession _session;
     private AtomicBoolean _closing = new AtomicBoolean(false);
 
@@ -1070,6 +1069,11 @@ public class AMQChannel implements Sessi
         return _session;
     }
 
+    public String getClientID()
+    {
+        return String.valueOf(_session.getContextKey());
+    }
+
     private class MessageDeliveryAction implements ServerTransaction.Action
     {
         private IncomingMessage _incommingMessage;

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java?rev=942102&r1=942101&r2=942102&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/handler/QueueDeclareHandler.java Fri May  7 15:10:08 2010
@@ -63,6 +63,7 @@ public class QueueDeclareHandler impleme
     public void methodReceived(AMQStateManager stateManager, QueueDeclareBody body, int channelId) throws AMQException
     {
         final AMQProtocolSession protocolConnection = stateManager.getProtocolSession();
+        final AMQSessionModel session = protocolConnection.getChannel(channelId);
         VirtualHost virtualHost = protocolConnection.getVirtualHost();
         ExchangeRegistry exchangeRegistry = virtualHost.getExchangeRegistry();
         QueueRegistry queueRegistry = virtualHost.getQueueRegistry();
@@ -100,11 +101,11 @@ public class QueueDeclareHandler impleme
 
             queue = queueRegistry.getQueue(queueName);
 
-            AMQSessionModel session = null;
+            AMQSessionModel owningSession = null;
 
             if (queue != null)
             {
-                session = queue.getExclusiveOwningSession();
+                owningSession = queue.getExclusiveOwningSession();
             }
 
             if (queue == null)
@@ -163,7 +164,7 @@ public class QueueDeclareHandler impleme
                     }
                 }
             }
-            else if (queue.isExclusive() && !queue.isDurable() && (session == null || session.getConnectionModel() != protocolConnection))
+            else if (queue.isExclusive() && !queue.isDurable() && (owningSession == null || owningSession.getConnectionModel() != protocolConnection))
             {
                 throw body.getConnectionException(AMQConstant.NOT_ALLOWED,
                                                   "Queue " + queue.getNameShortString() + " is exclusive, but not created on this Connection.");
@@ -175,13 +176,12 @@ public class QueueDeclareHandler impleme
                                                   "Cannot re-declare queue '" + queue.getNameShortString() + "' with different exclusivity (was: "
                                                     + queue.isExclusive() + " requested " + body.getExclusive() + ")");
             }
-
-            else if (!body.getPassive() && body.getExclusive() && !(queue.isDurable() ? queue.getOwner().equals(protocolConnection.getPrincipal().getName()) : (session == null || session.getConnectionModel() != protocolConnection)))
+            else if (!body.getPassive() && body.getExclusive() && !(queue.isDurable() ? String.valueOf(queue.getOwner()).equals(session.getClientID()) : (owningSession == null || owningSession.getConnectionModel() == protocolConnection)))
             {
                 throw body.getChannelException(AMQConstant.ALREADY_EXISTS, "Cannot declare queue('" + queueName + "'), "
                                                                            + "as exclusive queue with same name "
                                                                            + "declared on another client ID('"
-                                                                           + queue.getOwner() + "')");
+                                                                           + queue.getOwner() + "') your clientID('" + session.getClientID() + "')");
 
             }
             else if(!body.getPassive() && queue.isAutoDelete() != body.getAutoDelete())

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java?rev=942102&r1=942101&r2=942102&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolEngine.java Fri May  7 15:10:08 2010
@@ -1231,6 +1231,10 @@ public class AMQProtocolEngine implement
         }
     }
 
+    public String getClientID()
+    {
+        return getContextKey().toString();
+    }
 
     public void closeSession(AMQSessionModel session, AMQConstant cause, String message) throws AMQException
     {

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java?rev=942102&r1=942101&r2=942102&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQProtocolSessionMBean.java Fri May  7 15:10:08 2010
@@ -125,7 +125,7 @@ public class AMQProtocolSessionMBean ext
 
     public String getClientId()
     {
-        return (_protocolSession.getContextKey() == null) ? null : _protocolSession.getContextKey().toString();
+        return String.valueOf(_protocolSession.getContextKey());
     }
 
     public String getAuthorizedId()

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQSessionModel.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQSessionModel.java?rev=942102&r1=942101&r2=942102&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQSessionModel.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/protocol/AMQSessionModel.java Fri May  7 15:10:08 2010
@@ -25,4 +25,6 @@ public interface AMQSessionModel
     Object getID();
 
     AMQConnectionModel getConnectionModel();
+
+    String getClientID();
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueMBean.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueMBean.java?rev=942102&r1=942101&r2=942102&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueMBean.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/queue/AMQQueueMBean.java Fri May  7 15:10:08 2010
@@ -158,11 +158,7 @@ public class AMQQueueMBean extends AMQMa
 
     public String getOwner()
     {
-        return String.valueOf(_queue.getPrincipalHolder() == null
-                              ? null
-                              : _queue.getPrincipalHolder().getPrincipal() == null
-                                ? null
-                                : _queue.getPrincipalHolder().getPrincipal().getName());
+        return String.valueOf(_queue.getOwner());
     }
 
     public boolean isAutoDelete()

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/DerbyMessageStore.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/DerbyMessageStore.java?rev=942102&r1=942101&r2=942102&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/DerbyMessageStore.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/store/DerbyMessageStore.java Fri May  7 15:10:08 2010
@@ -813,11 +813,7 @@ public class DerbyMessageStore implement
                 {
                     stmt = conn.prepareStatement(INSERT_INTO_QUEUE);
 
-                    String owner = queue.getPrincipalHolder() == null
-                                   ? null
-                                   : queue.getPrincipalHolder().getPrincipal() == null
-                                     ? null
-                                     : queue.getPrincipalHolder().getPrincipal().getName();
+                    String owner = queue.getOwner() == null ? null : queue.getOwner().toString();
 
                     stmt.setString(1, queue.getNameShortString().toString());
                     stmt.setString(2, owner);

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java?rev=942102&r1=942101&r2=942102&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSession.java Fri May  7 15:10:08 2010
@@ -565,4 +565,11 @@ public class ServerSession extends Sessi
         return (ServerConnection) getConnection();
     }
 
+    public String getClientID()
+    {
+        //fixme this will only work for 0-10 connections
+        // In 0-8 there is an explicit ClientID property that is != Principal.
+        return getPrincipal().getName();
+    }
+
 }

Modified: qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java?rev=942102&r1=942101&r2=942102&view=diff
==============================================================================
--- qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java (original)
+++ qpid/trunk/qpid/java/broker/src/main/java/org/apache/qpid/server/transport/ServerSessionDelegate.java Fri May  7 15:10:08 2010
@@ -960,7 +960,7 @@ public class ServerSessionDelegate exten
     {
         final QueueRegistry registry = virtualHost.getQueueRegistry();
 
-        String owner = body.getExclusive() ? session.getPrincipal().getName() : null;
+        String owner = body.getExclusive() ? session.getClientID() : null;
 
         final AMQQueue queue = AMQQueueFactory.createAMQQueueImpl(queueName, body.getDurable(), owner, body.getAutoDelete(), virtualHost,
                                                                   body.getArguments());

Modified: qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/queue/ModelTest.java
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/queue/ModelTest.java?rev=942102&r1=942101&r2=942102&view=diff
==============================================================================
--- qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/queue/ModelTest.java (original)
+++ qpid/trunk/qpid/java/systests/src/main/java/org/apache/qpid/server/queue/ModelTest.java Fri May  7 15:10:08 2010
@@ -85,6 +85,26 @@ public class ModelTest extends QpidTestC
     }
 
     /**
+     * Test that an exclusive transient queue can be created via AMQP.
+     *
+     * @throws Exception On unexpected error
+     */
+    public void testExclusiveQueueCreationTransientViaAMQP() throws Exception
+    {
+        Connection connection = getConnection();
+
+        String queueName = getTestQueueName();
+        boolean durable = false;
+        boolean autoDelete = false;
+        boolean exclusive = true;
+
+        createViaAMQPandValidateViaJMX(connection, queueName, durable,
+                                       autoDelete, exclusive);
+    }
+
+
+
+    /**
      * Test that a transient queue can be created via AMQP.
      *
      * @throws Exception On unexpected error
@@ -96,10 +116,34 @@ public class ModelTest extends QpidTestC
         String queueName = getTestQueueName();
         boolean durable = false;
         boolean autoDelete = false;
-        boolean exclusive = false;
+        boolean exclusive = true;
+
+        createViaAMQPandValidateViaJMX(connection, queueName, durable,
+                                       autoDelete, exclusive);
+    }
+
+    /**
+     * Test that a durable exclusive queue can be created via AMQP.
+     *
+     * @throws Exception On unexpected error
+     */
+
+    public void testExclusiveQueueCreationDurableViaAMQP() throws Exception
+    {
+        Connection connection = getConnection();
+
+        String queueName = getTestQueueName();
+        boolean durable = true;
+        boolean autoDelete = false;
+        boolean exclusive = true;
 
         createViaAMQPandValidateViaJMX(connection, queueName, durable,
                                        autoDelete, exclusive);
+
+        // Clean up
+        ManagedBroker managedBroker =
+                _jmxUtils.getManagedBroker(VIRTUALHOST_NAME);
+        managedBroker.deleteQueue(queueName);
     }
 
     /**
@@ -126,6 +170,7 @@ public class ModelTest extends QpidTestC
         managedBroker.deleteQueue(queueName);
     }
 
+
     /**
      * Test that a transient queue can be created via JMX.
      *
@@ -246,7 +291,7 @@ public class ModelTest extends QpidTestC
         session.createQueue(new AMQShortString(queueName),
                             autoDelete, durable, exclusive);
 
-        validateQueueViaJMX(queueName, ((AMQConnection) connection).getUsername(), durable, autoDelete);
+        validateQueueViaJMX(queueName, exclusive ? connection.getClientID() : null, durable, autoDelete);
     }
 
     /**



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org