You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by rg...@apache.org on 2011/08/21 23:10:04 UTC

svn commit: r1160062 - in /qpid/branches/rg-amqp-1-0-sandbox/qpid/java: ./ amqp-1-0-client-jms/ amqp-1-0-client-jms/src/ amqp-1-0-client-jms/src/main/ amqp-1-0-client-jms/src/main/java/ amqp-1-0-client-jms/src/main/java/org/ amqp-1-0-client-jms/src/mai...

Author: rgodfrey
Date: Sun Aug 21 21:10:04 2011
New Revision: 1160062

URL: http://svn.apache.org/viewvc?rev=1160062&view=rev
Log:
RG AMQP 1-0 : Moved jms client lib to separate sub project

Added:
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/build.xml
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/
      - copied from r1159872, qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/jms/
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionFactory.java
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/NameParserImpl.java
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/PropertiesFileInitialContextFactory.java
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/ReadOnlyContext.java
Removed:
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client/src/main/java/org/apache/qpid/amqp_1_0/jms/
Modified:
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/DestinationImpl.java
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueImpl.java
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicImpl.java
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/build.deps
    qpid/branches/rg-amqp-1-0-sandbox/qpid/java/build.xml

Added: qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/build.xml
URL: http://svn.apache.org/viewvc/qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/build.xml?rev=1160062&view=auto
==============================================================================
--- qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/build.xml (added)
+++ qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/build.xml Sun Aug 21 21:10:04 2011
@@ -0,0 +1,29 @@
+<!--
+ -
+ - 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.
+ -
+ -->
+<project name="AMQP 1.0 JMS Client" default="build">
+
+  <property name="module.genpom" value="true"/>
+  <property name="module.depends" value="amqp-1-0-common amqp-1-0-client"/>
+
+
+  <import file="../module.xml"/>
+
+</project>

Added: qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionFactory.java
URL: http://svn.apache.org/viewvc/qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionFactory.java?rev=1160062&view=auto
==============================================================================
--- qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionFactory.java (added)
+++ qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/ConnectionFactory.java Sun Aug 21 21:10:04 2011
@@ -0,0 +1,31 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.jms;
+
+
+import javax.jms.JMSException;
+
+public interface ConnectionFactory extends javax.jms.ConnectionFactory
+{
+    Connection createConnection() throws JMSException;
+
+    Connection createConnection(String username, String password) throws JMSException;
+}

Added: qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java?rev=1160062&view=auto
==============================================================================
--- qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java (added)
+++ qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/ConnectionFactoryImpl.java Sun Aug 21 21:10:04 2011
@@ -0,0 +1,100 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.jms.impl;
+
+import org.apache.qpid.amqp_1_0.jms.Connection;
+import org.apache.qpid.amqp_1_0.jms.ConnectionFactory;
+
+import javax.jms.JMSException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+public class ConnectionFactoryImpl implements ConnectionFactory
+{
+    private String _host;
+    private int _port;
+    private String _username;
+    private String _password;
+    private String _clientId;
+
+    public ConnectionFactoryImpl(final String host,
+                                 final int port,
+                                 final String username,
+                                 final String password,
+                                 final String clientId)
+    {
+        _host = host;
+        _port = port;
+        _username = username;
+        _password = password;
+        _clientId = clientId;
+    }
+
+    public Connection createConnection() throws JMSException
+    {
+        return new ConnectionImpl(_host, _port, _username, _password, _clientId);
+    }
+
+    public Connection createConnection(final String username, final String password) throws JMSException
+    {
+        return new ConnectionImpl(_host, _port, username, password, _clientId);
+    }
+
+    public static ConnectionFactoryImpl createFromURL(final String urlString) throws MalformedURLException
+    {
+        URL url = new URL(urlString);
+        String host = url.getHost();
+        int port = url.getPort();
+        if(port == -1)
+        {
+            port = 5672;
+        }
+        String userInfo = url.getUserInfo();
+        String username = null;
+        String password = null;
+        String clientId = null;
+        if(userInfo != null)
+        {
+            String[] components = userInfo.split(":",2);
+            username = components[0];
+            if(components.length == 2)
+            {
+                password = components[1];
+            }
+        }
+        String query = url.getQuery();
+        if(query != null)
+        {
+           for(String param : query.split("&"))
+           {
+               String[] keyValuePair = param.split("=",2);
+               if(keyValuePair[0].equalsIgnoreCase("clientid"))
+               {
+                   clientId = keyValuePair[1];
+                   break;
+               }
+           }
+        }
+
+        return new ConnectionFactoryImpl(host, port, username, password, clientId);
+
+    }
+}

