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);
     }
 
 }