Author: rmannibucau
Date: Fri Jul 22 09:39:23 2011
New Revision: 1149524

URL: http://svn.apache.org/viewvc?rev=1149524&view=rev
Log:
OPENEJB-1046 deploying webservices into a webcontext too if specified

Modified:
    
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWsRegistry.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
    
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/OpenEJBHttpWsRegistry.java
    
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsRegistry.java
    
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
    
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsServlet.java

Modified: 
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWsRegistry.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWsRegistry.java?rev=1149524&r1=1149523&r2=1149524&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWsRegistry.java
 (original)
+++ 
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWsRegistry.java
 Fri Jul 22 09:39:23 2011
@@ -17,6 +17,13 @@
  */
 package org.apache.openejb.tomcat.catalina;
 
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 import org.apache.catalina.Container;
 import org.apache.catalina.Context;
 import org.apache.catalina.Engine;
@@ -36,8 +43,6 @@ import org.apache.catalina.core.Standard
 import org.apache.catalina.deploy.LoginConfig;
 import org.apache.catalina.deploy.SecurityCollection;
 import org.apache.catalina.deploy.SecurityConstraint;
-import org.apache.openejb.ClassLoaderUtil;
-import org.apache.openejb.core.webservices.JaxWsUtils;
 import org.apache.openejb.server.httpd.HttpListener;
 import org.apache.openejb.server.webservices.WsRegistry;
 import org.apache.openejb.server.webservices.WsServlet;
@@ -46,20 +51,13 @@ import org.apache.openejb.tomcat.loader.
 import static org.apache.openejb.tomcat.catalina.BackportUtil.getServlet;
 import static 
