Author: rmannibucau Date: Wed May 15 09:13:24 2013 New Revision: 1482735 URL: http://svn.apache.org/r1482735 Log: OPENEJB-2022 avoid useless classloader in embedded mode
Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java tomee/tomee/trunk/pom.xml Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1482735&r1=1482734&r2=1482735&view=diff ============================================================================== --- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original) +++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Wed May 15 09:13:24 2013 @@ -117,6 +117,7 @@ import org.apache.openejb.util.Propertie import org.apache.openejb.util.PropertyPlaceHolderHelper; import org.apache.openejb.util.References; import org.apache.openejb.util.SafeToolkit; +import org.apache.openejb.util.URLs; import org.apache.openejb.util.proxy.ProxyFactory; import org.apache.openejb.util.proxy.ProxyManager; import org.apache.webbeans.config.WebBeansContext; @@ -129,6 +130,7 @@ import org.apache.webbeans.spi.ResourceI import org.apache.webbeans.spi.ScannerService; import org.apache.webbeans.spi.TransactionService; import org.apache.webbeans.spi.adaptor.ELAdaptor; +import org.apache.xbean.finder.ClassLoaders; import org.apache.xbean.finder.ResourceFinder; import org.apache.xbean.finder.UrlSet; import org.apache.xbean.recipe.ObjectRecipe; @@ -215,6 +217,8 @@ public class Assembler extends Assembler public static final String TIMER_STORE_CLASS = "timerStore.class"; private static final ReentrantLock lock = new ReentrantLock(true); + private static final boolean SKIP_APP_LOADER_IF_POSSIBLE = "true".equalsIgnoreCase(SystemInstance.get().getProperty("openejb.classloader.skip-app-loader-if-possible", "true")); + Messages messages = new Messages(Assembler.class.getPackage().getName()); private final CoreContainerSystem containerSystem; private final PersistenceClassLoaderHandler persistenceClassLoaderHandler; @@ -785,8 +789,8 @@ public class Assembler extends Assembler final List<BeanContext> allDeployments = initEjbs(classLoader, appInfo, appContext, injections, new ArrayList<BeanContext>(), null); if ("true".equalsIgnoreCase(SystemInstance.get() - .getProperty(PROPAGATE_APPLICATION_EXCEPTIONS, - appInfo.properties.getProperty(PROPAGATE_APPLICATION_EXCEPTIONS, "false")))) { + .getProperty(PROPAGATE_APPLICATION_EXCEPTIONS, + appInfo.properties.getProperty(PROPAGATE_APPLICATION_EXCEPTIONS, "false")))) { propagateApplicationExceptions(appInfo, classLoader, allDeployments); } @@ -1025,11 +1029,11 @@ public class Assembler extends Assembler final MethodContext methodContext = entry.getValue(); for (final ScheduleData scheduleData : methodContext.getSchedules()) { timerStore.createCalendarTimer(timerService, - (String) beanContext.getDeploymentID(), - null, - entry.getKey(), - scheduleData.getExpression(), - scheduleData.getConfig()); + (String) beanContext.getDeploymentID(), + null, + entry.getKey(), + scheduleData.getExpression(), + scheduleData.getConfig()); } } beanContext.setEjbTimerService(timerService); @@ -1101,7 +1105,7 @@ public class Assembler extends Assembler if (container.getBeanContext(deployment.getDeploymentID()) == null) { container.deploy(deployment); if (!((String) deployment.getDeploymentID()).endsWith(".Comp") - && !deployment.isHidden()) { + && !deployment.isHidden()) { logger.info("createApplication.createdEjb", deployment.getDeploymentID(), deployment.getEjbName(), container.getContainerID()); } if (logger.isDebugEnabled()) { @@ -1122,7 +1126,7 @@ public class Assembler extends Assembler final Container container = deployment.getContainer(); container.start(deployment); if (!((String) deployment.getDeploymentID()).endsWith(".Comp") - && !deployment.isHidden()) { + && !deployment.isHidden()) { logger.info("createApplication.startedEjb", deployment.getDeploymentID(), deployment.getEjbName(), container.getContainerID()); } } catch (Throwable t) { @@ -1166,10 +1170,10 @@ public class Assembler extends Assembler final MBeanServer server = LocalMBeanServer.get(); try { final ObjectName leaf = new ObjectNameBuilder("openejb.user.mbeans") - .set("application", id) - .set("group", clazz.getPackage().getName()) - .set("name", clazz.getSimpleName()) - .build(); + .set("application", id) + .set("group", clazz.getPackage().getName()) + .set("name", clazz.getSimpleName()) + .build(); server.registerMBean(new DynamicMBeanWrapper(wc, instance), leaf); appMbeans.put(mbeanClass, leaf.getCanonicalName()); @@ -1637,7 +1641,7 @@ public class Assembler extends Assembler } } catch (NamingException e) { undeployException.getCauses().add(new Exception("Unable to prune openejb/Deployments and openejb/local namespaces, this could cause future deployments to fail.", - e)); + e)); } deployments.clear(); @@ -1817,6 +1821,37 @@ public class Assembler extends Assembler final URL[] filtered = jars.toArray(new URL[jars.size()]); + // some lib (DS for instance) rely on AppClassLoader for CDI bean manager usage (common for tests cases where you + // try to get the app BM from the AppClassLoader having stored it in a map). + // since we don't really need to create a classloader here when starting from classpath just let skip this step + if (SKIP_APP_LOADER_IF_POSSIBLE) { // TODO: maybe use a boolean to know if all urls comes from the classpath to avoid this validation + final Collection<File> urls = new ArrayList<File>(); + for (final URL url : ClassLoaders.findUrls(parent)) { // need to convert it to file since urls can be file:/xxx or jar:file:///xxx + try { + urls.add(URLs.toFile(url)); + } catch (final Exception ignored) { + // no-op + } + } + + boolean allIsIntheClasspath = true; + for (final URL url : filtered) { + try { + if (!urls.contains(URLs.toFile(url))) { + allIsIntheClasspath = false; + break; + } + } catch (final Exception ignored) { + allIsIntheClasspath = false; + break; + } + } + + if (allIsIntheClasspath) { + return parent; + } + } + if (!appInfo.delegateFirst) { return ClassLoaderUtil.createClassLoader(appInfo.path, filtered, parent); } @@ -1831,7 +1866,7 @@ public class Assembler extends Assembler initialContext = new InitialContext(contextInfo.properties); } catch (NamingException ne) { throw new OpenEJBException(String.format("JndiProvider(id=\"%s\") could not be created. Failed to create the InitialContext using the supplied properties", - contextInfo.id), ne); + contextInfo.id), ne); } try { @@ -2008,10 +2043,10 @@ public class Assembler extends Assembler for (final Map.Entry<Object, Object> entry : p.entrySet()) { final String key = entry.getKey().toString(); if (!props.containsKey(key) - // never override from Definition, just use it to complete the properties set - && - !(key.equalsIgnoreCase("url") && - props.containsKey("JdbcUrl"))) { // with @DataSource we can get both, see org.apache.openejb.config.ConvertDataSourceDefinitions.rawDefinition() + // never override from Definition, just use it to complete the properties set + && + !(key.equalsIgnoreCase("url") && + props.containsKey("JdbcUrl"))) { // with @DataSource we can get both, see org.apache.openejb.config.ConvertDataSourceDefinitions.rawDefinition() props.put(key, entry.getValue()); } } @@ -2065,8 +2100,8 @@ public class Assembler extends Assembler final BootstrapContext bootstrapContext; if (transactionManager instanceof GeronimoTransactionManager) { bootstrapContext = new GeronimoBootstrapContext((GeronimoWorkManager) workManager, - (GeronimoTransactionManager) transactionManager, - (GeronimoTransactionManager) transactionManager); + (GeronimoTransactionManager) transactionManager, + (GeronimoTransactionManager) transactionManager); } else if (transactionManager instanceof XATerminator) { bootstrapContext = new SimpleBootstrapContext(workManager, (XATerminator) transactionManager); } else { @@ -2129,7 +2164,7 @@ public class Assembler extends Assembler // init cm if needed final Object eagerInit = unset.remove("eagerInit"); if (eagerInit != null && eagerInit instanceof String && "true".equalsIgnoreCase((String) eagerInit) - && connectionManager instanceof AbstractConnectionManager) { + && connectionManager instanceof AbstractConnectionManager) { try { ((AbstractConnectionManager) connectionManager).doStart(); try { @@ -2184,7 +2219,7 @@ public class Assembler extends Assembler bindResource(alias, service); } if (serviceInfo.originAppName != null && !serviceInfo.originAppName.isEmpty() && !"/".equals(serviceInfo.originAppName) - && !serviceInfo.id.startsWith("global")) { + && !serviceInfo.id.startsWith("global")) { final String baseJndiName = serviceInfo.id.substring(serviceInfo.originAppName.length() + 1); serviceInfo.aliases.add(baseJndiName); final ContextualJndiReference ref = new ContextualJndiReference(baseJndiName); @@ -2596,14 +2631,14 @@ public class Assembler extends Assembler } public void afterApplicationCreated( - @Observes - final AssemblerAfterApplicationCreated event) { + @Observes + final AssemblerAfterApplicationCreated event) { delegate.afterApplicationCreated(event.getApp()); } public void beforeApplicationDestroyed( - @Observes - final AssemblerBeforeApplicationDestroyed event) { + @Observes + final AssemblerBeforeApplicationDestroyed event) { delegate.beforeApplicationDestroyed(event.getApp()); } Modified: tomee/tomee/trunk/pom.xml URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/pom.xml?rev=1482735&r1=1482734&r2=1482735&view=diff ============================================================================== --- tomee/tomee/trunk/pom.xml (original) +++ tomee/tomee/trunk/pom.xml Wed May 15 09:13:24 2013 @@ -97,7 +97,7 @@ <maven-bundle-plugin.version>2.3.7</maven-bundle-plugin.version> <!-- This is used by a manifest classpath entry --> - <xbeanVersion>3.13</xbeanVersion> + <xbeanVersion>3.14-SNAPSHOT</xbeanVersion> <!-- OSGi bundles properties --> <openejb.bundle.activator/>