Modified: qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/DestinationImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/DestinationImpl.java?rev=1160062&r1=1159872&r2=1160062&view=diff
==============================================================================
--- qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/DestinationImpl.java (original)
+++ qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/DestinationImpl.java Sun Aug 21 21:10:04 2011
@@ -21,11 +21,16 @@ package org.apache.qpid.amqp_1_0.jms.imp
 
 import org.apache.qpid.amqp_1_0.jms.Destination;
 
+import java.util.WeakHashMap;
+
 public class DestinationImpl implements Destination
 {
+    private static final WeakHashMap<String, DestinationImpl> DESTINATION_CACHE =
+            new WeakHashMap<String, DestinationImpl>();
+
     private final String _address;
 
-    public DestinationImpl(String address)
+    protected DestinationImpl(String address)
     {
         _address = address;
     }
@@ -37,6 +42,31 @@ public class DestinationImpl implements 
 
     public static DestinationImpl valueOf(String address)
     {
-        return address == null ? null : new DestinationImpl(address);
+        return address == null ? null : createDestination(address);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return _address.hashCode();
+    }
+
+    @Override
+    public boolean equals(final Object obj)
+    {
+        return obj != null
+               && obj.getClass() == getClass()
+               && _address.equals(((DestinationImpl)obj)._address);
+    }
+
+    public static synchronized DestinationImpl createDestination(final String address)
+    {
+        DestinationImpl destination = DESTINATION_CACHE.get(address);
+        if(destination == null)
+        {
+            destination = new DestinationImpl(address);
+            DESTINATION_CACHE.put(address, destination);
+        }
+        return destination;
     }
 }

Modified: qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueImpl.java?rev=1160062&r1=1159872&r2=1160062&view=diff
==============================================================================
--- qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueImpl.java (original)
+++ qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/QueueImpl.java Sun Aug 21 21:10:04 2011
@@ -20,8 +20,13 @@ package org.apache.qpid.amqp_1_0.jms.imp
 
 import org.apache.qpid.amqp_1_0.jms.Queue;
 
