Author: davsclaus
Date: Mon Sep 24 11:40:04 2012
New Revision: 1389304

URL: http://svn.apache.org/viewvc?rev=1389304&view=rev
Log:
CAMEL-5611: Added singleton based jndi context factory. Can be used for testing 
purposes etc. Thanks to Benjamin Graf for patch.

Added:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelSingletonInitialContextFactory.java
      - copied, changed from r1389287, 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelInitialContextFactory.java
    
camel/trunk/camel-core/src/test/java/org/apache/camel/util/jndi/JndiCamelSingletonInitialContextFactoryTest.java
   (with props)
Modified:
    
camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelInitialContextFactory.java

Modified: 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelInitialContextFactory.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelInitialContextFactory.java?rev=1389304&r1=1389303&r2=1389304&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelInitialContextFactory.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelInitialContextFactory.java
 Mon Sep 24 11:40:04 2012
@@ -17,7 +17,6 @@
 package org.apache.camel.util.jndi;
 
 import java.util.Hashtable;
-
 import javax.naming.Context;
 import javax.naming.NamingException;
 import javax.naming.spi.InitialContextFactory;
@@ -25,8 +24,11 @@ import javax.naming.spi.InitialContextFa
 import org.apache.camel.util.CastUtils;
 
 /**
- * A factory of the Camel InitialContext which allows a Map to be used to 
create a
+ * A factory of the Camel {@link javax.naming.InitialContext} which allows a 
{@link java.util.Map} to be used to create a
  * JNDI context.
+ * <p/>
+ * This implementation is prototype based, by creating a <b>new</b> context on 
each call to
+ * {@link #getInitialContext(java.util.Hashtable)}.
  *
  * @version 
  */

Copied: 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelSingletonInitialContextFactory.java
 (from r1389287, 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelInitialContextFactory.java)
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelSingletonInitialContextFactory.java?p2=camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelSingletonInitialContextFactory.java&p1=camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelInitialContextFactory.java&r1=1389287&r2=1389304&rev=1389304&view=diff
==============================================================================
--- 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelInitialContextFactory.java
 (original)
+++ 
camel/trunk/camel-core/src/main/java/org/apache/camel/util/jndi/CamelSingletonInitialContextFactory.java
 Mon Sep 24 11:40:04 2012
@@ -17,38 +17,36 @@
 package org.apache.camel.util.jndi;
 
 import java.util.Hashtable;
-
 import javax.naming.Context;
 import javax.naming.NamingException;
-import javax.naming.spi.InitialContextFactory;
-
-import org.apache.camel.util.CastUtils;
 
 /**
- * A factory of the Camel InitialContext which allows a Map to be used to 
create a
+ * A factory of the Camel {@link javax.naming.InitialContext} which allows a 
{@link java.util.Map} to be used to create a
  * JNDI context.
+ * <p/>
+ * This implementation is singleton based, by creating a <b>new</b> context 
once, and reusing it on each call to
+ * {@link #getInitialContext(java.util.Hashtable)}.
  *
- * @version 
+ * @version
  */
-public class CamelInitialContextFactory implements InitialContextFactory {
+public class CamelSingletonInitialContextFactory extends 
CamelInitialContextFactory {
+
+    private static volatile Context context;
 
     /**
-     * Creates a new context with the given environment.
+     * Gets or creates the context with the given environment.
+     * <p/>
+     * This implementation will create the context once, and then return the 
same instance
+     * on multiple calls.
      *
      * @param  environment  the environment, must not be <tt>null</tt>
      * @return the created context.
-     * @throws NamingException is thrown if creation failed.
+     * @throws javax.naming.NamingException is thrown if creation failed.
      */
-    public Context getInitialContext(Hashtable<?, ?> environment) throws 
NamingException {
-        try {
-            return new JndiContext(CastUtils.cast(environment, String.class, 
Object.class));
-        } catch (Exception e) {
-            if (e instanceof NamingException) {
-                throw (NamingException) e;
-            }
-            NamingException exception = new NamingException(e.getMessage());
-            exception.initCause(e);
-            throw exception;
+    public synchronized Context getInitialContext(Hashtable<?, ?> environment) 
throws NamingException {
+        if (context == null) {
+            context = super.getInitialContext(environment);
         }
+        return context;
     }
 }

Added: 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/jndi/JndiCamelSingletonInitialContextFactoryTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/util/jndi/JndiCamelSingletonInitialContextFactoryTest.java?rev=1389304&view=auto
==============================================================================
--- 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/jndi/JndiCamelSingletonInitialContextFactoryTest.java
 (added)
+++ 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/jndi/JndiCamelSingletonInitialContextFactoryTest.java
 Mon Sep 24 11:40:04 2012
@@ -0,0 +1,98 @@
+/**
+ * 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.camel.util.jndi;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.util.FileUtil;
+
+/**
+ *
+ */
+public class JndiCamelSingletonInitialContextFactoryTest extends 
ContextTestSupport {
+
+    private static final String FAKE = "!!! Get DataSource fake !!!";
+    private File file = new File("src/test/resources/jndi.properties");
+
+    @Override
+    protected void setUp() throws Exception {
+        FileUtil.deleteFile(file);
+
+        // crete jndi.properties file
+        FileOutputStream fos = new FileOutputStream(file);
+        try {
+            String name = "java.naming.factory.initial=" + 
CamelSingletonInitialContextFactory.class.getName();
+            fos.write(name.getBytes());
+        } finally {
+            fos.close();
+        }
+
+        super.setUp();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        FileUtil.deleteFile(file);
+        super.tearDown();
+    }
+
+    @Override
+    protected JndiRegistry createRegistry() throws Exception {
+        // create jndi registry to use in Camel, using the default initial 
contex (which will read jndi.properties)
+        // (instead of what test-support offers normally)
+        JndiRegistry jndi = new JndiRegistry(new InitialContext());
+        jndi.bind("jdbc/myDataSource", FAKE);
+        return jndi;
+    }
+
+    public void testSingletonJndiContext() throws Exception {
+        MockEndpoint mock = getMockEndpoint("mock:result");
+        mock.expectedBodiesReceived(FAKE);
+
+        template.sendBody("direct:simple", "Dummy");
+
+        mock.assertIsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:simple")
+                        .process(new Processor() {
+                            @Override
+                            public void process(Exchange exchange) throws 
Exception {
+                                // calling this should get us the existing 
context
+                                Context context = new InitialContext();
+                                
exchange.getIn().setBody(context.lookup("jdbc/myDataSource").toString());
+                            }
+                        })
+                        .to("mock:result");
+            }
+        };
+    }
+}

Propchange: 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/jndi/JndiCamelSingletonInitialContextFactoryTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
camel/trunk/camel-core/src/test/java/org/apache/camel/util/jndi/JndiCamelSingletonInitialContextFactoryTest.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date


Reply via email to