org.apache.openejb.tomcat.catalina.TomcatWebAppBuilder.IGNORE_CONTEXT;
 
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
 public class TomcatWsRegistry implements WsRegistry {
-    private final Map<String, StandardContext> webserviceContexts = new 
TreeMap<String, StandardContext>();
+    private final Map<String, Context> webserviceContexts = new 
TreeMap<String, Context>();
     private Engine engine;
     private List<Connector> connectors;
 
     public TomcatWsRegistry() {
-        StandardServer standardServer = (StandardServer) 
TomcatHelper.getServer();
+        StandardServer standardServer = TomcatHelper.getServer();
         for (Service service : standardServer.findServices()) {
             if (service.getContainer() instanceof Engine) {
                 connectors = Arrays.asList(service.findConnectors());
@@ -134,7 +132,7 @@ public class TomcatWsRegistry implements
         }
     }
 
-    public List<String> addWsContainer(String path, HttpListener httpListener, 
String virtualHost, String realmName, String transportGuarantee, String 
authMethod, ClassLoader classLoader) throws Exception {
+    public List<String> addWsContainer(String webContext, String path, 
HttpListener httpListener, String virtualHost, String realmName, String 
transportGuarantee, String authMethod, ClassLoader classLoader) throws 
Exception {
         if (path == null) throw new NullPointerException("contextRoot is 
null");
         if (httpListener == null) throw new NullPointerException("httpListener 
is null");
 
@@ -148,7 +146,27 @@ public class TomcatWsRegistry implements
             throw new IllegalArgumentException("Invalid virtual host '" + 
virtualHost + "'.  Do you have a matchiing Host entry in the server.xml?");
         }
 
-        // build the context
+        List<String> addresses = new ArrayList<String>();
+
+        // build contexts
+        // - old way (/*)
+        Context context = createNewContext(path, classLoader, authMethod, 
transportGuarantee, realmName);
+        host.addChild(context);
+        addServlet(host, context, "/*", httpListener, path, addresses);
+
+        // - new way (/<webappcontext>/webservices/*) if webcontext is 
specified
+        if (webContext != null) {
+            String root = webContext;
+            if (!root.startsWith("/")) {
+                root = '/' + root;
+            }
+            Context webAppContext = (Context) host.findChild(root);
+            addServlet(host, webAppContext, "/webservices/*", httpListener, 
path, addresses);
+        }
+        return addresses;
+    }
+
+    private static Context createNewContext(String path, ClassLoader 
classLoader, String authMethod, String transportGuarantee, String realmName) {
         StandardContext context = new StandardContext();
         context.setPath(path);
         context.setDocBase("");
@@ -160,12 +178,12 @@ public class TomcatWsRegistry implements
         context.addLifecycleListener(new LifecycleListener() {
             public void lifecycleEvent(LifecycleEvent event) {
                Context context = (Context) event.getLifecycle();
-               
+
                if (event.getType().equals(Lifecycle.BEFORE_START_EVENT)) {
-                       
context.getServletContext().setAttribute(IGNORE_CONTEXT, "true");       
+                       
context.getServletContext().setAttribute(IGNORE_CONTEXT, "true");
                }
-               
-               
+
+
                if (event.getType().equals(Lifecycle.START_EVENT) || 
event.getType().equals(Lifecycle.BEFORE_START_EVENT) || 
event.getType().equals("configure_start")) {
                     context.setConfigured(true);
                 }
@@ -221,8 +239,10 @@ public class TomcatWsRegistry implements
             throw new IllegalArgumentException("Invalid authMethod: " + 
authMethod);
         }
 
-        // Mark this as a dynamic context that should not be inspected by the 
TomcatWebAppBuilder
+        return context;
+    }
 
+    private void addServlet(Container host, Context context, String mapping, 
HttpListener httpListener, String path, List<String> addresses) {
         // build the servlet
         Wrapper wrapper = context.createWrapper();
         wrapper.setName("webservice");
@@ -230,27 +250,26 @@ public class TomcatWsRegistry implements
 
         // add servlet to context
         context.addChild(wrapper);
-        wrapper.addMapping("/*");
-        context.addServletMapping("/*", "webservice");
+        wrapper.addMapping(mapping);
+        context.addServletMapping(mapping, "webservice");
 
         String webServicecontainerID = wrapper.getName() + 
WsServlet.WEBSERVICE_CONTAINER + httpListener.hashCode();
         wrapper.addInitParameter(WsServlet.WEBSERVICE_CONTAINER, 
webServicecontainerID);
-        
-        // add context to host
-        host.addChild(context);
 
-               context.getServletContext().setAttribute(IGNORE_CONTEXT, 
"true");
-               setWsContainer(context, wrapper, httpListener);
-               
+        context.getServletContext().setAttribute(IGNORE_CONTEXT, "true");
+        setWsContainer(context, wrapper, httpListener);
+
         webserviceContexts.put(path, context);
 
         // register wsdl locations for service-ref resolution
-        List<String> addresses = new ArrayList<String>();
         for (Connector connector : connectors) {
-            URI address = new URI(connector.getScheme(), null, host.getName(), 
connector.getPort(), path, null, null);
-            addresses.add(address.toString());
+            try {
+                URI address = new URI(connector.getScheme(), null, 
host.getName(), connector.getPort(), path, null, null);
+                addresses.add(address.toString());
+            } catch (URISyntaxException ignored) {
+                // no-op
+            }
         }
-        return addresses;
     }
 
     public void removeWsContainer(String path) {
@@ -263,7 +282,7 @@ public class TomcatWsRegistry implements
                return;
         }
         
-        StandardContext context = webserviceContexts.remove(path);
+        Context context = webserviceContexts.remove(path);
         try {
             context.stop();
             context.destroy();

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java?rev=1149524&r1=1149523&r2=1149524&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/WebAppInfo.java
 Fri Jul 22 09:39:23 2011
@@ -34,6 +34,7 @@ public class WebAppInfo extends Validati
     public final Set<String> watchedResources = new TreeSet<String>();
     public final Set<String> restClass = new TreeSet<String>();
     public final Set<String> restApplications = new TreeSet<String>();
+    public final Set<String> ejbWebServices = new TreeSet<String>();
     public final List<PortInfo> portInfos = new ArrayList<PortInfo>();
     public final JndiEncInfo jndiEnc = new JndiEncInfo();
     public final List<ServletInfo> servlets = new ArrayList<ServletInfo>();

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java?rev=1149524&r1=1149523&r2=1149524&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
 Fri Jul 22 09:39:23 2011
@@ -962,8 +962,10 @@ public class AnnotationDeployer implemen
 
             for (Class<?> webServiceClass : classes) {
                 // If this class is also annotated @Stateless or @Singleton, 
we should skip it
-                if (webServiceClass.isAnnotationPresent(Singleton.class)) 
continue;
-                if (webServiceClass.isAnnotationPresent(Stateless.class)) 
continue;
+                if (webServiceClass.isAnnotationPresent(Singleton.class) || 
webServiceClass.isAnnotationPresent(Stateless.class)) {
+                    
webModule.getEjbWebServices().add(webServiceClass.getName());
+                    continue;
+                }
 
                 int modifiers = webServiceClass.getModifiers();
                 if (!Modifier.isPublic(modifiers) || 
Modifier.isFinal(modifiers) || isAbstract(modifiers)) {

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java?rev=1149524&r1=1149523&r2=1149524&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AppInfoBuilder.java
 Fri Jul 22 09:39:23 2011
@@ -303,6 +303,7 @@ class AppInfoBuilder {
             webAppInfo.uniqueId = webModule.getUniqueId();
             
webAppInfo.restApplications.addAll(webModule.getRestApplications());
             webAppInfo.restClass.addAll(webModule.getRestClasses());
+            webAppInfo.ejbWebServices.addAll(webModule.getEjbWebServices());
 
             webAppInfo.host = webModule.getHost();
             webAppInfo.contextRoot = webModule.getContextRoot();

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java?rev=1149524&r1=1149523&r2=1149524&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/WebModule.java
 Fri Jul 22 09:39:23 2011
@@ -49,6 +49,7 @@ public class WebModule extends Module im
     private final List<FacesConfig> facesConfigs = new 
ArrayList<FacesConfig>();
     private IAnnotationFinder finder;
     private final Set<String> restClasses = new TreeSet<String>();
+    private final Set<String> ejbWebServices = new TreeSet<String>();
     private final Set<String> restApplications = new TreeSet<String>();
 
     private ID id;
@@ -185,4 +186,8 @@ public class WebModule extends Module im
     public Set<String> getRestApplications() {
         return restApplications;
     }
+
+    public Set<String> getEjbWebServices() {
+        return ejbWebServices;
+    }
 }

Modified: 
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/OpenEJBHttpWsRegistry.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/OpenEJBHttpWsRegistry.java?rev=1149524&r1=1149523&r2=1149524&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/OpenEJBHttpWsRegistry.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/OpenEJBHttpWsRegistry.java
 Fri Jul 22 09:39:23 2011
@@ -31,7 +31,7 @@ public class OpenEJBHttpWsRegistry exten
     public void clearWsContainer(String virtualHost, String contextRoot, 
String servletName) {
     }
 
-    public List<String> addWsContainer(String path, HttpListener httpListener, 
String virtualHost, // ignored
+    public List<String> addWsContainer(String context, String path, 
HttpListener httpListener, String virtualHost, // ignored
             String realmName, // ignored
             String transportGuarantee, // ignored
             String authMethod, // ignored
@@ -44,7 +44,15 @@ public class OpenEJBHttpWsRegistry exten
             httpListener = new BasicAuthHttpListenerWrapper(httpListener, 
realmName);
         }
 
-        addWrappedHttpListener(httpListener, classLoader, path);
+        StringBuilder deployedPath = new StringBuilder("");
+        if (context != null) {
+            deployedPath.append(context);
+            if (!context.endsWith("/")) {
+                deployedPath.append("/");
+            }
+        }
+        deployedPath.append(path);
+        addWrappedHttpListener(httpListener, classLoader, 
deployedPath.toString());
 
         // register wsdl locations for service-ref resolution
         return getResolvedAddresses(path);

Modified: 
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsRegistry.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsRegistry.java?rev=1149524&r1=1149523&r2=1149524&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsRegistry.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsRegistry.java
 Fri Jul 22 09:39:23 2011
@@ -25,7 +25,7 @@ public interface WsRegistry {
 
     void clearWsContainer(String virtualHost, String contextRoot, String 
servletName);
 
-    List<String> addWsContainer(String path, HttpListener httpListener, String 
virtualHost, String realmName, String transportGuarantee, String authMethod, 
ClassLoader classLoader) throws Exception;
+    List<String> addWsContainer(String context, String path, HttpListener 
httpListener, String virtualHost, String realmName, String transportGuarantee, 
String authMethod, ClassLoader classLoader) throws Exception;
 
     void removeWsContainer(String path);
 }

Modified: 
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java?rev=1149524&r1=1149523&r2=1149524&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
 Fri Jul 22 09:39:23 2011
@@ -18,6 +18,7 @@
 package org.apache.openejb.server.webservices;
 
 import org.apache.openejb.BeanContext;
+import org.apache.openejb.jee.WebApp;
 import org.apache.openejb.server.ServerService;
 import org.apache.openejb.server.SelfManaging;
 import org.apache.openejb.server.ServiceException;
@@ -196,6 +197,13 @@ public abstract class WsService implemen
 
     public void afterApplicationCreated(AppInfo appInfo) {
         if (deployedApplications.add(appInfo)) {
+            Map<String, String> webContextByEjb = new HashMap<String, 
String>();
+            for (WebAppInfo webApp : appInfo.webApps) {
+                for (String ejb : webApp.ejbWebServices) {
+                    webContextByEjb.put(ejb, webApp.contextRoot);
+                }
+            }
+
             Map<String,String> contextData = new HashMap<String,String>();
             contextData.put("appId", appInfo.path);
             for (EjbJarInfo ejbJar : appInfo.ejbJars) {
@@ -253,9 +261,9 @@ public abstract class WsService implemen
                                     transport = portInfo.transportGuarantee;
                                 }
 
-                                List<String> addresses = 
wsRegistry.addWsContainer(location, container, virtualHost, realm, transport, 
auth, classLoader);
+                                List<String> addresses = 
wsRegistry.addWsContainer(webContextByEjb.get(bean.ejbClass), location, 
container, virtualHost, realm, transport, auth, classLoader);
 
-                                // one of the registered addresses to be the 
connonical address
+                                // one of the registered addresses to be the 
cannonical address
                                 String address = 
HttpUtil.selectSingleAddress(addresses);
 
                                 if (address != null) {

Modified: 
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsServlet.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsServlet.java?rev=1149524&r1=1149523&r2=1149524&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsServlet.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsServlet.java
 Fri Jul 22 09:39:23 2011
@@ -82,7 +82,7 @@ public class WsServlet implements Servle
     public void service(ServletRequest req, ServletResponse res) throws 
ServletException, IOException {
         HttpListener service = getService();
         if (service == null) throw new ServletException("WebServiceContainer 
has not been set");
-        
+
         ServletEndpointContext context = getContext();
         endpointContext.set(new InvocationContext((HttpServletRequest) req));
         try {


Reply via email to