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/>


Reply via email to