You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2016/12/03 16:38:09 UTC

[43/50] tomee git commit: TOMEE-1962 deprecate LocalInitialContextFactory

TOMEE-1962 deprecate LocalInitialContextFactory


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

Branch: refs/heads/tomee-1.7.x
Commit: 1ead00932d18728d6b66c923f76953ee4ac7914d
Parents: e0bbf0b
Author: rmannibucau <rm...@apache.org>
Authored: Thu Oct 20 18:27:57 2016 +0200
Committer: rmannibucau <rm...@apache.org>
Committed: Thu Oct 20 18:27:57 2016 +0200

----------------------------------------------------------------------
 .../core/LocalInitialContextFactory.java        |  1 +
 .../core/OpenEJBInitialContextFactory.java      | 76 ++++++++++++++++
 .../client/LocalInitialContextFactory.java      |  1 +
 .../core/OpenEJBInitialContextFactoryTest.java  | 92 ++++++++++++++++++++
 4 files changed, 170 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/1ead0093/container/openejb-core/src/main/java/org/apache/openejb/core/LocalInitialContextFactory.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/LocalInitialContextFactory.java b/container/openejb-core/src/main/java/org/apache/openejb/core/LocalInitialContextFactory.java
index ef318e0..de7961c 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/core/LocalInitialContextFactory.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/LocalInitialContextFactory.java
@@ -34,6 +34,7 @@ import java.util.concurrent.locks.ReentrantLock;
  * @version $Rev$ $Date$
  */
 @SuppressWarnings("UseOfObsoleteCollectionType")
