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>