+import java.util.WeakHashMap;
+
 public class QueueImpl extends DestinationImpl implements Queue
 {
+    private static final WeakHashMap<String, QueueImpl> QUEUE_CACHE =
+        new WeakHashMap<String, QueueImpl>();
+
     public QueueImpl(String address)
     {
         super(address);
@@ -29,6 +34,18 @@ public class QueueImpl extends Destinati
 
     public String getQueueName()
     {
-        return getAddress();  //TODO
+        return getAddress();
+    }
+
+    public static synchronized QueueImpl createQueue(final String address)
+    {
+        QueueImpl queue = QUEUE_CACHE.get(address);
+        if(queue == null)
+        {
+            queue = new QueueImpl(address);
+            QUEUE_CACHE.put(address, queue);
+        }
+        return queue;
     }
+
 }

Modified: qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicImpl.java?rev=1160062&r1=1159872&r2=1160062&view=diff
==============================================================================
--- qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicImpl.java (original)
+++ qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/impl/TopicImpl.java Sun Aug 21 21:10:04 2011
@@ -19,8 +19,15 @@
 package org.apache.qpid.amqp_1_0.jms.impl;
 
 import org.apache.qpid.amqp_1_0.jms.Topic;
+
+import java.util.WeakHashMap;
+
 public class TopicImpl extends DestinationImpl implements Topic
 {
+    private static final WeakHashMap<String, TopicImpl> TOPIC_CACHE =
+        new WeakHashMap<String, TopicImpl>();
+
+
     public TopicImpl(String address)
     {
         super(address);
@@ -30,4 +37,17 @@ public class TopicImpl extends Destinati
     {
         return getAddress();
     }
+
+    public static synchronized TopicImpl createTopic(final String address)
+    {
+        TopicImpl topic = TOPIC_CACHE.get(address);
+        if(topic == null)
+        {
+            topic = new TopicImpl(address);
+            TOPIC_CACHE.put(address, topic);
+        }
+        return topic;
+    }
+
+
 }

Added: qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/NameParserImpl.java
URL: http://svn.apache.org/viewvc/qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/NameParserImpl.java?rev=1160062&view=auto
==============================================================================
--- qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/NameParserImpl.java (added)
+++ qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/NameParserImpl.java Sun Aug 21 21:10:04 2011
@@ -0,0 +1,37 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.qpid.amqp_1_0.jms.jndi;
+
+import javax.naming.CompositeName;
+import javax.naming.Name;
+import javax.naming.NameParser;
+import javax.naming.NamingException;
+
+/**
+ * A default implementation of {@link NameParser}
+ * <p/>
+ * Based on class from ActiveMQ.
+ */
+public class NameParserImpl implements NameParser
+{
+    public Name parse(String name) throws NamingException
+    {
+        return new CompositeName(name);
+    }
+}

Added: qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/PropertiesFileInitialContextFactory.java
URL: http://svn.apache.org/viewvc/qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/PropertiesFileInitialContextFactory.java?rev=1160062&view=auto
==============================================================================
--- qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/PropertiesFileInitialContextFactory.java (added)
+++ qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/PropertiesFileInitialContextFactory.java Sun Aug 21 21:10:04 2011
@@ -0,0 +1,230 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.jms.jndi;
+
+import org.apache.qpid.amqp_1_0.jms.impl.ConnectionFactoryImpl;
+import org.apache.qpid.amqp_1_0.jms.impl.DestinationImpl;
+import org.apache.qpid.amqp_1_0.jms.impl.QueueImpl;
+import org.apache.qpid.amqp_1_0.jms.impl.TopicImpl;
+
+import java.io.BufferedInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.jms.ConnectionFactory;
+import javax.jms.Destination;
+import javax.jms.Queue;
+import javax.jms.Topic;
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.naming.spi.InitialContextFactory;
+
+
+public class PropertiesFileInitialContextFactory implements InitialContextFactory
+{
+
+    private String CONNECTION_FACTORY_PREFIX = "connectionfactory.";
+    private String DESTINATION_PREFIX = "destination.";
+    private String QUEUE_PREFIX = "queue.";
+    private String TOPIC_PREFIX = "topic.";
+
+    public Context getInitialContext(Hashtable environment) throws NamingException
+    {
+        Map data = new ConcurrentHashMap();
+
+        String file = null;
+        try
+        {
+
+
+            if (environment.containsKey(Context.PROVIDER_URL))
+            {
+                file = (String) environment.get(Context.PROVIDER_URL);
+            }
+            else
+            {
+                file = System.getProperty(Context.PROVIDER_URL);
+            }
+
+            if (file != null)
+            {
+
+                // Load the properties specified
+                BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(file));
+                Properties p = new Properties();
+                try
+                {
+                    p.load(inputStream);
+                }
+                finally
+                {
+                    inputStream.close();
+                }
+
+
+                for (Map.Entry me : p.entrySet())
+                {
+                    String key = (String) me.getKey();
+                    String value = (String) me.getValue();
+                    environment.put(key, value);
+                    if (System.getProperty(key) == null)
+                    {
+                        System.setProperty(key, value);
+                    }
+                }
+            }
+            else
+            {
+                throw new NamingException("No Provider URL specified.");
+            }
+        }
+        catch (IOException ioe)
+        {
+            NamingException ne = new NamingException("Unable to load property file:" + file +".");
+            ne.setRootCause(ioe);
+            throw ne;
+        }
+
+        try
+        {
+            createConnectionFactories(data, environment);
+        }
+        catch (MalformedURLException e)
+        {
+            NamingException ne = new NamingException();
+            ne.setRootCause(e);
+            throw ne;
+        }
+
+        createDestinations(data, environment);
+
+        createQueues(data, environment);
+
+        createTopics(data, environment);
+
+        return createContext(data, environment);
+    }
+
+    protected ReadOnlyContext createContext(Map data, Hashtable environment)
+    {
+        return new ReadOnlyContext(environment, data);
+    }
+
+    protected void createConnectionFactories(Map data, Hashtable environment) throws MalformedURLException
+    {
+        for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();)
+        {
+            Map.Entry entry = (Map.Entry) iter.next();
+            String key = entry.getKey().toString();
+            if (key.startsWith(CONNECTION_FACTORY_PREFIX))
+            {
+                String jndiName = key.substring(CONNECTION_FACTORY_PREFIX.length());
+                ConnectionFactory cf = createFactory(entry.getValue().toString().trim());
+                if (cf != null)
+                {
+                    data.put(jndiName, cf);
+                }
+            }
+        }
+    }
+
+    protected void createDestinations(Map data, Hashtable environment)
+    {
+        for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();)
+        {
+            Map.Entry entry = (Map.Entry) iter.next();
+            String key = entry.getKey().toString();
+            if (key.startsWith(DESTINATION_PREFIX))
+            {
+                String jndiName = key.substring(DESTINATION_PREFIX.length());
+                Destination dest = createDestination(entry.getValue().toString().trim());
+                if (dest != null)
+                {
+                    data.put(jndiName, dest);
+                }
+            }
+        }
+    }
+
+    protected void createQueues(Map data, Hashtable environment)
+    {
+        for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();)
+        {
+            Map.Entry entry = (Map.Entry) iter.next();
+            String key = entry.getKey().toString();
+            if (key.startsWith(QUEUE_PREFIX))
+            {
+                String jndiName = key.substring(QUEUE_PREFIX.length());
+                Queue q = createQueue(entry.getValue().toString().trim());
+                if (q != null)
+                {
+                    data.put(jndiName, q);
+                }
+            }
+        }
+    }
+
+    protected void createTopics(Map data, Hashtable environment)
+    {
+        for (Iterator iter = environment.entrySet().iterator(); iter.hasNext();)
+        {
+            Map.Entry entry = (Map.Entry) iter.next();
+            String key = entry.getKey().toString();
+            if (key.startsWith(TOPIC_PREFIX))
+            {
+                String jndiName = key.substring(TOPIC_PREFIX.length());
+                Topic t = createTopic(entry.getValue().toString().trim());
+                if (t != null)
+                {
+                    data.put(jndiName, t);
+                }
+            }
+        }
+    }
+
+
+    private ConnectionFactory createFactory(String url) throws MalformedURLException
+    {
+        return ConnectionFactoryImpl.createFromURL(url);
+    }
+
+    private DestinationImpl createDestination(String str)
+    {
+        return DestinationImpl.createDestination(str);
+    }
+
+    private QueueImpl createQueue(String address)
+    {
+        return QueueImpl.createQueue(address);
+    }
+
+    private TopicImpl createTopic(String address)
+    {
+        return TopicImpl.createTopic(address);
+    }
+
+}

