Author: rmannibucau
Date: Wed Mar  6 06:50:54 2013
New Revision: 1453172

URL: http://svn.apache.org/r1453172
Log:
TOMEE-784 multiple applications deployment

Added:
    
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/MultipleApplicationsTest.java
Modified:
    
tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java

Added: 
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/MultipleApplicationsTest.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/MultipleApplicationsTest.java?rev=1453172&view=auto
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/MultipleApplicationsTest.java
 (added)
+++ 
tomee/tomee/trunk/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/MultipleApplicationsTest.java
 Wed Mar  6 06:50:54 2013
@@ -0,0 +1,71 @@
+/*
+ *     Licensed to the Apache Software Foundation (ASF) under one or more
+ *     contributor license agreements.  See the NOTICE file distributed with
+ *     this work for additional information regarding copyright ownership.
+ *     The ASF licenses this file to You under the Apache License, Version 2.0
+ *     (the "License"); you may not use this file except in compliance with
+ *     the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *     Unless required by applicable law or agreed to in writing, software
+ *     distributed under the License is distributed on an "AS IS" BASIS,
+ *     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *     See the License for the specific language governing permissions and
+ *     limitations under the License.
+ */
+package org.apache.openejb.server.cxf.rs;
+
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.openejb.jee.WebApp;
+import org.apache.openejb.junit.ApplicationComposer;
+import org.apache.openejb.server.cxf.rs.beans.MyFirstRestClass;
+import org.apache.openejb.server.cxf.rs.beans.MySecondRestClass;
+import org.apache.openejb.testing.Classes;
+import org.apache.openejb.testing.EnableServices;
+import org.apache.openejb.testing.Module;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import javax.ws.rs.ApplicationPath;
+import javax.ws.rs.core.Application;
+import java.util.Collections;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+
+@EnableServices("jax-rs")
+@RunWith(ApplicationComposer.class)
+public class MultipleApplicationsTest {
+    @Module
+    @Classes(cdi = true, value = { Application1.class, Application2.class, 
MyFirstRestClass.class })
+    public WebApp war() {
+        return new WebApp().contextRoot("foo");
+    }
+
+    @Test
+    public void app1() {
+        assertEquals("Hi from REST World!", 
WebClient.create("http://localhost:4204/foo/";).path("app1/first/hi").get(String.class));
+    }
+
+    @Test
+    public void app2() {
+        assertEquals("hi bar", 
WebClient.create("http://localhost:4204/foo/";).path("app2/second/hi2/bar").get(String.class));
+    }
+
+    @ApplicationPath("app1")
+    public static class Application1 extends Application {
+        @Override
+        public Set<Class<?>> getClasses() {
+            return Collections.<Class<?>>singleton(MyFirstRestClass.class);
+        }
+    }
+
+    @ApplicationPath("app2")
+    public static class Application2 extends Application {
+        @Override
+        public Set<Class<?>> getClasses() {
+            return Collections.<Class<?>>singleton(MySecondRestClass.class);
+        }
+    }
+}

Modified: 
tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java?rev=1453172&r1=1453171&r2=1453172&view=diff
==============================================================================
--- 
tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
 (original)
+++ 
tomee/tomee/trunk/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
 Wed Mar  6 06:50:54 2013
@@ -20,15 +20,7 @@ package org.apache.openejb.server.rest;
 import org.apache.openejb.BeanContext;
 import org.apache.openejb.BeanType;
 import org.apache.openejb.Injection;
-import org.apache.openejb.assembler.classic.AppInfo;
-import org.apache.openejb.assembler.classic.Assembler;
-import org.apache.openejb.assembler.classic.EjbJarInfo;
-import org.apache.openejb.assembler.classic.EnterpriseBeanInfo;
-import org.apache.openejb.assembler.classic.IdPropertiesInfo;
-import org.apache.openejb.assembler.classic.ParamValueInfo;
-import org.apache.openejb.assembler.classic.ServiceInfo;
-import org.apache.openejb.assembler.classic.ServletInfo;
-import org.apache.openejb.assembler.classic.WebAppInfo;
+import org.apache.openejb.assembler.classic.*;
 import 
