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 {