Added: qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/ReadOnlyContext.java
URL: http://svn.apache.org/viewvc/qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/ReadOnlyContext.java?rev=1160062&view=auto
==============================================================================
--- qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/ReadOnlyContext.java (added)
+++ qpid/branches/rg-amqp-1-0-sandbox/qpid/java/amqp-1-0-client-jms/src/main/java/org/apache/qpid/amqp_1_0/jms/jndi/ReadOnlyContext.java Sun Aug 21 21:10:04 2011
@@ -0,0 +1,527 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.amqp_1_0.jms.jndi;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.Map;
+
+import javax.naming.Binding;
+import javax.naming.CompositeName;
+import javax.naming.Context;
+import javax.naming.LinkRef;
+import javax.naming.Name;
+import javax.naming.NameClassPair;
+import javax.naming.NameNotFoundException;
+import javax.naming.NameParser;
+import javax.naming.NamingEnumeration;
+import javax.naming.NamingException;
+import javax.naming.NotContextException;
+import javax.naming.OperationNotSupportedException;
+import javax.naming.Reference;
+import javax.naming.spi.NamingManager;
+
+/**
+ * Based on class from ActiveMQ.
+ * A read-only Context
+ * <p/>
+ * This version assumes it and all its subcontext are read-only and any attempt
+ * to modify (e.g. through bind) will result in an OperationNotSupportedException.
+ * Each Context in the tree builds a cache of the entries in all sub-contexts
+ * to optimise the performance of lookup.
+ * </p>
+ * <p>This implementation is intended to optimise the performance of lookup(String)
+ * to about the level of a HashMap get. It has been observed that the scheme
+ * resolution phase performed by the JVM takes considerably longer, so for
+ * optimum performance lookups should be coded like:</p>
+ * <code>
+ * Context componentContext = (Context)new InitialContext().lookup("java:comp");
+ * String envEntry = (String) componentContext.lookup("env/myEntry");
+ * String envEntry2 = (String) componentContext.lookup("env/myEntry2");
+ * </code>
+ */
+public class ReadOnlyContext implements Context, Serializable
+{
+    private static final long serialVersionUID = -5754338187296859149L;
+    protected static final NameParser nameParser = new NameParserImpl();
+
+    protected final Hashtable environment; // environment for this context
+    protected final Map bindings; // bindings at my level
+    protected final Map treeBindings; // all bindings under me
+
+    private boolean frozen = false;
+    private String nameInNamespace = "";
+    public static final String SEPARATOR = "/";
+
+    public ReadOnlyContext()
+    {
+        environment = new Hashtable();
+        bindings = new HashMap();
+        treeBindings = new HashMap();
+    }
+
+    public ReadOnlyContext(Hashtable env)
+    {
+        if (env == null)
+        {
+            this.environment = new Hashtable();
+        }
+        else
+        {
+            this.environment = new Hashtable(env);
+        }
+
+        this.bindings = Collections.EMPTY_MAP;
+        this.treeBindings = Collections.EMPTY_MAP;
+    }
+
+    public ReadOnlyContext(Hashtable environment, Map bindings)
+    {
+        if (environment == null)
+        {
+            this.environment = new Hashtable();
+        }
+        else
+        {
+            this.environment = new Hashtable(environment);
+        }
+
+        this.bindings = bindings;
+        treeBindings = new HashMap();
+        frozen = true;
+    }
+
+    public ReadOnlyContext(Hashtable environment, Map bindings, String nameInNamespace)
+    {
+        this(environment, bindings);
+        this.nameInNamespace = nameInNamespace;
+    }
+
+    protected ReadOnlyContext(ReadOnlyContext clone, Hashtable env)
+    {
+        this.bindings = clone.bindings;
+        this.treeBindings = clone.treeBindings;
+        this.environment = new Hashtable(env);
+    }
+
+    protected ReadOnlyContext(ReadOnlyContext clone, Hashtable env, String nameInNamespace)
+    {
+        this(clone, env);
+        this.nameInNamespace = nameInNamespace;
+    }
+
+    public void freeze()
+    {
+        frozen = true;
+    }
+
+    boolean isFrozen()
+    {
+        return frozen;
+    }
+
+    /**
+     * internalBind is intended for use only during setup or possibly by suitably synchronized superclasses.
+     * It binds every possible lookup into a map in each context.  To do this, each context
+     * strips off one name segment and if necessary creates a new context for it. Then it asks that context
+     * to bind the remaining name.  It returns a map containing all the bindings from the next context, plus
+     * the context it just created (if it in fact created it). (the names are suitably extended by the segment
+     * originally lopped off).
+     *
+     * @param name
+     * @param value
+     * @return
+     * @throws javax.naming.NamingException
+     */
+    protected Map internalBind(String name, Object value) throws NamingException
+    {
+        assert (name != null) && (name.length() > 0);
+        assert !frozen;
+
+        Map newBindings = new HashMap();
+        int pos = name.indexOf('/');
+        if (pos == -1)
+        {
+            if (treeBindings.put(name, value) != null)
+            {
+                throw new NamingException("Something already bound at " + name);
+            }
+
+            bindings.put(name, value);
+            newBindings.put(name, value);
+        }
+        else
+        {
+            String segment = name.substring(0, pos);
+            assert segment != null;
+            assert !segment.equals("");
+            Object o = treeBindings.get(segment);
+            if (o == null)
+            {
+                o = newContext();
+                treeBindings.put(segment, o);
+                bindings.put(segment, o);
+                newBindings.put(segment, o);
+            }
+            else if (!(o instanceof ReadOnlyContext))
+            {
+                throw new NamingException("Something already bound where a subcontext should go");
+            }
+
+            ReadOnlyContext readOnlyContext = (ReadOnlyContext) o;
+            String remainder = name.substring(pos + 1);
+            Map subBindings = readOnlyContext.internalBind(remainder, value);
+            for (Iterator iterator = subBindings.entrySet().iterator(); iterator.hasNext();)
+            {
+                Map.Entry entry = (Map.Entry) iterator.next();
+                String subName = segment + "/" + (String) entry.getKey();
+                Object bound = entry.getValue();
+                treeBindings.put(subName, bound);
+                newBindings.put(subName, bound);
+            }
+        }
+
+        return newBindings;
+    }
+
+    protected ReadOnlyContext newContext()
+    {
+        return new ReadOnlyContext();
+    }
+
+    public Object addToEnvironment(String propName, Object propVal) throws NamingException
+    {
+        return environment.put(propName, propVal);
+    }
+
+    public Hashtable getEnvironment() throws NamingException
+    {
+        return (Hashtable) environment.clone();
+    }
+
+    public Object removeFromEnvironment(String propName) throws NamingException
+    {
+        return environment.remove(propName);
+    }
+
+    public Object lookup(String name) throws NamingException
+    {
+        if (name.length() == 0)
+        {
+            return this;
+        }
+
+        Object result = treeBindings.get(name);
+        if (result == null)
+        {
+            result = bindings.get(name);
+        }
+
+        if (result == null)
+        {
+            int pos = name.indexOf(':');
+            if (pos > 0)
+            {
+                String scheme = name.substring(0, pos);
+                Context ctx = NamingManager.getURLContext(scheme, environment);
+                if (ctx == null)
+                {
+                    throw new NamingException("scheme " + scheme + " not recognized");
+                }
+
+                return ctx.lookup(name);
+            }
+            else
+            {
+                // Split out the first name of the path
+                // and look for it in the bindings map.
+                CompositeName path = new CompositeName(name);
+
+                if (path.size() == 0)
+                {
+                    return this;
+                }
+                else
+                {
+                    String first = path.get(0);
+                    Object obj = bindings.get(first);
+                    if (obj == null)
+                    {
+                        throw new NameNotFoundException(name);
+                    }
+                    else if ((obj instanceof Context) && (path.size() > 1))
+                    {
+                        Context subContext = (Context) obj;
+                        obj = subContext.lookup(path.getSuffix(1));
+                    }
+
+                    return obj;
+                }
+            }
+        }
+
+        if (result instanceof LinkRef)
+        {
+            LinkRef ref = (LinkRef) result;
+            result = lookup(ref.getLinkName());
+        }
+
+        if (result instanceof Reference)
+        {
+            try
+            {
+                result = NamingManager.getObjectInstance(result, null, null, this.environment);
+            }
+            catch (NamingException e)
+            {
+                throw e;
+            }
+            catch (Exception e)
+            {
+                throw (NamingException) new NamingException("could not look up : " + name).initCause(e);
+            }
+        }
+
+        if (result instanceof ReadOnlyContext)
+        {
+            String prefix = getNameInNamespace();
+            if (prefix.length() > 0)
+            {
+                prefix = prefix + SEPARATOR;
+            }
+
+            result = new ReadOnlyContext((ReadOnlyContext) result, environment, prefix + name);
+        }
+
+        return result;
+    }
+
+    public Object lookup(Name name) throws NamingException
+    {
+        return lookup(name.toString());
+    }
+
+    public Object lookupLink(String name) throws NamingException
+    {
+        return lookup(name);
+    }
+
+    public Name composeName(Name name, Name prefix) throws NamingException
+    {
+        Name result = (Name) prefix.clone();
+        result.addAll(name);
+
+        return result;
+    }
+
+    public String composeName(String name, String prefix) throws NamingException
+    {
+        CompositeName result = new CompositeName(prefix);
+        result.addAll(new CompositeName(name));
+
+        return result.toString();
+    }
+
+    public NamingEnumeration list(String name) throws NamingException
+    {
+        Object o = lookup(name);
+        if (o == this)
+        {
+            return new ListEnumeration();
+        }
+        else if (o instanceof Context)
+        {
+            return ((Context) o).list("");
+        }
+        else
+        {
+            throw new NotContextException();
+        }
+    }
+
+    public NamingEnumeration listBindings(String name) throws NamingException
+    {
+        Object o = lookup(name);
+        if (o == this)
+        {
+            return new ListBindingEnumeration();
+        }
+        else if (o instanceof Context)
+        {
+            return ((Context) o).listBindings("");
+        }
+        else
+        {
+            throw new NotContextException();
+        }
+    }
+
+    public Object lookupLink(Name name) throws NamingException
+    {
+        return lookupLink(name.toString());
+    }
+
+    public NamingEnumeration list(Name name) throws NamingException
+    {
+        return list(name.toString());
+    }
+
+    public NamingEnumeration listBindings(Name name) throws NamingException
+    {
+        return listBindings(name.toString());
+    }
+
+    public void bind(Name name, Object obj) throws NamingException
+    {
+        throw new OperationNotSupportedException();
+    }
+
+    public void bind(String name, Object obj) throws NamingException
+    {
+        throw new OperationNotSupportedException();
+    }
+
+    public void close() throws NamingException
+    {
+        // ignore
+    }
+
+    public Context createSubcontext(Name name) throws NamingException
+    {
+        throw new OperationNotSupportedException();
+    }
+
+    public Context createSubcontext(String name) throws NamingException
+    {
+        throw new OperationNotSupportedException();
+    }
+
+    public void destroySubcontext(Name name) throws NamingException
+    {
+        throw new OperationNotSupportedException();
+    }
+
+    public void destroySubcontext(String name) throws NamingException
+    {
+        throw new OperationNotSupportedException();
+    }
+
+    public String getNameInNamespace() throws NamingException
+    {
+        return nameInNamespace;
+    }
+
+    public NameParser getNameParser(Name name) throws NamingException
+    {
+        return nameParser;
+    }
+
+    public NameParser getNameParser(String name) throws NamingException
+    {
+        return nameParser;
+    }
+
+    public void rebind(Name name, Object obj) throws NamingException
+    {
+        throw new OperationNotSupportedException();
+    }
+
+    public void rebind(String name, Object obj) throws NamingException
+    {
+        throw new OperationNotSupportedException();
+    }
+
+    public void rename(Name oldName, Name newName) throws NamingException
+    {
+        throw new OperationNotSupportedException();
+    }
+
+    public void rename(String oldName, String newName) throws NamingException
+    {
+        throw new OperationNotSupportedException();
+    }
+
+    public void unbind(Name name) throws NamingException
+    {
+        throw new OperationNotSupportedException();
+    }
+
+    public void unbind(String name) throws NamingException
+    {
+        throw new OperationNotSupportedException();
+    }
+
+    private abstract class LocalNamingEnumeration implements NamingEnumeration
+    {
+        private Iterator i = bindings.entrySet().iterator();
+
+        public boolean hasMore() throws NamingException
+        {
+            return i.hasNext();
+        }
+
+        public boolean hasMoreElements()
+        {
+            return i.hasNext();
+        }
+
+        protected Map.Entry getNext()
+        {
+            return (Map.Entry) i.next();
+        }
+
+        public void close() throws NamingException
+        { }
+    }
+
+    private class ListEnumeration extends LocalNamingEnumeration
+    {
+        public Object next() throws NamingException
+        {
+            return nextElement();
+        }
+
+        public Object nextElement()
+        {
+            Map.Entry entry = getNext();
+
+            return new NameClassPair((String) entry.getKey(), entry.getValue().getClass().getName());
+        }
+    }
+
+    private class ListBindingEnumeration extends LocalNamingEnumeration
+    {
+        public Object next() throws NamingException
+        {
+            return nextElement();
+        }
+
+        public Object nextElement()
+        {
+            Map.Entry entry = getNext();
+
+            return new Binding((String) entry.getKey(), entry.getValue());
+        }
+    }
+}

