Repository: tomee Updated Branches: refs/heads/master 345967ac9 -> 7bc8519e6
another explicit instantiation + lazy creation of Messages in Instance since it is 100% error messages Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/7bc8519e Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/7bc8519e Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/7bc8519e Branch: refs/heads/master Commit: 7bc8519e6b8d06865404d92102033a3c03ec0eb1 Parents: 345967a Author: Romain Manni-Bucau <[email protected]> Authored: Wed Jun 17 15:22:04 2015 +0200 Committer: Romain Manni-Bucau <[email protected]> Committed: Wed Jun 17 15:22:04 2015 +0200 ---------------------------------------------------------------------- .../main/java/org/apache/openejb/OpenEJB.java | 34 +++++++++----- .../apache/tomee/catalina/ServerListener.java | 49 ++++++++++++-------- 2 files changed, 51 insertions(+), 32 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/7bc8519e/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java ---------------------------------------------------------------------- diff --git a/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java b/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java index 32c761e..3742c4e 100644 --- a/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java +++ b/container/openejb-core/src/main/java/org/apache/openejb/OpenEJB.java @@ -35,6 +35,7 @@ import org.apache.openejb.util.SafeToolkit; import javax.transaction.TransactionManager; import java.util.Date; import java.util.Properties; +import java.util.concurrent.atomic.AtomicReference; /** * @version $Rev$ $Date$ @@ -56,7 +57,6 @@ public final class OpenEJB { public static class Instance { - private static final Messages messages = new Messages("org.apache.openejb.util.resources"); private final Throwable initialized; /** @@ -119,18 +119,19 @@ public final class OpenEJB { //OWB support. The classloader has to be able to load all OWB components including the ones supplied by OpenEjb. CdiBuilder.initializeOWB(getClass().getClassLoader()); - final String className = system.getOptions().get("openejb.assembler", "org.apache.openejb.assembler.classic.Assembler"); + final String className = system.getOptions().get("openejb.assembler", (String) null); logger.debug("startup.instantiatingAssemblerClass", className); final Assembler assembler; try { - assembler = (Assembler) SafeToolkit.getToolkit("OpenEJB").newInstance(className); + assembler = className == null ? + new org.apache.openejb.assembler.classic.Assembler() : (Assembler) SafeToolkit.getToolkit("OpenEJB").newInstance(className); } catch (final OpenEJBException oe) { logger.fatal("startup.assemblerCannotBeInstantiated", oe); throw oe; } catch (final Throwable t) { - final String msg = messages.message("startup.openejbEncounteredUnexpectedError"); + final String msg = messages().message("startup.openejbEncounteredUnexpectedError"); logger.fatal(msg, t); throw new OpenEJBException(msg, t); } @@ -141,7 +142,7 @@ public final class OpenEJB { logger.fatal("startup.assemblerFailedToInitialize", oe); throw oe; } catch (final Throwable t) { - final String msg = messages.message("startup.assemblerEncounteredUnexpectedError"); + final String msg = messages().message("startup.assemblerEncounteredUnexpectedError"); logger.fatal(msg, t); throw new OpenEJBException(msg, t); } @@ -152,14 +153,14 @@ public final class OpenEJB { logger.fatal("startup.assemblerFailedToBuild", oe); throw oe; } catch (final Throwable t) { - final String msg = messages.message("startup.assemblerEncounterUnexpectedBuildError"); + final String msg = messages().message("startup.assemblerEncounterUnexpectedBuildError"); logger.fatal(msg, t); throw new OpenEJBException(msg, t); } final ContainerSystem containerSystem = assembler.getContainerSystem(); if (containerSystem == null) { - final String msg = messages.message("startup.assemblerReturnedNullContainer"); + final String msg = messages().message("startup.assemblerReturnedNullContainer"); logger.fatal(msg); throw new OpenEJBException(msg); } @@ -233,7 +234,7 @@ public final class OpenEJB { final SecurityService securityService = assembler.getSecurityService(); if (securityService == null) { - final String msg = messages.message("startup.assemblerReturnedNullSecurityService"); + final String msg = messages().message("startup.assemblerReturnedNullSecurityService"); logger.fatal(msg); throw new OpenEJBException(msg); } else { @@ -243,7 +244,7 @@ public final class OpenEJB { final TransactionManager transactionManager = assembler.getTransactionManager(); if (transactionManager == null) { - final String msg = messages.message("startup.assemblerReturnedNullTransactionManager"); + final String msg = messages().message("startup.assemblerReturnedNullTransactionManager"); logger.fatal(msg); throw new OpenEJBException(msg); } else { @@ -278,7 +279,16 @@ public final class OpenEJB { init(props, null); } - private static final Messages messages = new Messages("org.apache.openejb.util.resources"); + private static final AtomicReference<Messages> messagesRef = new AtomicReference<>(); + + private static Messages messages() { // only used for errors so lazy init is great + Messages m = messagesRef.get(); + if (m == null) { + m = new Messages("org.apache.openejb.util.resources"); + messagesRef.compareAndSet(null, m); + } + return m; + } /** * 2 usages @@ -286,11 +296,11 @@ public final class OpenEJB { public static void init(final Properties initProps, final ApplicationServer appServer) throws OpenEJBException { if (isInitialized()) { if (instance != null) { - final String msg = messages.message("startup.alreadyInitialized"); + final String msg = messages().message("startup.alreadyInitialized"); logger().error(msg, instance.initialized); throw new OpenEJBException(msg, instance.initialized); } else { - final String msg = messages.message("startup.alreadyInitialized"); + final String msg = messages().message("startup.alreadyInitialized"); logger().error(msg); throw new OpenEJBException(msg); } http://git-wip-us.apache.org/repos/asf/tomee/blob/7bc8519e/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ServerListener.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ServerListener.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ServerListener.java index 1a30f1a..0235c02 100644 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ServerListener.java +++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ServerListener.java @@ -30,6 +30,7 @@ import org.apache.openejb.util.OpenEjbVersion; import org.apache.tomee.loader.TomcatHelper; import java.io.File; +import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; @@ -37,11 +38,15 @@ import java.lang.reflect.Modifier; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; +import java.util.ArrayList; +import java.util.Collection; import java.util.Properties; import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; +import static java.util.Arrays.asList; + // this listener is the real tomee one (the OpenEJBListener is more tomcat oriented) // so it even changes the server info public class ServerListener implements LifecycleListener { @@ -129,31 +134,35 @@ public class ServerListener implements LifecycleListener { loader.initSystemInstance(properties); // manage additional libraries - if (URLClassLoader.class.isInstance(classLoader)) { - final URLClassLoader ucl = URLClassLoader.class.cast(classLoader); - try { - final Method addUrl = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); - final boolean acc = addUrl.isAccessible(); - try { - for (final File f : ProvisioningUtil.addAdditionalLibraries()) { - addUrl(ucl, addUrl, f.toURI().toURL()); - } + try { + final Collection<URL> files = new ArrayList<>(); + for (final File f : ProvisioningUtil.addAdditionalLibraries()) { + files.add(f.toURI().toURL()); + } + + final ClassLoaderConfigurer configurer = QuickJarsTxtParser.parse(SystemInstance.get().getConf(QuickJarsTxtParser.FILE_NAME)); + if (configurer != null) { + files.addAll(asList(configurer.additionalURLs())); + } - final File globalJarsTxt = SystemInstance.get().getConf(QuickJarsTxtParser.FILE_NAME); - final ClassLoaderConfigurer configurer = QuickJarsTxtParser.parse(globalJarsTxt); - if (configurer != null) { - for (final URL f : configurer.additionalURLs()) { - addUrl(ucl, addUrl, f); + if (!files.isEmpty() && URLClassLoader.class.isInstance(classLoader)) { + final URLClassLoader ucl = URLClassLoader.class.cast(classLoader); + try { + final Method addUrl = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); + final boolean acc = addUrl.isAccessible(); + try { + for (final URL url : files) { + addUrl(ucl, addUrl, url); } + } finally { + addUrl.setAccessible(acc); } - } finally { - addUrl.setAccessible(acc); + } catch (final Exception e) { + LOGGER.log(Level.SEVERE, e.getMessage(), e); } - } catch (final Exception e) { - LOGGER.log(Level.SEVERE, e.getMessage(), e); } - } else { - LOGGER.finer("container classloader is not an URL one so can't check provisining: " + classLoader); + } catch (final IOException ex) { + LOGGER.log(Level.SEVERE, ex.getMessage(), ex); } loader.initialize(properties);
