Author: rmannibucau
Date: Thu Nov 22 17:01:59 2012
New Revision: 1412620

URL: http://svn.apache.org/viewvc?rev=1412620&view=rev
Log:
OPENEJB-1939 trying to include tomcat context resources in openejb apps

Added:
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatResourceFactory.java
Modified:
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBNamingResource.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
    
openejb/trunk/openejb/tomee/tomee-webapp/src/main/resources/META-INF/org.apache.tomee/service-jar.xml

Modified: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java?rev=1412620&r1=1412619&r2=1412620&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
 Thu Nov 22 17:01:59 2012
@@ -35,6 +35,7 @@ import org.apache.openejb.loader.SystemI
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.openejb.util.URLs;
+import org.apache.tomcat.util.digester.Digester;
 import org.apache.tomee.common.NamingUtil;
 import org.apache.tomee.common.ResourceFactory;
 
@@ -83,6 +84,24 @@ public class OpenEJBContextConfig extend
         configureStartOk = true;
     }
 
+    @Override
+    protected void contextConfig(final Digester digester) {
+        final NamingResources resources;
+        if (context != null) {
+            resources = context.getNamingResources();
+        } else {
+            resources = null;
+        }
+
+        if (resources instanceof OpenEJBNamingResource) {
+            ((OpenEJBNamingResource) resources).setTomcatResource(true);
+        }
+        super.contextConfig(digester);
+        if (resources instanceof OpenEJBNamingResource) {
+            ((OpenEJBNamingResource) resources).setTomcatResource(false);
+        }
+    }
+
     private void adjustDataSourceNameIfNecessary() {
         if (context == null || 
"false".equalsIgnoreCase(ADJUST_DATASOURCE_JNDI_NAMES)) {
             return;

Modified: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBNamingResource.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBNamingResource.java?rev=1412620&r1=1412619&r2=1412620&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBNamingResource.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBNamingResource.java
 Thu Nov 22 17:01:59 2012
@@ -27,9 +27,15 @@ import org.apache.catalina.deploy.Messag
 import org.apache.catalina.deploy.NamingResources;
 import org.apache.catalina.deploy.ResourceBase;
 
+import java.util.ArrayList;
+import java.util.Collection;
+
 public class OpenEJBNamingResource extends NamingResources {
     private static final String JAVA_PREFIX = "java:";
 
+    private boolean isTomcatResource = false;
+    private final Collection<ResourceBase> tomcatResources = new 
ArrayList<ResourceBase>();
+
     @Override
     public void addEnvironment(ContextEnvironment environment) {
         normalize(environment);
@@ -58,6 +64,9 @@ public class OpenEJBNamingResource exten
     public void addResource(ContextResource ref) {
         normalize(ref);
         super.addResource(ref);
+        if (isTomcatResource) {
+            pushResourceToAddInOpenEJB(ref);
+        }
     }
 
     @Override
@@ -94,4 +103,16 @@ public class OpenEJBNamingResource exten
             ref.setType("");
         }
     }
+
+    public void setTomcatResource(final boolean tomcatResource) {
+        isTomcatResource = tomcatResource;
+    }
+
+    private void pushResourceToAddInOpenEJB(final ContextResource ref) {
+        tomcatResources.add(ref);
+    }
+
+    public Collection<ResourceBase> getTomcatResources() {
+        return tomcatResources;
+    }
 }
\ No newline at end of file

Added: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatResourceFactory.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatResourceFactory.java?rev=1412620&view=auto
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatResourceFactory.java
 (added)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatResourceFactory.java
 Thu Nov 22 17:01:59 2012
@@ -0,0 +1,73 @@
+/*
+ * 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.tomee.catalina;
+
+import org.apache.openejb.assembler.classic.WebAppBuilder;
+import org.apache.openejb.loader.SystemInstance;
+
+import javax.naming.NamingException;
+import javax.naming.spi.ObjectFactory;
+
+public class TomcatResourceFactory {
+    private String jndiName;
+    private String appName;
+    private String factory;
+
+    public void setJndiName(final String jndiName) {
+        this.jndiName = jndiName;
+    }
+
+    public void setAppName(final String appName) {
+        this.appName = appName;
+    }
+
+    public void setFactory(final String factory) {
+        this.factory = factory;
+    }
+
+    public Object create() throws NamingException {
+        final TomcatWebAppBuilder.ContextInfo info = ((TomcatWebAppBuilder) 
SystemInstance.get().getComponent(WebAppBuilder.class))
+                .getContextInfo(appName);
+        if (info == null || info.standardContext == null) {
+            return null;
+        }
+
+        final ClassLoader loader = 
Thread.currentThread().getContextClassLoader();
+        final ClassLoader tccl = 
info.standardContext.getLoader().getClassLoader();
+        Thread.currentThread().setContextClassLoader(tccl);
+        try {
+            // lookup can't work because of the lifecycle
+            // return new InitialContext().lookup(jndiName);
+
+            if (factory != null) {
+                final Class<?> clazz = tccl.loadClass(factory);
+                final Object instance = clazz.newInstance();
+                if (instance instanceof ObjectFactory) {
+                    // not really used as expected but it matches a bit more 
than before
+                    // context is null since it can't be used at this moment 
(see TomcatWebAppBuilder lifecycle)
+                    return ((ObjectFactory) 
instance).getObjectInstance(jndiName, null, null, null);
+                }
+            }
+        } catch (Exception e) {
+            // no-op
+        } finally {
+            Thread.currentThread().setContextClassLoader(loader);
+        }
+
+        return null;
+    }
+}

Modified: 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1412620&r1=1412619&r2=1412620&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 Thu Nov 22 17:01:59 2012
@@ -42,6 +42,7 @@ import org.apache.catalina.deploy.Contex
 import org.apache.catalina.deploy.ContextResourceLink;
 import org.apache.catalina.deploy.ContextTransaction;
 import org.apache.catalina.deploy.NamingResources;
+import org.apache.catalina.deploy.ResourceBase;
 import org.apache.catalina.ha.CatalinaCluster;
 import org.apache.catalina.loader.WebappClassLoader;
 import org.apache.catalina.loader.WebappLoader;
@@ -78,6 +79,7 @@ import org.apache.openejb.config.Configu
 import org.apache.openejb.config.DeploymentLoader;
 import org.apache.openejb.config.WebModule;
 import org.apache.openejb.config.event.BeforeDeploymentEvent;
+import org.apache.openejb.config.sys.Resource;
 import org.apache.openejb.core.CoreContainerSystem;
 import org.apache.openejb.core.ParentClassLoaderFinder;
 import org.apache.openejb.core.WebContext;
@@ -781,6 +783,21 @@ public class TomcatWebAppBuilder impleme
         return new File(new File(System.getProperty("catalina.base"), base), 
doc); // shouldn't occur
     }
 
+    public ContextInfo getContextInfo(final String appName) {
+        ContextInfo info = null;
+        for (Map.Entry<String, ContextInfo> current : infos.entrySet()) {
+            final String key = current.getKey();
+            if (key.equals(appName)) {
+                info = current.getValue();
+                break;
+            }
+            if (key.endsWith(appName)) {
+                info = current.getValue();
+            }
+        }
+        return info;
+    }
+
     public class StandardContextInfo {
 
         private final StandardContext standardContext;
@@ -908,6 +925,18 @@ public class TomcatWebAppBuilder impleme
 
         if (contextInfo == null) {
             final AppModule appModule = loadApplication(standardContext);
+
+            if (standardContext.getNamingResources() instanceof 
OpenEJBNamingResource) {
+                // add them to the app as resource
+                for (ResourceBase resource : ((OpenEJBNamingResource) 
standardContext.getNamingResources()).getTomcatResources()) {
+                    final Resource newResource = new 
Resource(resource.getName(), resource.getType(), 
"org.apache.tomee:ProvidedByTomcat");
+                    newResource.getProperties().setProperty("jndiName", 
newResource.getId());
+                    newResource.getProperties().setProperty("appName", 
getId(standardContext));
+                    newResource.getProperties().setProperty("factory", 
(String) resource.getProperty("factory"));
+                    appModule.getResources().add(newResource);
+                }
+            }
+
             if (appModule != null) {
                 try {
                     contextInfo = 
addContextInfo(standardContext.getHostname(), standardContext);

Modified: 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/resources/META-INF/org.apache.tomee/service-jar.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-webapp/src/main/resources/META-INF/org.apache.tomee/service-jar.xml?rev=1412620&r1=1412619&r2=1412620&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/resources/META-INF/org.apache.tomee/service-jar.xml
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-webapp/src/main/resources/META-INF/org.apache.tomee/service-jar.xml
 Thu Nov 22 17:01:59 2012
@@ -45,4 +45,8 @@
   <ServiceProvider id="Default Mail Session" 
parent="org.apache.openejb:Default Mail Session"/>
   <ServiceProvider id="Default Remote Jndi Provider" 
parent="org.apache.openejb:Default Remote Jndi Provider"/>
   <ServiceProvider id="RoutedDataSource" 
parent="org.apache.openejb:RoutedDataSource"/>
+  <ServiceProvider id="ProvidedByTomcat" service="Resource" 
class-name="org.apache.tomee.catalina.TomcatResourceFactory" 
factory-name="create">
+    jndiName =
+    appName =
+  </ServiceProvider>
 </ServiceJar>


Reply via email to