org.apache.openejb.assembler.classic.event.AssemblerAfterApplicationCreated;
 import 
org.apache.openejb.assembler.classic.event.AssemblerBeforeApplicationDestroyed;
 import org.apache.openejb.assembler.classic.util.PojoUtil;
@@ -58,19 +50,8 @@ import javax.ws.rs.ext.Provider;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.net.MalformedURLException;
-import java.net.Socket;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
+import java.net.*;
+import java.util.*;
 
 public abstract class RESTService implements ServerService, SelfManaging {
 
@@ -139,13 +120,12 @@ public abstract class RESTService implem
         try {
             boolean deploymentWithApplication = 
"true".equalsIgnoreCase(appInfo.properties.getProperty(OPENEJB_USE_APPLICATION_PROPERTY,
 APPLICATION_DEPLOYMENT));
             if (deploymentWithApplication) {
-                Application application = null;
-                boolean appSkipped = false;
-                String prefix = "/";
-
-                final Class<?> appClazz;
-                if (webApp.restApplications.size() == 1) {
-                    final String app = 
webApp.restApplications.iterator().next();
+                Class<?> appClazz;
+                for (final String app : webApp.restApplications) {
+                    Application application;
+                    boolean appSkipped = false;
+                    String prefix = "/";
+
                     try {
                         appClazz = classLoader.loadClass(app);
                         application = 
Application.class.cast(appClazz.newInstance());
@@ -202,170 +182,225 @@ public abstract class RESTService implem
                             prefix += wildcard;
                         }
                     }
-                }
 
-                if (deploymentWithApplication) { // don't do it if we detected 
we should use old deployment
-                    if (appSkipped || application == null) {
-                        application = new InternalApplication(application);
+                    if (deploymentWithApplication) { // don't do it if we 
detected we should use old deployment
+                        if (appSkipped || application == null) {
+                            application = new InternalApplication(application);
 
-                        for (final String clazz : webApp.restClass) {
-                            try {
-                                final Class<?> loaded = 
classLoader.loadClass(clazz);
-                                if (!isProvider(loaded)) {
-                                    pojoConfigurations = 
PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
-                                    if 
(PojoUtil.findConfiguration(pojoConfigurations, loaded.getName()) != null) {
-                                        deploymentWithApplication = false;
-                                        
logOldDeploymentUsage(loaded.getName());
-                                        break;
+                            for (final String clazz : webApp.restClass) {
+                                try {
+                                    final Class<?> loaded = 
classLoader.loadClass(clazz);
+                                    if (!isProvider(loaded)) {
+                                        pojoConfigurations = 
PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
+                                        if 
(PojoUtil.findConfiguration(pojoConfigurations, loaded.getName()) != null) {
+                                            deploymentWithApplication = false;
+                                            
logOldDeploymentUsage(loaded.getName());
+                                            break;
+                                        }
+                                        application.getClasses().add(loaded);
+                                    } else {
+                                        additionalProviders.add(loaded);
                                     }
-                                    application.getClasses().add(loaded);
-                                } else {
-                                    additionalProviders.add(loaded);
+                                } catch (Exception e) {
+                                    throw new 
OpenEJBRestRuntimeException("can't load class " + clazz, e);
                                 }
-                            } catch (Exception e) {
-                                throw new OpenEJBRestRuntimeException("can't 
load class " + clazz, e);
-                            }
-                        }
-                        if (deploymentWithApplication) {
-                            for (final Map.Entry<String, EJBRestServiceInfo> 
ejb : restEjbs.entrySet()) {
-                                
application.getClasses().add(ejb.getValue().context.getBeanClass());
                             }
-                            if (!prefix.endsWith(wildcard)) {
-                                prefix += wildcard;
+                            if (deploymentWithApplication) {
+                                addEjbToApplication(application, restEjbs);
+                                if (!prefix.endsWith(wildcard)) {
+                                    prefix += wildcard;
+                                }
                             }
                         }
+
+                        if (!application.getClasses().isEmpty() || 
!application.getSingletons().isEmpty()) {
+                            pojoConfigurations = 
PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
+                            deployApplication(appInfo, webApp.contextRoot, 
restEjbs, classLoader, injections, owbCtx, context, additionalProviders, 
pojoConfigurations, application, prefix);
+                        }
                     }
 
-                    if (!application.getClasses().isEmpty() || 
!application.getSingletons().isEmpty()) {
-                        pojoConfigurations = 
PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
-                        deployApplication(appInfo, webApp.contextRoot, 
restEjbs, classLoader, injections, owbCtx, context, additionalProviders, 
pojoConfigurations, application, prefix);
+                    if (!deploymentWithApplication) {
+                        fullServletDeployment(appInfo, webApp, webContext, 
restEjbs, classLoader, injections, owbCtx, context, additionalProviders, 
pojoConfigurations);
                     }
                 }
-            }
 
-            if (!deploymentWithApplication) {
-                // The spec says:
-                //
-                // "The resources and providers that make up a JAX-RS 
application are configured via an application-supplied
-                // subclass of Application. An implementation MAY provide 
alternate mechanisms for locating resource
-                // classes and providers (e.g. runtime class scanning) but use 
of Application is the only portable means of
-                //  configuration."
-                //
-                //  The choice here is to deploy using the Application if it 
exists or to use the scanned classes
-                //  if there is no Application.
-                //
-                //  Like this providing an Application subclass user can 
totally control deployed services.
-
-                boolean useApp = false;
-                String appPrefix = webApp.contextRoot;
-                for (final String app : webApp.restApplications) { // normally 
a unique one but we support more
-                    appPrefix = webApp.contextRoot; // if multiple application 
classes reinit it
-                    if (!appPrefix.endsWith("/")) {
-                        appPrefix += "/";
+                if (webApp.restApplications.isEmpty()) {
+                    final Application application = new 
InternalApplication(null);
+                    for (final String clazz : webApp.restClass) {
+                        try {
+                            final Class<?> loaded = 
classLoader.loadClass(clazz);
+                            if (!isProvider(loaded)) {
+                                pojoConfigurations = 
PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
+                                if 
(PojoUtil.findConfiguration(pojoConfigurations, loaded.getName()) != null) {
+                                    deploymentWithApplication = false;
+                                    logOldDeploymentUsage(loaded.getName());
+                                    break;
+                                }
+                                application.getClasses().add(loaded);
+                            } else {
+                                additionalProviders.add(loaded);
+                            }
+                        } catch (Exception e) {
+                            throw new OpenEJBRestRuntimeException("can't load 
class " + clazz, e);
+                        }
                     }
+                    addEjbToApplication(application, restEjbs);
 
-                    final Application appInstance;
-                    final Class<?> appClazz;
-                    try {
-                        appClazz = classLoader.loadClass(app);
-                        appInstance = 
Application.class.cast(appClazz.newInstance());
-                        if (owbCtx.getBeanManagerImpl().isInUse()) {
-                            try {
-                                webContext.inject(appInstance);
-                            } catch (Exception e) {
-                                // not important since not required by the spec
+                    if (deploymentWithApplication) {
+                        if (!application.getClasses().isEmpty() || 
!application.getSingletons().isEmpty()) {
+                            final String path = appPrefix(webApp, 
application.getClass());
+                            final String prefix;
+                            if (path != null) {
+                                prefix = "/" + path + wildcard;
+                            } else {
+                                prefix = "/" + wildcard;
                             }
+
+                            pojoConfigurations = 
PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
+                            deployApplication(appInfo, webApp.contextRoot, 
restEjbs, classLoader, injections, owbCtx, context, additionalProviders, 
pojoConfigurations, application, prefix);
                         }
-                    } catch (Exception e) {
-                        throw new OpenEJBRestRuntimeException("can't create 
class " + app, e);
+                    } else {
+                        fullServletDeployment(appInfo, webApp, webContext, 
restEjbs, classLoader, injections, owbCtx, context, additionalProviders, 
pojoConfigurations);
                     }
+                }
+            } else {
+                fullServletDeployment(appInfo, webApp, webContext, restEjbs, 
classLoader, injections, owbCtx, context, additionalProviders, 
pojoConfigurations);
+            }
+        } finally {
+            Thread.currentThread().setContextClassLoader(oldLoader);
+        }
+    }
 
-                    final String path = appPrefix(webApp, appClazz);
-                    if (path != null) {
-                        appPrefix += path;
-                    }
+    private void addEjbToApplication(Application application, Map<String, 
EJBRestServiceInfo> restEjbs) {
+        for (final Map.Entry<String, EJBRestServiceInfo> ejb : 
restEjbs.entrySet()) {
+            
application.getClasses().add(ejb.getValue().context.getBeanClass());
+        }
+    }
 
-                    final Set<Class<?>> classes = appInstance.getClasses();
-                    final Set<Object> singletons = appInstance.getSingletons();
+    private void fullServletDeployment(final AppInfo appInfo, final WebAppInfo 
webApp, final WebContext webContext,
+                                       final Map<String, EJBRestServiceInfo> 
restEjbs, final ClassLoader classLoader,
+                                       final Collection<Injection> injections, 
final WebBeansContext owbCtx,
+                                       final Context context, final 
Collection<Object> additionalProviders,
+                                       final Collection<IdPropertiesInfo> 
initPojoConfigurations) {
+        // The spec says:
+        //
+        // "The resources and providers that make up a JAX-RS application are 
configured via an application-supplied
+        // subclass of Application. An implementation MAY provide alternate 
mechanisms for locating resource
+        // classes and providers (e.g. runtime class scanning) but use of 
Application is the only portable means of
+        //  configuration."
+        //
+        //  The choice here is to deploy using the Application if it exists or 
to use the scanned classes
+        //  if there is no Application.
+        //
+        //  Like this providing an Application subclass user can totally 
control deployed services.
+
+        Collection<IdPropertiesInfo> pojoConfigurations = null;
+        boolean useApp = false;
+        String appPrefix = webApp.contextRoot;
+        for (final String app : webApp.restApplications) {
+            appPrefix = webApp.contextRoot; // if multiple application classes 
reinit it
+            if (!appPrefix.endsWith("/")) {
+                appPrefix += "/";
+            }
 
-                    // look for providers
-                    for (final Class<?> clazz : classes) {
-                        if (isProvider(clazz)) {
-                            additionalProviders.add(clazz);
-                        }
-                    }
-                    for (final Object obj : singletons) {
-                        if (obj != null && isProvider(obj.getClass())) {
-                            additionalProviders.add(obj);
-                        }
+            final Application appInstance;
+            final Class<?> appClazz;
+            try {
+                appClazz = classLoader.loadClass(app);
+                appInstance = Application.class.cast(appClazz.newInstance());
+                if (owbCtx.getBeanManagerImpl().isInUse()) {
+                    try {
+                        webContext.inject(appInstance);
+                    } catch (Exception e) {
+                        // not important since not required by the spec
                     }
+                }
+            } catch (Exception e) {
+                throw new OpenEJBRestRuntimeException("can't create class " + 
app, e);
+            }
 
-                    for (final Object o : singletons) {
-                        if (o == null || additionalProviders.contains(o)) {
-                            continue;
-                        }
+            final String path = appPrefix(webApp, appClazz);
+            if (path != null) {
+                appPrefix += path;
+            }
 
-                        if (hasEjbAndIsNotAManagedBean(restEjbs, 
o.getClass().getName())) {
-                            // no more a singleton if the ejb is not a 
singleton...but it is a weird case
-                            deployEJB(webApp.contextRoot, appPrefix, 
restEjbs.get(o.getClass().getName()).context, additionalProviders, 
appInfo.services);
-                        } else {
-                            pojoConfigurations = 
PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
-                            deploySingleton(webApp.contextRoot, appPrefix, o, 
appInstance, classLoader, additionalProviders,
-                                            new 
ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, 
o.getClass().getName()), appInfo.services));
-                        }
-                    }
+            final Set<Class<?>> classes = appInstance.getClasses();
+            final Set<Object> singletons = appInstance.getSingletons();
 
-                    for (final Class<?> clazz : classes) {
-                        if (additionalProviders.contains(clazz)) {
-                            continue;
-                        }
+            // look for providers
+            for (final Class<?> clazz : classes) {
+                if (isProvider(clazz)) {
+                    additionalProviders.add(clazz);
+                }
+            }
+            for (final Object obj : singletons) {
+                if (obj != null && isProvider(obj.getClass())) {
+                    additionalProviders.add(obj);
+                }
+            }
 
-                        if (hasEjbAndIsNotAManagedBean(restEjbs, 
clazz.getName())) {
-                            deployEJB(webApp.contextRoot, appPrefix, 
restEjbs.get(clazz.getName()).context, additionalProviders, appInfo.services);
-                        } else {
-                            pojoConfigurations = 
PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
-                            deployPojo(webApp.contextRoot, appPrefix, clazz, 
appInstance, classLoader, injections, context, owbCtx, additionalProviders,
-                                       new 
ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, 
clazz.getName()), appInfo.services));
-                        }
-                    }
+            for (final Object o : singletons) {
+                if (o == null || additionalProviders.contains(o)) {
+                    continue;
+                }
 
-                    useApp = useApp || classes.size() + singletons.size() > 0;
-                    LOGGER.info("REST application deployed: " + app);
+                if (hasEjbAndIsNotAManagedBean(restEjbs, 
o.getClass().getName())) {
+                    // no more a singleton if the ejb is not a singleton...but 
it is a weird case
+                    deployEJB(webApp.contextRoot, appPrefix, 
restEjbs.get(o.getClass().getName()).context, additionalProviders, 
appInfo.services);
+                } else {
+                    pojoConfigurations = 
PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
+                    deploySingleton(webApp.contextRoot, appPrefix, o, 
appInstance, classLoader, additionalProviders,
+                            new 
ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, 
o.getClass().getName()), appInfo.services));
                 }
+            }
 
-                if (!useApp) {
-                    if (webApp.restApplications.isEmpty() || 
webApp.restApplications.size() > 1) {
-                        appPrefix = webApp.contextRoot;
-                    } // else keep application prefix
+            for (final Class<?> clazz : classes) {
+                if (additionalProviders.contains(clazz)) {
+                    continue;
+                }
 
-                    final Set<String> restClasses = new 
HashSet<String>(webApp.restClass);
-                    restClasses.addAll(webApp.ejbRestServices);
+                if (hasEjbAndIsNotAManagedBean(restEjbs, clazz.getName())) {
+                    deployEJB(webApp.contextRoot, appPrefix, 
restEjbs.get(clazz.getName()).context, additionalProviders, appInfo.services);
+                } else {
+                    pojoConfigurations = 
PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
+                    deployPojo(webApp.contextRoot, appPrefix, clazz, 
appInstance, classLoader, injections, context, owbCtx, additionalProviders,
+                            new 
ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, 
clazz.getName()), appInfo.services));
+                }
+            }
 
-                    for (final String clazz : restClasses) {
-                        if (restEjbs.containsKey(clazz)) {
-                            final BeanContext ctx = 
restEjbs.get(clazz).context;
-                            if (hasEjbAndIsNotAManagedBean(restEjbs, clazz)) {
-                                deployEJB(webApp.contextRoot, appPrefix, 
restEjbs.get(clazz).context, additionalProviders, appInfo.services);
-                            } else {
-                                deployPojo(webApp.contextRoot, appPrefix, 
ctx.getBeanClass(), null, ctx.getClassLoader(), ctx.getInjections(), context,
-                                           owbCtx, additionalProviders, new 
ServiceConfiguration(ctx.getProperties(), appInfo.services));
-                            }
-                        } else {
-                            try {
-                                final Class<?> loadedClazz = 
classLoader.loadClass(clazz);
-                                pojoConfigurations = 
PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
-                                deployPojo(webApp.contextRoot, appPrefix, 
loadedClazz, null, classLoader, injections, context, owbCtx,
-                                           additionalProviders,
-                                           new 
ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, 
loadedClazz.getName()), appInfo.services));
-                            } catch (ClassNotFoundException e) {
-                                throw new OpenEJBRestRuntimeException("can't 
find class " + clazz, e);
-                            }
-                        }
+            useApp = useApp || classes.size() + singletons.size() > 0;
+            LOGGER.info("REST application deployed: " + app);
+        }
+
+        if (!useApp) {
+            if (webApp.restApplications.isEmpty() || 
webApp.restApplications.size() > 1) {
+                appPrefix = webApp.contextRoot;
+            } // else keep application prefix
+
+            final Set<String> restClasses = new 
HashSet<String>(webApp.restClass);
+            restClasses.addAll(webApp.ejbRestServices);
+
+            for (final String clazz : restClasses) {
+                if (restEjbs.containsKey(clazz)) {
+                    final BeanContext ctx = restEjbs.get(clazz).context;
+                    if (hasEjbAndIsNotAManagedBean(restEjbs, clazz)) {
+                        deployEJB(webApp.contextRoot, appPrefix, 
restEjbs.get(clazz).context, additionalProviders, appInfo.services);
+                    } else {
+                        deployPojo(webApp.contextRoot, appPrefix, 
ctx.getBeanClass(), null, ctx.getClassLoader(), ctx.getInjections(), context,
+                                owbCtx, additionalProviders, new 
ServiceConfiguration(ctx.getProperties(), appInfo.services));
+                    }
+                } else {
+                    try {
+                        final Class<?> loadedClazz = 
classLoader.loadClass(clazz);
+                        pojoConfigurations = 
PojoUtil.findPojoConfig(pojoConfigurations, appInfo, webApp);
+                        deployPojo(webApp.contextRoot, appPrefix, loadedClazz, 
null, classLoader, injections, context, owbCtx,
+                                additionalProviders,
+                                new 
ServiceConfiguration(PojoUtil.findConfiguration(pojoConfigurations, 
loadedClazz.getName()), appInfo.services));
+                    } catch (ClassNotFoundException e) {
+                        throw new OpenEJBRestRuntimeException("can't find 
class " + clazz, e);
                     }
                 }
             }
-        } finally {
-            Thread.currentThread().setContextClassLoader(oldLoader);
         }
     }
 
@@ -375,7 +410,7 @@ public abstract class RESTService implem
 
     private void deployApplication(final AppInfo appInfo, final String 
contextRoot, final Map<String, EJBRestServiceInfo> restEjbs, final ClassLoader 
classLoader, final Collection<Injection> injections, final WebBeansContext 
owbCtx, final Context context, final Collection<Object> additionalProviders, 
final Collection<IdPropertiesInfo> pojoConfigurations, final Application 
application, final String prefix) {
         // get configuration
-        Properties configuration = null;
+        Properties configuration;
         if (InternalApplication.class.equals(application.getClass())) {
             final Application original = 
InternalApplication.class.cast(application).getOriginal();
             if (original == null) {
@@ -403,8 +438,8 @@ public abstract class RESTService implem
 
         services.add(new DeployedService(address.complete, contextRoot, 
application.getClass().getName()));
         listener.deployApplication(application, address.complete.substring(0, 
address.complete.length() - wildcard.length()), 
nopath.substring(NOPATH_PREFIX.length(), nopath.length() - wildcard.length()), 
additionalProviders, restEjbs, // app config
-                                   classLoader, injections, context, owbCtx, 
// injection/webapp context
-                                   new ServiceConfiguration(configuration, 
appInfo.services)); // deployment config
+                classLoader, injections, context, owbCtx, // injection/webapp 
context
+                new ServiceConfiguration(configuration, appInfo.services)); // 
deployment config
     }
 
     private static String appPrefix(final WebAppInfo info, final Class<?> 
appClazz) {
@@ -477,8 +512,8 @@ public abstract class RESTService implem
     }
 
     public void afterApplicationCreated(
-                                               @Observes
-                                               final 
AssemblerAfterApplicationCreated event) {
+            @Observes
+            final AssemblerAfterApplicationCreated event) {
         if (!enabled)
             return;
 
@@ -505,9 +540,7 @@ public abstract class RESTService implem
 
                 if 
("true".equalsIgnoreCase(appInfo.properties.getProperty(OPENEJB_USE_APPLICATION_PROPERTY,
 APPLICATION_DEPLOYMENT))) {
                     final Application application = new 
InternalApplication(null);
-                    for (final Map.Entry<String, EJBRestServiceInfo> ejb : 
restEjbs.entrySet()) {
-                        
application.getClasses().add(ejb.getValue().context.getBeanClass());
-                    }
+                    addEjbToApplication(application, restEjbs);
 
                     // merge configurations at app level since a single 
deployment is available
                     final List<IdPropertiesInfo> pojoConfigurations = new 
ArrayList<IdPropertiesInfo>();
@@ -536,16 +569,16 @@ public abstract class RESTService implem
                     }
 
                     deployApplication(appInfo, next.getValue().path, restEjbs, 
comp.getClassLoader(), comp.getInjections(),
-                                      
containerSystem.getAppContext(appInfo.appId).getWebBeansContext(), 
comp.getJndiContext(),
-                                      providers, pojoConfigurations, 
application, wildcard);
+                            
containerSystem.getAppContext(appInfo.appId).getWebBeansContext(), 
comp.getJndiContext(),
+                            providers, pojoConfigurations, application, 
wildcard);
                 } else {
                     for (final Map.Entry<String, EJBRestServiceInfo> ejb : 
restEjbs.entrySet()) {
                         final BeanContext ctx = ejb.getValue().context;
                         if (BeanType.MANAGED.equals(ctx.getComponentType())) {
                             deployPojo("", ejb.getValue().path, 
ctx.getBeanClass(), null, ctx.getClassLoader(), ctx.getInjections(),
-                                       ctx.getJndiContext(),
-                                       
containerSystem.getAppContext(appInfo.appId).getWebBeansContext(),
-                                       providers, new 
ServiceConfiguration(ctx.getProperties(), appInfo.services));
+                                    ctx.getJndiContext(),
+                                    
containerSystem.getAppContext(appInfo.appId).getWebBeansContext(),
+                                    providers, new 
ServiceConfiguration(ctx.getProperties(), appInfo.services));
                         } else {
                             deployEJB("", ejb.getValue().path, ctx, providers, 
appInfo.services);
                         }
@@ -646,7 +679,7 @@ public abstract class RESTService implem
 
         services.add(new DeployedService(address.complete, contextRoot, 
loadedClazz.getName()));
         listener.deployPojo(contextRoot, getFullContext(address.base, 
contextRoot), loadedClazz, app, injections, context, owbCtx,
-                            additionalProviders, config);
+                additionalProviders, config);
 
         LOGGER.info("REST Service: " + address.complete + "  -> Pojo " + 
loadedClazz.getName());
     }
@@ -658,7 +691,7 @@ public abstract class RESTService implem
 
         services.add(new DeployedService(address.complete, context, 
beanContext.getBeanClass().getName()));
         listener.deployEJB(context, getFullContext(address.base, context), 
beanContext,
-                           additionalProviders, new 
ServiceConfiguration(beanContext.getProperties(), serviceInfos));
+                additionalProviders, new 
ServiceConfiguration(beanContext.getProperties(), serviceInfos));
 
         LOGGER.info("REST Service: " + address.complete + "  -> EJB " + 
beanContext.getEjbName());
     }
@@ -802,8 +835,8 @@ public abstract class RESTService implem
     }
 
     public void beforeApplicationDestroyed(
-                                                  @Observes
-                                                  final 
AssemblerBeforeApplicationDestroyed event) {
+            @Observes
+            final AssemblerBeforeApplicationDestroyed event) {
         final AppInfo app = event.getApp();
         if (deployedApplications.contains(app)) {
             for (final WebAppInfo webApp : app.webApps) {


Reply via email to