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