You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ha...@apache.org on 2014/12/18 03:41:31 UTC

[01/17] activemq git commit: AMQ-5312: Reduce logging noise for activemq-pool if its stopped.

Repository: activemq
Updated Branches:
  refs/heads/activemq-5.10.x b41f92127 -> 22f2f3dde


AMQ-5312: Reduce logging noise for activemq-pool if its stopped.


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/fb3e96a7
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/fb3e96a7
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/fb3e96a7

Branch: refs/heads/activemq-5.10.x
Commit: fb3e96a7d6bc8d0505afeee892e4781ef317306c
Parents: b41f921
Author: Claus Ibsen <cl...@gmail.com>
Authored: Thu Aug 7 14:38:58 2014 +0200
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:22:23 2014 -0500

----------------------------------------------------------------------
 .../org/apache/activemq/pool/JcaPooledConnectionFactory.java | 8 ++++++--
 .../org/apache/activemq/pool/PooledConnectionFactory.java    | 8 ++++++--
 .../org/apache/activemq/pool/XaPooledConnectionFactory.java  | 8 ++++++--
 3 files changed, 18 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/fb3e96a7/activemq-pool/src/main/java/org/apache/activemq/pool/JcaPooledConnectionFactory.java
----------------------------------------------------------------------
diff --git a/activemq-pool/src/main/java/org/apache/activemq/pool/JcaPooledConnectionFactory.java b/activemq-pool/src/main/java/org/apache/activemq/pool/JcaPooledConnectionFactory.java
index 55c2482..4788c1b 100644
--- a/activemq-pool/src/main/java/org/apache/activemq/pool/JcaPooledConnectionFactory.java
+++ b/activemq-pool/src/main/java/org/apache/activemq/pool/JcaPooledConnectionFactory.java
@@ -53,8 +53,12 @@ public class JcaPooledConnectionFactory extends XaPooledConnectionFactory {
                     public void onException(IOException error) {
                         synchronized (this) {
                             setHasExpired(true);
-                            LOG.info("Expiring connection " + connection + " on IOException: " + error);
-                            LOG.debug("Expiring connection on IOException", error);
+                            // only log if not stopped
+                            if (!stopped.get()) {
+                                LOG.info("Expiring connection " + connection + " on IOException: " + error.getMessage());
+                                // log stacktrace at debug level
+                                LOG.debug("Expiring connection " + connection + " on IOException: ", error);
+                            }
                         }
                     }
 

http://git-wip-us.apache.org/repos/asf/activemq/blob/fb3e96a7/activemq-pool/src/main/java/org/apache/activemq/pool/PooledConnectionFactory.java
----------------------------------------------------------------------
diff --git a/activemq-pool/src/main/java/org/apache/activemq/pool/PooledConnectionFactory.java b/activemq-pool/src/main/java/org/apache/activemq/pool/PooledConnectionFactory.java
index 1cd5130..ee38bea 100644
--- a/activemq-pool/src/main/java/org/apache/activemq/pool/PooledConnectionFactory.java
+++ b/activemq-pool/src/main/java/org/apache/activemq/pool/PooledConnectionFactory.java
@@ -110,8 +110,12 @@ public class PooledConnectionFactory extends org.apache.activemq.jms.pool.Pooled
                     public void onException(IOException error) {
                         synchronized (this) {
                             setHasExpired(true);
-                            LOG.info("Expiring connection {} on IOException: {}" , connection, error);
-                            LOG.debug("Expiring connection on IOException", error);
+                            // only log if not stopped
+                            if (!stopped.get()) {
+                                LOG.info("Expiring connection " + connection + " on IOException: " + error.getMessage());
+                                // log stacktrace at debug level
+                                LOG.debug("Expiring connection " + connection + " on IOException: ", error);
+                            }
                         }
                     }
 

http://git-wip-us.apache.org/repos/asf/activemq/blob/fb3e96a7/activemq-pool/src/main/java/org/apache/activemq/pool/XaPooledConnectionFactory.java
----------------------------------------------------------------------
diff --git a/activemq-pool/src/main/java/org/apache/activemq/pool/XaPooledConnectionFactory.java b/activemq-pool/src/main/java/org/apache/activemq/pool/XaPooledConnectionFactory.java
index 7465253..0c80c77 100644
--- a/activemq-pool/src/main/java/org/apache/activemq/pool/XaPooledConnectionFactory.java
+++ b/activemq-pool/src/main/java/org/apache/activemq/pool/XaPooledConnectionFactory.java
@@ -96,8 +96,12 @@ public class XaPooledConnectionFactory extends org.apache.activemq.jms.pool.XaPo
                     public void onException(IOException error) {
                         synchronized (this) {
                             setHasExpired(true);
-                            LOG.info("Expiring connection " + connection + " on IOException: " + error);
-                            LOG.debug("Expiring connection on IOException", error);
+                            // only log if not stopped
+                            if (!stopped.get()) {
+                                LOG.info("Expiring connection " + connection + " on IOException: " + error.getMessage());
+                                // log stacktrace at debug level
+                                LOG.debug("Expiring connection " + connection + " on IOException: ", error);
+                            }
                         }
                     }
 


[10/17] activemq git commit: Add ldap auth unit test

Posted by ha...@apache.org.
Add ldap auth unit test


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/ccae55e3
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/ccae55e3
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/ccae55e3

Branch: refs/heads/activemq-5.10.x
Commit: ccae55e3676870910df36c86e32a1cf41beebd01
Parents: 3f67862
Author: Hadrian Zbarcea <ha...@apache.org>
Authored: Sun Aug 17 11:15:56 2014 -0400
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:39:57 2014 -0500

----------------------------------------------------------------------
 .../activemq/security/LDAPSecurityTest.java     | 19 +++++++++++-
 .../org/apache/activemq/security/activemq.ldif  | 32 +++++++++++++++++++-
 2 files changed, 49 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/ccae55e3/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPSecurityTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPSecurityTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPSecurityTest.java
index 91d1559..3642e0b 100644
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPSecurityTest.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPSecurityTest.java
@@ -20,6 +20,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
 
 import javax.jms.Connection;
+import javax.jms.Destination;
 import javax.jms.JMSException;
 import javax.jms.Message;
 import javax.jms.MessageConsumer;
@@ -74,7 +75,7 @@ public class LDAPSecurityTest extends AbstractLdapTestUnit {
         Connection conn = factory.createQueueConnection("jdoe", "sunflower");
         Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
         conn.start();
-        Queue queue = sess.createQueue("TEST.FOO");
+        Destination queue = sess.createQueue("TEST.FOO");
 
         MessageProducer producer = sess.createProducer(queue);
         MessageConsumer consumer = sess.createConsumer(queue);
@@ -85,6 +86,22 @@ public class LDAPSecurityTest extends AbstractLdapTestUnit {
     }
 
     @Test
+    public void testSendTopic() throws Exception {
+        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
+        Connection conn = factory.createQueueConnection("jdoe", "sunflower");
+        Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        conn.start();
+        Destination topic = sess.createTopic("TEST.BAR");
+
+        MessageProducer producer = sess.createProducer(topic);
+        MessageConsumer consumer = sess.createConsumer(topic);
+
+        producer.send(sess.createTextMessage("test"));
+        Message msg = consumer.receive(1000);
+        assertNotNull(msg);
+    }
+
+    @Test
     public void testSendDenied() throws Exception {
         ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
         Connection conn = factory.createQueueConnection("jdoe", "sunflower");

http://git-wip-us.apache.org/repos/asf/activemq/blob/ccae55e3/activemq-unit-tests/src/test/resources/org/apache/activemq/security/activemq.ldif
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/resources/org/apache/activemq/security/activemq.ldif b/activemq-unit-tests/src/test/resources/org/apache/activemq/security/activemq.ldif
index 563818e..e9d1e42 100644
--- a/activemq-unit-tests/src/test/resources/org/apache/activemq/security/activemq.ldif
+++ b/activemq-unit-tests/src/test/resources/org/apache/activemq/security/activemq.ldif
@@ -146,6 +146,35 @@ objectClass: top
 member: cn=users
 member: cn=admins
 
+## TEST.BAR
+
+dn: cn=TEST.BAR,ou=Topic,ou=Destination,ou=ActiveMQ,ou=system
+cn: TEST.BAR
+description: A topic
+objectClass: applicationProcess
+objectClass: top
+
+dn: cn=admin,cn=TEST.BAR,ou=Topic,ou=Destination,ou=ActiveMQ,ou=system
+cn: admin
+description: Admin privilege group, members are roles
+member: cn=admins
+member: cn=users
+objectClass: groupOfNames
+objectClass: top
+
+dn: cn=read,cn=TEST.BAR,ou=Topic,ou=Destination,ou=ActiveMQ,ou=system
+cn: read
+member: cn=users
+member: cn=admins
+objectClass: groupOfNames
+objectClass: top
+
+dn: cn=write,cn=TEST.BAR,ou=Topic,ou=Destination,ou=ActiveMQ,ou=system
+cn: write
+objectClass: groupOfNames
+objectClass: top
+member: cn=users
+member: cn=admins
 
 
 #######################
@@ -208,4 +237,5 @@ cn: admin
 member: cn=admins
 member: cn=users
 objectClass: groupOfNames
-objectClass: top
\ No newline at end of file
+objectClass: top
+


[16/17] activemq git commit: give test more gc wiggle room - AMQ-4930

Posted by ha...@apache.org.
give test more gc wiggle room - AMQ-4930


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/6bdf4f8b
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/6bdf4f8b
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/6bdf4f8b

Branch: refs/heads/activemq-5.10.x
Commit: 6bdf4f8b669645ed5333b45ac967d8af17503bee
Parents: 4349e77
Author: gtully <ga...@gmail.com>
Authored: Sat Aug 30 01:06:21 2014 +0100
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:52:48 2014 -0500

----------------------------------------------------------------------
 .../src/test/java/org/apache/activemq/bugs/AMQ4930Test.java        | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/6bdf4f8b/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ4930Test.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ4930Test.java b/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ4930Test.java
index f75eae3..7572850 100644
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ4930Test.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/bugs/AMQ4930Test.java
@@ -105,7 +105,7 @@ public class AMQ4930Test extends TestCase {
             underTest.browse();
             Runtime.getRuntime().gc();
             Runtime.getRuntime().gc();
-            assertTrue("No growth: " + Runtime.getRuntime().freeMemory()/1024, Runtime.getRuntime().freeMemory()/1024 >= (free - (free * 0.1)));
+            assertTrue("No growth: " + Runtime.getRuntime().freeMemory()/1024 + " >= " + (free - (free * 0.2)), Runtime.getRuntime().freeMemory()/1024 >= (free - (free * 0.2)));
         }
     }
 


[07/17] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5072

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5072

Add accessors to the persitence adapter class and a test to validate.


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/b75ccd5a
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/b75ccd5a
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/b75ccd5a

Branch: refs/heads/activemq-5.10.x
Commit: b75ccd5ae795f0de25cde3f2e5b13098098d9115
Parents: dbe9bc1
Author: Timothy Bish <ta...@gmail.com>
Authored: Thu Aug 14 11:14:59 2014 -0400
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:37:40 2014 -0500

----------------------------------------------------------------------
 .../store/kahadb/KahaDBPersistenceAdapter.java  |  17 ++
 .../store/kahadb/KahaDBIndexLocationTest.java   | 165 +++++++++++++++++++
 2 files changed, 182 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/b75ccd5a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/KahaDBPersistenceAdapter.java
----------------------------------------------------------------------
diff --git a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/KahaDBPersistenceAdapter.java b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/KahaDBPersistenceAdapter.java
index 8ca8ca4..9b83a0e 100644
--- a/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/KahaDBPersistenceAdapter.java
+++ b/activemq-kahadb-store/src/main/java/org/apache/activemq/store/kahadb/KahaDBPersistenceAdapter.java
@@ -415,6 +415,23 @@ public class KahaDBPersistenceAdapter extends LockableServiceSupport implements
     }
 
     /**
+     * @return the currently configured location of the KahaDB index files.
+     */
+    public File getIndexDirectory() {
+        return this.letter.getIndexDirectory();
+    }
+
+    /**
+     * Sets the directory where KahaDB index files should be written.
+     *
+     * @param indexDirectory
+     *        the directory where the KahaDB store index files should be written.
+     */
+    public void setIndexDirectory(File indexDirectory) {
+        this.letter.setIndexDirectory(indexDirectory);
+    }
+
+    /**
      * Get the enableJournalDiskSyncs
      *
      * @return the enableJournalDiskSyncs

http://git-wip-us.apache.org/repos/asf/activemq/blob/b75ccd5a/activemq-unit-tests/src/test/java/org/apache/activemq/store/kahadb/KahaDBIndexLocationTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/store/kahadb/KahaDBIndexLocationTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/store/kahadb/KahaDBIndexLocationTest.java
new file mode 100644
index 0000000..4a23331
--- /dev/null
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/store/kahadb/KahaDBIndexLocationTest.java
@@ -0,0 +1,165 @@
+/**
+ * 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.activemq.store.kahadb;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FilenameFilter;
+
+import javax.jms.Connection;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.activemq.broker.BrokerService;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestName;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ */
+public class KahaDBIndexLocationTest {
+
+    private static final Logger LOG = LoggerFactory.getLogger(KahaDBIndexLocationTest.class);
+
+    @Rule public TestName name = new TestName();
+
+    private BrokerService broker;
+
+    private final File testDataDir = new File("target/activemq-data/QueuePurgeTest");
+    private final File kahaDataDir = new File(testDataDir, "kahadb");
+    private final File kahaIndexDir = new File(testDataDir, "kahadb/index");
+
+    /**
+     * @throws java.lang.Exception
+     */
+    @Before
+    public void setUp() throws Exception {
+        startBroker();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        stopBroker();
+    }
+
+    private void startBroker() throws Exception {
+        createBroker();
+        broker.start();
+        broker.waitUntilStarted();
+    }
+
+    private void stopBroker() throws Exception {
+        if (broker != null) {
+            broker.stop();
+            broker.waitUntilStopped();
+        }
+    }
+
+    private void restartBroker() throws Exception {
+        stopBroker();
+        createBroker();
+        broker.start();
+        broker.waitUntilStarted();
+    }
+
+    private void createBroker() throws Exception {
+        broker = new BrokerService();
+
+        KahaDBPersistenceAdapter persistenceAdapter = new KahaDBPersistenceAdapter();
+        persistenceAdapter.setDirectory(kahaDataDir);
+        persistenceAdapter.setIndexDirectory(kahaIndexDir);
+
+        broker.setDataDirectoryFile(testDataDir);
+        broker.setUseJmx(false);
+        broker.setAdvisorySupport(false);
+        broker.setSchedulerSupport(false);
+        broker.setDeleteAllMessagesOnStartup(true);
+        broker.setPersistenceAdapter(persistenceAdapter);
+    }
+
+    @Test
+    public void testIndexDirExists() throws Exception {
+        LOG.info("Index dir is configured as: {}", kahaIndexDir);
+        assertTrue(kahaDataDir.exists());
+        assertTrue(kahaIndexDir.exists());
+
+        String[] index = kahaIndexDir.list(new FilenameFilter() {
+
+            @Override
+            public boolean accept(File dir, String name) {
+                LOG.info("Testing filename: {}", name);
+                return name.endsWith("data") || name.endsWith("redo");
+            }
+        });
+
+        String[] journal = kahaDataDir.list(new FilenameFilter() {
+
+            @Override
+            public boolean accept(File dir, String name) {
+                LOG.info("Testing filename: {}", name);
+                return name.endsWith("log") || name.equals("lock");
+            }
+        });
+
+        produceMessages();
+
+        // Should be db.data and db.redo and nothing else.
+        assertNotNull(index);
+        assertEquals(2, index.length);
+
+        // Should contain the initial log for the journal and the lock.
+        assertNotNull(journal);
+        assertEquals(2, journal.length);
+    }
+
+    @Test
+    public void testRestartWithDeleteWorksWhenIndexIsSeparate() throws Exception {
+        produceMessages();
+        restartBroker();
+
+        ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("vm://localhost?create=false");
+        Connection connection = cf.createConnection();
+        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        Queue queue = session.createQueue(name.getMethodName());
+        MessageConsumer consumer = session.createConsumer(queue);
+        assertNull(consumer.receive(2000));
+    }
+
+    private void produceMessages() throws Exception {
+        ActiveMQConnectionFactory cf = new ActiveMQConnectionFactory("vm://localhost?create=false");
+        Connection connection = cf.createConnection();
+        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        Queue queue = session.createQueue(name.getMethodName());
+        MessageProducer producer = session.createProducer(queue);
+        for (int i = 0; i < 5; ++i) {
+            producer.send(session.createTextMessage("test:" + i));
+        }
+        connection.close();
+    }
+}


[09/17] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5323

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5323


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/3f67862a
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/3f67862a
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/3f67862a

Branch: refs/heads/activemq-5.10.x
Commit: 3f67862ac882c333b0e46e8386f27097c02c468a
Parents: 4275157
Author: Timothy Bish <ta...@gmail.com>
Authored: Fri Aug 15 14:23:14 2014 -0400
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:39:00 2014 -0500

----------------------------------------------------------------------
 .../activemq/command/ActiveMQMessage.java       | 18 ++++++++--
 .../activemq/command/ActiveMQMessageTest.java   | 36 ++++++++++++++++++++
 2 files changed, 51 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/3f67862a/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQMessage.java
----------------------------------------------------------------------
diff --git a/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQMessage.java b/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQMessage.java
index eef6c11..7995993 100755
--- a/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQMessage.java
+++ b/activemq-client/src/main/java/org/apache/activemq/command/ActiveMQMessage.java
@@ -396,13 +396,25 @@ public class ActiveMQMessage extends Message implements org.apache.activemq.Mess
         JMS_PROPERTY_SETERS.put("JMSDeliveryMode", new PropertySetter() {
             @Override
             public void set(Message message, Object value) throws MessageFormatException {
-                Integer rc = (Integer) TypeConversionSupport.convert(value, Integer.class);
+                Integer rc = null;
+                try {
+                    rc = (Integer) TypeConversionSupport.convert(value, Integer.class);
+                } catch (NumberFormatException nfe) {
+                    if (value instanceof String) {
+                        if (((String) value).equalsIgnoreCase("PERSISTENT")) {
+                            rc = DeliveryMode.PERSISTENT;
+                        } else if (((String) value).equalsIgnoreCase("NON_PERSISTENT")) {
+                            rc = DeliveryMode.NON_PERSISTENT;
+                        } else {
+                            throw nfe;
+                        }
+                    }
+                }
                 if (rc == null) {
                     Boolean bool = (Boolean) TypeConversionSupport.convert(value, Boolean.class);
                     if (bool == null) {
                         throw new MessageFormatException("Property JMSDeliveryMode cannot be set from a " + value.getClass().getName() + ".");
-                    }
-                    else {
+                    } else {
                         rc = bool.booleanValue() ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT;
                     }
                 }

http://git-wip-us.apache.org/repos/asf/activemq/blob/3f67862a/activemq-unit-tests/src/test/java/org/apache/activemq/command/ActiveMQMessageTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/command/ActiveMQMessageTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/command/ActiveMQMessageTest.java
index 0287f4b..e1079a1 100755
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/command/ActiveMQMessageTest.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/command/ActiveMQMessageTest.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.util.Enumeration;
 import java.util.Map;
 
+import javax.jms.DeliveryMode;
 import javax.jms.JMSException;
 import javax.jms.Message;
 import javax.jms.MessageFormatException;
@@ -353,6 +354,41 @@ public class ActiveMQMessageTest extends TestCase {
         assertTrue(((Float) msg.getObjectProperty(name)).floatValue() == 1.3f);
     }
 
+    public void testSetJMSDeliveryModeProperty() throws JMSException {
+        ActiveMQMessage message = new ActiveMQMessage();
+        String propertyName = "JMSDeliveryMode";
+
+        // Set as Boolean
+        message.setObjectProperty(propertyName, Boolean.TRUE);
+        assertTrue(message.isPersistent());
+        message.setObjectProperty(propertyName, Boolean.FALSE);
+        assertFalse(message.isPersistent());
+        message.setBooleanProperty(propertyName, true);
+        assertTrue(message.isPersistent());
+        message.setBooleanProperty(propertyName, false);
+        assertFalse(message.isPersistent());
+
+        // Set as Integer
+        message.setObjectProperty(propertyName, DeliveryMode.PERSISTENT);
+        assertTrue(message.isPersistent());
+        message.setObjectProperty(propertyName, DeliveryMode.NON_PERSISTENT);
+        assertFalse(message.isPersistent());
+        message.setIntProperty(propertyName, DeliveryMode.PERSISTENT);
+        assertTrue(message.isPersistent());
+        message.setIntProperty(propertyName, DeliveryMode.NON_PERSISTENT);
+        assertFalse(message.isPersistent());
+
+        // Set as String
+        message.setObjectProperty(propertyName, "PERSISTENT");
+        assertTrue(message.isPersistent());
+        message.setObjectProperty(propertyName, "NON_PERSISTENT");
+        assertFalse(message.isPersistent());
+        message.setStringProperty(propertyName, "PERSISTENT");
+        assertTrue(message.isPersistent());
+        message.setStringProperty(propertyName, "NON_PERSISTENT");
+        assertFalse(message.isPersistent());
+    }
+
     @SuppressWarnings("rawtypes")
     public void testGetPropertyNames() throws JMSException {
         ActiveMQMessage msg = new ActiveMQMessage();


[05/17] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5315

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5315

Fix for potential NPE on transport error.


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/5c3a2db3
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/5c3a2db3
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/5c3a2db3

Branch: refs/heads/activemq-5.10.x
Commit: 5c3a2db3ff528eab33ef7a914a990a8e6156ae20
Parents: f436b33
Author: Timothy Bish <ta...@gmail.com>
Authored: Fri Aug 8 13:42:15 2014 -0400
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:27:45 2014 -0500

----------------------------------------------------------------------
 .../org/apache/activemq/network/DemandForwardingBridgeSupport.java | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/5c3a2db3/activemq-broker/src/main/java/org/apache/activemq/network/DemandForwardingBridgeSupport.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/network/DemandForwardingBridgeSupport.java b/activemq-broker/src/main/java/org/apache/activemq/network/DemandForwardingBridgeSupport.java
index 3a6f88e..2242d73 100644
--- a/activemq-broker/src/main/java/org/apache/activemq/network/DemandForwardingBridgeSupport.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/network/DemandForwardingBridgeSupport.java
@@ -348,6 +348,7 @@ public abstract class DemandForwardingBridgeSupport implements NetworkBridge, Br
             remoteBrokerInfo = futureRemoteBrokerInfo.get();
             if (remoteBrokerInfo == null) {
                 fireBridgeFailed();
+                return;
             }
         } catch (Exception e) {
             serviceRemoteException(e);
@@ -358,6 +359,7 @@ public abstract class DemandForwardingBridgeSupport implements NetworkBridge, Br
             localBrokerInfo = futureLocalBrokerInfo.get();
             if (localBrokerInfo == null) {
                 fireBridgeFailed();
+                return;
             }
 
             // Before we try and build the bridge lets check if we are in a loop


[15/17] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5337

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5337

Switch to LinkedHashMap with R/W locking for concurrent add / remove
protection


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/4349e77e
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/4349e77e
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/4349e77e

Branch: refs/heads/activemq-5.10.x
Commit: 4349e77eefa560f0dff2eee31cb6a9881fee3559
Parents: 41311df
Author: Timothy Bish <ta...@gmail.com>
Authored: Fri Aug 29 15:52:23 2014 -0400
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:50:55 2014 -0500

----------------------------------------------------------------------
 .../activemq/advisory/AdvisoryBroker.java       | 45 +++++++++++++++-----
 1 file changed, 34 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/4349e77e/activemq-broker/src/main/java/org/apache/activemq/advisory/AdvisoryBroker.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/advisory/AdvisoryBroker.java b/activemq-broker/src/main/java/org/apache/activemq/advisory/AdvisoryBroker.java
index 2583a23..58947ad 100755
--- a/activemq-broker/src/main/java/org/apache/activemq/advisory/AdvisoryBroker.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/advisory/AdvisoryBroker.java
@@ -16,12 +16,14 @@
  */
 package org.apache.activemq.advisory;
 
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
 import java.util.Map;
-import java.util.Queue;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import org.apache.activemq.broker.Broker;
 import org.apache.activemq.broker.BrokerFilter;
@@ -70,7 +72,8 @@ public class AdvisoryBroker extends BrokerFilter {
 
     protected final ConcurrentHashMap<ConnectionId, ConnectionInfo> connections = new ConcurrentHashMap<ConnectionId, ConnectionInfo>();
 
-    protected final Queue<ConsumerInfo> consumers = new ConcurrentLinkedQueue<ConsumerInfo>();
+    private final ReentrantReadWriteLock consumersLock = new ReentrantReadWriteLock();
+    protected final Map<ConsumerId, ConsumerInfo> consumers = new LinkedHashMap<ConsumerId, ConsumerInfo>();
 
     protected final ConcurrentHashMap<ProducerId, ProducerInfo> producers = new ConcurrentHashMap<ProducerId, ProducerInfo>();
     protected final ConcurrentHashMap<ActiveMQDestination, DestinationInfo> destinations = new ConcurrentHashMap<ActiveMQDestination, DestinationInfo>();
@@ -103,7 +106,12 @@ public class AdvisoryBroker extends BrokerFilter {
         // Don't advise advisory topics.
         if (!AdvisorySupport.isAdvisoryTopic(info.getDestination())) {
             ActiveMQTopic topic = AdvisorySupport.getConsumerAdvisoryTopic(info.getDestination());
-            consumers.offer(info);
+            consumersLock.writeLock().lock();
+            try {
+                consumers.put(info.getConsumerId(), info);
+            } finally {
+                consumersLock.writeLock().unlock();
+            }
             fireConsumerAdvisory(context, info.getDestination(), topic, info);
         } else {
             // We need to replay all the previously collected state objects
@@ -148,10 +156,15 @@ public class AdvisoryBroker extends BrokerFilter {
 
             // Replay the consumers.
             if (AdvisorySupport.isConsumerAdvisoryTopic(info.getDestination())) {
-                for (Iterator<ConsumerInfo> iter = consumers.iterator(); iter.hasNext(); ) {
-                    ConsumerInfo value = iter.next();
-                    ActiveMQTopic topic = AdvisorySupport.getConsumerAdvisoryTopic(value.getDestination());
-                    fireConsumerAdvisory(context, value.getDestination(), topic, value, info.getConsumerId());
+                consumersLock.readLock().lock();
+                try {
+                    for (Iterator<ConsumerInfo> iter = consumers.values().iterator(); iter.hasNext(); ) {
+                        ConsumerInfo value = iter.next();
+                        ActiveMQTopic topic = AdvisorySupport.getConsumerAdvisoryTopic(value.getDestination());
+                        fireConsumerAdvisory(context, value.getDestination(), topic, value, info.getConsumerId());
+                    }
+                } finally {
+                    consumersLock.readLock().unlock();
                 }
             }
 
@@ -266,7 +279,12 @@ public class AdvisoryBroker extends BrokerFilter {
         ActiveMQDestination dest = info.getDestination();
         if (!AdvisorySupport.isAdvisoryTopic(dest)) {
             ActiveMQTopic topic = AdvisorySupport.getConsumerAdvisoryTopic(dest);
-            consumers.remove(info);
+            consumersLock.writeLock().lock();
+            try {
+                consumers.remove(info.getConsumerId());
+            } finally {
+                consumersLock.writeLock().unlock();
+            }
             if (!dest.isTemporary() || destinations.containsKey(dest)) {
                 fireConsumerAdvisory(context, dest, topic, info.createRemoveCommand());
             }
@@ -623,8 +641,13 @@ public class AdvisoryBroker extends BrokerFilter {
         return connections;
     }
 
-    public Queue<ConsumerInfo> getAdvisoryConsumers() {
-        return consumers;
+    public Collection<ConsumerInfo> getAdvisoryConsumers() {
+        consumersLock.readLock().lock();
+        try {
+            return new ArrayList<ConsumerInfo>(consumers.values());
+        } finally {
+            consumersLock.readLock().unlock();
+        }
     }
 
     public Map<ProducerId, ProducerInfo> getAdvisoryProducers() {


[14/17] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5315

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5315

Fix for possible NPE during start with immediate bridge failure.


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/41311df3
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/41311df3
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/41311df3

Branch: refs/heads/activemq-5.10.x
Commit: 41311df39cb5d5a667e46b447404a2c8e2447e5b
Parents: 0a6e217
Author: Timothy Bish <ta...@gmail.com>
Authored: Fri Aug 29 10:06:53 2014 -0400
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:50:13 2014 -0500

----------------------------------------------------------------------
 .../network/DemandForwardingBridgeSupport.java     | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/41311df3/activemq-broker/src/main/java/org/apache/activemq/network/DemandForwardingBridgeSupport.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/network/DemandForwardingBridgeSupport.java b/activemq-broker/src/main/java/org/apache/activemq/network/DemandForwardingBridgeSupport.java
index 2242d73..f61c5ac 100644
--- a/activemq-broker/src/main/java/org/apache/activemq/network/DemandForwardingBridgeSupport.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/network/DemandForwardingBridgeSupport.java
@@ -107,7 +107,7 @@ public abstract class DemandForwardingBridgeSupport implements NetworkBridge, Br
     protected static final String DURABLE_SUB_PREFIX = "NC-DS_";
     protected final Transport localBroker;
     protected final Transport remoteBroker;
-    protected IdGenerator idGenerator;
+    protected IdGenerator idGenerator = new IdGenerator();
     protected final LongSequenceGenerator consumerIdGenerator = new LongSequenceGenerator();
     protected ConnectionInfo localConnectionInfo;
     protected ConnectionInfo remoteConnectionInfo;
@@ -381,8 +381,6 @@ public abstract class DemandForwardingBridgeSupport implements NetworkBridge, Br
             remoteBrokerName = remoteBrokerInfo.getBrokerName();
             if (configuration.isUseBrokerNamesAsIdSeed()) {
                 idGenerator = new IdGenerator(brokerService.getBrokerName() + "->" + remoteBrokerName);
-            } else {
-                idGenerator = new IdGenerator();
             }
         } catch (Throwable e) {
             serviceLocalException(e);
@@ -433,10 +431,15 @@ public abstract class DemandForwardingBridgeSupport implements NetworkBridge, Br
     }
 
     private void startLocalBridge() throws Throwable {
-        if (localBridgeStarted.compareAndSet(false, true)) {
+        if (!bridgeFailed.get() && localBridgeStarted.compareAndSet(false, true)) {
             synchronized (this) {
                 LOG.trace("{} starting local Bridge, localBroker={}", configuration.getBrokerName(), localBroker);
                 if (!disposed.get()) {
+
+                    if (idGenerator == null) {
+                        throw new IllegalStateException("Id Generator cannot be null");
+                    }
+
                     localConnectionInfo = new ConnectionInfo();
                     localConnectionInfo.setConnectionId(new ConnectionId(idGenerator.generateId()));
                     localClientId = configuration.getName() + "_" + remoteBrokerName + "_inbound_" + configuration.getBrokerName();
@@ -518,7 +521,7 @@ public abstract class DemandForwardingBridgeSupport implements NetworkBridge, Br
     }
 
     protected void startRemoteBridge() throws Exception {
-        if (remoteBridgeStarted.compareAndSet(false, true)) {
+        if (!bridgeFailed.get() && remoteBridgeStarted.compareAndSet(false, true)) {
             LOG.trace("{} starting remote Bridge, remoteBroker={}", configuration.getBrokerName(), remoteBroker);
             synchronized (this) {
                 if (!isCreatedByDuplex()) {
@@ -810,8 +813,8 @@ public abstract class DemandForwardingBridgeSupport implements NetworkBridge, Br
         } else if (data.getClass() == RemoveSubscriptionInfo.class) {
             RemoveSubscriptionInfo info = ((RemoveSubscriptionInfo) data);
             SubscriptionInfo subscriptionInfo = new SubscriptionInfo(info.getClientId(), info.getSubscriptionName());
-            for (Iterator i = subscriptionMapByLocalId.values().iterator(); i.hasNext(); ) {
-                DemandSubscription ds = (DemandSubscription) i.next();
+            for (Iterator<DemandSubscription> i = subscriptionMapByLocalId.values().iterator(); i.hasNext(); ) {
+                DemandSubscription ds = i.next();
                 boolean removed = ds.getDurableRemoteSubs().remove(subscriptionInfo);
                 if (removed) {
                     if (ds.getDurableRemoteSubs().isEmpty()) {


[04/17] activemq git commit: Add try/catch blocks to prevent client shutdown errors from preventing Broker shutdown.

Posted by ha...@apache.org.
Add try/catch blocks to prevent client shutdown errors from preventing
Broker shutdown.


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/f436b334
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/f436b334
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/f436b334

Branch: refs/heads/activemq-5.10.x
Commit: f436b3344f92e65bc633e770a2dcfdd90b7e8971
Parents: b66daf2
Author: Timothy Bish <ta...@gmail.com>
Authored: Fri Aug 8 12:34:38 2014 -0400
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:27:07 2014 -0500

----------------------------------------------------------------------
 .../activemq/JmsTransactionTestSupport.java     | 60 ++++++++++++--------
 1 file changed, 36 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/f436b334/activemq-broker/src/test/java/org/apache/activemq/JmsTransactionTestSupport.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/test/java/org/apache/activemq/JmsTransactionTestSupport.java b/activemq-broker/src/test/java/org/apache/activemq/JmsTransactionTestSupport.java
index 013ecff..7f212cd 100755
--- a/activemq-broker/src/test/java/org/apache/activemq/JmsTransactionTestSupport.java
+++ b/activemq-broker/src/test/java/org/apache/activemq/JmsTransactionTestSupport.java
@@ -41,7 +41,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * 
+ *
  */
 public abstract class JmsTransactionTestSupport extends TestSupport implements MessageListener {
 
@@ -61,8 +61,8 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
     protected BrokerService broker;
 
     // for message listener test
-    private List<Message> unackMessages = new ArrayList<Message>(MESSAGE_COUNT);
-    private List<Message> ackMessages = new ArrayList<Message>(MESSAGE_COUNT);
+    private final List<Message> unackMessages = new ArrayList<Message>(MESSAGE_COUNT);
+    private final List<Message> ackMessages = new ArrayList<Message>(MESSAGE_COUNT);
     private boolean resendPhase;
 
     public JmsTransactionTestSupport() {
@@ -75,9 +75,10 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see junit.framework.TestCase#setUp()
      */
+    @Override
     protected void setUp() throws Exception {
         broker = createBroker();
         broker.start();
@@ -119,19 +120,29 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
 
     /*
      * (non-Javadoc)
-     * 
+     *
      * @see junit.framework.TestCase#tearDown()
      */
+    @Override
     protected void tearDown() throws Exception {
         LOG.info("Closing down connection");
 
-        session.close();
-        session = null;
-        connection.close();
-        connection = null;
-        broker.stop();
-        broker.waitUntilStopped();
-        broker = null;
+        try {
+            session.close();
+            session = null;
+            connection.close();
+            connection = null;
+        } catch (Exception e) {
+            LOG.info("Caught exception while closing resources.");
+        }
+
+        try {
+            broker.stop();
+            broker.waitUntilStopped();
+            broker = null;
+        } catch (Exception e) {
+            LOG.info("Caught exception while shutting down the Broker", e);
+        }
 
         LOG.info("Connection closed.");
     }
@@ -140,7 +151,7 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
 
     /**
      * Sends a batch of messages and validates that the messages are received.
-     * 
+     *
      * @throws Exception
      */
     public void testSendReceiveTransactedBatches() throws Exception {
@@ -174,7 +185,7 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
     /**
      * Sends a batch of messages and validates that the rollbacked message was
      * not consumed.
-     * 
+     *
      * @throws Exception
      */
     public void testSendRollback() throws Exception {
@@ -295,7 +306,7 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
     /**
      * Sends a batch of messages and validates that the message sent before
      * session close is not consumed.
-     * 
+     *
      * @throws Exception
      */
     public void testSendSessionAndConnectionClose() throws Exception {
@@ -343,7 +354,7 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
     /**
      * Sends a batch of messages and validates that the rollbacked message was
      * redelivered.
-     * 
+     *
      * @throws Exception
      */
     public void testReceiveRollback() throws Exception {
@@ -394,7 +405,7 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
     /**
      * Sends a batch of messages and validates that the rollbacked message was
      * redelivered.
-     * 
+     *
      * @throws Exception
      */
     public void testReceiveTwoThenRollback() throws Exception {
@@ -448,7 +459,7 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
     /**
      * Sends a batch of messages and validates that the rollbacked message was
      * not consumed.
-     * 
+     *
      * @throws Exception
      */
     public void testSendReceiveWithPrefetchOne() throws Exception {
@@ -479,7 +490,7 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
     /**
      * Perform the test that validates if the rollbacked message was redelivered
      * multiple times.
-     * 
+     *
      * @throws Exception
      */
     public void testReceiveTwoThenRollbackManyTimes() throws Exception {
@@ -491,7 +502,7 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
     /**
      * Sends a batch of messages and validates that the rollbacked message was
      * not consumed. This test differs by setting the message prefetch to one.
-     * 
+     *
      * @throws Exception
      */
     public void testSendRollbackWithPrefetchOfOne() throws Exception {
@@ -503,7 +514,7 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
      * Sends a batch of messages and and validates that the rollbacked message
      * was redelivered. This test differs by setting the message prefetch to
      * one.
-     * 
+     *
      * @throws Exception
      */
     public void testReceiveRollbackWithPrefetchOfOne() throws Exception {
@@ -514,7 +525,7 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
     /**
      * Tests if the messages can still be received if the consumer is closed
      * (session is not closed).
-     * 
+     *
      * @throws Exception see http://jira.codehaus.org/browse/AMQ-143
      */
     public void testCloseConsumerBeforeCommit() throws Exception {
@@ -605,7 +616,7 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
 
     /**
      * Recreates the connection.
-     * 
+     *
      * @throws JMSException
      */
     protected void reconnect() throws Exception {
@@ -622,7 +633,7 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
 
     /**
      * Recreates the connection.
-     * 
+     *
      * @throws JMSException
      */
     protected void reconnectSession() throws JMSException {
@@ -671,6 +682,7 @@ public abstract class JmsTransactionTestSupport extends TestSupport implements M
         reconnect();
     }
 
+    @Override
     public void onMessage(Message message) {
         if (!resendPhase) {
             unackMessages.add(message);


[06/17] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5295

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5295

HTTPS Network Connector doesn't work with Mutual authentication-
HTTPSClientTransport uses wrong SSLSocketFactory


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/dbe9bc12
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/dbe9bc12
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/dbe9bc12

Branch: refs/heads/activemq-5.10.x
Commit: dbe9bc12f5bfb7790a5f23d95e18babdff97403a
Parents: 5c3a2db
Author: Timothy Bish <ta...@gmail.com>
Authored: Wed Aug 13 12:44:25 2014 -0400
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:36:19 2014 -0500

----------------------------------------------------------------------
 .../transport/https/HttpsClientTransport.java   | 76 ++++++++++++--------
 1 file changed, 46 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/dbe9bc12/activemq-http/src/main/java/org/apache/activemq/transport/https/HttpsClientTransport.java
----------------------------------------------------------------------
diff --git a/activemq-http/src/main/java/org/apache/activemq/transport/https/HttpsClientTransport.java b/activemq-http/src/main/java/org/apache/activemq/transport/https/HttpsClientTransport.java
index b943f87..2e432fc 100755
--- a/activemq-http/src/main/java/org/apache/activemq/transport/https/HttpsClientTransport.java
+++ b/activemq-http/src/main/java/org/apache/activemq/transport/https/HttpsClientTransport.java
@@ -1,42 +1,40 @@
 /**
-*
-* 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.
-*/
+ *
+ * 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.activemq.transport.https;
 
+import java.io.IOException;
+import java.net.URI;
+
+import org.apache.activemq.broker.SslContext;
 import org.apache.activemq.transport.http.HttpClientTransport;
 import org.apache.activemq.transport.util.TextWireFormat;
+import org.apache.activemq.util.IOExceptionSupport;
 import org.apache.http.conn.ClientConnectionManager;
 import org.apache.http.conn.scheme.Scheme;
 import org.apache.http.conn.scheme.SchemeRegistry;
 import org.apache.http.conn.ssl.SSLSocketFactory;
 import org.apache.http.impl.conn.PoolingClientConnectionManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.URI;
-import java.security.KeyStore;
 
 public class HttpsClientTransport extends HttpClientTransport {
 
-  public HttpsClientTransport(TextWireFormat wireFormat, URI remoteUrl) {
-    super(wireFormat, remoteUrl);
-  }
+    public HttpsClientTransport(TextWireFormat wireFormat, URI remoteUrl) {
+        super(wireFormat, remoteUrl);
+    }
 
     @Override
     protected ClientConnectionManager createClientConnectionManager() {
@@ -48,10 +46,7 @@ public class HttpsClientTransport extends HttpClientTransport {
 
         SchemeRegistry schemeRegistry = new SchemeRegistry();
         try {
-            // register the default socket factory so that it looks at the javax.net.ssl.keyStore,
-            // javax.net.ssl.trustStore, etc, properties by default
-            SSLSocketFactory sslSocketFactory =
-                    new SSLSocketFactory((javax.net.ssl.SSLSocketFactory) javax.net.ssl.SSLSocketFactory.getDefault(),
+            SSLSocketFactory sslSocketFactory = new SSLSocketFactory(createSocketFactory(),
                     SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
             schemeRegistry.register(new Scheme("https", getRemoteUrl().getPort(), sslSocketFactory));
             return schemeRegistry;
@@ -59,4 +54,25 @@ public class HttpsClientTransport extends HttpClientTransport {
             throw new IllegalStateException("Failure trying to create scheme registry", e);
         }
     }
+
+    /**
+     * Creates a new SSL SocketFactory. The given factory will use user-provided
+     * key and trust managers (if the user provided them).
+     *
+     * @return Newly created (Ssl)SocketFactory.
+     * @throws IOException
+     */
+    protected javax.net.ssl.SSLSocketFactory createSocketFactory() throws IOException {
+        if (SslContext.getCurrentSslContext() != null) {
+            SslContext ctx = SslContext.getCurrentSslContext();
+            try {
+                return ctx.getSSLContext().getSocketFactory();
+            } catch (Exception e) {
+                throw IOExceptionSupport.create(e);
+            }
+        } else {
+            return (javax.net.ssl.SSLSocketFactory) javax.net.ssl.SSLSocketFactory.getDefault();
+        }
+
+    }
 }


[17/17] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5345 - improve ldap communication

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5345 - improve ldap communication


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/22f2f3dd
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/22f2f3dd
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/22f2f3dd

Branch: refs/heads/activemq-5.10.x
Commit: 22f2f3dde757d31307da772d579815c1d169bc39
Parents: 6bdf4f8
Author: Dejan Bosanac <de...@nighttale.net>
Authored: Mon Sep 8 13:51:25 2014 +0200
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:53:53 2014 -0500

----------------------------------------------------------------------
 .../activemq/network/LdapNetworkConnector.java  | 12 ++-
 .../activemq/security/LDAPAuthorizationMap.java |  8 +-
 .../SimpleCachedLDAPAuthorizationMap.java       |  8 +-
 .../apache/activemq/jaas/LDAPLoginModule.java   | 11 ++-
 .../activemq/jaas/LDAPLoginModuleTest.java      | 27 +++++++
 activemq-jaas/src/test/resources/login.config   | 19 +++++
 .../security/LDAPAuthenticationTest.java        | 83 ++++++++++++++++++++
 .../activemq/security/LDAPSecurityTest.java     |  2 +-
 .../src/test/resources/login.config             | 19 +++++
 .../activemq/security/activemq-ldap-auth.xml    | 46 +++++++++++
 10 files changed, 225 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/22f2f3dd/activemq-broker/src/main/java/org/apache/activemq/network/LdapNetworkConnector.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/network/LdapNetworkConnector.java b/activemq-broker/src/main/java/org/apache/activemq/network/LdapNetworkConnector.java
index 3445b5a..0d3342e 100644
--- a/activemq-broker/src/main/java/org/apache/activemq/network/LdapNetworkConnector.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/network/LdapNetworkConnector.java
@@ -210,8 +210,16 @@ public class LdapNetworkConnector extends NetworkConnector implements NamespaceC
             env.put(Context.SECURITY_AUTHENTICATION, "none");
         } else {
             LOG.debug("    login credentials [{}:******]", user);
-            env.put(Context.SECURITY_PRINCIPAL, user);
-            env.put(Context.SECURITY_CREDENTIALS, password);
+            if (user != null && !"".equals(user)) {
+                env.put(Context.SECURITY_PRINCIPAL, user);
+            } else {
+                throw new Exception("Empty username is not allowed");
+            }
+            if (password != null && !"".equals(password)) {
+                env.put(Context.SECURITY_CREDENTIALS, password);
+            } else {
+                throw new Exception("Empty password is not allowed");
+            }
         }
         boolean isConnected = false;
         while (!isConnected) {

http://git-wip-us.apache.org/repos/asf/activemq/blob/22f2f3dd/activemq-broker/src/main/java/org/apache/activemq/security/LDAPAuthorizationMap.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/security/LDAPAuthorizationMap.java b/activemq-broker/src/main/java/org/apache/activemq/security/LDAPAuthorizationMap.java
index 011c2c1..2b89d12 100755
--- a/activemq-broker/src/main/java/org/apache/activemq/security/LDAPAuthorizationMap.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/security/LDAPAuthorizationMap.java
@@ -469,11 +469,15 @@ public class LDAPAuthorizationMap implements AuthorizationMap {
         try {
             Hashtable<String, String> env = new Hashtable<String, String>();
             env.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);
-            if (connectionUsername != null || !"".equals(connectionUsername)) {
+            if (connectionUsername != null && !"".equals(connectionUsername)) {
                 env.put(Context.SECURITY_PRINCIPAL, connectionUsername);
+            } else {
+                throw new NamingException("Empty username is not allowed");
             }
-            if (connectionPassword != null || !"".equals(connectionPassword)) {
+            if (connectionPassword != null && !"".equals(connectionPassword)) {
                 env.put(Context.SECURITY_CREDENTIALS, connectionPassword);
+            } else {
+                throw new NamingException("Empty password is not allowed");
             }
             env.put(Context.SECURITY_PROTOCOL, connectionProtocol);
             env.put(Context.PROVIDER_URL, connectionURL);

http://git-wip-us.apache.org/repos/asf/activemq/blob/22f2f3dd/activemq-broker/src/main/java/org/apache/activemq/security/SimpleCachedLDAPAuthorizationMap.java
----------------------------------------------------------------------
diff --git a/activemq-broker/src/main/java/org/apache/activemq/security/SimpleCachedLDAPAuthorizationMap.java b/activemq-broker/src/main/java/org/apache/activemq/security/SimpleCachedLDAPAuthorizationMap.java
index e01d5c0..9f888b9 100644
--- a/activemq-broker/src/main/java/org/apache/activemq/security/SimpleCachedLDAPAuthorizationMap.java
+++ b/activemq-broker/src/main/java/org/apache/activemq/security/SimpleCachedLDAPAuthorizationMap.java
@@ -125,11 +125,15 @@ public class SimpleCachedLDAPAuthorizationMap implements AuthorizationMap {
     protected DirContext createContext() throws NamingException {
         Hashtable<String, String> env = new Hashtable<String, String>();
         env.put(Context.INITIAL_CONTEXT_FACTORY, initialContextFactory);
-        if (connectionUsername != null || !"".equals(connectionUsername)) {
+        if (connectionUsername != null && !"".equals(connectionUsername)) {
             env.put(Context.SECURITY_PRINCIPAL, connectionUsername);
+        } else {
+            throw new NamingException("Empty username is not allowed");
         }
-        if (connectionPassword != null || !"".equals(connectionPassword)) {
+        if (connectionPassword != null && !"".equals(connectionPassword)) {
             env.put(Context.SECURITY_CREDENTIALS, connectionPassword);
+        } else {
+            throw new NamingException("Empty password is not allowed");
         }
         env.put(Context.SECURITY_PROTOCOL, connectionProtocol);
         env.put(Context.PROVIDER_URL, connectionURL);

http://git-wip-us.apache.org/repos/asf/activemq/blob/22f2f3dd/activemq-jaas/src/main/java/org/apache/activemq/jaas/LDAPLoginModule.java
----------------------------------------------------------------------
diff --git a/activemq-jaas/src/main/java/org/apache/activemq/jaas/LDAPLoginModule.java b/activemq-jaas/src/main/java/org/apache/activemq/jaas/LDAPLoginModule.java
index 7dc6326..f0834a0 100644
--- a/activemq-jaas/src/main/java/org/apache/activemq/jaas/LDAPLoginModule.java
+++ b/activemq-jaas/src/main/java/org/apache/activemq/jaas/LDAPLoginModule.java
@@ -190,7 +190,7 @@ public class LDAPLoginModule implements LoginModule {
         try {
 
             String filter = userSearchMatchingFormat.format(new String[] {
-                username
+                doRFC2254Encoding(username)
             });
             SearchControls constraints = new SearchControls();
             if (userSearchSubtreeBool) {
@@ -319,7 +319,7 @@ public class LDAPLoginModule implements LoginModule {
             return list;
         }
         String filter = roleSearchMatchingFormat.format(new String[] {
-            doRFC2254Encoding(dn), username
+            doRFC2254Encoding(dn), doRFC2254Encoding(username)
         });
 
         SearchControls constraints = new SearchControls();
@@ -459,9 +459,14 @@ public class LDAPLoginModule implements LoginModule {
             env.put(Context.INITIAL_CONTEXT_FACTORY, getLDAPPropertyValue(INITIAL_CONTEXT_FACTORY));
             if (isLoginPropertySet(CONNECTION_USERNAME)) {
                 env.put(Context.SECURITY_PRINCIPAL, getLDAPPropertyValue(CONNECTION_USERNAME));
+            } else {
+                throw new NamingException("Empty username is not allowed");
             }
+
             if (isLoginPropertySet(CONNECTION_PASSWORD)) {
                 env.put(Context.SECURITY_CREDENTIALS, getLDAPPropertyValue(CONNECTION_PASSWORD));
+            } else {
+                throw new NamingException("Empty password is not allowed");
             }
             env.put(Context.SECURITY_PROTOCOL, getLDAPPropertyValue(CONNECTION_PROTOCOL));
             env.put(Context.PROVIDER_URL, getLDAPPropertyValue(CONNECTION_URL));
@@ -484,7 +489,7 @@ public class LDAPLoginModule implements LoginModule {
     
     private boolean isLoginPropertySet(String propertyName) {
     	for (int i=0; i < config.length; i++ ) {
-    		if (config[i].getPropertyName() == propertyName && config[i].getPropertyValue() != null)
+    		if (config[i].getPropertyName() == propertyName && (config[i].getPropertyValue() != null && !"".equals(config[i].getPropertyValue())))
     				return true;
     	}
     	return false;

http://git-wip-us.apache.org/repos/asf/activemq/blob/22f2f3dd/activemq-jaas/src/test/java/org/apache/activemq/jaas/LDAPLoginModuleTest.java
----------------------------------------------------------------------
diff --git a/activemq-jaas/src/test/java/org/apache/activemq/jaas/LDAPLoginModuleTest.java b/activemq-jaas/src/test/java/org/apache/activemq/jaas/LDAPLoginModuleTest.java
index d721b1f..e68b815 100644
--- a/activemq-jaas/src/test/java/org/apache/activemq/jaas/LDAPLoginModuleTest.java
+++ b/activemq-jaas/src/test/java/org/apache/activemq/jaas/LDAPLoginModuleTest.java
@@ -41,7 +41,9 @@ import java.net.URL;
 import java.util.HashSet;
 import java.util.Hashtable;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 @RunWith ( FrameworkRunner.class )
 @CreateLdapServer(transports = {@CreateTransport(protocol = "LDAP", port=1024)})
@@ -121,4 +123,29 @@ public class LDAPLoginModuleTest extends AbstractLdapTestUnit {
         context.logout();
     }
 
+    @Test
+    public void testUnauthenticated() throws LoginException {
+        LoginContext context = new LoginContext("UnAuthenticatedLDAPLogin", new CallbackHandler() {
+            public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
+                for (int i = 0; i < callbacks.length; i++) {
+                    if (callbacks[i] instanceof NameCallback) {
+                        ((NameCallback) callbacks[i]).setName("first");
+                    } else if (callbacks[i] instanceof PasswordCallback) {
+                        ((PasswordCallback) callbacks[i]).setPassword("secret".toCharArray());
+                    } else {
+                        throw new UnsupportedCallbackException(callbacks[i]);
+                    }
+                }
+            }
+        });
+        try {
+            context.login();
+        } catch (LoginException le) {
+            assertEquals(le.getCause().getMessage(), "Empty password is not allowed");
+            return;
+        }
+        fail("Should have failed authenticating");
+    }
+
+
 }

http://git-wip-us.apache.org/repos/asf/activemq/blob/22f2f3dd/activemq-jaas/src/test/resources/login.config
----------------------------------------------------------------------
diff --git a/activemq-jaas/src/test/resources/login.config b/activemq-jaas/src/test/resources/login.config
index 6835c14..ae1371c 100644
--- a/activemq-jaas/src/test/resources/login.config
+++ b/activemq-jaas/src/test/resources/login.config
@@ -40,6 +40,25 @@ LDAPLogin {
         ;
 };
 
+UnAuthenticatedLDAPLogin {
+    org.apache.activemq.jaas.LDAPLoginModule required
+        debug=true
+        initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory
+        connectionURL="ldap://localhost:1024"
+        connectionUsername="uid=admin,ou=system"
+        connectionPassword=""
+        connectionProtocol=s
+        authentication=simple
+        userBase="ou=system"
+        userSearchMatching="(uid={0})"
+        userSearchSubtree=false
+        roleBase="ou=system"
+        roleName=dummyRoleName
+        roleSearchMatching="(uid={1})"
+        roleSearchSubtree=false
+        ;
+};
+
 ExpandedLDAPLogin {
     org.apache.activemq.jaas.LDAPLoginModule required
         debug=true

http://git-wip-us.apache.org/repos/asf/activemq/blob/22f2f3dd/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPAuthenticationTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPAuthenticationTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPAuthenticationTest.java
new file mode 100644
index 0000000..4e77c01
--- /dev/null
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPAuthenticationTest.java
@@ -0,0 +1,83 @@
+/**
+ * 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.activemq.security;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+import javax.jms.Connection;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+import org.apache.activemq.broker.BrokerFactory;
+import org.apache.activemq.broker.BrokerService;
+import org.apache.directory.server.annotations.CreateLdapServer;
+import org.apache.directory.server.annotations.CreateTransport;
+import org.apache.directory.server.core.annotations.ApplyLdifFiles;
+import org.apache.directory.server.core.integ.AbstractLdapTestUnit;
+import org.apache.directory.server.core.integ.FrameworkRunner;
+import org.apache.directory.server.ldap.LdapServer;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+
+@RunWith( FrameworkRunner.class )
+@CreateLdapServer(transports = {@CreateTransport(protocol = "LDAP", port=1024)})
+@ApplyLdifFiles(
+   "org/apache/activemq/security/activemq.ldif"
+)
+public class LDAPAuthenticationTest extends AbstractLdapTestUnit {
+
+    public BrokerService broker;
+
+    public static LdapServer ldapServer;
+
+    @Before
+    public void setup() throws Exception {
+        System.setProperty("ldapPort", String.valueOf(getLdapServer().getPort()));
+
+        broker = BrokerFactory.createBroker("xbean:org/apache/activemq/security/activemq-ldap-auth.xml");
+        broker.start();
+        broker.waitUntilStarted();
+    }
+
+    @After
+    public void shutdown() throws Exception {
+        broker.stop();
+        broker.waitUntilStopped();
+    }
+
+    @Test
+    public void testWildcard() throws Exception {
+        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
+        Connection conn = factory.createQueueConnection("*", "sunflower");
+        try {
+            conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return;
+        }
+        fail("Should have failed connecting");
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq/blob/22f2f3dd/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPSecurityTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPSecurityTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPSecurityTest.java
index 3642e0b..63c4cbd 100644
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPSecurityTest.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/security/LDAPSecurityTest.java
@@ -44,7 +44,7 @@ import org.junit.runner.RunWith;
 
 
 @RunWith( FrameworkRunner.class )
-@CreateLdapServer(transports = {@CreateTransport(protocol = "LDAP")})
+@CreateLdapServer(transports = {@CreateTransport(protocol = "LDAP", port=1024)})
 @ApplyLdifFiles(
    "org/apache/activemq/security/activemq.ldif"
 )

http://git-wip-us.apache.org/repos/asf/activemq/blob/22f2f3dd/activemq-unit-tests/src/test/resources/login.config
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/resources/login.config b/activemq-unit-tests/src/test/resources/login.config
index ed4dd2e..1f5f77c 100644
--- a/activemq-unit-tests/src/test/resources/login.config
+++ b/activemq-unit-tests/src/test/resources/login.config
@@ -65,4 +65,23 @@ broker2 {
         debug=true
         org.apache.activemq.jaas.textfiledn.user="org/apache/activemq/security/users2.properties"
         org.apache.activemq.jaas.textfiledn.group="org/apache/activemq/security/groups.properties";
+};
+
+LDAPLogin {
+    org.apache.activemq.jaas.LDAPLoginModule required
+        debug=true
+        initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory
+        connectionURL="ldap://localhost:1024"
+        connectionUsername="uid=admin,ou=system"
+        connectionPassword=secret
+        connectionProtocol=s
+        authentication=simple
+        userBase="ou=User,ou=ActiveMQ,ou=system"
+        userSearchMatching="(uid={0})"
+        userSearchSubtree=false
+        roleBase="ou=Group,ou=ActiveMQ,ou=system"
+        roleName=cn
+        roleSearchMatching="(uid={1})"
+        roleSearchSubtree=true
+        ;
 };
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq/blob/22f2f3dd/activemq-unit-tests/src/test/resources/org/apache/activemq/security/activemq-ldap-auth.xml
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/resources/org/apache/activemq/security/activemq-ldap-auth.xml b/activemq-unit-tests/src/test/resources/org/apache/activemq/security/activemq-ldap-auth.xml
new file mode 100644
index 0000000..8a11a6a
--- /dev/null
+++ b/activemq-unit-tests/src/test/resources/org/apache/activemq/security/activemq-ldap-auth.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    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.
+-->
+<!-- START SNIPPET: xbean -->
+<beans
+  xmlns="http://www.springframework.org/schema/beans"
+  xmlns:amq="http://activemq.apache.org/schema/core"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
+  http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
+
+  <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
+
+  <broker useJmx="false"  xmlns="http://activemq.apache.org/schema/core" persistent="false">
+
+      <destinations>
+         <queue physicalName="ADMIN.FOO" />
+      </destinations>
+
+      <plugins>
+          <jaasAuthenticationPlugin configuration="LDAPLogin"/>
+      </plugins>
+
+
+    <transportConnectors>
+      <transportConnector uri="tcp://localhost:61616"/>
+    </transportConnectors>
+
+  </broker>
+
+</beans>
+<!-- END SNIPPET: xbean -->


[03/17] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5304 - re-enable the test as the fix should be fixed now; amqp version of the test is ignored until we have temp destinations work properly with amqp

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5304 - re-enable the test as the fix should be fixed now; amqp version of the test is ignored until we have temp destinations work properly with amqp


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/b66daf27
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/b66daf27
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/b66daf27

Branch: refs/heads/activemq-5.10.x
Commit: b66daf2732437a48657d3805cc95857d8770aeb4
Parents: fe09b74
Author: Dejan Bosanac <de...@nighttale.net>
Authored: Fri Aug 8 14:00:13 2014 +0200
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:24:49 2014 -0500

----------------------------------------------------------------------
 .../activemq/karaf/itest/ActiveMQAMQPBrokerFeatureTest.java     | 5 +++++
 .../apache/activemq/karaf/itest/ActiveMQBrokerFeatureTest.java  | 1 -
 2 files changed, 5 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/b66daf27/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQAMQPBrokerFeatureTest.java
----------------------------------------------------------------------
diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQAMQPBrokerFeatureTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQAMQPBrokerFeatureTest.java
index 9dc2328..5544314 100644
--- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQAMQPBrokerFeatureTest.java
+++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQAMQPBrokerFeatureTest.java
@@ -59,4 +59,9 @@ public class ActiveMQAMQPBrokerFeatureTest extends ActiveMQBrokerFeatureTest {
 
         return connection;
     }
+
+    @Override
+    public void testTemporaryDestinations() throws Throwable {
+        // ignore until we have temporary destination are working in amqp
+    }
 }

http://git-wip-us.apache.org/repos/asf/activemq/blob/b66daf27/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerFeatureTest.java
----------------------------------------------------------------------
diff --git a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerFeatureTest.java b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerFeatureTest.java
index 4c6e2a9..ede449e 100644
--- a/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerFeatureTest.java
+++ b/activemq-karaf-itest/src/test/java/org/apache/activemq/karaf/itest/ActiveMQBrokerFeatureTest.java
@@ -72,7 +72,6 @@ public class ActiveMQBrokerFeatureTest extends AbstractJmsFeatureTest {
     }
 
     @Test
-    @Ignore
     public void testTemporaryDestinations() throws Throwable {
         Connection connection = getConnection();
         Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);


[11/17] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5281

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5281

Apply patch correctly honor JMS selector behavior for unknown values.


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/2193ef14
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/2193ef14
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/2193ef14

Branch: refs/heads/activemq-5.10.x
Commit: 2193ef144ba4559ced7015e4ecb777ae68c92a48
Parents: ccae55e
Author: Timothy Bish <ta...@gmail.com>
Authored: Mon Aug 18 13:23:56 2014 -0400
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:45:56 2014 -0500

----------------------------------------------------------------------
 .../activemq/filter/ComparisonExpression.java   |   3 +
 .../apache/activemq/filter/LogicExpression.java |  25 ++-
 .../selector/UnknownHandlingSelectorTest.java   | 182 +++++++++++++++++++
 3 files changed, 200 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/2193ef14/activemq-client/src/main/java/org/apache/activemq/filter/ComparisonExpression.java
----------------------------------------------------------------------
diff --git a/activemq-client/src/main/java/org/apache/activemq/filter/ComparisonExpression.java b/activemq-client/src/main/java/org/apache/activemq/filter/ComparisonExpression.java
index 0f77399..62d53d1 100755
--- a/activemq-client/src/main/java/org/apache/activemq/filter/ComparisonExpression.java
+++ b/activemq-client/src/main/java/org/apache/activemq/filter/ComparisonExpression.java
@@ -212,6 +212,9 @@ public abstract class ComparisonExpression extends BinaryExpression implements B
 
                 // If one of the values is null
                 if (lv == null ^ rv == null) {
+                    if (lv == null) {
+                        return null;
+                    }
                     return Boolean.FALSE;
                 }
                 if (lv == rv || lv.equals(rv)) {

http://git-wip-us.apache.org/repos/asf/activemq/blob/2193ef14/activemq-client/src/main/java/org/apache/activemq/filter/LogicExpression.java
----------------------------------------------------------------------
diff --git a/activemq-client/src/main/java/org/apache/activemq/filter/LogicExpression.java b/activemq-client/src/main/java/org/apache/activemq/filter/LogicExpression.java
index bddd3d7..fdc022b 100755
--- a/activemq-client/src/main/java/org/apache/activemq/filter/LogicExpression.java
+++ b/activemq-client/src/main/java/org/apache/activemq/filter/LogicExpression.java
@@ -39,13 +39,17 @@ public abstract class LogicExpression extends BinaryExpression implements Boolea
             public Object evaluate(MessageEvaluationContext message) throws JMSException {
 
                 Boolean lv = (Boolean)left.evaluate(message);
-                // Can we do an OR shortcut??
                 if (lv != null && lv.booleanValue()) {
                     return Boolean.TRUE;
                 }
-
                 Boolean rv = (Boolean)right.evaluate(message);
-                return rv == null ? null : rv;
+                if (rv != null && rv.booleanValue()) {
+                    return Boolean.TRUE;
+                }
+                if (lv == null || rv == null) {
+                    return null;
+                }
+                return Boolean.FALSE;
             }
 
             public String getExpressionSymbol() {
@@ -61,16 +65,17 @@ public abstract class LogicExpression extends BinaryExpression implements Boolea
 
                 Boolean lv = (Boolean)left.evaluate(message);
 
-                // Can we do an AND shortcut??
-                if (lv == null) {
-                    return null;
-                }
-                if (!lv.booleanValue()) {
+                if (lv != null && !lv.booleanValue()) {
                     return Boolean.FALSE;
                 }
-
                 Boolean rv = (Boolean)right.evaluate(message);
-                return rv == null ? null : rv;
+                if (rv != null && !rv.booleanValue()) {
+                    return Boolean.FALSE;
+                }
+                if (lv == null || rv == null) {
+                    return null;
+                }
+                return Boolean.TRUE;
             }
 
             public String getExpressionSymbol() {

http://git-wip-us.apache.org/repos/asf/activemq/blob/2193ef14/activemq-unit-tests/src/test/java/org/apache/activemq/selector/UnknownHandlingSelectorTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/selector/UnknownHandlingSelectorTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/selector/UnknownHandlingSelectorTest.java
new file mode 100644
index 0000000..5c9a8ee
--- /dev/null
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/selector/UnknownHandlingSelectorTest.java
@@ -0,0 +1,182 @@
+/**
+ * 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.activemq.selector;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import javax.jms.JMSException;
+import javax.jms.Message;
+
+import org.apache.activemq.command.ActiveMQMessage;
+import org.apache.activemq.command.ActiveMQTopic;
+import org.apache.activemq.filter.BooleanExpression;
+import org.apache.activemq.filter.MessageEvaluationContext;
+import org.junit.Before;
+import org.junit.Test;
+
+public class UnknownHandlingSelectorTest {
+
+    private Message message;
+
+    @Before
+    public void setUp() throws Exception {
+        message = new ActiveMQMessage();
+        message.setJMSDestination(new ActiveMQTopic("FOO.BAR"));
+        message.setJMSType("selector-test");
+        message.setJMSMessageID("connection:1:1:1:1");
+        message.setBooleanProperty("trueProp", true);
+        message.setBooleanProperty("falseProp", false);
+        message.setObjectProperty("nullProp", null);
+    }
+
+    /**
+     * | NOT
+     * +------+------
+     * |  T   |   F
+     * |  F   |   T
+     * |  U   |   U
+     * +------+-------
+     */
+    @Test
+    public void notEvaluation() throws Exception {
+        assertSelector("not(trueProp)", false);
+        assertSelector("not(falseProp)", true);
+        assertSelector("not(unknownProp)", false);
+    }
+
+    /**
+     * | AND  |   T   |   F   |   U
+     * +------+-------+-------+-------
+     * |  T   |   T   |   F   |   U
+     * |  F   |   F   |   F   |   F
+     * |  U   |   U   |   F   |   U
+     * +------+-------+-------+-------
+     */
+    @Test
+    public void andEvaluation() throws Exception {
+        assertSelectorEvaluatesToTrue("trueProp AND trueProp");
+        assertSelectorEvaluatesToFalse("trueProp AND falseProp");
+        assertSelectorEvaluatesToFalse("falseProp AND trueProp");
+        assertSelectorEvaluatesToFalse("falseProp AND falseProp");
+        assertSelectorEvaluatesToFalse("falseProp AND unknownProp");
+        assertSelectorEvaluatesToFalse("unknownProp AND falseProp");
+        assertSelectorEvaluatesToUnknown("trueProp AND unknownProp");
+        assertSelectorEvaluatesToUnknown("unknownProp AND trueProp");
+        assertSelectorEvaluatesToUnknown("unknownProp AND unknownProp");
+    }
+
+    /**
+     * | OR   |   T   |   F   |   U
+     * +------+-------+-------+--------
+     * |  T   |   T   |   T   |   T
+     * |  F   |   T   |   F   |   U
+     * |  U   |   T   |   U   |   U
+     * +------+-------+-------+-------
+     */
+    @Test
+    public void orEvaluation() throws Exception {
+        assertSelectorEvaluatesToTrue("trueProp OR trueProp");
+        assertSelectorEvaluatesToTrue("trueProp OR falseProp");
+        assertSelectorEvaluatesToTrue("falseProp OR trueProp");
+        assertSelectorEvaluatesToTrue("trueProp OR unknownProp");
+        assertSelectorEvaluatesToTrue("unknownProp OR trueProp");
+        assertSelectorEvaluatesToFalse("falseProp OR falseProp");
+        assertSelectorEvaluatesToUnknown("falseProp OR unknownProp");
+        assertSelectorEvaluatesToUnknown("unknownProp OR falseProp");
+        assertSelectorEvaluatesToUnknown("unknownProp OR unknownProp");
+    }
+
+    @Test
+    public void comparisonWithUnknownShouldEvaluateToUnknown() throws Exception {
+        assertSelectorEvaluatesToUnknown("unknownProp = 0");
+        assertSelectorEvaluatesToUnknown("unknownProp > 0");
+        assertSelectorEvaluatesToUnknown("unknownProp >= 0");
+        assertSelectorEvaluatesToUnknown("unknownProp < 0");
+        assertSelectorEvaluatesToUnknown("unknownProp <= 0");
+        assertSelectorEvaluatesToUnknown("unknownProp <> 0");
+        assertSelectorEvaluatesToUnknown("unknownProp LIKE 'zero'");
+        assertSelectorEvaluatesToUnknown("unknownProp NOT LIKE 'zero'");
+        assertSelectorEvaluatesToUnknown("unknownProp IN ('zero')");
+        assertSelectorEvaluatesToUnknown("unknownProp NOT IN ('zero')");
+        assertSelectorEvaluatesToUnknown("unknownProp BETWEEN 1 AND 2");
+        assertSelectorEvaluatesToUnknown("unknownProp NOT BETWEEN 1 AND 2");
+    }
+
+    @Test
+    public void comparisonWithNullPropShouldEvaluateToUnknown() throws Exception {
+        assertSelectorEvaluatesToUnknown("nullProp = 0");
+        assertSelectorEvaluatesToUnknown("nullProp > 0");
+        assertSelectorEvaluatesToUnknown("nullProp >= 0");
+        assertSelectorEvaluatesToUnknown("nullProp < 0");
+        assertSelectorEvaluatesToUnknown("nullProp <= 0");
+        assertSelectorEvaluatesToUnknown("nullProp <> 0");
+        assertSelectorEvaluatesToUnknown("nullProp LIKE 'zero'");
+        assertSelectorEvaluatesToUnknown("nullProp NOT LIKE 'zero'");
+        assertSelectorEvaluatesToUnknown("nullProp IN ('zero')");
+        assertSelectorEvaluatesToUnknown("nullProp NOT IN ('zero')");
+        assertSelectorEvaluatesToUnknown("nullProp BETWEEN 1 AND 2");
+        assertSelectorEvaluatesToUnknown("nullProp NOT BETWEEN 1 AND 2");
+    }
+
+    @Test
+    public void isNullIsNotNull() throws Exception {
+        assertSelectorEvaluatesToTrue("unknownProp IS NULL");
+        assertSelectorEvaluatesToTrue("nullProp IS NULL");
+        assertSelectorEvaluatesToFalse("trueProp IS NULL");
+        assertSelectorEvaluatesToFalse("unknownProp IS NOT NULL");
+        assertSelectorEvaluatesToFalse("nullProp IS NOT NULL");
+        assertSelectorEvaluatesToTrue("trueProp IS NOT NULL");
+    }
+
+    @Test
+    public void arithmeticWithNull() throws Exception {
+        assertSelectorEvaluatesToUnknown("-unknownProp = 0");
+        assertSelectorEvaluatesToUnknown("+unknownProp = 0");
+        assertSelectorEvaluatesToUnknown("unknownProp * 2 = 0");
+        assertSelectorEvaluatesToUnknown("unknownProp / 2 = 0");
+        assertSelectorEvaluatesToUnknown("unknownProp + 2 = 0");
+        assertSelectorEvaluatesToUnknown("unknownProp - 2 = 0");
+    }
+
+    protected void assertSelectorEvaluatesToUnknown(String selector) throws JMSException {
+        assertSelector(selector, false);
+        assertSelector(not(selector), false);
+    }
+    protected void assertSelectorEvaluatesToTrue(String selector) throws JMSException {
+        assertSelector(selector, true);
+        assertSelector(not(selector), false);
+    }
+
+    protected void assertSelectorEvaluatesToFalse(String selector) throws JMSException {
+        assertSelector(selector, false);
+        assertSelector(not(selector), true);
+    }
+
+    protected void assertSelector(String text, boolean matches) throws JMSException {
+        BooleanExpression selector = SelectorParser.parse(text);
+        assertTrue("Created a valid selector", selector != null);
+        MessageEvaluationContext context = new MessageEvaluationContext();
+        context.setMessageReference((org.apache.activemq.command.Message)message);
+        boolean value = selector.matches(context);
+        assertEquals("Selector for: " + text, matches, value);
+    }
+
+    private static String not(String selector) {
+        return "not(" + selector + ")";
+    }
+}
\ No newline at end of file


[02/17] activemq git commit: https://issues.apache.org/jira/browse/AMQ-5220

Posted by ha...@apache.org.
https://issues.apache.org/jira/browse/AMQ-5220

Fixes empty message bodies from responses to statistics plugin queries
over the STOMP transport.

This closes #41


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/fe09b748
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/fe09b748
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/fe09b748

Branch: refs/heads/activemq-5.10.x
Commit: fe09b7482c98dab25086a879cd2891a62f8c3b20
Parents: fb3e96a
Author: Timothy Bish <ta...@gmail.com>
Authored: Thu Aug 7 14:18:40 2014 -0400
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:23:55 2014 -0500

----------------------------------------------------------------------
 .../transport/stomp/FrameTranslator.java        |   5 +-
 .../transport/stomp/JmsFrameTranslator.java     | 184 ++++++++++---------
 .../transport/stomp/ProtocolConverter.java      |  15 +-
 .../apache/activemq/transport/stomp/Stomp.java  |   5 +
 .../transport/stomp/StompAdvisoryTest.java      |  58 ++++++
 .../transport/stomp/StompTestSupport.java       |   5 +
 6 files changed, 174 insertions(+), 98 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/fe09b748/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/FrameTranslator.java
----------------------------------------------------------------------
diff --git a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/FrameTranslator.java b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/FrameTranslator.java
index d37d364..7496472 100644
--- a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/FrameTranslator.java
+++ b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/FrameTranslator.java
@@ -27,12 +27,13 @@ import org.apache.activemq.command.ActiveMQDestination;
 import org.apache.activemq.command.ActiveMQMessage;
 
 /**
- * Implementations of this interface are used to map back and forth from Stomp
+ * Implementations of this interface are used to map back and forth from STOMP
  * to ActiveMQ. There are several standard mappings which are semantically the
  * same, the inner class, Helper, provides functions to copy those properties
  * from one to the other
  */
 public interface FrameTranslator {
+
     ActiveMQMessage convertFrame(ProtocolConverter converter, StompFrame frame) throws JMSException, ProtocolException;
 
     StompFrame convertMessage(ProtocolConverter converter, ActiveMQMessage message) throws IOException, JMSException;
@@ -142,7 +143,7 @@ public interface FrameTranslator {
                 msg.setPersistent("true".equals(o));
             }
 
-            // Stomp specific headers
+            // STOMP specific headers
             headers.remove(Stomp.Headers.RECEIPT_REQUESTED);
 
             // Since we take the rest of the header and put them in properties which could then

http://git-wip-us.apache.org/repos/asf/activemq/blob/fe09b748/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/JmsFrameTranslator.java
----------------------------------------------------------------------
diff --git a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/JmsFrameTranslator.java b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/JmsFrameTranslator.java
index 6ae68fc..3525b23 100644
--- a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/JmsFrameTranslator.java
+++ b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/JmsFrameTranslator.java
@@ -16,6 +16,9 @@
  */
 package org.apache.activemq.transport.stomp;
 
+import static org.apache.activemq.transport.stomp.FrameTranslator.Helper.copyStandardHeadersFromFrameToMessage;
+import static org.apache.activemq.transport.stomp.FrameTranslator.Helper.copyStandardHeadersFromMessageToFrame;
+
 import java.io.IOException;
 import java.io.Serializable;
 import java.io.StringReader;
@@ -33,6 +36,9 @@ import org.apache.activemq.command.ActiveMQMapMessage;
 import org.apache.activemq.command.ActiveMQMessage;
 import org.apache.activemq.command.ActiveMQObjectMessage;
 import org.apache.activemq.command.DataStructure;
+import org.apache.activemq.transport.stomp.Stomp.Headers;
+import org.apache.activemq.transport.stomp.Stomp.Responses;
+import org.apache.activemq.transport.stomp.Stomp.Transformations;
 import org.codehaus.jettison.mapped.Configuration;
 import org.fusesource.hawtbuf.UTF8Buffer;
 
@@ -49,133 +55,129 @@ import com.thoughtworks.xstream.io.xml.xppdom.XppFactory;
 /**
  * Frame translator implementation that uses XStream to convert messages to and
  * from XML and JSON
- *
- * @author <a href="mailto:dejan@nighttale.net">Dejan Bosanac</a>
  */
-public class JmsFrameTranslator extends LegacyFrameTranslator implements
-        BrokerContextAware {
+public class JmsFrameTranslator extends LegacyFrameTranslator implements BrokerContextAware {
 
     XStream xStream = null;
     BrokerContext brokerContext;
 
     @Override
-    public ActiveMQMessage convertFrame(ProtocolConverter converter,
-            StompFrame command) throws JMSException, ProtocolException {
+    public ActiveMQMessage convertFrame(ProtocolConverter converter, StompFrame command) throws JMSException, ProtocolException {
         Map<String, String> headers = command.getHeaders();
         ActiveMQMessage msg;
-        String transformation = headers.get(Stomp.Headers.TRANSFORMATION);
-        if (headers.containsKey(Stomp.Headers.CONTENT_LENGTH) || transformation.equals(Stomp.Transformations.JMS_BYTE.toString())) {
+        String transformation = headers.get(Headers.TRANSFORMATION);
+        if (headers.containsKey(Headers.CONTENT_LENGTH) || transformation.equals(Transformations.JMS_BYTE.toString())) {
             msg = super.convertFrame(converter, command);
         } else {
             HierarchicalStreamReader in;
 
             try {
                 String text = new String(command.getContent(), "UTF-8");
-                switch (Stomp.Transformations.getValue(transformation)) {
-                case JMS_OBJECT_XML:
-                    in = new XppReader(new StringReader(text), XppFactory.createDefaultParser());
-                    msg = createObjectMessage(in);
-                    break;
-                case JMS_OBJECT_JSON:
-                    in = new JettisonMappedXmlDriver().createReader(new StringReader(text));
-                    msg = createObjectMessage(in);
-                    break;
-                case JMS_MAP_XML:
-                    in = new XppReader(new StringReader(text), XppFactory.createDefaultParser());
-                    msg = createMapMessage(in);
-                    break;
-                case JMS_MAP_JSON:
-                    in = new JettisonMappedXmlDriver().createReader(new StringReader(text));
-                    msg = createMapMessage(in);
-                    break;
-                default:
-                    throw new Exception("Unkown transformation: " + transformation);
+                switch (Transformations.getValue(transformation)) {
+                    case JMS_OBJECT_XML:
+                        in = new XppReader(new StringReader(text), XppFactory.createDefaultParser());
+                        msg = createObjectMessage(in);
+                        break;
+                    case JMS_OBJECT_JSON:
+                        in = new JettisonMappedXmlDriver().createReader(new StringReader(text));
+                        msg = createObjectMessage(in);
+                        break;
+                    case JMS_MAP_XML:
+                        in = new XppReader(new StringReader(text), XppFactory.createDefaultParser());
+                        msg = createMapMessage(in);
+                        break;
+                    case JMS_MAP_JSON:
+                        in = new JettisonMappedXmlDriver().createReader(new StringReader(text));
+                        msg = createMapMessage(in);
+                        break;
+                    default:
+                        throw new Exception("Unkown transformation: " + transformation);
                 }
             } catch (Throwable e) {
-                command.getHeaders().put(Stomp.Headers.TRANSFORMATION_ERROR, e.getMessage());
+                command.getHeaders().put(Headers.TRANSFORMATION_ERROR, e.getMessage());
                 msg = super.convertFrame(converter, command);
             }
         }
-        FrameTranslator.Helper.copyStandardHeadersFromFrameToMessage(converter, command, msg, this);
+
+        copyStandardHeadersFromFrameToMessage(converter, command, msg, this);
         return msg;
     }
 
     @Override
-    public StompFrame convertMessage(ProtocolConverter converter,
-            ActiveMQMessage message) throws IOException, JMSException {
+    public StompFrame convertMessage(ProtocolConverter converter, ActiveMQMessage message) throws IOException, JMSException {
+
+        StompFrame command = new StompFrame();
+        command.setAction(Responses.MESSAGE);
+        Map<String, String> headers = new HashMap<String, String>(25);
+        command.setHeaders(headers);
+
+        copyStandardHeadersFromMessageToFrame(converter, message, command, this);
+
+        String transformation = headers.get(Headers.TRANSFORMATION);
 
         if (message.getDataStructureType() == ActiveMQObjectMessage.DATA_STRUCTURE_TYPE) {
-            StompFrame command = new StompFrame();
-            command.setAction(Stomp.Responses.MESSAGE);
-            Map<String, String> headers = new HashMap<String, String>(25);
-            command.setHeaders(headers);
-
-            FrameTranslator.Helper.copyStandardHeadersFromMessageToFrame(
-                    converter, message, command, this);
-
-            if (headers.get(Stomp.Headers.TRANSFORMATION).equals(Stomp.Transformations.JMS_XML.toString())) {
-                headers.put(Stomp.Headers.TRANSFORMATION, Stomp.Transformations.JMS_OBJECT_XML.toString());
-            } else if (headers.get(Stomp.Headers.TRANSFORMATION).equals(Stomp.Transformations.JMS_JSON.toString())) {
-                headers.put(Stomp.Headers.TRANSFORMATION, Stomp.Transformations.JMS_OBJECT_JSON.toString());
+
+            if (Transformations.JMS_XML.equals(transformation)) {
+                headers.put(Headers.TRANSFORMATION, Transformations.JMS_OBJECT_XML.toString());
+            } else if (Transformations.JMS_JSON.equals(transformation)) {
+                headers.put(Headers.TRANSFORMATION, Transformations.JMS_OBJECT_JSON.toString());
+            }
+
+            if (!headers.containsKey(Headers.TRANSFORMATION)) {
+                headers.put(Headers.TRANSFORMATION, Transformations.JMS_OBJECT_XML.toString());
             }
 
             ActiveMQObjectMessage msg = (ActiveMQObjectMessage) message.copy();
-            command.setContent(marshall(msg.getObject(),
-                    headers.get(Stomp.Headers.TRANSFORMATION))
-                    .getBytes("UTF-8"));
-            return command;
+            command.setContent(marshall(msg.getObject(), headers.get(Headers.TRANSFORMATION)).getBytes("UTF-8"));
 
         } else if (message.getDataStructureType() == ActiveMQMapMessage.DATA_STRUCTURE_TYPE) {
-            StompFrame command = new StompFrame();
-            command.setAction(Stomp.Responses.MESSAGE);
-            Map<String, String> headers = new HashMap<String, String>(25);
-            command.setHeaders(headers);
-
-            FrameTranslator.Helper.copyStandardHeadersFromMessageToFrame(
-                    converter, message, command, this);
-
-            if (headers.get(Stomp.Headers.TRANSFORMATION).equals(Stomp.Transformations.JMS_XML.toString())) {
-                headers.put(Stomp.Headers.TRANSFORMATION, Stomp.Transformations.JMS_MAP_XML.toString());
-            } else if (headers.get(Stomp.Headers.TRANSFORMATION).equals(Stomp.Transformations.JMS_JSON.toString())) {
-                headers.put(Stomp.Headers.TRANSFORMATION, Stomp.Transformations.JMS_MAP_JSON.toString());
+
+            if (Transformations.JMS_XML.equals(transformation)) {
+                headers.put(Headers.TRANSFORMATION, Transformations.JMS_MAP_XML.toString());
+            } else if (Transformations.JMS_JSON.equals(transformation)) {
+                headers.put(Headers.TRANSFORMATION, Transformations.JMS_MAP_JSON.toString());
+            }
+
+            if (!headers.containsKey(Headers.TRANSFORMATION)) {
+                headers.put(Headers.TRANSFORMATION, Transformations.JMS_MAP_XML.toString());
             }
 
             ActiveMQMapMessage msg = (ActiveMQMapMessage) message.copy();
-            command.setContent(marshall((Serializable)msg.getContentMap(),
-                    headers.get(Stomp.Headers.TRANSFORMATION)).getBytes("UTF-8"));
-            return command;
-        } else if (message.getDataStructureType() == ActiveMQMessage.DATA_STRUCTURE_TYPE &&
-                AdvisorySupport.ADIVSORY_MESSAGE_TYPE.equals(message.getType())) {
-
-            StompFrame command = new StompFrame();
-            command.setAction(Stomp.Responses.MESSAGE);
-            Map<String, String> headers = new HashMap<String, String>(25);
-            command.setHeaders(headers);
-
-            FrameTranslator.Helper.copyStandardHeadersFromMessageToFrame(
-                    converter, message, command, this);
-
-            if (!headers.containsKey(Stomp.Headers.TRANSFORMATION)) {
-                headers.put(Stomp.Headers.TRANSFORMATION, Stomp.Transformations.JMS_ADVISORY_JSON.toString());
+            command.setContent(marshall((Serializable) msg.getContentMap(), headers.get(Headers.TRANSFORMATION)).getBytes("UTF-8"));
+
+        } else if (message.getDataStructureType() == ActiveMQMessage.DATA_STRUCTURE_TYPE && AdvisorySupport.ADIVSORY_MESSAGE_TYPE.equals(message.getType())) {
+
+            if (Transformations.JMS_XML.equals(transformation)) {
+                headers.put(Headers.TRANSFORMATION, Transformations.JMS_ADVISORY_XML.toString());
+            } else if (Transformations.JMS_JSON.equals(transformation)) {
+                headers.put(Headers.TRANSFORMATION, Transformations.JMS_ADVISORY_JSON.toString());
             }
 
-            if (headers.get(Stomp.Headers.TRANSFORMATION).equals(Stomp.Transformations.JMS_XML.toString())) {
-                headers.put(Stomp.Headers.TRANSFORMATION, Stomp.Transformations.JMS_ADVISORY_XML.toString());
-            } else if (headers.get(Stomp.Headers.TRANSFORMATION).equals(Stomp.Transformations.JMS_JSON.toString())) {
-                headers.put(Stomp.Headers.TRANSFORMATION, Stomp.Transformations.JMS_ADVISORY_JSON.toString());
+            if (!headers.containsKey(Headers.TRANSFORMATION)) {
+                headers.put(Headers.TRANSFORMATION, Transformations.JMS_ADVISORY_JSON.toString());
             }
 
-            String body = marshallAdvisory(message.getDataStructure(),
-                    headers.get(Stomp.Headers.TRANSFORMATION));
+            String body = marshallAdvisory(message.getDataStructure(), headers.get(Headers.TRANSFORMATION));
             command.setContent(body.getBytes("UTF-8"));
-            return command;
+
         } else {
-            return super.convertMessage(converter, message);
+            command = super.convertMessage(converter, message);
         }
+
+        return command;
     }
 
     /**
-     * Marshalls the Object to a string using XML or JSON encoding
+     * Marshal the Object to a string using XML or JSON encoding
+     *
+     * @param object
+     *        the object to marshal
+     * @param transformation
+     *        the transformation to apply to the object.
+     *
+     * @returns the marshaled form of the given object, in JSON or XML.
+     *
+     * @throws JMSException if an error occurs during the marshal operation.
      */
     protected String marshall(Serializable object, String transformation) throws JMSException {
         StringWriter buffer = new StringWriter();
@@ -199,7 +201,7 @@ public class JmsFrameTranslator extends LegacyFrameTranslator implements
     @SuppressWarnings("unchecked")
     protected ActiveMQMapMessage createMapMessage(HierarchicalStreamReader in) throws JMSException {
         ActiveMQMapMessage mapMsg = new ActiveMQMapMessage();
-        Map<String, Object> map = (Map<String, Object>)getXStream().unmarshal(in);
+        Map<String, Object> map = (Map<String, Object>) getXStream().unmarshal(in);
         for (String key : map.keySet()) {
             mapMsg.setObject(key, map.get(key));
         }
@@ -256,8 +258,9 @@ public class JmsFrameTranslator extends LegacyFrameTranslator implements
             xstream.ignoreUnknownElements();
         }
 
-        // For any object whose elements contains an UTF8Buffer instance instead of a String
-        // type we map it to String both in and out such that we don't marshal UTF8Buffers out
+        // For any object whose elements contains an UTF8Buffer instance instead
+        // of a String type we map it to String both in and out such that we don't
+        // marshal UTF8Buffers out
         xstream.registerConverter(new AbstractSingleValueConverter() {
 
             @Override
@@ -283,14 +286,17 @@ public class JmsFrameTranslator extends LegacyFrameTranslator implements
     }
 
     @Override
-    public  BrokerContext getBrokerContext() {
+    public BrokerContext getBrokerContext() {
         return this.brokerContext;
     }
 
     /**
      * Return an Advisory message as a JSON formatted string
+     *
      * @param ds
-     * @return
+     *        the DataStructure instance that is being marshaled.
+     *
+     * @return the JSON marshaled form of the given DataStructure instance.
      */
     protected String marshallAdvisory(final DataStructure ds) {
         XStream xstream = new XStream(new JsonHierarchicalStreamDriver());

http://git-wip-us.apache.org/repos/asf/activemq/blob/fe09b748/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/ProtocolConverter.java
----------------------------------------------------------------------
diff --git a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/ProtocolConverter.java b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/ProtocolConverter.java
index 0ed08e4..edefb15 100644
--- a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/ProtocolConverter.java
+++ b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/ProtocolConverter.java
@@ -204,17 +204,16 @@ public class ProtocolConverter {
     }
 
     protected FrameTranslator findTranslator(String header) {
-        return findTranslator(header, null);
+        return findTranslator(header, null, false);
     }
 
-    protected FrameTranslator findTranslator(String header, ActiveMQDestination destination) {
+    protected FrameTranslator findTranslator(String header, ActiveMQDestination destination, boolean advisory) {
         FrameTranslator translator = frameTranslator;
         try {
             if (header != null) {
-                translator = (FrameTranslator) FRAME_TRANSLATOR_FINDER
-                        .newInstance(header);
+                translator = (FrameTranslator) FRAME_TRANSLATOR_FINDER.newInstance(header);
             } else {
-                if (destination != null && AdvisorySupport.isAdvisoryTopic(destination)) {
+                if (destination != null && (advisory || AdvisorySupport.isAdvisoryTopic(destination))) {
                     translator = new JmsFrameTranslator();
                 }
             }
@@ -230,7 +229,7 @@ public class ProtocolConverter {
     }
 
     /**
-     * Convert a stomp command
+     * Convert a STOMP command
      *
      * @param command
      */
@@ -894,7 +893,9 @@ public class ProtocolConverter {
         if (ignoreTransformation == true) {
             return frameTranslator.convertMessage(this, message);
         } else {
-            return findTranslator(message.getStringProperty(Stomp.Headers.TRANSFORMATION), message.getDestination()).convertMessage(this, message);
+            FrameTranslator translator = findTranslator(
+                message.getStringProperty(Stomp.Headers.TRANSFORMATION), message.getDestination(), message.isAdvisory());
+            return translator.convertMessage(this, message);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/activemq/blob/fe09b748/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/Stomp.java
----------------------------------------------------------------------
diff --git a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/Stomp.java b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/Stomp.java
index a66b5ee..767e947 100644
--- a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/Stomp.java
+++ b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/Stomp.java
@@ -176,10 +176,15 @@ public interface Stomp {
         JMS_ADVISORY_XML,
         JMS_ADVISORY_JSON;
 
+        @Override
         public String toString() {
             return name().replaceAll("_", "-").toLowerCase(Locale.ENGLISH);
         }
 
+        public boolean equals(String value) {
+            return toString().equals(value);
+        }
+
         public static Transformations getValue(String value) {
             return valueOf(value.replaceAll("-", "_").toUpperCase(Locale.ENGLISH));
         }

http://git-wip-us.apache.org/repos/asf/activemq/blob/fe09b748/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompAdvisoryTest.java
----------------------------------------------------------------------
diff --git a/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompAdvisoryTest.java b/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompAdvisoryTest.java
index 10d09b0..cc78308 100644
--- a/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompAdvisoryTest.java
+++ b/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompAdvisoryTest.java
@@ -22,29 +22,41 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.util.HashMap;
+import java.util.List;
 
 import javax.jms.Connection;
 import javax.jms.Destination;
 import javax.jms.Message;
 import javax.jms.MessageConsumer;
 import javax.jms.MessageProducer;
+import javax.jms.Queue;
 import javax.jms.Session;
+import javax.jms.Topic;
 
 import org.apache.activemq.ActiveMQConnection;
+import org.apache.activemq.broker.BrokerPlugin;
 import org.apache.activemq.broker.region.policy.ConstantPendingMessageLimitStrategy;
 import org.apache.activemq.broker.region.policy.PolicyEntry;
 import org.apache.activemq.broker.region.policy.PolicyMap;
 import org.apache.activemq.command.ActiveMQQueue;
+import org.apache.activemq.plugin.StatisticsBrokerPlugin;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class StompAdvisoryTest extends StompTestSupport {
+    static final String STATS_DESTINATION_PREFIX = "ActiveMQ.Statistics.Destination";
+
     private static final Logger LOG = LoggerFactory.getLogger(StompAdvisoryTest.class);
 
     protected ActiveMQConnection connection;
 
     @Override
+    protected void addAdditionalPlugins(List<BrokerPlugin> plugins) throws Exception {
+        plugins.add(new StatisticsBrokerPlugin());
+    }
+
+    @Override
     protected void applyBrokerPolicies() throws Exception {
 
         PolicyEntry policy = new PolicyEntry();
@@ -269,4 +281,50 @@ public class StompAdvisoryTest extends StompTestSupport {
         c.stop();
         c.close();
     }
+
+    @Test
+    public void testStatisticsAdvisory() throws Exception {
+        Connection c = cf.createConnection("system", "manager");
+        c.start();
+        final Session session = c.createSession(false, Session.AUTO_ACKNOWLEDGE);
+        final Topic replyTo = session.createTopic("stats");
+
+        // Dummy Queue used to later gather statistics.
+        final ActiveMQQueue testQueue = new ActiveMQQueue("queueToBeTestedForStats");
+        final MessageProducer producer = session.createProducer(null);
+        Message mess = session.createTextMessage("test");
+        producer.send(testQueue, mess);
+
+        // Create a request for Queue statistics
+        Thread child = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Thread.sleep(1000);
+                    Queue query = session.createQueue(STATS_DESTINATION_PREFIX + testQueue.getQueueName());
+                    Message msg = session.createMessage();
+                    msg.setJMSReplyTo(replyTo);
+                    producer.send(query, msg);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        });
+        child.start();
+
+        // Attempt to gather the statistics response from the previous request.
+        stompConnection.connect("system", "manager");
+        stompConnection.subscribe("/topic/" + replyTo.getTopicName(), Stomp.Headers.Subscribe.AckModeValues.AUTO);
+        stompConnection.begin("TX");
+        StompFrame f = stompConnection.receive(5000);
+        stompConnection.commit("TX");
+
+        LOG.debug(f.toString());
+        assertEquals(f.getAction(),"MESSAGE");
+        assertTrue("Should have a body", f.getBody().length() > 0);
+        assertTrue("Should contains memoryUsage stats", f.getBody().contains("memoryUsage"));
+
+        c.stop();
+        c.close();
+    }
 }

http://git-wip-us.apache.org/repos/asf/activemq/blob/fe09b748/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompTestSupport.java
----------------------------------------------------------------------
diff --git a/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompTestSupport.java b/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompTestSupport.java
index 3cf1356..e763552 100644
--- a/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompTestSupport.java
+++ b/activemq-stomp/src/test/java/org/apache/activemq/transport/stomp/StompTestSupport.java
@@ -146,6 +146,8 @@ public class StompTestSupport {
             plugins.add(configureAuthentication());
         }
 
+        addAdditionalPlugins(plugins);
+
         if (!plugins.isEmpty()) {
             BrokerPlugin[] array = new BrokerPlugin[plugins.size()];
             brokerService.setPlugins(plugins.toArray(array));
@@ -172,6 +174,9 @@ public class StompTestSupport {
         brokerService.setJobSchedulerStore(jobStore);
     }
 
+    protected void addAdditionalPlugins(List<BrokerPlugin> plugins) throws Exception {
+    }
+
     protected BrokerPlugin configureAuthentication() throws Exception {
         List<AuthenticationUser> users = new ArrayList<AuthenticationUser>();
         users.add(new AuthenticationUser("system", "manager", "users,admins"));


[08/17] activemq git commit: Make comments match reality.

Posted by ha...@apache.org.
Make comments match reality.


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/42751573
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/42751573
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/42751573

Branch: refs/heads/activemq-5.10.x
Commit: 4275157365ada2aa0a6ab4db42e56683115bb06a
Parents: b75ccd5
Author: Timothy Bish <ta...@gmail.com>
Authored: Thu Aug 14 18:17:30 2014 -0400
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:38:11 2014 -0500

----------------------------------------------------------------------
 .../main/java/org/apache/activemq/ActiveMQMessageProducer.java    | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/42751573/activemq-client/src/main/java/org/apache/activemq/ActiveMQMessageProducer.java
----------------------------------------------------------------------
diff --git a/activemq-client/src/main/java/org/apache/activemq/ActiveMQMessageProducer.java b/activemq-client/src/main/java/org/apache/activemq/ActiveMQMessageProducer.java
index e45809a..2fec295 100755
--- a/activemq-client/src/main/java/org/apache/activemq/ActiveMQMessageProducer.java
+++ b/activemq-client/src/main/java/org/apache/activemq/ActiveMQMessageProducer.java
@@ -105,8 +105,7 @@ public class ActiveMQMessageProducer extends ActiveMQMessageProducerSupport impl
 
         this.info.setDestination(destination);
 
-        // Enable producer window flow control if protocol > 3 and the window
-        // size > 0
+        // Enable producer window flow control if protocol >= 3 and the window size > 0
         if (session.connection.getProtocolVersion() >= 3 && this.info.getWindowSize() > 0) {
             producerWindow = new MemoryUsage("Producer Window: " + producerId);
             producerWindow.setExecutor(session.getConnectionExecutor());


[12/17] activemq git commit: Ensure all resources shut down.

Posted by ha...@apache.org.
Ensure all resources shut down.


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/58be7125
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/58be7125
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/58be7125

Branch: refs/heads/activemq-5.10.x
Commit: 58be7125d48efdba29f05debe77ee59e0c64eef1
Parents: 2193ef1
Author: Timothy Bish <ta...@gmail.com>
Authored: Mon Aug 18 17:58:58 2014 -0400
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:46:50 2014 -0500

----------------------------------------------------------------------
 .../activemq/transport/ws/WSTransportTest.java   | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/58be7125/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java
----------------------------------------------------------------------
diff --git a/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java b/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java
index 6c99328..b133e71 100644
--- a/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java
+++ b/activemq-http/src/test/java/org/apache/activemq/transport/ws/WSTransportTest.java
@@ -17,6 +17,8 @@
 
 package org.apache.activemq.transport.ws;
 
+import static org.junit.Assert.assertTrue;
+
 import java.io.File;
 import java.io.IOException;
 import java.net.Socket;
@@ -47,8 +49,6 @@ import org.openqa.selenium.firefox.FirefoxProfile;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.junit.Assert.assertTrue;
-
 public class WSTransportTest {
 
     private static final Logger LOG = LoggerFactory.getLogger(WSTransportTest.class);
@@ -137,13 +137,21 @@ public class WSTransportTest {
         } catch(Exception e) {
             // Some tests explicitly disconnect from stomp so can ignore
         } finally {
-            stopBroker();
+            try {
+                stopBroker();
+            } catch (Exception e) {
+                LOG.warn("Error on Broker stop.");
+            }
             if (driver != null) {
-                driver.quit();
+                try {
+                    driver.quit();
+                } catch (Exception e) {}
                 driver = null;
             }
             if (server != null) {
-                server.stop();
+                try {
+                    server.stop();
+                } catch (Exception e) {}
             }
         }
     }
@@ -250,6 +258,7 @@ public class WSTransportTest {
 
             assertTrue("Should have disconnected", Wait.waitFor(new Wait.Condition() {
 
+                @Override
                 public boolean isSatisified() throws Exception {
                     return webStatus.getText().equals("Disconnected");
                 }


[13/17] activemq git commit: Fix test, remote broker only dequeues the message if it is ack'd otherwise it remains in-flight.

Posted by ha...@apache.org.
Fix test, remote broker only dequeues the message if it is ack'd
otherwise it remains in-flight.


Project: http://git-wip-us.apache.org/repos/asf/activemq/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq/commit/0a6e217f
Tree: http://git-wip-us.apache.org/repos/asf/activemq/tree/0a6e217f
Diff: http://git-wip-us.apache.org/repos/asf/activemq/diff/0a6e217f

Branch: refs/heads/activemq-5.10.x
Commit: 0a6e217fd65d0f25778ddaf78fcbb28bdf8b1b8d
Parents: 58be712
Author: Timothy Bish <ta...@gmail.com>
Authored: Tue Aug 19 14:37:30 2014 -0400
Committer: Hadrian Zbarcea <ha...@apache.org>
Committed: Wed Dec 17 19:47:31 2014 -0500

----------------------------------------------------------------------
 .../activemq/network/DemandForwardingBridgeTest.java    | 12 ++++++++++--
 1 file changed, 10 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq/blob/0a6e217f/activemq-unit-tests/src/test/java/org/apache/activemq/network/DemandForwardingBridgeTest.java
----------------------------------------------------------------------
diff --git a/activemq-unit-tests/src/test/java/org/apache/activemq/network/DemandForwardingBridgeTest.java b/activemq-unit-tests/src/test/java/org/apache/activemq/network/DemandForwardingBridgeTest.java
index 020a511..02b207c 100755
--- a/activemq-unit-tests/src/test/java/org/apache/activemq/network/DemandForwardingBridgeTest.java
+++ b/activemq-unit-tests/src/test/java/org/apache/activemq/network/DemandForwardingBridgeTest.java
@@ -26,6 +26,7 @@ import org.apache.activemq.command.ActiveMQDestination;
 import org.apache.activemq.command.ConnectionInfo;
 import org.apache.activemq.command.ConsumerInfo;
 import org.apache.activemq.command.Message;
+import org.apache.activemq.command.MessageAck;
 import org.apache.activemq.command.ProducerInfo;
 import org.apache.activemq.command.SessionInfo;
 import org.apache.activemq.util.Wait;
@@ -80,14 +81,20 @@ public class DemandForwardingBridgeTest extends NetworkTestSupport {
 
         // Now create remote consumer that should cause message to move to this
         // remote consumer.
-        ConsumerInfo consumerInfo2 = createConsumerInfo(sessionInfo2, destination);
+        final ConsumerInfo consumerInfo2 = createConsumerInfo(sessionInfo2, destination);
         connection2.request(consumerInfo2);
 
         // Make sure the message was delivered via the remote.
         assertTrue("message was received", Wait.waitFor(new Wait.Condition() {
             @Override
             public boolean isSatisified() throws Exception {
-                return receiveMessage(connection2) != null;
+                Message msg = receiveMessage(connection2);
+                if (msg != null) {
+                    connection2.request(createAck(consumerInfo2, msg, 1, MessageAck.STANDARD_ACK_TYPE));
+                    return true;
+                }
+
+                return false;
             }
         }));
 
@@ -97,6 +104,7 @@ public class DemandForwardingBridgeTest extends NetworkTestSupport {
                 return 1 == destinationStatistics.getForwards().getCount();
             }
         }));
+
         assertEquals("broker dest stat dequeues", 1, destinationStatistics.getDequeues().getCount());
         assertEquals("remote broker dest stat dequeues", 1, remoteBroker.getDestination(destination).getDestinationStatistics().getDequeues().getCount());
     }