You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2007/12/28 03:22:48 UTC
svn commit: r607160 [2/2] - in /openejb/trunk/openejb3:
assembly/openejb-tomcat/ assembly/openejb-tomcat/openejb-tomcat-naming/
assembly/openejb-tomcat/openejb-tomcat-naming/src/
assembly/openejb-tomcat/openejb-tomcat-naming/src/main/ assembly/openejb-...
Copied: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatJndiBuilder.java (from r605804, openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatJndiBuilder.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatJndiBuilder.java?p2=openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatJndiBuilder.java&p1=openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatJndiBuilder.java&r1=605804&r2=607160&rev=607160&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatJndiBuilder.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatJndiBuilder.java Thu Dec 27 18:22:44 2007
@@ -23,7 +23,6 @@
import org.apache.catalina.deploy.ContextEnvironment;
import org.apache.catalina.deploy.ContextResource;
import org.apache.catalina.deploy.ContextResourceEnvRef;
-import org.apache.catalina.deploy.ContextService;
import org.apache.catalina.deploy.ContextTransaction;
import org.apache.catalina.deploy.NamingResources;
import org.apache.naming.ContextAccessController;
@@ -47,21 +46,28 @@
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.persistence.JtaEntityManager;
import org.apache.openejb.persistence.JtaEntityManagerRegistry;
-import static org.apache.openejb.tomcat.NamingUtil.DEPLOYMENT_ID;
-import static org.apache.openejb.tomcat.NamingUtil.EXTENDED;
-import static org.apache.openejb.tomcat.NamingUtil.EXTERNAL;
-import static org.apache.openejb.tomcat.NamingUtil.JNDI_NAME;
-import static org.apache.openejb.tomcat.NamingUtil.JNDI_PROVIDER_ID;
-import static org.apache.openejb.tomcat.NamingUtil.LOCAL;
-import static org.apache.openejb.tomcat.NamingUtil.NAME;
-import static org.apache.openejb.tomcat.NamingUtil.RESOURCE_ID;
-import static org.apache.openejb.tomcat.NamingUtil.UNIT;
-import static org.apache.openejb.tomcat.NamingUtil.WSDL_URL;
-import static org.apache.openejb.tomcat.NamingUtil.WS_CLASS;
-import static org.apache.openejb.tomcat.NamingUtil.WS_ID;
-import static org.apache.openejb.tomcat.NamingUtil.WS_PORT_QNAME;
-import static org.apache.openejb.tomcat.NamingUtil.WS_QNAME;
-import static org.apache.openejb.tomcat.NamingUtil.setStaticValue;
+import static org.apache.openejb.tomcat.naming.NamingUtil.DEPLOYMENT_ID;
+import static org.apache.openejb.tomcat.naming.NamingUtil.EXTENDED;
+import static org.apache.openejb.tomcat.naming.NamingUtil.EXTERNAL;
+import static org.apache.openejb.tomcat.naming.NamingUtil.JNDI_NAME;
+import static org.apache.openejb.tomcat.naming.NamingUtil.JNDI_PROVIDER_ID;
+import static org.apache.openejb.tomcat.naming.NamingUtil.LOCAL;
+import static org.apache.openejb.tomcat.naming.NamingUtil.NAME;
+import static org.apache.openejb.tomcat.naming.NamingUtil.RESOURCE_ID;
+import static org.apache.openejb.tomcat.naming.NamingUtil.UNIT;
+import static org.apache.openejb.tomcat.naming.NamingUtil.WSDL_URL;
+import static org.apache.openejb.tomcat.naming.NamingUtil.WS_CLASS;
+import static org.apache.openejb.tomcat.naming.NamingUtil.WS_ID;
+import static org.apache.openejb.tomcat.naming.NamingUtil.WS_PORT_QNAME;
+import static org.apache.openejb.tomcat.naming.NamingUtil.WS_QNAME;
+import static org.apache.openejb.tomcat.naming.NamingUtil.setStaticValue;
+import org.apache.openejb.tomcat.naming.EjbFactory;
+import org.apache.openejb.tomcat.naming.WsFactory;
+import org.apache.openejb.tomcat.naming.ResourceFactory;
+import org.apache.openejb.tomcat.naming.PersistenceUnitFactory;
+import org.apache.openejb.tomcat.naming.PersistenceContextFactory;
+import org.apache.openejb.tomcat.naming.UserTransactionFactory;
+import org.apache.openejb.tomcat.naming.NamingUtil;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
@@ -86,7 +92,7 @@
public TomcatJndiBuilder(StandardContext standardContext, WebAppInfo webAppInfo, List<Injection> injections) {
this.injections = injections;
this.standardContext = standardContext;
- this.namingContextListener = standardContext.getNamingContextListener();
+ this.namingContextListener = BackportUtil.getNamingContextListener(standardContext);
this.webAppInfo = webAppInfo;
String parameter = standardContext.findParameter("openejb.start.late");
@@ -279,7 +285,8 @@
JtaEntityManagerRegistry jtaEntityManagerRegistry = SystemInstance.get().getComponent(JtaEntityManagerRegistry.class);
JtaEntityManager jtaEntityManager = new JtaEntityManager(jtaEntityManagerRegistry, factory, ref.properties, ref.extended);
- setStaticValue(resource, jtaEntityManager);
+ Object object = jtaEntityManager;
+ setResource(resource, object);
}
if (addEntry) {
@@ -323,7 +330,7 @@
} catch (NamingException e) {
throw new IllegalStateException("PersistenceUnit '" + ref.unitId + "' not found for EXTENDED ref '" + ref.referenceName + "'");
}
- setStaticValue(resource, factory);
+ setResource(resource, factory);
}
if (addEntry) {
@@ -416,7 +423,6 @@
}
public void mergeRef(NamingResources naming, ServiceReferenceInfo ref) {
- ContextService service = naming.findService(ref.referenceName);
ContextResource resource = naming.findResource(ref.referenceName);
boolean addEntry = false;
if (resource == null) {
@@ -470,15 +476,15 @@
portRef.getProperties().putAll(portRefInfo.properties);
portRefs.add(portRef);
}
- setStaticValue(resource, "port-refs", portRefs);
+ setResource(resource, "port-refs", portRefs);
}
// add the handle chains
if (!ref.handlerChains.isEmpty()) {
try {
List<HandlerChainData> handlerChains = WsBuilder.toHandlerChainData(ref.handlerChains, standardContext.getLoader().getClassLoader());
- setStaticValue(resource, "handler-chains", handlerChains);
- setStaticValue(resource, "injections", injections);
+ setResource(resource, "handler-chains", handlerChains);
+ setResource(resource, "injections", injections);
} catch (OpenEJBException e) {
throw new IllegalArgumentException("Error creating handler chain for web service-ref " + ref.referenceName);
}
@@ -486,9 +492,10 @@
}
// if there was a service entry, remove it
- if (service != null) {
+ String serviceName = BackportUtil.findServiceName(naming, ref.referenceName);
+ if (serviceName != null) {
ContextAccessController.setWritable(namingContextListener.getName(), standardContext);
- if (!addEntry) namingContextListener.removeService(service.getName());
+ if (!addEntry) BackportUtil.removeService(namingContextListener, serviceName);
ContextAccessController.setReadOnly(namingContextListener.getName());
}
@@ -531,5 +538,25 @@
}
return wsdlUrl;
+ }
+
+ private void setResource(ContextResource resource, String name, Object object) {
+ setStaticValue(new Resource(resource), name, object);
+ }
+
+ private void setResource(ContextResource resource, Object object) {
+ setStaticValue(new Resource(resource), object);
+ }
+
+ private static class Resource implements NamingUtil.Resource {
+ private final ContextResource contextResource;
+
+ public Resource(ContextResource contextResource) {
+ this.contextResource = contextResource;
+ }
+
+ public void setProperty(String name, Object value) {
+ contextResource.setProperty(name, value);
+ }
}
}
Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatLoader.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatLoader.java?rev=607160&r1=605103&r2=607160&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatLoader.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatLoader.java Thu Dec 27 18:22:44 2007
@@ -91,6 +91,9 @@
System.setProperty("openejb.provider.default", "org.apache.openejb.tomcat");
SystemInstance.init(props);
+ System.setProperty("openejb.home", SystemInstance.get().getHome().getDirectory().getAbsolutePath());
+ System.setProperty("openejb.base", SystemInstance.get().getBase().getDirectory().getAbsolutePath());
+
// Install tomcat thread context listener
ThreadContext.addThreadContextListener(new TomcatThreadContextListener());
Added: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatVersion.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatVersion.java?rev=607160&view=auto
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatVersion.java (added)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatVersion.java Thu Dec 27 18:22:44 2007
@@ -0,0 +1,83 @@
+/**
+ * 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.tomcat;
+
+import java.util.Properties;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public enum TomcatVersion {
+
+ v3, v40, v41, v50, v55, v6, UNKNOWN;
+
+ private String serverNumber;
+ private String serverBuilt;
+
+ private static TomcatVersion version;
+
+ public String getServerNumber() {
+ return serverNumber;
+ }
+
+ public String getServerBuilt() {
+ return serverBuilt;
+ }
+
+ public boolean isTheVersion() {
+ return get() == this;
+ }
+
+ public static boolean hasAnnotationProcessingSupport(){
+ switch (get()) {
+ case v40:
+ case v41:
+ case v50:
+ case v55:
+ return false;
+ default:
+ return true;
+ }
+ }
+
+ public static TomcatVersion get(){
+ if (version != null) return version;
+
+ try {
+ Properties properties = new Properties();
+ ClassLoader classLoader = TomcatVersion.class.getClassLoader();
+ properties.load(classLoader.getResourceAsStream("org/apache/catalina/util/ServerInfo.properties"));
+
+ String serverNumber = properties.getProperty("server.number");
+
+ if (serverNumber.startsWith("3")) version = v3;
+ else if (serverNumber.startsWith("4.0")) version = v40;
+ else if (serverNumber.startsWith("4.1")) version = v41;
+ else if (serverNumber.startsWith("5.0")) version = v50;
+ else if (serverNumber.startsWith("5.5")) version = v55;
+ else if (serverNumber.startsWith("6.")) version = v6;
+ else version = UNKNOWN;
+
+ version.serverNumber = serverNumber;
+ version.serverBuilt = properties.getProperty("server.built");
+
+ return version;
+ } catch (Exception e) {
+ return UNKNOWN;
+ }
+ }
+}
Copied: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatWebAppBuilder.java (from r605804, openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatWebAppBuilder.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatWebAppBuilder.java?p2=openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatWebAppBuilder.java&p1=openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatWebAppBuilder.java&r1=605804&r2=607160&rev=607160&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/src/main/java/org/apache/openejb/tomcat/TomcatWebAppBuilder.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/TomcatWebAppBuilder.java Thu Dec 27 18:22:44 2007
@@ -17,6 +17,9 @@
*/
package org.apache.openejb.tomcat;
+import static org.apache.openejb.tomcat.BackportUtil.getServlet;
+import static org.apache.openejb.tomcat.BackportUtil.*;
+import org.apache.openejb.tomcat.naming.LegacyAnnotationProcessor;
import org.apache.catalina.Container;
import org.apache.catalina.Engine;
import org.apache.catalina.LifecycleListener;
@@ -290,7 +293,7 @@
Class<?> clazz = tempClassLoader.loadClass(servletClass);
if (JaxWsUtils.isWebService(clazz)) {
wrapper.setServletClass(WsServlet.class.getName());
- if (wrapper.getServlet() != null) {
+ if (getServlet(wrapper) != null) {
wrapper.load();
wrapper.unload();
}
@@ -303,14 +306,15 @@
// bind extra stuff at the java:comp level which can only be
// bound after the context is created
- ContextAccessController.setWritable(standardContext.getNamingContextListener().getName(), standardContext);
+ String listenerName = getNamingContextListener(standardContext).getName();
+ ContextAccessController.setWritable(listenerName, standardContext);
try {
Context openejbContext = SystemInstance.get().getComponent(ContainerSystem.class).getJNDIContext();
openejbContext = (Context) openejbContext.lookup("openejb");
Context root = (Context) ContextBindings.getClassLoader().lookup("");
- safeBind(root, "openejb", openejbContext);
+ safeBind(root, "openejb", openejbContext);
Context comp = (Context) ContextBindings.getClassLoader().lookup("comp");
@@ -337,7 +341,25 @@
safeBind(comp, "HandleDelegate", new SystemComponentReference(HandleDelegate.class));
} catch (NamingException e) {
}
- ContextAccessController.setReadOnly(standardContext.getNamingContextListener().getName());
+ ContextAccessController.setReadOnly(listenerName);
+
+ if (!TomcatVersion.hasAnnotationProcessingSupport()){
+ try {
+ Context compEnv = (Context) ContextBindings.getClassLoader().lookup("comp/env");
+
+ LegacyAnnotationProcessor annotationProcessor = new LegacyAnnotationProcessor(compEnv);
+
+ standardContext.addContainerListener(new ProcessAnnotatedListenersListener(annotationProcessor));
+
+ for (Container container : standardContext.findChildren()) {
+ if (container instanceof Wrapper) {
+ Wrapper wrapper = (Wrapper) container;
+ wrapper.addInstanceListener(new ProcessAnnotatedServletsListener(annotationProcessor));
+ }
+ }
+ } catch (NamingException e) {
+ }
+ }
OpenEJBValve openejbValve = new OpenEJBValve();
@@ -552,13 +574,15 @@
webApp = ReadDescriptors.readWebApp(webXmlUrl);
}
} catch (Exception e) {
- logger.error("Unable to load web.xml in war " + servletContext.getContextPath() + ": Exception: " + e.getMessage(), e);
+ logger.error("Unable to load web.xml in war " + standardContext.getPath() + ": Exception: " + e.getMessage(), e);
}
// create the web module
String basePath = new File(servletContext.getRealPath(".")).getParentFile().getAbsolutePath();
ClassLoader classLoader = new TemporaryClassLoader(standardContext.getLoader().getClassLoader());
- WebModule webModule = new WebModule(webApp, servletContext.getContextPath(), classLoader, basePath, getId(standardContext));
+ String path = standardContext.getPath();
+ System.out.println("context path = " + path);
+ WebModule webModule = new WebModule(webApp, path, classLoader, basePath, getId(standardContext));
webModule.setHost(standardContext.getHostname());
// Add all Tomcat env entries to context so they can be overriden by the env.properties file
Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/installer/Installer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/installer/Installer.java?rev=607160&r1=605103&r2=607160&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/installer/Installer.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/java/org/apache/openejb/tomcat/installer/Installer.java Thu Dec 27 18:22:44 2007
@@ -45,7 +45,8 @@
static {
// is the OpenEJB listener installed
- Boolean listener = (Boolean) invokeStaticNoArgMethod("org.apache.openejb.loader.OpenEJBListener", "isListenerInstalled");
+ Boolean listener = (Boolean) org.apache.openejb.loader.OpenEJBListener.isListenerInstalled();
+// Boolean listener = (Boolean) invokeStaticNoArgMethod("org.apache.openejb.loader.OpenEJBListener", "isListenerInstalled");
if (listener == null) listener = false;
listenerInstalled = listener;
@@ -431,7 +432,7 @@
Method method = clazz.getMethod(propertyName);
Object result = method.invoke(null, (Object[]) null);
return result;
- } catch (Exception e) {
+ } catch (Throwable e) {
return null;
}
}
Added: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/META-INF/org.apache.openejb.tomcat/ServerClassLoader
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/META-INF/org.apache.openejb.tomcat/ServerClassLoader?rev=607160&view=auto
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/META-INF/org.apache.openejb.tomcat/ServerClassLoader (added)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/META-INF/org.apache.openejb.tomcat/ServerClassLoader Thu Dec 27 18:22:44 2007
@@ -0,0 +1 @@
+This file causes the jar containing it to be loaded into the Tomcat server classloader rather than the commom classloader
\ No newline at end of file
Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/README.txt
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/README.txt?rev=607160&r1=605103&r2=607160&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/README.txt (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/README.txt Thu Dec 27 18:22:44 2007
@@ -12,7 +12,7 @@
instructions will get you going ASAP; otherwise, please visit the OpenEJB
Tomcat site for detailed instructions with examples.
- http://openejb.apache.org/tomcat.html
+ http://openejb.apache.org/3.0/tomcat.html
Assuming you have a normal working Tomcat 6.x installation:
Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/WEB-INF/web.xml?rev=607160&r1=605103&r2=607160&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/WEB-INF/web.xml (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/WEB-INF/web.xml Thu Dec 27 18:22:44 2007
@@ -30,9 +30,14 @@
</servlet>
<servlet>
+ <servlet-name>LoaderServlet</servlet-name>
+ <servlet-class>org.apache.openejb.loader.LoaderServlet</servlet-class>
+ <load-on-startup>0</load-on-startup>
+ </servlet>
+
+ <servlet>
<servlet-name>InstallerServlet</servlet-name>
<servlet-class>org.apache.openejb.tomcat.installer.InstallerServlet</servlet-class>
- <load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/openejb.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/openejb.xml?rev=607160&r1=605103&r2=607160&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/openejb.xml (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/openejb.xml Thu Dec 27 18:22:44 2007
@@ -17,6 +17,6 @@
limitations under the License.
-->
<Context path="/openejb" docBase="${catalina.home}/server/webapps/openejb"
- privileged="false" antiResourceLocking="false" antiJARLocking="false">
+ privileged="true" antiResourceLocking="false" antiJARLocking="false">
</Context>
Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/testhome.jsp
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/testhome.jsp?rev=607160&r1=605103&r2=607160&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/testhome.jsp (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-webapp/src/main/resources/testhome.jsp Thu Dec 27 18:22:44 2007
@@ -1,29 +1,30 @@
-<!--
-
- 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.
-
--->
-
-<!-- $Rev: 597221 $ $Date: 2007-11-21 22:51:05 +0100 (Wed, 21 Nov 2007) $ -->
-
+<!--
+
+ 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.
+
+-->
+
+<!-- $Rev: 597221 $ $Date: 2007-11-21 22:51:05 +0100 (Wed, 21 Nov 2007) $ -->
+
<%@ page import="
javax.servlet.http.HttpServletRequest,
javax.servlet.jsp.JspWriter,
java.io.File
"%>
+<%@ page import="org.apache.openejb.tomcat.TomcatVersion"%>
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
@@ -144,7 +145,14 @@
// The openejb.home must contain a 'lib' directory
out.print("<tr><td><font size='2'>has lib directory</font></td> ");
- File openejbHomeLib = new File(openejbHome, "lib");
+
+ File openejbHomeLib;
+ if (TomcatVersion.v6.isTheVersion()) {
+ openejbHomeLib = new File(openejbHome, "lib");
+ } else {
+ File common = new File(openejbHome, "common");
+ openejbHomeLib = new File(common, "lib");
+ }
if (!openejbHomeLib.exists()) handleError(BAD_HOME + homePath, NO_LIB, INSTRUCTIONS);
out.print(OK);
Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/pom.xml?rev=607160&r1=607159&r2=607160&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/pom.xml (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/pom.xml Thu Dec 27 18:22:44 2007
@@ -15,12 +15,11 @@
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.
--->
-
+-->
<!-- $Rev$ $Date$ -->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>assembly</artifactId>
<groupId>org.apache.openejb</groupId>
@@ -28,179 +27,11 @@
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>openejb-tomcat</artifactId>
- <packaging>jar</packaging>
+ <packaging>pom</packaging>
<name>OpenEJB :: Assembly :: Tomcat</name>
- <build>
- <plugins>
- <plugin>
- <artifactId>maven-assembly-plugin</artifactId>
- <executions>
- <execution>
- <phase>package</phase>
- <goals>
- <goal>attached</goal>
- </goals>
- </execution>
- </executions>
- <configuration>
- <appendAssemblyId>false</appendAssemblyId>
- <descriptor>src/main/assembly/war.xml</descriptor>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-dependency-plugin</artifactId>
- <executions>
- <execution>
- <id>copy</id>
- <phase>process-resources</phase>
- <goals>
- <goal>copy</goal>
- </goals>
- <configuration>
- <artifactItems>
- <artifactItem>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-itests-standalone-client</artifactId>
- <version>${version}</version>
- <outputDirectory>${project.build.directory}</outputDirectory>
- </artifactItem>
- <artifactItem>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-itests-web</artifactId>
- <version>${version}</version>
- <type>war</type>
- <outputDirectory>${project.build.directory}</outputDirectory>
- </artifactItem>
- <artifactItem>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-itests-beans</artifactId>
- <version>${version}</version>
- <outputDirectory>${project.build.directory}</outputDirectory>
- </artifactItem>
- <artifactItem>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.1</version>
- <outputDirectory>${project.build.directory}</outputDirectory>
- </artifactItem>
- </artifactItems>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- <dependencies>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-loader</artifactId>
- <version>${version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-core</artifactId>
- <version>${version}</version>
- <exclusions>
- <exclusion>
- <groupId>org.apache.geronimo.modules</groupId>
- <artifactId>geronimo-kernel</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.apache.geronimo.modules</groupId>
- <artifactId>geronimo-webservices</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.apache.geronimo.modules</groupId>
- <artifactId>geronimo-naming</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.apache.geronimo.modules</groupId>
- <artifactId>geronimo-timer</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.apache.geronimo.modules</groupId>
- <artifactId>geronimo-security</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-cxf</artifactId>
- <version>${version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.geronimo.specs</groupId>
- <artifactId>geronimo-j2ee-connector_1.5_spec</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.geronimo.javamail</groupId>
- <artifactId>geronimo-javamail_1.4_mail</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.geronimo.specs</groupId>
- <artifactId>geronimo-jaxr_1.0_spec</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.geronimo.specs</groupId>
- <artifactId>geronimo-saaj_1.1_spec</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-client</artifactId>
- <version>${version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-server</artifactId>
- <version>${version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-ejbd</artifactId>
- <version>${version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-hsql</artifactId>
- <version>${version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.derby</groupId>
- <artifactId>derby</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-http</artifactId>
- <version>${version}</version>
- </dependency>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-telnet</artifactId>
- <version>${version}</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-itests-client</artifactId>
- <version>${version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.openejb</groupId>
- <artifactId>openejb-itests-beans</artifactId>
- <version>${version}</version>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.apache.tomcat</groupId>
- <artifactId>catalina</artifactId>
- <version>6.0.13</version>
- <optional>true</optional>
- </dependency>
- </dependencies>
+
+ <modules>
+ <module>openejb-tomcat-naming</module>
+ <module>openejb-tomcat-webapp</module>
+ </modules>
</project>
Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DebuggableVmHackery.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DebuggableVmHackery.java?rev=607160&r1=607159&r2=607160&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DebuggableVmHackery.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/DebuggableVmHackery.java Thu Dec 27 18:22:44 2007
@@ -32,6 +32,8 @@
import org.apache.openejb.jee.ResourceEnvRef;
import org.apache.openejb.jee.MessageDestinationRef;
import org.apache.openejb.jee.ResourceRef;
+import org.apache.openejb.jee.Interceptor;
+import org.apache.openejb.jee.JndiConsumer;
import java.util.Map;
import java.util.ArrayList;
@@ -60,28 +62,7 @@
EjbDeployment ejbDeployment = deployments.get(ejbName);
- for (ResourceRef ref : copy(bean.getResourceRef())) {
- if (ref.getResType().startsWith("javax.jms.")){
- ResourceLink resourceLink = ejbDeployment.getResourceLink(ref.getName());
- ejbDeployment.getResourceLink().remove(resourceLink);
- bean.getResourceRef().remove(ref);
- }
- }
-
- for (ResourceEnvRef ref : bean.getResourceEnvRef()) {
- ResourceLink resourceLink = ejbDeployment.getResourceLink(ref.getName());
- ejbDeployment.getResourceLink().remove(resourceLink);
- }
- bean.getResourceEnvRef().clear();
-
- for (MessageDestinationRef ref : bean.getMessageDestinationRef()) {
- ResourceLink resourceLink = ejbDeployment.getResourceLink(ref.getName());
- ejbDeployment.getResourceLink().remove(resourceLink);
- }
- bean.getMessageDestinationRef().clear();
-
- bean.getPersistenceContextRef().clear();
- bean.getPersistenceUnitRef().clear();
+ pruneRefs(bean, ejbDeployment);
if (!(bean instanceof MessageDrivenBean) && !(bean instanceof EntityBean)) {
@@ -130,8 +111,37 @@
bean.getEjbRefMap().keySet().removeAll(removed);
}
+ for (Interceptor interceptor : ejbJar.getInterceptors()) {
+ pruneRefs(interceptor, new EjbDeployment());
+ }
+
}
return appModule;
+ }
+
+ private void pruneRefs(JndiConsumer bean, EjbDeployment ejbDeployment) {
+ for (ResourceRef ref : copy(bean.getResourceRef())) {
+ if (ref.getResType().startsWith("javax.jms.")){
+ ResourceLink resourceLink = ejbDeployment.getResourceLink(ref.getName());
+ ejbDeployment.getResourceLink().remove(resourceLink);
+ bean.getResourceRef().remove(ref);
+ }
+ }
+
+ for (ResourceEnvRef ref : bean.getResourceEnvRef()) {
+ ResourceLink resourceLink = ejbDeployment.getResourceLink(ref.getName());
+ ejbDeployment.getResourceLink().remove(resourceLink);
+ }
+ bean.getResourceEnvRef().clear();
+
+ for (MessageDestinationRef ref : bean.getMessageDestinationRef()) {
+ ResourceLink resourceLink = ejbDeployment.getResourceLink(ref.getName());
+ ejbDeployment.getResourceLink().remove(resourceLink);
+ }
+ bean.getMessageDestinationRef().clear();
+
+ bean.getPersistenceContextRef().clear();
+ bean.getPersistenceUnitRef().clear();
}
public <T> List<T> copy(Collection<T> list) {
Added: openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/LoaderJar.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/LoaderJar.java?rev=607160&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/LoaderJar.java (added)
+++ openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/LoaderJar.java Thu Dec 27 18:22:44 2007
@@ -0,0 +1,55 @@
+/**
+ * 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.loader;
+
+import java.io.File;
+import java.net.URI;
+import java.net.URL;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class LoaderJar {
+
+ public static File get() {
+ return findInClassPath(LoaderJar.class);
+ }
+
+ public static File findInClassPath(Class clazz) {
+ try {
+ String classFileName = clazz.getName().replace(".", "/") + ".class";
+
+ URL classURL = clazz.getClassLoader().getResource(classFileName);
+
+ URI uri = classURL.toURI();
+ if (uri.getPath() == null){
+ uri = new URI(uri.getSchemeSpecificPart());
+ }
+
+ String path = uri.getPath();
+ if (path.contains("!")){
+ path = path.substring(0, path.indexOf('!'));
+ } else {
+ path = path.substring(0, path.length() - classFileName.length());
+ }
+
+ return new File(path);
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+ }
+}
Modified: openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/LoaderServlet.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/LoaderServlet.java?rev=607160&r1=607159&r2=607160&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/LoaderServlet.java (original)
+++ openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/LoaderServlet.java Thu Dec 27 18:22:44 2007
@@ -44,25 +44,19 @@
// let it do the rest.
Properties p = initParamsToProperties(config);
- String embeddingStyle = p.getProperty("openejb.loader");
+ String webappPath = getWebappPath(config);
- // Set the mandatory values for a webapp-only setup
- if (embeddingStyle.endsWith("tomcat-webapp")) {
- setPropertyIfNUll(p, "openejb.base", getWebappPath(config));
-// setPropertyIfNUll(p, "openejb.configuration", "META-INF/openejb.xml");
-// setPropertyIfNUll(p, "openejb.container.decorators", "org.apache.openejb.tomcat.TomcatJndiSupport");
-// setPropertyIfNUll(p, "log4j.configuration", "META-INF/log4j.properties");
- } else if (embeddingStyle.endsWith("tomcat-system")){
- String webappPath = getWebappPath(config);
- File webappDir = new File(webappPath);
- File libDir = new File(webappDir, "lib");
- String catalinaHome = System.getProperty("catalina.home");
- p.setProperty("openejb.home", catalinaHome);
- String catalinaBase = System.getProperty("catalina.base");
- p.setProperty("openejb.base", catalinaBase);
- String libPath = libDir.getAbsolutePath();
- p.setProperty("openejb.libs", libPath);
- }
+ File webappDir = new File(webappPath);
+ File libDir = new File(webappDir, "lib");
+
+ String catalinaHome = System.getProperty("catalina.home");
+ p.setProperty("openejb.home", catalinaHome);
+
+ String catalinaBase = System.getProperty("catalina.base");
+ p.setProperty("openejb.base", catalinaBase);
+
+ String libPath = libDir.getAbsolutePath();
+ p.setProperty("openejb.libs", libPath);
try {
SystemInstance.init(p);
@@ -73,25 +67,6 @@
loader = (Loader) instance;
} catch (ClassCastException e) {
loader = new LoaderWrapper(instance);
- }
-
- // loader created, now finish adding all properties
- if (embeddingStyle.endsWith("tomcat-webapp")) {
- ServletContext ctx = config.getServletContext();
- File webInf = new File(ctx.getRealPath("WEB-INF"));
- File webapp = webInf.getParentFile();
- String webappPath = webapp.getAbsolutePath();
-
- setPropertyIfNUll(p, "openejb.base", webappPath);
- setPropertyIfNUll(p, "openejb.configuration", "META-INF/openejb.xml");
- setPropertyIfNUll(p, "openejb.container.decorators", "org.apache.openejb.tomcat.TomcatJndiSupport");
- setPropertyIfNUll(p, "log4j.configuration", "META-INF/log4j.properties");
- } else if (embeddingStyle.endsWith("tomcat-system")) {
- String catalinaHome = System.getProperty("catalina.home");
- p.setProperty("openejb.home", catalinaHome);
-
- String catalinaBase = System.getProperty("catalina.base");
- p.setProperty("openejb.base", catalinaBase);
}
// initialize the loader
Modified: openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/OpenEJBListener.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/OpenEJBListener.java?rev=607160&r1=607159&r2=607160&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/OpenEJBListener.java (original)
+++ openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/OpenEJBListener.java Thu Dec 27 18:22:44 2007
@@ -33,7 +33,7 @@
static private Boolean listenerInstalled;
public static boolean isListenerInstalled() {
- return listenerInstalled;
+ return listenerInstalled != null && listenerInstalled;
}
public static void tryDynamicInstall() {
@@ -68,15 +68,16 @@
Properties properties = new Properties();
properties.setProperty("openejb.loader", "tomcat-system");
- File webappDir = findOpenEjbWar(standardServer);
- System.setProperty("openejb.war", webappDir.getAbsolutePath());
- File libDir = new File(webappDir, "lib");
String catalinaHome = System.getProperty("catalina.home");
properties.setProperty("openejb.home", catalinaHome);
System.setProperty("openejb.home", catalinaHome);
String catalinaBase = System.getProperty("catalina.base");
properties.setProperty("openejb.base", catalinaBase);
System.setProperty("openejb.base", catalinaBase);
+
+ File webappDir = findOpenEjbWar(standardServer);
+ System.setProperty("openejb.war", webappDir.getAbsolutePath());
+ File libDir = new File(webappDir, "lib");
String libPath = libDir.getAbsolutePath();
properties.setProperty("openejb.libs", libPath);
Modified: openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/TomcatClassPath.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/TomcatClassPath.java?rev=607160&r1=607159&r2=607160&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/TomcatClassPath.java (original)
+++ openejb/trunk/openejb3/container/openejb-loader/src/main/java/org/apache/openejb/loader/TomcatClassPath.java Thu Dec 27 18:22:44 2007
@@ -17,11 +17,17 @@
package org.apache.openejb.loader;
import java.io.File;
+import java.io.IOException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
+import java.net.JarURLConnection;
+import java.net.URLConnection;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
import java.security.AccessController;
import java.security.PrivilegedAction;
+import java.util.jar.JarFile;
/*-------------------------------------------------------*/
/* Tomcat ClassLoader Support */
@@ -29,7 +35,8 @@
public class TomcatClassPath extends BasicURLClassPath {
- private final ClassLoader classLoader;
+ private final ClassLoader commonLoader;
+ private final ClassLoader serverLoader;
private Method addRepositoryMethod;
private Method addURLMethod;
@@ -39,7 +46,7 @@
}
public TomcatClassPath(ClassLoader classLoader) {
- this.classLoader = classLoader;
+ this.commonLoader = classLoader;
try {
addRepositoryMethod = getAddRepositoryMethod();
} catch (Exception tomcat4Exception) {
@@ -50,6 +57,12 @@
throw new RuntimeException("Failed accessing classloader for Tomcat 4 or 5", tomcat5Exception);
}
}
+
+ ClassLoader serverLoader = getServerLoader(getContextClassLoader());
+ if (serverLoader != null && serverLoader != commonLoader){
+ this.serverLoader = serverLoader;
+ } else this.serverLoader = null;
+
}
private static ClassLoader getCommonLoader(ClassLoader loader) {
@@ -73,8 +86,17 @@
return loader;
}
+ private static ClassLoader getServerLoader(ClassLoader loader) {
+ try {
+ return loader.loadClass("org.apache.catalina.Container").getClassLoader();
+ } catch (ClassNotFoundException e) {
+ return null;
+ }
+ }
+
public ClassLoader getClassLoader() {
- return classLoader;
+ return (serverLoader != null)? serverLoader: commonLoader;
+// return commonLoader;
}
public void addJarsToPath(File dir) throws Exception {
@@ -100,11 +122,26 @@
}
public void _addJarToPath(URL jar) throws Exception {
+ ClassLoader classLoader = commonLoader;
+
+ if (serverLoader != null && useServerClassLoader(jar)){
+ classLoader = serverLoader;
+ }
+
if (addRepositoryMethod != null) {
String path = jar.toExternalForm();
- addRepositoryMethod.invoke(getClassLoader(), new Object[]{path});
+ addRepositoryMethod.invoke(classLoader, new Object[]{path});
} else {
- addURLMethod.invoke(getClassLoader(), new Object[]{jar});
+ addURLMethod.invoke(classLoader, new Object[]{jar});
+ }
+ }
+
+ private boolean useServerClassLoader(URL jar) {
+ try {
+ URL url = findResource("META-INF/org.apache.openejb.tomcat/ServerClassLoader", jar);
+ return url != null;
+ } catch (Exception e) {
+ return false;
}
}
@@ -165,6 +202,131 @@
}
}
});
+ }
+
+ private static boolean isDirectory(URL url) {
+ String file = url.getFile();
+ return (file.length() > 0 && file.charAt(file.length() - 1) == '/');
+ }
+
+ private static URL findResource(String resourceName, URL... search) {
+ for (int i = 0; i < search.length; i++) {
+ URL currentUrl = search[i];
+ if (currentUrl == null) {
+ continue;
+ }
+
+ if (currentUrl == null || isDirectory(currentUrl) || currentUrl.getProtocol().equals("jar")) {
+ continue;
+ }
+ try {
+ currentUrl = new URL("jar", "", -1, currentUrl.toString() + "!/");
+ } catch (MalformedURLException e) {
+ }
+
+
+ JarFile jarFile = null;
+ try {
+ String protocol = currentUrl.getProtocol();
+ if (protocol.equals("jar")) {
+ /*
+ * If the connection for currentUrl or resURL is
+ * used, getJarFile() will throw an exception if the
+ * entry doesn't exist.
+ */
+ URL jarURL = ((JarURLConnection) currentUrl.openConnection()).getJarFileURL();
+ try {
+ JarURLConnection juc = (JarURLConnection) new URL("jar", "", jarURL.toExternalForm() + "!/").openConnection();
+ jarFile = juc.getJarFile();
+ } catch (IOException e) {
+ // Don't look for this jar file again
+ search[i] = null;
+ throw e;
+ }
+
+ String entryName;
+ if (currentUrl.getFile().endsWith("!/")) {
+ entryName = resourceName;
+ } else {
+ String file = currentUrl.getFile();
+ int sepIdx = file.lastIndexOf("!/");
+ if (sepIdx == -1) {
+ // Invalid URL, don't look here again
+ search[i] = null;
+ continue;
+ }
+ sepIdx += 2;
+ StringBuffer sb = new StringBuffer(file.length() - sepIdx + resourceName.length());
+ sb.append(file.substring(sepIdx));
+ sb.append(resourceName);
+ entryName = sb.toString();
+ }
+ if (entryName.equals("META-INF/") && jarFile.getEntry("META-INF/MANIFEST.MF") != null){
+ return targetURL(currentUrl, "META-INF/MANIFEST.MF");
+ }
+ if (jarFile.getEntry(entryName) != null) {
+ return targetURL(currentUrl, resourceName);
+ }
+ } else if (protocol.equals("file")) {
+ String baseFile = currentUrl.getFile();
+ String host = currentUrl.getHost();
+ int hostLength = 0;
+ if (host != null) {
+ hostLength = host.length();
+ }
+ StringBuffer buf = new StringBuffer(2 + hostLength + baseFile.length() + resourceName.length());
+
+ if (hostLength > 0) {
+ buf.append("//").append(host);
+ }
+ // baseFile always ends with '/'
+ buf.append(baseFile);
+ String fixedResName = resourceName;
+ // Do not create a UNC path, i.e. \\host
+ while (fixedResName.startsWith("/") || fixedResName.startsWith("\\")) {
+ fixedResName = fixedResName.substring(1);
+ }
+ buf.append(fixedResName);
+ String filename = buf.toString();
+ File file = new File(filename);
+ if (file.exists()) {
+ return targetURL(currentUrl, fixedResName);
+ }
+ } else {
+ URL resourceURL = targetURL(currentUrl, resourceName);
+ URLConnection urlConnection = resourceURL.openConnection();
+
+ try {
+ urlConnection.getInputStream().close();
+ } catch (SecurityException e) {
+ return null;
+ }
+ // HTTP can return a stream on a non-existent file
+ // So check for the return code;
+ if (!resourceURL.getProtocol().equals("http")) {
+ return resourceURL;
+ }
+
+ int code = ((HttpURLConnection) urlConnection).getResponseCode();
+ if (code >= 200 && code < 300) {
+ return resourceURL;
+ }
+ }
+ } catch (MalformedURLException e) {
+ // Keep iterating through the URL list
+ } catch (IOException e) {
+ } catch (SecurityException e) {
+ }
+ }
+ return null;
+ }
+
+ private static URL targetURL(URL base, String name) throws MalformedURLException {
+ StringBuffer sb = new StringBuffer(base.getFile().length() + name.length());
+ sb.append(base.getFile());
+ sb.append(name);
+ String file = sb.toString();
+ return new URL(base.getProtocol(), base.getHost(), base.getPort(), file, null);
}
}