Modified: qpid/branches/rg-amqp-1-0-sandbox/qpid/java/build.deps
URL: http://svn.apache.org/viewvc/qpid/branches/rg-amqp-1-0-sandbox/qpid/java/build.deps?rev=1160062&r1=1160061&r2=1160062&view=diff
==============================================================================
--- qpid/branches/rg-amqp-1-0-sandbox/qpid/java/build.deps (original)
+++ qpid/branches/rg-amqp-1-0-sandbox/qpid/java/build.deps Sun Aug 21 21:10:04 2011
@@ -60,7 +60,8 @@ client.libs=${geronimo-jms}
 tools.libs=${commons-configuration.libs} ${log4j}
 broker.libs=${commons-cli} ${commons-logging} ${log4j} ${slf4j-log4j} \
     ${xalan} ${felix.libs} ${derby-db} ${commons-configuration.libs}
-amqp-1-0-client.libs=${geronimo-jms} ${commons-cli}
+amqp-1-0-client.libs=${commons-cli}
+amqp-1-0-client-jms.libs=${geronimo-jms}
 
 broker-plugins.libs=${felix.libs} ${log4j} ${commons-configuration.libs}
 

Modified: qpid/branches/rg-amqp-1-0-sandbox/qpid/java/build.xml
URL: http://svn.apache.org/viewvc/qpid/branches/rg-amqp-1-0-sandbox/qpid/java/build.xml?rev=1160062&r1=1160061&r2=1160062&view=diff
==============================================================================
--- qpid/branches/rg-amqp-1-0-sandbox/qpid/java/build.xml (original)
+++ qpid/branches/rg-amqp-1-0-sandbox/qpid/java/build.xml Sun Aug 21 21:10:04 2011
@@ -26,7 +26,7 @@
   <findSubProjects name="client-plugins" dir="client-plugins" erroronmissingdir="false"/>
   <findSubProjects name="management" dir="management" excludes="common,example"/>
 
-  <property name="modules.core"       value="junit-toolkit common management/common amqp-1-0-common broker client amqp-1-0-client tools"/>
+  <property name="modules.core"       value="junit-toolkit common management/common amqp-1-0-common broker client amqp-1-0-client amqp-1-0-client-jms tools"/>
   <property name="modules.examples"   value="client/example management/example"/>
   <property name="modules.tests"      value="systests perftests integrationtests testkit"/>
   <property name="modules.management" value="${management}"/>



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