+@Deprecated // use org.apache.openejb.core.OpenEJBInitialContextFactory
 public class LocalInitialContextFactory implements InitialContextFactory {
 
     private static final ReentrantLock lock = new ReentrantLock();

http://git-wip-us.apache.org/repos/asf/tomee/blob/1ead0093/container/openejb-core/src/main/java/org/apache/openejb/core/OpenEJBInitialContextFactory.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/core/OpenEJBInitialContextFactory.java b/container/openejb-core/src/main/java/org/apache/openejb/core/OpenEJBInitialContextFactory.java
new file mode 100644
index 0000000..0d91b41
--- /dev/null
+++ b/container/openejb-core/src/main/java/org/apache/openejb/core/OpenEJBInitialContextFactory.java
@@ -0,0 +1,76 @@
+/*
+ * 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.openejb.core;
+
+import org.apache.openejb.core.ivm.naming.ContextWrapper;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.spi.ContainerSystem;
+
+import javax.naming.Context;
+import javax.naming.NameNotFoundException;
+import javax.naming.NamingException;
+import javax.naming.spi.InitialContextFactory;
+import java.util.Hashtable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+public class OpenEJBInitialContextFactory implements InitialContextFactory {
+    @Override
+    public Context getInitialContext(final Hashtable env) throws NamingException {
+        // don't validate there env content, it is commonly built from System properties and therefore can inherit a bunch of things
+        return new LocalFallbackContextWrapper(SystemInstance.get().getComponent(ContainerSystem.class).getJNDIContext());
+    }
+
+    private static class LocalFallbackContextWrapper extends ContextWrapper {
+        private final ConcurrentMap<String, String> mapping = new ConcurrentHashMap<>();
+
+        private LocalFallbackContextWrapper(final Context jndiContext) {
+            super(jndiContext);
+        }
+
+        @Override
+        public Object lookup(final String userName) throws NamingException {
+            String jndi = mapping.get(userName);
+            if (jndi == null) {
+                jndi = userName;
+            }
+            try {
+                return super.lookup(jndi);
+            } catch (final NameNotFoundException nnfe) {
+                if (!jndi.startsWith("java:") && !jndi.startsWith("openejb:")) { // try jndi lookup
+                    try {
+                        final String ejb = "java:openejb/local/" + jndi;
+                        final Object lookup = super.lookup(ejb);
+                        mapping.put(userName, ejb);
+                        return lookup;
+                    } catch (final NameNotFoundException nnfeIgnored) { // resource
+                        try {
+                            final String resource = "java:openejb/Resource/" + jndi;
+                            final Object resourceInstance = super.lookup(resource);
+                            mapping.put(userName, resource);
+                            return resourceInstance;
+                        } catch (final NameNotFoundException nnfeIgnoredAgain) {
+                            throw nnfe;
+                        }
+                    }
+                }
+                throw nnfe;
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/tomee/blob/1ead0093/container/openejb-core/src/main/java/org/openejb/client/LocalInitialContextFactory.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/openejb/client/LocalInitialContextFactory.java b/container/openejb-core/src/main/java/org/openejb/client/LocalInitialContextFactory.java
index 01372e1..ed3adfc 100644
--- a/container/openejb-core/src/main/java/org/openejb/client/LocalInitialContextFactory.java
+++ b/container/openejb-core/src/main/java/org/openejb/client/LocalInitialContextFactory.java
@@ -21,5 +21,6 @@ package org.openejb.client;
  * @version $Revision: 1222119 $ $Date: 2011-12-22 10:23:14 +0100 (jeu. 22 d�c. 2011) $
  * @deprecated use org.apache.openejb.core.LocalInitialContextFactory
  */
+@Deprecated
 public class LocalInitialContextFactory extends org.apache.openejb.core.LocalInitialContextFactory {
 }

http://git-wip-us.apache.org/repos/asf/tomee/blob/1ead0093/container/openejb-core/src/test/java/org/apache/openejb/core/OpenEJBInitialContextFactoryTest.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/core/OpenEJBInitialContextFactoryTest.java b/container/openejb-core/src/test/java/org/apache/openejb/core/OpenEJBInitialContextFactoryTest.java
new file mode 100644
index 0000000..95be0e3
--- /dev/null
+++ b/container/openejb-core/src/test/java/org/apache/openejb/core/OpenEJBInitialContextFactoryTest.java
@@ -0,0 +1,92 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.openejb.core;
+
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.testing.Classes;
+import org.apache.openejb.testing.ContainerProperties;
+import org.apache.openejb.testng.PropertiesBuilder;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.ejb.Singleton;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.sql.DataSource;
+import java.util.concurrent.Callable;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(ApplicationComposer.class)
+@Classes(innerClassesAsBean = true)
+@ContainerProperties(@ContainerProperties.Property(name = "db", value = "new://Resource?type=DataSource"))
+public class OpenEJBInitialContextFactoryTest {
+    @Test
+    public void run() throws Exception {
+        final Callable<Boolean> innerTest = new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                final Context ctx = new InitialContext(new PropertiesBuilder()
+                        .p(Context.INITIAL_CONTEXT_FACTORY, OpenEJBInitialContextFactory.class.getName())
+                        .build());
+
+                // ejbs
+                assertEquals("ejb", SomeEjb.class.cast(ctx.lookup("java:global/openejb/SomeEjb")).from());
+                assertEquals("ejb", SomeEjb.class.cast(ctx.lookup("global/openejb/SomeEjb")).from());
+                assertEquals("ejb", SomeEjb.class.cast(ctx.lookup("java:openejb/local/SomeEjbLocalBean")).from());
+                assertEquals("ejb", SomeEjb.class.cast(ctx.lookup("openejb/local/SomeEjbLocalBean")).from());
+                assertEquals("ejb", SomeEjb.class.cast(ctx.lookup("openejb:local/SomeEjbLocalBean")).from());
+                assertEquals("ejb", SomeEjb.class.cast(ctx.lookup("SomeEjbLocalBean")).from());
+
+                // resources (hibernate use case for instance)
+                assertTrue(DataSource.class.isInstance(ctx.lookup("openejb:Resource/db")));
+                assertTrue(DataSource.class.isInstance(ctx.lookup("java:openejb/Resource/db")));
+                assertTrue(DataSource.class.isInstance(ctx.lookup("openejb/Resource/db")));
+                assertTrue(DataSource.class.isInstance(ctx.lookup("db")));
+                return true;
+            }
+        };
+
+        // in an unmanaged thread
+        final AtomicBoolean result = new AtomicBoolean(false);
+        final Thread outOfContext = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    result.set(innerTest.call());
+                } catch (final Exception e) {
+                    result.set(false);
+                }
+            }
+        });
+        outOfContext.start();
+        outOfContext.join();
+        assertTrue(result.get());
+
+        // and in a managed thread
+        assertTrue(innerTest.call());
+    }
+
+    @Singleton
+    public static class SomeEjb {
+        public String from() {
+            return "ejb";
+        }
+    }
+}