Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatJndiBuilder.java Thu Jul 24 22:40:36 2014 @@ -19,12 +19,7 @@ package org.apache.tomee.catalina; import org.apache.catalina.core.NamingContextListener; import org.apache.catalina.core.StandardContext; import org.apache.catalina.core.StandardServer; -import org.apache.catalina.deploy.ContextEjb; -import org.apache.catalina.deploy.ContextEnvironment; -import org.apache.catalina.deploy.ContextResource; -import org.apache.catalina.deploy.ContextResourceEnvRef; -import org.apache.catalina.deploy.ContextTransaction; -import org.apache.catalina.deploy.NamingResources; +import org.apache.catalina.deploy.NamingResourcesImpl; import org.apache.naming.ContextAccessController; import org.apache.naming.ContextBindings; import org.apache.naming.factory.Constants; @@ -54,6 +49,12 @@ import org.apache.openejb.persistence.Jt import org.apache.openejb.spi.ContainerSystem; import org.apache.openejb.util.Contexts; import org.apache.openejb.util.URLs; +import org.apache.tomcat.util.descriptor.web.ContextEjb; +import org.apache.tomcat.util.descriptor.web.ContextEnvironment; +import org.apache.tomcat.util.descriptor.web.ContextResource; +import org.apache.tomcat.util.descriptor.web.ContextResourceEnvRef; +import org.apache.tomcat.util.descriptor.web.ContextService; +import org.apache.tomcat.util.descriptor.web.ContextTransaction; import org.apache.tomee.common.EjbFactory; import org.apache.tomee.common.EnumFactory; import org.apache.tomee.common.LookupFactory; @@ -100,7 +101,7 @@ public class TomcatJndiBuilder { public TomcatJndiBuilder(final StandardContext standardContext, final WebAppInfo webAppInfo, final Collection<Injection> injections) { this.injections = injections; this.standardContext = standardContext; - this.namingContextListener = BackportUtil.getNamingContextListener(standardContext); + this.namingContextListener = standardContext.getNamingContextListener(); this.webAppInfo = webAppInfo; final String parameter = standardContext.findParameter("openejb.start.late"); @@ -117,7 +118,7 @@ public class TomcatJndiBuilder { public void mergeJndi() throws OpenEJBException { - final NamingResources naming = standardContext.getNamingResources(); + final NamingResourcesImpl naming = standardContext.getNamingResources(); final URI moduleUri = URLs.uri(webAppInfo.moduleId); for (final EnvEntryInfo ref : webAppInfo.jndiEnc.envEntries) { @@ -152,7 +153,9 @@ public class TomcatJndiBuilder { public static void mergeJava(final StandardContext standardContext) { final ContainerSystem cs = SystemInstance.get().getComponent(ContainerSystem.class); - ContextAccessController.setWritable(standardContext.getNamingContextListener().getName(), standardContext); + final String name = standardContext.getNamingContextListener().getName(); + final Object namingToken = standardContext.getNamingToken(); + ContextAccessController.setWritable(name, namingToken); Context root = null; try { root = (Context) ContextBindings.getClassLoader().lookup(""); @@ -163,7 +166,7 @@ public class TomcatJndiBuilder { // classical deployment - needed because can be overriden through META-INF/context.xml String path = standardContext.findParameter(TomcatWebAppBuilder.OPENEJB_WEBAPP_MODULE_ID); if (path == null) { // standardContext not created by OpenEJB - path = standardContext.getHostname(); + path = org.apache.tomee.catalina.Contexts.getHostname(standardContext); if (standardContext.getPath().startsWith("/")) { path += standardContext.getPath(); } else { @@ -292,7 +295,7 @@ public class TomcatJndiBuilder { // no-op } - ContextAccessController.setReadOnly(standardContext.getNamingContextListener().getName()); + ContextAccessController.setReadOnly(name); } private static String removeCompEnv(final String key) { @@ -338,7 +341,7 @@ public class TomcatJndiBuilder { return value; } - public void mergeRef(final NamingResources naming, final EnvEntryInfo ref) { + public void mergeRef(final NamingResourcesImpl naming, final EnvEntryInfo ref) { // if (!ref.referenceName.startsWith("comp/")) return; if ("java.lang.Class".equals(ref.type)) { final ContextResourceEnvRef resourceEnv = new ContextResourceEnvRef(); @@ -393,7 +396,7 @@ public class TomcatJndiBuilder { } if (replaceEntry) { - ContextAccessController.setWritable(namingContextListener.getName(), standardContext); + ContextAccessController.setWritable(namingContextListener.getName(), standardContext.getNamingToken()); if (!addEntry) { namingContextListener.removeEnvironment(environment.getName()); } @@ -402,7 +405,7 @@ public class TomcatJndiBuilder { } } - private boolean isLookupRef(final NamingResources naming, final InjectableInfo ref) { + private boolean isLookupRef(final NamingResourcesImpl naming, final InjectableInfo ref) { if (ref.location == null) { return false; } @@ -426,7 +429,7 @@ public class TomcatJndiBuilder { return true; } - public void mergeRef(final NamingResources naming, final EjbReferenceInfo ref) { + public void mergeRef(final NamingResourcesImpl naming, final EjbReferenceInfo ref) { if (isLookupRef(naming, ref)) { return; } @@ -463,7 +466,7 @@ public class TomcatJndiBuilder { } if (replaceEntry) { - ContextAccessController.setWritable(namingContextListener.getName(), standardContext); + ContextAccessController.setWritable(namingContextListener.getName(), standardContext.getNamingToken()); if (!addEntry) { namingContextListener.removeEjb(ejb.getName()); } @@ -472,7 +475,7 @@ public class TomcatJndiBuilder { } } - public void mergeRef(final NamingResources naming, final EjbLocalReferenceInfo ref) { + public void mergeRef(final NamingResourcesImpl naming, final EjbLocalReferenceInfo ref) { if (isLookupRef(naming, ref)) { return; } @@ -508,7 +511,7 @@ public class TomcatJndiBuilder { } if (replaceEntry) { - ContextAccessController.setWritable(namingContextListener.getName(), standardContext); + ContextAccessController.setWritable(namingContextListener.getName(), standardContext.getNamingToken()); if (!addEntry) { namingContextListener.removeEjb(ejb.getName()); } @@ -518,7 +521,7 @@ public class TomcatJndiBuilder { } @SuppressWarnings({"UnusedDeclaration"}) - public void mergeRef(final NamingResources naming, final PersistenceContextReferenceInfo ref, final URI moduleUri) { + public void mergeRef(final NamingResourcesImpl naming, final PersistenceContextReferenceInfo ref, final URI moduleUri) { if (isLookupRef(naming, ref)) { return; } @@ -561,7 +564,7 @@ public class TomcatJndiBuilder { } if (replaceEntry) { - ContextAccessController.setWritable(namingContextListener.getName(), standardContext); + ContextAccessController.setWritable(namingContextListener.getName(), standardContext.getNamingToken()); if (!addEntry) { namingContextListener.removeResource(resource.getName()); } @@ -571,7 +574,7 @@ public class TomcatJndiBuilder { } @SuppressWarnings({"UnusedDeclaration"}) - public void mergeRef(final NamingResources naming, final PersistenceUnitReferenceInfo ref, final URI moduleUri) { + public void mergeRef(final NamingResourcesImpl naming, final PersistenceUnitReferenceInfo ref, final URI moduleUri) { if (isLookupRef(naming, ref)) { return; } @@ -612,7 +615,7 @@ public class TomcatJndiBuilder { } if (replaceEntry) { - ContextAccessController.setWritable(namingContextListener.getName(), standardContext); + ContextAccessController.setWritable(namingContextListener.getName(), standardContext.getNamingToken()); if (!addEntry) { namingContextListener.removeResource(resource.getName()); } @@ -621,7 +624,7 @@ public class TomcatJndiBuilder { } } - public void mergeRef(final NamingResources naming, final ResourceReferenceInfo ref) { + public void mergeRef(final NamingResourcesImpl naming, final ResourceReferenceInfo ref) { if (isLookupRef(naming, ref)) { return; } @@ -653,7 +656,7 @@ public class TomcatJndiBuilder { } if (replaceEntry) { - ContextAccessController.setWritable(namingContextListener.getName(), standardContext); + ContextAccessController.setWritable(namingContextListener.getName(), standardContext.getNamingToken()); if (!addEntry) { namingContextListener.removeResource(resource.getName()); } @@ -662,7 +665,7 @@ public class TomcatJndiBuilder { } } - public void mergeRef(final NamingResources naming, final ResourceEnvReferenceInfo ref) { + public void mergeRef(final NamingResourcesImpl naming, final ResourceEnvReferenceInfo ref) { if (isLookupRef(naming, ref)) { return; } @@ -709,7 +712,7 @@ public class TomcatJndiBuilder { } if (replaceEntry) { - ContextAccessController.setWritable(namingContextListener.getName(), standardContext); + ContextAccessController.setWritable(namingContextListener.getName(), standardContext.getNamingToken()); if (!addEntry) { namingContextListener.removeResourceEnvRef(resourceEnv.getName()); } @@ -718,7 +721,7 @@ public class TomcatJndiBuilder { } } - public void mergeRef(final NamingResources naming, final ServiceReferenceInfo ref) { + public void mergeRef(final NamingResourcesImpl naming, final ServiceReferenceInfo ref) { if (isLookupRef(naming, ref)) { return; } @@ -792,11 +795,12 @@ public class TomcatJndiBuilder { } // if there was a service entry, remove it - final String serviceName = BackportUtil.findServiceName(naming, ref.referenceName.replaceAll("^comp/env/", "")); + final ContextService service = naming.findService(ref.referenceName.replaceAll("^comp/env/", "")); + final String serviceName = service != null ? service.getName() : null; if (serviceName != null) { - ContextAccessController.setWritable(namingContextListener.getName(), standardContext); + ContextAccessController.setWritable(namingContextListener.getName(), standardContext.getNamingToken()); if (!addEntry) { - BackportUtil.removeService(namingContextListener, serviceName); + namingContextListener.removeService(serviceName); } ContextAccessController.setReadOnly(namingContextListener.getName()); } @@ -808,7 +812,7 @@ public class TomcatJndiBuilder { // or replace the exisitng resource entry if (replaceEntry) { - ContextAccessController.setWritable(namingContextListener.getName(), standardContext); + ContextAccessController.setWritable(namingContextListener.getName(), standardContext.getNamingToken()); if (!addEntry) { namingContextListener.removeResource(resource.getName()); } @@ -857,7 +861,7 @@ public class TomcatJndiBuilder { } public static void importOpenEJBResourcesInTomcat(final Collection<ResourceInfo> resources, final StandardServer server) { - final NamingResources naming = server.getGlobalNamingResources(); + final NamingResourcesImpl naming = server.getGlobalNamingResources(); for (final ResourceInfo info : resources) { final String name = info.id;
Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatThreadContextListener.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatThreadContextListener.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatThreadContextListener.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatThreadContextListener.java Thu Jul 24 22:40:36 2014 @@ -61,7 +61,7 @@ public class TomcatThreadContextListener method = ContextBindings.class.getDeclaredMethod("getThreadName"); method.setAccessible(true); - final Field threadNameBindingsField = ContextBindings.class.getDeclaredField("threadNameBindings"); + final Field threadNameBindingsField = ContextBindings.class.getDeclaredField("threadObjectBindings"); threadNameBindingsField.setAccessible(true); threadNameBindings = (Hashtable<Thread, Object>) threadNameBindingsField.get(null); } catch (final Exception e) { Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java Thu Jul 24 22:40:36 2014 @@ -31,6 +31,7 @@ import org.apache.catalina.Realm; import org.apache.catalina.Service; import org.apache.catalina.UserDatabase; import org.apache.catalina.Valve; +import org.apache.catalina.WebResourceRoot; import org.apache.catalina.Wrapper; import org.apache.catalina.core.ContainerBase; import org.apache.catalina.core.NamingContextListener; @@ -38,18 +39,9 @@ import org.apache.catalina.core.Standard import org.apache.catalina.core.StandardHost; import org.apache.catalina.core.StandardServer; import org.apache.catalina.core.StandardWrapper; -import org.apache.catalina.deploy.ApplicationParameter; -import org.apache.catalina.deploy.ContextEnvironment; -import org.apache.catalina.deploy.ContextResource; -import org.apache.catalina.deploy.ContextResourceLink; -import org.apache.catalina.deploy.ContextTransaction; -import org.apache.catalina.deploy.FilterDef; -import org.apache.catalina.deploy.FilterMap; -import org.apache.catalina.deploy.NamingResources; -import org.apache.catalina.deploy.ResourceBase; +import org.apache.catalina.deploy.NamingResourcesImpl; import org.apache.catalina.ha.CatalinaCluster; import org.apache.catalina.ha.tcp.SimpleTcpCluster; -import org.apache.catalina.loader.VirtualWebappLoader; import org.apache.catalina.loader.WebappLoader; import org.apache.catalina.session.StandardManager; import org.apache.catalina.startup.Constants; @@ -59,11 +51,11 @@ import org.apache.catalina.startup.Realm import org.apache.catalina.startup.SetAllPropertiesRule; import org.apache.catalina.startup.SetNextNamingRule; import org.apache.catalina.users.MemoryUserDatabase; +import org.apache.catalina.webresources.DirResourceSet; import org.apache.naming.ContextAccessController; import org.apache.naming.ContextBindings; import org.apache.naming.ResourceEnvRef; import org.apache.naming.ResourceRef; -import org.apache.naming.resources.FileDirContext; import org.apache.openejb.AppContext; import org.apache.openejb.BeanContext; import org.apache.openejb.BeanType; @@ -114,18 +106,25 @@ import org.apache.openejb.util.Logger; import org.apache.openejb.util.proxy.LocalBeanProxyFactory; import org.apache.openejb.util.reflection.Reflections; import org.apache.tomcat.InstanceManager; +import org.apache.tomcat.JarScanFilter; +import org.apache.tomcat.util.descriptor.web.ApplicationParameter; +import org.apache.tomcat.util.descriptor.web.ContextEnvironment; +import org.apache.tomcat.util.descriptor.web.ContextResource; +import org.apache.tomcat.util.descriptor.web.ContextResourceLink; +import org.apache.tomcat.util.descriptor.web.ContextTransaction; +import org.apache.tomcat.util.descriptor.web.FilterDef; +import org.apache.tomcat.util.descriptor.web.FilterMap; +import org.apache.tomcat.util.descriptor.web.ResourceBase; import org.apache.tomcat.util.digester.Digester; +import org.apache.tomcat.util.scan.StandardJarScanFilter; import org.apache.tomee.catalina.cluster.ClusterObserver; import org.apache.tomee.catalina.cluster.TomEEClusterListener; import org.apache.tomee.catalina.environment.Hosts; import org.apache.tomee.catalina.event.AfterApplicationCreated; -import org.apache.tomee.catalina.naming.resources.AdditionalDocBase; -import org.apache.tomee.catalina.naming.resources.EmptyDirContext; import org.apache.tomee.catalina.routing.RouterValve; import org.apache.tomee.catalina.websocket.JavaEEDefaultServerEnpointConfigurator; import org.apache.tomee.common.LegacyAnnotationProcessor; import org.apache.tomee.common.NamingUtil; -import org.apache.tomee.common.TomcatVersion; import org.apache.tomee.common.UserTransactionFactory; import org.apache.tomee.loader.TomcatHelper; import org.apache.webbeans.config.WebBeansContext; @@ -170,7 +169,6 @@ import java.util.concurrent.atomic.Atomi import java.util.jar.JarEntry; import java.util.jar.JarFile; -import static org.apache.tomee.catalina.BackportUtil.getNamingContextListener; import static org.apache.tomee.catalina.Contexts.warPath; /** @@ -419,7 +417,7 @@ public class TomcatWebAppBuilder impleme public void start(final StandardServer server) { if (SystemInstance.get().isDefaultProfile()) { // add user tomee is no user are specified try { - final NamingResources resources = server.getGlobalNamingResources(); + final NamingResourcesImpl resources = server.getGlobalNamingResources(); final ContextResource userDataBaseResource = resources.findResource("UserDatabase"); final UserDatabase db = (UserDatabase) server.getGlobalNamingContext().lookup(userDataBaseResource.getName()); if (!db.getUsers().hasNext() && db instanceof MemoryUserDatabase) { @@ -808,7 +806,12 @@ public class TomcatWebAppBuilder impleme standardContext.setReloadable(true); } if (SKIP_TLD) { - standardContext.setProcessTlds(false); + if (standardContext.getJarScanner() != null && standardContext.getJarScanner().getJarScanFilter() != null) { + final JarScanFilter jarScanFilter = standardContext.getJarScanner().getJarScanFilter(); + if (StandardJarScanFilter.class.isInstance(jarScanFilter)) { + StandardJarScanFilter.class.cast(jarScanFilter).setDefaultTldScan(false); + } + } } final String name = standardContext.getName(); @@ -1033,11 +1036,31 @@ public class TomcatWebAppBuilder impleme // can only be done until here (before_start) if (Boolean.parseBoolean(SystemInstance.get().getProperty("tomee.skip-war-resources", "false"))) { - if (!EmptyDirContext.class.isInstance(Reflections.get(standardContext, "webappResources"))) { - final EmptyDirContext resources = new EmptyDirContext(standardContext); - standardContext.setResources(resources); - standardContext.setCachingAllowed(resources.isCached()); - } // else don't redo it otherwise it just doesn't work when reload() is called + /* play with StandardRoot to get: + + @Override + protected File file(final String name) { + if (shouldLookup(name)) { + return super.file(name); + } + if ("/WEB-INF/classes".equals(name)) { + if (context.getLoader() != null && TomEEWebappClassLoader.class.isInstance(context.getLoader().getClassLoader())) { + final Collection<File> repos = TomEEWebappClassLoader.class.cast(context.getLoader().getClassLoader()).getAdditionalRepos(); + if (repos != null && !repos.isEmpty()) { + return repos.iterator().next(); + } + } + } + return null; + } + + private static boolean shouldLookup(final String name) { + return name != null && !name.equals("/WEB-INF/classes") + && (name.matches("/?WEB-INF/[^/]*\\.?[^/]") + || name.startsWith("/WEB-INF/lib") || name.startsWith("WEB-INF/lib") + || name.startsWith("/META-INF/")); + } + */ } } @@ -1045,8 +1068,10 @@ public class TomcatWebAppBuilder impleme final Loader standardContextLoader = standardContext.getLoader(); if (standardContextLoader != null && ( - (!VirtualWebappLoader.class.equals(standardContextLoader.getClass()) && !WebappLoader.class.equals(standardContextLoader.getClass())) - || (WebappLoader.class.equals(standardContextLoader.getClass()) && !WebappLoader.class.cast(standardContextLoader).getLoaderClass().startsWith("org.apache.tom"))) + (!TomEEWebappLoader.class.equals(standardContextLoader.getClass()) + && !WebappLoader.class.equals(standardContextLoader.getClass())) + || (WebappLoader.class.equals(standardContextLoader.getClass()) + && !WebappLoader.class.cast(standardContextLoader).getLoaderClass().startsWith("org.apache.tom"))) ) { // custom loader, we don't know it // and since we don't have a full delegate pattern for our lazy stop loader @@ -1055,22 +1080,16 @@ public class TomcatWebAppBuilder impleme return; } - if (standardContextLoader != null && ProvisioningWebappLoader.class.isInstance(standardContextLoader)) { - standardContextLoader.setContainer(standardContext); + if (standardContextLoader != null && TomEEWebappLoader.class.isInstance(standardContextLoader)) { + standardContextLoader.setContext(standardContext); return; // no need to replace the loader } // we just want to wrap it to lazy stop it (afterstop) // to avoid classnotfound in @PreDestoy or destroyApplication() - final VirtualWebappLoader loader = new ProvisioningWebappLoader(); + final TomEEWebappLoader loader = new TomEEWebappLoader(); loader.setDelegate(standardContext.getDelegate()); - loader.setLoaderClass(LazyStopWebappClassLoader.class.getName()); - - if (VirtualWebappLoader.class.isInstance(standardContextLoader)) { - final VirtualWebappLoader vwl = VirtualWebappLoader.class.cast(standardContextLoader); - loader.setSearchVirtualFirst(vwl.getSearchVirtualFirst()); - loader.setVirtualClasspath(String.class.cast(Reflections.get(vwl, "virtualClasspath"))); - } + loader.setLoaderClass(TomEEWebappClassLoader.class.getName()); final Loader lazyStopLoader = new LazyStopLoader(loader); standardContext.setLoader(lazyStopLoader); @@ -1078,14 +1097,12 @@ public class TomcatWebAppBuilder impleme @Override public void configureStart(final StandardContext standardContext) { - if (TomcatHelper.isTomcat7()) { - TomcatHelper.configureJarScanner(standardContext); + TomcatHelper.configureJarScanner(standardContext); - final ContextTransaction contextTransaction = new ContextTransaction(); - contextTransaction.setProperty(org.apache.naming.factory.Constants.FACTORY, UserTransactionFactory.class.getName()); - standardContext.getNamingResources().setTransaction(contextTransaction); - startInternal(standardContext); - } + final ContextTransaction contextTransaction = new ContextTransaction(); + contextTransaction.setProperty(org.apache.naming.factory.Constants.FACTORY, UserTransactionFactory.class.getName()); + standardContext.getNamingResources().setTransaction(contextTransaction); + startInternal(standardContext); // clear a bit log for default case addMyFacesDefaultParameters(standardContext.getLoader().getClassLoader(), standardContext.getServletContext()); @@ -1103,9 +1120,7 @@ public class TomcatWebAppBuilder impleme @SuppressWarnings("unchecked") @Override public void start(final StandardContext standardContext) { - if (!TomcatHelper.isTomcat7()) { - startInternal(standardContext); - } + startInternal(standardContext); } /** @@ -1220,10 +1235,10 @@ public class TomcatWebAppBuilder impleme classLoader = appModule.getClassLoader(); } else { final ClassLoader loader = standardContext.getLoader().getClassLoader(); - if (loader instanceof LazyStopWebappClassLoader) { - final LazyStopWebappClassLoader lazyStopWebappClassLoader = (LazyStopWebappClassLoader) loader; + if (loader instanceof TomEEWebappClassLoader) { + final TomEEWebappClassLoader tomEEWebappClassLoader = (TomEEWebappClassLoader) loader; for (final URL url : appModule.getWebModules().iterator().next().getAddedUrls()) { - lazyStopWebappClassLoader.addURL(url); + tomEEWebappClassLoader.addURL(url); } } } @@ -1515,8 +1530,9 @@ public class TomcatWebAppBuilder impleme } // skip undeployment if restarting - final LazyStopWebappClassLoader lazyStopWebappClassLoader = lazyClassLoader(child); - if (lazyStopWebappClassLoader != null && lazyStopWebappClassLoader.isRestarting()) { + final TomEEWebappClassLoader tomEEWebappClassLoader = lazyClassLoader( + org.apache.catalina.Context.class.isInstance(child)? org.apache.catalina.Context.class.cast(child) : null); + if (tomEEWebappClassLoader != null && tomEEWebappClassLoader.isRestarting()) { return true; } @@ -1527,7 +1543,7 @@ public class TomcatWebAppBuilder impleme return false; } - private static LazyStopWebappClassLoader lazyClassLoader(final Container child) { + private static TomEEWebappClassLoader lazyClassLoader(final org.apache.catalina.Context child) { if (child == null) { return null; } @@ -1538,11 +1554,11 @@ public class TomcatWebAppBuilder impleme } final ClassLoader old = ((LazyStopLoader) loader).getStopClassLoader(); - if (old == null || !(old instanceof LazyStopWebappClassLoader)) { + if (old == null || !(old instanceof TomEEWebappClassLoader)) { return null; } - return (LazyStopWebappClassLoader) old; + return (TomEEWebappClassLoader) old; } private JndiEncBuilder getJndiBuilder(final ClassLoader classLoader, final WebAppInfo webAppInfo, final Set<Injection> injections) throws OpenEJBException { @@ -1596,9 +1612,9 @@ public class TomcatWebAppBuilder impleme final ClassLoader originalLoader = thread.getContextClassLoader(); thread.setContextClassLoader(classLoader); - final NamingContextListener ncl = getNamingContextListener(standardContext); + final NamingContextListener ncl = standardContext.getNamingContextListener(); final String listenerName = ncl.getName(); - ContextAccessController.setWritable(listenerName, standardContext); + ContextAccessController.setWritable(listenerName, standardContext.getNamingToken()); try { final Context openejbContext = (Context) getContainerSystem().getJNDIContext().lookup("openejb"); final Context root = (Context) ContextBindings.getClassLoader().lookup(""); @@ -1651,25 +1667,6 @@ public class TomcatWebAppBuilder impleme SystemInstance.get().fireEvent(new AfterApplicationCreated(contextInfo.appInfo, webApp)); } - if (!TomcatVersion.hasAnnotationProcessingSupport()) { - try { - final Context compEnv = (Context) ContextBindings.getClassLoader().lookup("comp/env"); - - final LegacyAnnotationProcessor annotationProcessor = new LegacyAnnotationProcessor(compEnv); - - standardContext.addContainerListener(new ProcessAnnotatedListenersListener(annotationProcessor)); - - for (final Container container : standardContext.findChildren()) { - if (container instanceof Wrapper) { - final Wrapper wrapper = (Wrapper) container; - wrapper.addInstanceListener(new ProcessAnnotatedServletsListener(annotationProcessor)); - } - } - } catch (final NamingException e) { - // no-op - } - } - // owb integration filters final WebBeansContext webBeansContext = getWebBeansContext(contextInfo); if (webBeansContext != null) { @@ -1780,20 +1777,8 @@ public class TomcatWebAppBuilder impleme continue; } - final FileDirContext altDirContext = new AdditionalDocBase(); - altDirContext.setDocBase(trim); - altDirContext.setAllowLinking(standardContext.isAllowLinking()); - altDirContext.setAliases(standardContext.getAliases()); - altDirContext.setCacheTTL(standardContext.getCacheTTL()); - altDirContext.setCacheMaxSize(standardContext.getCacheMaxSize()); - altDirContext.setCacheObjectMaxSize(standardContext.getCacheObjectMaxSize()); - if (cache != null) { - altDirContext.setCached(Boolean.parseBoolean(cache)); - } else { - altDirContext.setCached(standardContext.isCachingAllowed()); - } - - standardContext.addResourcesDirContext(altDirContext); + final WebResourceRoot root = standardContext.getResources(); + root.addPreResources(new DirResourceSet(root, "/", trim, "/")); } } } @@ -1910,7 +1895,7 @@ public class TomcatWebAppBuilder impleme return; } - final LazyStopWebappClassLoader old = lazyClassLoader(standardContext); + final TomEEWebappClassLoader old = lazyClassLoader(standardContext); if (old != null) { // should always be the case TldScanner.forceCompleteClean(old); jsfClasses.remove(old); @@ -2179,7 +2164,7 @@ public class TomcatWebAppBuilder impleme logger.debug("context path = " + path); webModule.setHost(Contexts.getHostname(standardContext)); // Add all Tomcat env entries to context so they can be overriden by the env.properties file - final NamingResources naming = standardContext.getNamingResources(); + final NamingResourcesImpl naming = standardContext.getNamingResources(); for (final ContextEnvironment environment : naming.findEnvironments()) { EnvEntry envEntry = webApp.getEnvEntryMap().get(environment.getName()); if (envEntry == null) { Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/Warmup.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/Warmup.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/Warmup.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/Warmup.java Thu Jul 24 22:40:36 2014 @@ -136,8 +136,6 @@ public class Warmup { "org.apache.tomcat.util.net.AbstractEndpoint", "org.apache.tomcat.util.scan.StandardJarScanner", "org.apache.tomcat.util.threads.ThreadPoolExecutor", - "org.apache.tomee.catalina.BackportUtil", - "org.apache.tomee.catalina.BackportUtil$1", "org.apache.tomee.loader.TomEEJarScanner", // "org.apache.tomee.catalina.TomcatLoader", // can't be loaded from here "org.apache.webbeans.config.WebBeansFinder", Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cluster/DeployMessage.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cluster/DeployMessage.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cluster/DeployMessage.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cluster/DeployMessage.java Thu Jul 24 22:40:36 2014 @@ -55,4 +55,9 @@ public class DeployMessage extends Clust public byte[] getArchive() { return archive; } + + @Override + public String getUniqueId() { + return "DEPLOY-" + file; + } } Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cluster/UndeployMessage.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cluster/UndeployMessage.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cluster/UndeployMessage.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cluster/UndeployMessage.java Thu Jul 24 22:40:36 2014 @@ -28,4 +28,9 @@ public class UndeployMessage extends Clu public String getFile() { return file; } + + @Override + public String getUniqueId() { + return "UNDEPLOY-" + file; + } } Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/realm/LazyRealm.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/realm/LazyRealm.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/realm/LazyRealm.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/realm/LazyRealm.java Thu Jul 24 22:40:36 2014 @@ -27,9 +27,9 @@ import org.apache.catalina.Realm; import org.apache.catalina.Wrapper; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; -import org.apache.catalina.deploy.SecurityConstraint; import org.apache.catalina.util.LifecycleBase; import org.apache.openejb.config.sys.PropertiesAdapter; +import org.apache.tomcat.util.descriptor.web.SecurityConstraint; import org.apache.tomee.catalina.TomEERuntimeException; import org.apache.webbeans.config.WebBeansContext; import org.apache.xbean.recipe.ObjectRecipe; @@ -52,7 +52,7 @@ public class LazyRealm extends Lifecycle private boolean cdi; private volatile Realm delegate; - private Container container; + private Context container; private CreationalContext<Object> creationalContext; @@ -183,16 +183,11 @@ public class LazyRealm extends Lifecycle if (delegate != null) { instance().setContainer(container); } else { - this.container = container; + this.container = Context.class.cast(container); } } @Override - public String getInfo() { - return instance().getInfo(); - } - - @Override public void addPropertyChangeListener(final PropertyChangeListener listener) { instance().addPropertyChangeListener(listener); } @@ -230,7 +225,8 @@ public class LazyRealm extends Lifecycle @Override public boolean hasResourcePermission(final Request request, final Response response, - final SecurityConstraint[] constraint, final Context context) throws IOException { + final SecurityConstraint[] constraint, + final Context context) throws IOException { return instance().hasResourcePermission(request, response, constraint, context); } Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/realm/LowTypedRealm.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/realm/LowTypedRealm.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/realm/LowTypedRealm.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/realm/LowTypedRealm.java Thu Jul 24 22:40:36 2014 @@ -22,7 +22,7 @@ import org.apache.catalina.Realm; import org.apache.catalina.Wrapper; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; -import org.apache.catalina.deploy.SecurityConstraint; +import org.apache.tomcat.util.descriptor.web.SecurityConstraint; import org.apache.tomee.catalina.TomEERuntimeException; import org.ietf.jgss.GSSContext; @@ -120,11 +120,6 @@ public class LowTypedRealm implements Re } @Override - public String getInfo() { - return info; - } - - @Override public void addPropertyChangeListener(final PropertyChangeListener listener) { // no-op } @@ -182,7 +177,8 @@ public class LowTypedRealm implements Re @Override public boolean hasResourcePermission(final Request request, final Response response, - final SecurityConstraint[] constraint, final Context context) throws IOException { + final SecurityConstraint[] constraint, + final Context context) throws IOException { return (Boolean) invoke(hasResourcePermissionMethod, request.getRequest(), response.getResponse(), constraint, context.getPath()); } Modified: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/remote/TomEERemoteWebapp.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/remote/TomEERemoteWebapp.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/remote/TomEERemoteWebapp.java (original) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/remote/TomEERemoteWebapp.java Thu Jul 24 22:40:36 2014 @@ -16,7 +16,7 @@ */ package org.apache.tomee.catalina.remote; -import org.apache.catalina.Container; +import org.apache.catalina.Context; import org.apache.catalina.LifecycleException; import org.apache.catalina.Loader; import org.apache.catalina.Wrapper; @@ -53,8 +53,6 @@ public class TomEERemoteWebapp extends I } private static class ServerClassLoaderLoader implements Loader { - private static final String[] EMPTY_ARRAY = new String[0]; - private final TomEERemoteWebapp container; public ServerClassLoaderLoader(final TomEERemoteWebapp tomEERemoteWebapp) { @@ -72,12 +70,12 @@ public class TomEERemoteWebapp extends I } @Override - public Container getContainer() { + public Context getContext() { return container; } @Override - public void setContainer(final Container container) { + public void setContext(final Context context) { // no-op } @@ -92,11 +90,6 @@ public class TomEERemoteWebapp extends I } @Override - public String getInfo() { - return ServerClassLoaderLoader.class.getName() + "/1.0"; - } - - @Override public boolean getReloadable() { return false; } @@ -112,16 +105,6 @@ public class TomEERemoteWebapp extends I } @Override - public void addRepository(final String repository) { - // no-op - } - - @Override - public String[] findRepositories() { - return EMPTY_ARRAY; - } - - @Override public boolean modified() { return false; } Added: tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/scan/EmptyScanner.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/scan/EmptyScanner.java?rev=1613316&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/scan/EmptyScanner.java (added) +++ tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/scan/EmptyScanner.java Thu Jul 24 22:40:36 2014 @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomee.catalina.scan; + +import org.apache.tomcat.JarScanFilter; +import org.apache.tomcat.JarScanType; +import org.apache.tomcat.JarScanner; +import org.apache.tomcat.JarScannerCallback; + +import javax.servlet.ServletContext; + +public class EmptyScanner implements JarScanner { + private JarScanFilter scanner; + + @Override + public void scan(final JarScanType scanType, final ServletContext context, + final JarScannerCallback callback) { + // no-op + } + + @Override + public JarScanFilter getJarScanFilter() { + return scanner; + } + + @Override + public void setJarScanFilter(final JarScanFilter jarScanFilter) { + this.scanner = jarScanFilter; + } +} Modified: tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Installer.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Installer.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Installer.java (original) +++ tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Installer.java Thu Jul 24 22:40:36 2014 @@ -25,7 +25,6 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileWriter; import java.io.IOException; -import java.util.Arrays; import java.util.List; import java.util.jar.JarFile; import java.util.zip.ZipEntry; @@ -264,6 +263,7 @@ public class Installer implements Instal } } + /* private void addJavaeeInEndorsed() { final File endorsed = new File(paths.getCatalinaHomeDir(), "endorsed"); if (!endorsed.mkdir()) { @@ -285,6 +285,7 @@ public class Installer implements Instal } } } + */ private void copyClasses(final File javaEEAPIJar, final File sourceJar, final File destinationJar, final String pattern, final List<String> exceptions) { @@ -651,7 +652,10 @@ public class Installer implements Instal } } if (newLoggingProps != null) { - if (Installers.writeAll(loggingPropsFile, newLoggingProps, alerts)) { + if (Installers.writeAll( + loggingPropsFile, + newLoggingProps.replace("java.util.logging.ConsoleHandler", "org.apache.tomee.jul.formatter.AsyncConsoleHandler"), + alerts)) { alerts.addInfo("Append OpenEJB config to logging.properties"); } } Modified: tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Paths.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Paths.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Paths.java (original) +++ tomee/tomee/trunk/tomee/tomee-common/src/main/java/org/apache/tomee/installer/Paths.java Thu Jul 24 22:40:36 2014 @@ -20,7 +20,6 @@ package org.apache.tomee.installer; import org.apache.openejb.jpa.integration.MakeTxLookup; import org.apache.openejb.loader.JarLocation; -import org.apache.tomee.common.TomcatVersion; import java.io.File; import java.io.FilenameFilter; @@ -174,11 +173,7 @@ public class Paths implements PathsInter return null; } - if (TomcatVersion.v6.isTheVersion() || TomcatVersion.v7.isTheVersion()) { - return new File(catalinaHomeDir, "lib"); - } else { - return new File(new File(catalinaHomeDir, "server"), "lib"); - } + return new File(catalinaHomeDir, "lib"); } /** * Returns the directory representing {@link #catalinaBaseDir}/conf Modified: tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java (original) +++ tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java Thu Jul 24 22:40:36 2014 @@ -20,6 +20,7 @@ import org.apache.catalina.LifecycleExce import org.apache.catalina.Server; import org.apache.catalina.Service; import org.apache.catalina.connector.Connector; +import org.apache.catalina.core.StandardContext; import org.apache.catalina.core.StandardServer; import org.apache.catalina.session.StandardManager; import org.apache.catalina.startup.CatalinaProperties; @@ -508,11 +509,11 @@ public class Container { final org.apache.catalina.Container e = service.getContainer(); for (final org.apache.catalina.Container h : e.findChildren()) { for (final org.apache.catalina.Container c : h.findChildren()) { - StandardManager m = (StandardManager) c.getManager(); + StandardManager m = (StandardManager) StandardContext.class.cast(c).getManager(); if (m == null) { m = new StandardManager(); m.setSecureRandomClass("org.apache.catalina.startup.FastNonSecureRandom"); - c.setManager(m); + StandardContext.class.cast(c).setManager(m); } } } Modified: tomee/tomee/trunk/tomee/tomee-jaxrs/src/test/java/org/apache/tomee/jaxrs/ReloadingLoaderTest.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-jaxrs/src/test/java/org/apache/tomee/jaxrs/ReloadingLoaderTest.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-jaxrs/src/test/java/org/apache/tomee/jaxrs/ReloadingLoaderTest.java (original) +++ tomee/tomee/trunk/tomee/tomee-jaxrs/src/test/java/org/apache/tomee/jaxrs/ReloadingLoaderTest.java Thu Jul 24 22:40:36 2014 @@ -34,7 +34,7 @@ import org.apache.openejb.loader.SystemI import org.apache.openejb.server.cxf.rs.CxfRSService; import org.apache.openejb.spi.ContainerSystem; import org.apache.openejb.util.reflection.Reflections; -import org.apache.tomee.catalina.LazyStopWebappClassLoader; +import org.apache.tomee.catalina.TomEEWebappClassLoader; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; @@ -52,7 +52,7 @@ import static org.junit.Assert.assertSam public class ReloadingLoaderTest { private AppInfo info; private AppContext context; - private LazyStopWebappClassLoader loader; + private TomEEWebappClassLoader loader; @BeforeClass @AfterClass @@ -76,7 +76,7 @@ public class ReloadingLoaderTest { } }); - loader = new LazyStopWebappClassLoader(ParentClassLoaderFinder.Helper.get()); + loader = new TomEEWebappClassLoader(ParentClassLoaderFinder.Helper.get()); loader.init(); loader.start(); Modified: tomee/tomee/trunk/tomee/tomee-juli/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-juli/pom.xml?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-juli/pom.xml (original) +++ tomee/tomee/trunk/tomee/tomee-juli/pom.xml Thu Jul 24 22:40:36 2014 @@ -72,9 +72,6 @@ <filters> <filter> <artifact>org.apache.tomcat:tomcat-juli</artifact> - <excludes> - <exclude>org/apache/juli/logging/LogFactory.class</exclude> - </excludes> </filter> </filters> </configuration> Modified: tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/AsyncConsoleHandler.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/AsyncConsoleHandler.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/AsyncConsoleHandler.java (original) +++ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/AsyncConsoleHandler.java Thu Jul 24 22:40:36 2014 @@ -18,13 +18,45 @@ package org.apache.tomee.jul.formatter; import org.apache.juli.AsyncFileHandler; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.logging.ConsoleHandler; +import java.util.logging.Formatter; import java.util.logging.LogRecord; public class AsyncConsoleHandler extends AsyncFileHandler { - private final ConsoleHandler delegate = new ConsoleHandler(); + private final ConsoleHandler delegate = new ConsoleHandler() {{ + setFormatter(new SingleLineFormatter()); // console -> dev. File uses plain old format + }}; protected void publishInternal(final LogRecord record) { delegate.publish(record); } + + // copy cause of classloading + private static class SingleLineFormatter extends Formatter { + private static final String SEP = System.getProperty("line.separator", "\n"); + + @Override + public synchronized String format(final LogRecord record) { + final boolean exception = record.getThrown() != null; + final StringBuilder sbuf = new StringBuilder(); + sbuf.append(record.getLevel().getLocalizedName()); + sbuf.append(" - "); + sbuf.append(this.formatMessage(record)); + sbuf.append(SEP); + if (exception) { + try { + final StringWriter sw = new StringWriter(); + final PrintWriter pw = new PrintWriter(sw); + record.getThrown().printStackTrace(pw); + pw.close(); + sbuf.append(sw.toString()); + } catch (final Exception ex) { + // no-op + } + } + return sbuf.toString(); + } + } } Added: tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/JULLogger.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/JULLogger.java?rev=1613316&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/JULLogger.java (added) +++ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/JULLogger.java Thu Jul 24 22:40:36 2014 @@ -0,0 +1,179 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomee.jul.formatter.log; + +import org.apache.juli.logging.Log; + +import java.util.logging.ConsoleHandler; +import java.util.logging.Formatter; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.Logger; + +// DirectJDKLog copy since it is now package scoped +public class JULLogger implements Log { + /** Alternate config reader and console format + */ + private static final String SIMPLE_FMT="java.util.logging.SimpleFormatter"; + private static final String SIMPLE_CFG="org.apache.juli.JdkLoggerConfig"; //doesn't exist + private static final String FORMATTER="org.apache.juli.formatter"; + + static { + if( System.getProperty("java.util.logging.config.class") == null && + System.getProperty("java.util.logging.config.file") == null ) { + // default configuration - it sucks. Let's override at least the + // formatter for the console + try { + Class.forName(SIMPLE_CFG).newInstance(); + } catch( Throwable t ) { + } + try { + Formatter fmt=(Formatter)Class.forName(System.getProperty(FORMATTER, SIMPLE_FMT)).newInstance(); + // it is also possible that the user modified jre/lib/logging.properties - + // but that's really stupid in most cases + Logger root=Logger.getLogger(""); + Handler handlers[]=root.getHandlers(); + for( int i=0; i< handlers.length; i++ ) { + // I only care about console - that's what's used in default config anyway + if( handlers[i] instanceof ConsoleHandler) { + handlers[i].setFormatter(fmt); + } + } + } catch( Throwable t ) { + // maybe it wasn't included - the ugly default will be used. + } + + } + } + + private final Logger logger; + + public JULLogger(final String name ) { + logger= Logger.getLogger(name); + } + + @Override + public final boolean isErrorEnabled() { + return logger.isLoggable(Level.SEVERE); + } + + @Override + public final boolean isWarnEnabled() { + return logger.isLoggable(Level.WARNING); + } + + @Override + public final boolean isInfoEnabled() { + return logger.isLoggable(Level.INFO); + } + + @Override + public final boolean isDebugEnabled() { + return logger.isLoggable(Level.FINE); + } + + @Override + public final boolean isFatalEnabled() { + return logger.isLoggable(Level.SEVERE); + } + + @Override + public final boolean isTraceEnabled() { + return logger.isLoggable(Level.FINER); + } + + @Override + public final void debug(Object message) { + log(Level.FINE, String.valueOf(message), null); + } + + @Override + public final void debug(Object message, Throwable t) { + log(Level.FINE, String.valueOf(message), t); + } + + @Override + public final void trace(Object message) { + log(Level.FINER, String.valueOf(message), null); + } + + @Override + public final void trace(Object message, Throwable t) { + log(Level.FINER, String.valueOf(message), t); + } + + @Override + public final void info(Object message) { + log(Level.INFO, String.valueOf(message), null); + } + + @Override + public final void info(Object message, Throwable t) { + log(Level.INFO, String.valueOf(message), t); + } + + @Override + public final void warn(Object message) { + log(Level.WARNING, String.valueOf(message), null); + } + + @Override + public final void warn(Object message, Throwable t) { + log(Level.WARNING, String.valueOf(message), t); + } + + @Override + public final void error(Object message) { + log(Level.SEVERE, String.valueOf(message), null); + } + + @Override + public final void error(Object message, Throwable t) { + log(Level.SEVERE, String.valueOf(message), t); + } + + @Override + public final void fatal(Object message) { + log(Level.SEVERE, String.valueOf(message), null); + } + + @Override + public final void fatal(Object message, Throwable t) { + log(Level.SEVERE, String.valueOf(message), t); + } + + private void log(Level level, String msg, Throwable ex) { + if (logger.isLoggable(level)) { + // Hack (?) to get the stack trace. + Throwable dummyException=new Throwable(); + StackTraceElement locations[]=dummyException.getStackTrace(); + // Caller will be the third element + String cname = "unknown"; + String method = "unknown"; + if (locations != null && locations.length > 3) { + StackTraceElement caller = locations[3]; + cname = caller.getClassName(); + method = caller.getMethodName(); + } + if (ex==null) { + logger.logp(level, cname, method, msg); + } else { + logger.logp(level, cname, method, msg, ex); + } + } + } +} Added: tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/LoggerFactory.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/LoggerFactory.java?rev=1613316&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/LoggerFactory.java (added) +++ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/LoggerFactory.java Thu Jul 24 22:40:36 2014 @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomee.jul.formatter.log; + +import org.apache.juli.logging.Log; + +public interface LoggerFactory { + Log newInstance(String name); +} Added: tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/NoopLogger.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/NoopLogger.java?rev=1613316&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/NoopLogger.java (added) +++ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/NoopLogger.java Thu Jul 24 22:40:36 2014 @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomee.jul.formatter.log; + +import org.apache.juli.logging.Log; + +public class NoopLogger implements Log { + public static final NoopLogger INSTANCE = new NoopLogger(); + + private NoopLogger() { + // no-op + } + + @Override + public boolean isDebugEnabled() { + return false; + } + + @Override + public boolean isErrorEnabled() { + return false; + } + + @Override + public boolean isFatalEnabled() { + return false; + } + + @Override + public boolean isInfoEnabled() { + return false; + } + + @Override + public boolean isTraceEnabled() { + return false; + } + + @Override + public boolean isWarnEnabled() { + return false; + } + + @Override + public void trace(final Object message) { + // no-op + } + + @Override + public void trace(final Object message, final Throwable t) { + // no-op + } + + @Override + public void debug(final Object message) { + // no-op + } + + @Override + public void debug(final Object message, final Throwable t) { + // no-op + } + + @Override + public void info(final Object message) { + // no-op + } + + @Override + public void info(final Object message, final Throwable t) { + // no-op + } + + @Override + public void warn(final Object message) { + // no-op + } + + @Override + public void warn(final Object message, final Throwable t) { + // no-op + } + + @Override + public void error(final Object message) { + // no-op + } + + @Override + public void error(final Object message, final Throwable t) { + // no-op + } + + @Override + public void fatal(final Object message) { + // no-op + } + + @Override + public void fatal(final Object message, final Throwable t) { + // no-op + } +} Added: tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/ReloadableLog.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/ReloadableLog.java?rev=1613316&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/ReloadableLog.java (added) +++ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/ReloadableLog.java Thu Jul 24 22:40:36 2014 @@ -0,0 +1,96 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomee.jul.formatter.log; + +import org.apache.juli.logging.Log; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.concurrent.atomic.AtomicReference; + +public class ReloadableLog { + + public static final Class<?>[] INTERFACES = new Class<?>[]{Log.class}; + + private ReloadableLog() { + // no-op + } + + public static Log newLog(final String name, final String factory) { + return Log.class.cast(Proxy.newProxyInstance( + ReloadableLog.class.getClassLoader(), INTERFACES, new ReloadableLogHandler(factory, name))); + } + + private static class ReloadableLogHandler implements InvocationHandler { + private static final String LOG4J_IMPL = "org.apache.tomee.loader.log.Log4jLog"; + private static final String SLF4J_IMPL = "org.apache.tomee.loader.log.Slf4jLog"; + + private final String factory; + private final String name; + private final AtomicReference<Log> delegate = new AtomicReference<>(); + private volatile boolean done = false; + + public ReloadableLogHandler(final String factory, final String name) { + this.factory = factory; + this.name = name; + initDelegate(); + } + + private Log initDelegate() { + if (done) { + return delegate.get(); + } + + try { + switch (factory) { + case "org.apache.openejb.util.Log4jLogStreamFactory": + delegate.set(newInstance(LOG4J_IMPL)); break; + case "org.apache.openejb.util.Slf4jLogStreamFactory": + delegate.set(newInstance(SLF4J_IMPL)); + break; + default: + delegate.set(new JULLogger(name)); + } + done = true; + } catch (final Throwable the) { + if (delegate.get() == null) { + delegate.set(new JULLogger(name)); + } + } + return delegate.get(); + } + + private Log newInstance(final String impl) throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException, ClassNotFoundException { + return Log.class.cast(Thread.currentThread() + .getContextClassLoader() + .loadClass(impl) + .getConstructor(String.class) + .newInstance(name)); + } + + @Override + public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { + try { + return method.invoke(initDelegate(), args); + } catch (final InvocationTargetException ite) { + throw ite.getCause(); + } + } + } +} Added: tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/TomEELog.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/TomEELog.java?rev=1613316&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/TomEELog.java (added) +++ tomee/tomee/trunk/tomee/tomee-juli/src/main/java/org/apache/tomee/jul/formatter/log/TomEELog.java Thu Jul 24 22:40:36 2014 @@ -0,0 +1,160 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.tomee.jul.formatter.log; + +import org.apache.juli.logging.Log; + +import java.lang.reflect.Method; + +public class TomEELog implements Log { + private static volatile boolean initialized = false; + private static volatile String loggerClazz; + private static volatile boolean defaultLogger; + + private static synchronized void initialize() { + if (initialized) { + return; + } + + if (!Boolean.getBoolean("tomee.skip-tomcat-log")) { + final Thread thread = Thread.currentThread(); + try { + final ClassLoader tccl = thread.getContextClassLoader(); + final Class<?> logger = tccl.loadClass("org.apache.openejb.util.Logger"); + final Method m = logger.getDeclaredMethod("delegateClass"); + loggerClazz = (String) m.invoke(null); + switch (loggerClazz) { + case "org.apache.openejb.util.Log4jLogStreamFactory": + defaultLogger = false; + initialized = true; + return; + case "org.apache.openejb.util.Slf4jLogStreamFactory": + defaultLogger = false; + initialized = true; + return; + default: + defaultLogger = true; + initialized = true; + return; + } + } catch (final Throwable th) { + // no-op + } + } + } + + private final Log delegate; + + public TomEELog() { // for ServiceLoader + delegate = null; + } + + public TomEELog(final String name) { + initialize(); + this.delegate = defaultLogger ? new JULLogger(name) : ReloadableLog.newLog(name, loggerClazz); + } + + @Override + public boolean isDebugEnabled() { + return delegate.isDebugEnabled(); + } + + @Override + public boolean isErrorEnabled() { + return delegate.isErrorEnabled(); + } + + @Override + public boolean isFatalEnabled() { + return delegate.isFatalEnabled(); + } + + @Override + public boolean isInfoEnabled() { + return delegate.isInfoEnabled(); + } + + @Override + public boolean isTraceEnabled() { + return delegate.isTraceEnabled(); + } + + @Override + public boolean isWarnEnabled() { + return delegate.isWarnEnabled(); + } + + @Override + public void trace(final Object message) { + delegate.trace(message); + } + + @Override + public void trace(final Object message, final Throwable t) { + delegate.trace(message, t); + } + + @Override + public void debug(final Object message) { + delegate.debug(message); + } + + @Override + public void debug(final Object message, final Throwable t) { + delegate.debug(message, t); + } + + @Override + public void info(final Object message) { + delegate.info(message); + } + + @Override + public void info(final Object message, final Throwable t) { + delegate.info(message, t); + } + + @Override + public void warn(final Object message) { + delegate.warn(message); + } + + @Override + public void warn(final Object message, final Throwable t) { + delegate.warn(message, t); + } + + @Override + public void error(final Object message) { + delegate.error(message); + } + + @Override + public void error(final Object message, final Throwable t) { + delegate.error(message, t); + } + + @Override + public void fatal(final Object message) { + delegate.fatal(message); + } + + @Override + public void fatal(final Object message, final Throwable t) { + delegate.fatal(message, t); + } +} Added: tomee/tomee/trunk/tomee/tomee-juli/src/main/resources/META-INF/services/org.apache.juli.logging.Log URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-juli/src/main/resources/META-INF/services/org.apache.juli.logging.Log?rev=1613316&view=auto ============================================================================== --- tomee/tomee/trunk/tomee/tomee-juli/src/main/resources/META-INF/services/org.apache.juli.logging.Log (added) +++ tomee/tomee/trunk/tomee/tomee-juli/src/main/resources/META-INF/services/org.apache.juli.logging.Log Thu Jul 24 22:40:36 2014 @@ -0,0 +1 @@ +org.apache.tomee.jul.formatter.log.TomEELog Modified: tomee/tomee/trunk/tomee/tomee-loader/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/pom.xml?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-loader/pom.xml (original) +++ tomee/tomee/trunk/tomee/tomee-loader/pom.xml Thu Jul 24 22:40:36 2014 @@ -42,18 +42,6 @@ <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina</artifactId> <scope>provided</scope> - <exclusions> - <exclusion> - <groupId>org.apache.tomcat</groupId> - <artifactId>tomcat-juli</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.apache.openejb</groupId> - <artifactId>tomee-juli</artifactId> - <version>${project.version}</version> - <scope>compile</scope> </dependency> <dependency> <groupId>org.apache.openejb</groupId> Modified: tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java?rev=1613316&r1=1613315&r2=1613316&view=diff ============================================================================== --- tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java (original) +++ tomee/tomee/trunk/tomee/tomee-loader/src/main/java/org/apache/tomee/loader/OpenEJBListener.java Thu Jul 24 22:40:36 2014 @@ -26,7 +26,6 @@ import org.apache.catalina.core.Standard import org.apache.catalina.core.StandardEngine; import org.apache.catalina.core.StandardHost; import org.apache.catalina.core.StandardServer; -import org.apache.tomee.TomEELogConfigurer; import java.io.BufferedOutputStream; import java.io.File; @@ -91,7 +90,6 @@ public class OpenEJBListener implements properties.setProperty("openejb.embedder.source", OpenEJBListener.class.getSimpleName()); TomcatEmbedder.embed(properties, StandardServer.class.getClassLoader()); listenerInstalled = true; - TomEELogConfigurer.configureLogs(); } else if (logWebappNotFound) { LOGGER.info("tomee webapp not found from the listener, will try from the webapp if exists"); logWebappNotFound = false;
