You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2011/07/19 23:32:33 UTC
svn commit: r1148549 - in /openejb/trunk/openejb3: assembly/
assembly/openejb-tomcat/ assembly/openejb-tomcat/openejb-tomcat-catalina/
assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/
assembly/openejb-to...
Author: rmannibucau
Date: Tue Jul 19 21:32:28 2011
New Revision: 1148549
URL: http://svn.apache.org/viewvc?rev=1148549&view=rev
Log:
adding cxf rs in tomcat - some work around tomcat jndi tree is still to do
Added:
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatRsRegistry.java
openejb/trunk/openejb3/examples/webapps/ejb-examples/src/main/resources/log4j.xml
openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsServlet.java
Modified:
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/pom.xml
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatLoader.java
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java
openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/OpenEJBListener.java
openejb/trunk/openejb3/assembly/openejb-tomcat/pom.xml
openejb/trunk/openejb3/assembly/pom.xml
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.java
openejb/trunk/openejb3/examples/webapps/applet/src/main/java/org/superbiz/applet/CalculatorApplet.java
openejb/trunk/openejb3/examples/webapps/moviefun/app/src/main/java/org/superbiz/moviefun/ActionServlet.java
openejb/trunk/openejb3/examples/webapps/moviefun/monitor/src/main/java/org/superbiz/moviefun/NotificationMonitor.java
openejb/trunk/openejb3/examples/webapps/pom.xml
openejb/trunk/openejb3/server/openejb-cxf-rs/pom.xml
openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestResourceProvider.java
openejb/trunk/openejb3/server/openejb-cxf-transport/pom.xml
openejb/trunk/openejb3/server/openejb-cxf/pom.xml
openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpRegistry.java
openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistry.java
openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistryImpl.java
Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/pom.xml?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/pom.xml (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/pom.xml Tue Jul 19 21:32:28 2011
@@ -62,6 +62,11 @@
</dependency>
<dependency>
<groupId>org.apache.openejb</groupId>
+ <artifactId>openejb-rest</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.openejb</groupId>
<artifactId>openejb-tomcat-common</artifactId>
<version>${project.version}</version>
</dependency>
Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatJndiBuilder.java Tue Jul 19 21:32:28 2011
@@ -48,22 +48,6 @@ import org.apache.openejb.persistence.Jt
import org.apache.openejb.spi.ContainerSystem;
import org.apache.openejb.tomcat.common.EjbFactory;
import org.apache.openejb.tomcat.common.NamingUtil;
-import static org.apache.openejb.tomcat.common.NamingUtil.DEPLOYMENT_ID;
-import static org.apache.openejb.tomcat.common.NamingUtil.EXTENDED;
-import static org.apache.openejb.tomcat.common.NamingUtil.EXTERNAL;
-import static org.apache.openejb.tomcat.common.NamingUtil.JNDI_NAME;
-import static org.apache.openejb.tomcat.common.NamingUtil.JNDI_PROVIDER_ID;
-import static org.apache.openejb.tomcat.common.NamingUtil.LOCAL;
-import static org.apache.openejb.tomcat.common.NamingUtil.LOCALBEAN;
-import static org.apache.openejb.tomcat.common.NamingUtil.NAME;
-import static org.apache.openejb.tomcat.common.NamingUtil.RESOURCE_ID;
-import static org.apache.openejb.tomcat.common.NamingUtil.UNIT;
-import static org.apache.openejb.tomcat.common.NamingUtil.WSDL_URL;
-import static org.apache.openejb.tomcat.common.NamingUtil.WS_CLASS;
-import static org.apache.openejb.tomcat.common.NamingUtil.WS_ID;
-import static org.apache.openejb.tomcat.common.NamingUtil.WS_PORT_QNAME;
-import static org.apache.openejb.tomcat.common.NamingUtil.WS_QNAME;
-import static org.apache.openejb.tomcat.common.NamingUtil.setStaticValue;
import org.apache.openejb.tomcat.common.PersistenceContextFactory;
import org.apache.openejb.tomcat.common.PersistenceUnitFactory;
import org.apache.openejb.tomcat.common.ResourceFactory;
@@ -82,6 +66,23 @@ import java.net.URL;
import java.util.ArrayList;
import java.util.List;
+import static org.apache.openejb.tomcat.common.NamingUtil.DEPLOYMENT_ID;
+import static org.apache.openejb.tomcat.common.NamingUtil.EXTENDED;
+import static org.apache.openejb.tomcat.common.NamingUtil.EXTERNAL;
+import static org.apache.openejb.tomcat.common.NamingUtil.JNDI_NAME;
+import static org.apache.openejb.tomcat.common.NamingUtil.JNDI_PROVIDER_ID;
+import static org.apache.openejb.tomcat.common.NamingUtil.LOCAL;
+import static org.apache.openejb.tomcat.common.NamingUtil.LOCALBEAN;
+import static org.apache.openejb.tomcat.common.NamingUtil.NAME;
+import static org.apache.openejb.tomcat.common.NamingUtil.RESOURCE_ID;
+import static org.apache.openejb.tomcat.common.NamingUtil.UNIT;
+import static org.apache.openejb.tomcat.common.NamingUtil.WSDL_URL;
+import static org.apache.openejb.tomcat.common.NamingUtil.WS_CLASS;
+import static org.apache.openejb.tomcat.common.NamingUtil.WS_ID;
+import static org.apache.openejb.tomcat.common.NamingUtil.WS_PORT_QNAME;
+import static org.apache.openejb.tomcat.common.NamingUtil.WS_QNAME;
+import static org.apache.openejb.tomcat.common.NamingUtil.setStaticValue;
+
public class TomcatJndiBuilder {
private final StandardContext standardContext;
private final WebAppInfo webAppInfo;
Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatLoader.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatLoader.java?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatLoader.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatLoader.java Tue Jul 19 21:32:28 2011
@@ -36,6 +36,7 @@ import org.apache.openejb.server.ServerS
import org.apache.openejb.server.ServiceException;
import org.apache.openejb.server.ServiceManager;
import org.apache.openejb.server.ejbd.EjbServer;
+import org.apache.openejb.server.rest.RsRegistry;
import org.apache.openejb.server.webservices.WsRegistry;
import org.apache.openejb.tomcat.installer.Installer;
import org.apache.openejb.tomcat.installer.Paths;
@@ -49,6 +50,8 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Properties;
/**
@@ -94,6 +97,9 @@ public class TomcatLoader implements Loa
*/
private final String platform;
+ /** other services */
+ private List<ServerService> services = new ArrayList<ServerService> ();
+
/**
* Creates a new instance.
*/
@@ -185,6 +191,12 @@ public class TomcatLoader implements Loa
SystemInstance.get().setComponent(WsRegistry.class, tomcatSoapHandler);
}
+ TomcatRsRegistry tomcatRestHandler = (TomcatRsRegistry) SystemInstance.get().getComponent(RsRegistry.class);
+ if (tomcatRestHandler == null) {
+ tomcatRestHandler = new TomcatRsRegistry();
+ SystemInstance.get().setComponent(RsRegistry.class, tomcatRestHandler);
+ }
+
// Start OpenEJB
ejbServer = new EjbServer();
SystemInstance.get().setComponent(EjbServer.class, ejbServer);
@@ -196,7 +208,7 @@ public class TomcatLoader implements Loa
ejbServer.init(ejbServerProps);
// Add our naming context listener to the server which registers all Tomcat resources with OpenEJB
- StandardServer standardServer = (StandardServer) TomcatHelper.getServer();
+ StandardServer standardServer = TomcatHelper.getServer();
OpenEJBNamingContextListener namingContextListener = new OpenEJBNamingContextListener(standardServer);
// Standard server has no state property, so we check global naming context to determine if server is started yet
if (standardServer.getGlobalNamingContext() != null) {
@@ -213,14 +225,27 @@ public class TomcatLoader implements Loa
manager.init();
manager.start(false);
} else {
+ // WS
try {
- ServerService serverService = (ServerService) Class.forName("org.apache.openejb.server.cxf.CxfService").newInstance();
- serverService.start();
+ ServerService cxfService = (ServerService) Class.forName("org.apache.openejb.server.cxf.CxfService").newInstance();
+ cxfService.start();
+ services.add(cxfService);
} catch (ClassNotFoundException ignored) {
} catch (Exception e) {
Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, getClass());
logger.error("Webservices failed to start", e);
}
+
+ // REST
+ try {
+ ServerService restService = (ServerService) Class.forName("org.apache.openejb.server.cxf.rs.CxfRSService").newInstance();
+ restService.start();
+ services.add(restService);
+ } catch (ClassNotFoundException ignored) {
+ } catch (Exception e) {
+ Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, getClass());
+ logger.error("REST failed to start", e);
+ }
}
standardServer.addLifecycleListener(new LifecycleListener() {
@@ -237,11 +262,20 @@ public class TomcatLoader implements Loa
* Destroy system.
*/
public void destroy() {
+ for (ServerService s : services) {
+ try {
+ s.stop();
+ } catch (ServiceException ignored) {
+ // no-op
+ }
+ }
+
//Stop ServiceManager
if (manager != null) {
try {
manager.stop();
} catch (ServiceException e) {
+ // no-op
}
manager = null;
}
@@ -251,6 +285,7 @@ public class TomcatLoader implements Loa
try {
ejbServer.stop();
} catch (ServiceException e) {
+ // no-op
}
ejbServer = null;
}
Added: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatRsRegistry.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatRsRegistry.java?rev=1148549&view=auto
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatRsRegistry.java (added)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatRsRegistry.java Tue Jul 19 21:32:28 2011
@@ -0,0 +1,152 @@
+/*
+ * 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.tomcat.catalina;
+
+import org.apache.catalina.*;
+import org.apache.catalina.connector.Connector;
+import org.apache.catalina.core.StandardServer;
+import org.apache.openejb.server.httpd.HttpListener;
+import org.apache.openejb.server.rest.RsRegistry;
+import org.apache.openejb.server.rest.RsServlet;
+import org.apache.openejb.tomcat.loader.TomcatHelper;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
+
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+import static org.apache.openejb.tomcat.catalina.TomcatWebAppBuilder.IGNORE_CONTEXT;
+
+public class TomcatRsRegistry implements RsRegistry {
+ private static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB_STARTUP, TomcatRsRegistry.class);
+
+ private Engine engine;
+ private List<Connector> connectors;
+ private final Map<String, Context> contexts = new TreeMap<String, Context>();
+ private final Map<String, HttpListener> listeners = new TreeMap<String, HttpListener>();
+
+ public TomcatRsRegistry() {
+ StandardServer standardServer = TomcatHelper.getServer();
+ for (Service service : standardServer.findServices()) {
+ if (service.getContainer() instanceof Engine) {
+ connectors = Arrays.asList(service.findConnectors());
+ engine = (Engine) service.getContainer();
+ break;
+ }
+ }
+ }
+
+ @Override public List<String> createRsHttpListener(HttpListener listener, ClassLoader classLoader, String completePath, String virtualHost) {
+ String path = completePath;
+ if (path == null) {
+ throw new NullPointerException("contextRoot is null");
+ }
+ if (listener == null) {
+ throw new NullPointerException("listener is null");
+ }
+
+ // assure context root with a leading slash
+ if (!path.startsWith("/")) {
+ path = "/" + path;
+ }
+ String webContext = path.substring(0, path.substring(1).indexOf("/") + 1);
+ path = path.substring(webContext.length(), path.length());
+
+ // find the existing host (we do not auto-create hosts)
+ if (virtualHost == null) virtualHost = engine.getDefaultHost();
+ Container host = engine.findChild(virtualHost);
+ if (host == null) {
+ throw new IllegalArgumentException("Invalid virtual host '" + virtualHost + "'. Do you have a matching Host entry in the server.xml?");
+ }
+
+ // get the webapp context
+ Context context = (Context) host.findChild(webContext);
+ 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");
+ }
+ if (event.getType().equals(Lifecycle.START_EVENT) || event.getType().equals(Lifecycle.BEFORE_START_EVENT) || event.getType().equals("configure_start")) {
+ context.setConfigured(true);
+ }
+ }
+ });
+
+
+ Wrapper wrapper = context.createWrapper();
+ final String name = "rest_" + listener.hashCode();
+ wrapper.setName(name);
+ wrapper.setServletClass(RsServlet.class.getName());
+
+ final String mapping = path.replace("/.*", "/*");
+ context.addChild(wrapper);
+ wrapper.addMapping(mapping);
+ context.addServletMapping(mapping, name);
+
+ final String listenerId = wrapper.getName() + RsServlet.class.getName() + listener.hashCode();
+ wrapper.addInitParameter(HttpListener.class.getName(), listenerId);
+ context.getServletContext().setAttribute(listenerId, listener);
+
+ contexts.put(path, context);
+ listeners.put(path, listener);
+
+ // register wsdl locations for service-ref resolution
+ List<String> addresses = new ArrayList<String>();
+ for (Connector connector : connectors) {
+ URI address;
+ try {
+ address = new URI(connector.getScheme(), null, host.getName(), connector.getPort(), completePath, null, null);
+ } catch (Exception e) { // just an URI problem normally...shouldn't occur
+ LOGGER.error("can't add container for path " + path, e);
+ continue;
+ }
+ addresses.add(address.toString());
+ }
+ return addresses;
+ }
+
+ @Override public HttpListener removeListener(final String completePath) {
+ String path = completePath;
+ if (path == null) {
+ return listeners.get(path);
+ }
+
+ // assure context root with a leading slash
+ if (!path.startsWith("/")) path = "/" + path;
+
+ if (TomcatHelper.isTomcat7() && TomcatHelper.isStopping()) {
+ return listeners.get(path);
+ }
+
+ Context context = contexts.remove(path);
+ try {
+ context.stop();
+ context.destroy();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ Host host = (Host) context.getParent();
+ host.removeChild(context);
+
+ return listeners.remove(completePath);
+ }
+}
Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java Tue Jul 19 21:32:28 2011
@@ -1,19 +1,18 @@
-/**
- *
+/*
* 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
+ * 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
+ * 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.
+ * 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.tomcat.catalina;
@@ -22,10 +21,7 @@ import org.apache.catalina.Engine;
import org.apache.catalina.LifecycleListener;
import org.apache.catalina.Service;
import org.apache.catalina.Wrapper;
-import org.apache.catalina.core.ContainerBase;
-import org.apache.catalina.core.StandardContext;
-import org.apache.catalina.core.StandardHost;
-import org.apache.catalina.core.StandardServer;
+import org.apache.catalina.core.*;
import org.apache.catalina.deploy.ContextEnvironment;
import org.apache.catalina.deploy.ContextResource;
import org.apache.catalina.deploy.ContextResourceLink;
@@ -53,6 +49,7 @@ import org.apache.openejb.core.ivm.namin
import org.apache.openejb.jee.EnvEntry;
import org.apache.openejb.jee.WebApp;
import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.rest.RESTService;
import org.apache.openejb.server.webservices.WsService;
import org.apache.openejb.tomcat.common.LegacyAnnotationProcessor;
import org.apache.openejb.tomcat.common.TomcatVersion;
@@ -136,6 +133,8 @@ public class TomcatWebAppBuilder impleme
*/
private WsService wsService;
+ private RESTService rsService;
+
/**
* Creates a new web application builder
* instance.
@@ -364,17 +363,6 @@ public class TomcatWebAppBuilder impleme
return;
}
- // required for Pojo Web Services because when Assembler creates the application
- // the CoreContainerSystem does not contain the WebContext
- // see also the start method getContainerSystem().addWebDeployment(webContext);
- WsService wsService = getWsService();
- if (wsService != null) {
- List<WebAppInfo> webApps = contextInfo.appInfo.webApps;
- for (WebAppInfo webApp : webApps) {
- wsService.afterApplicationCreated(webApp);
- }
- }
-
// bind extra stuff at the java:comp level which can only be
// bound after the context is created
String listenerName = getNamingContextListener(standardContext).getName();
@@ -387,18 +375,25 @@ public class TomcatWebAppBuilder impleme
Context root = (Context) ContextBindings.getClassLoader().lookup("");
safeBind(root, "openejb", openejbContext);
+ // TODO: else (=NamingException) if it doesn't exist create it to bind TransactionManager...
Context comp = (Context) ContextBindings.getClassLoader().lookup("comp");
// add context to WebDeploymentInfo
for (WebAppInfo webAppInfo : contextInfo.appInfo.webApps) {
- // Bean Validation
- standardContext.getServletContext().setAttribute("javax.faces.validator.beanValidator.ValidatorFactory", openejbContext.lookup(Assembler.VALIDATOR_FACTORY_NAMING_CONTEXT + webAppInfo.moduleId));
-
- if (("/" + webAppInfo.contextRoot).equals(standardContext.getPath()) || isRootApplication(standardContext)) {
+ boolean isRoot = isRootApplication(standardContext);
+ if (("/" + webAppInfo.contextRoot).equals(standardContext.getPath()) || isRoot) {
WebContext webContext = getContainerSystem().getWebContext(webAppInfo.moduleId);
if (webContext != null) {
- webContext.setJndiEnc(comp);
+ // webContext.setJndiEnc(comp);
+ }
+
+ try {
+ // Bean Validation
+ standardContext.getServletContext().setAttribute("javax.faces.validator.beanValidator.ValidatorFactory", openejbContext.lookup(Assembler.VALIDATOR_FACTORY_NAMING_CONTEXT.replaceFirst("openejb", "") + webAppInfo.uniqueId));
+ } catch (NamingException ne) {
+ logger.warning("no validator factory found for webapp " + webAppInfo.moduleId);
}
+
break;
}
}
@@ -417,6 +412,25 @@ public class TomcatWebAppBuilder impleme
}
ContextAccessController.setReadOnly(listenerName);
+ // required for Pojo Web Services because when Assembler creates the application
+ // the CoreContainerSystem does not contain the WebContext
+ // see also the start method getContainerSystem().addWebDeployment(webContext);
+ WsService wsService = getWsService();
+ if (wsService != null) {
+ List<WebAppInfo> webApps = contextInfo.appInfo.webApps;
+ for (WebAppInfo webApp : webApps) {
+ wsService.afterApplicationCreated(webApp);
+ }
+ }
+
+ RESTService rsService = getRsService();
+ if (rsService != null) {
+ List<WebAppInfo> webApps = contextInfo.appInfo.webApps;
+ for (WebAppInfo webApp : webApps) {
+ rsService.afterApplicationCreated(webApp);
+ }
+ }
+
if (!TomcatVersion.hasAnnotationProcessingSupport()) {
try {
Context compEnv = (Context) ContextBindings.getClassLoader().lookup("comp/env");
@@ -751,21 +765,14 @@ public class TomcatWebAppBuilder impleme
*/
private void safeBind(Context comp, String name, Object value) {
try {
- Object lookup = null;
-
- try {
- lookup = comp.lookup(name);
- } catch (Exception e) {
- }
-
- if (lookup != null) {
- logger.info(name + " already bound, ignoring");
- return;
- }
-
- comp.bind(name, value);
- } catch (NamingException e) {
- logger.error("Error in safeBind method", e);
+ comp.lookup(name);
+ logger.info(name + " already bound, ignoring");
+ } catch (Exception e) {
+ try {
+ comp.bind(name, value);
+ } catch (NamingException ne) {
+ logger.error("Error in safeBind method", e);
+ }
}
}
@@ -805,6 +812,13 @@ public class TomcatWebAppBuilder impleme
return wsService;
}
+ private RESTService getRsService() {
+ if (rsService == null) {
+ rsService = SystemInstance.get().getComponent(RESTService.class);
+ }
+ return rsService;
+ }
+
/**
* Gets id of the context. Context id
* is host name + context root name.
Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/OpenEJBListener.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/OpenEJBListener.java?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/OpenEJBListener.java (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/OpenEJBListener.java Tue Jul 19 21:32:28 2011
@@ -56,6 +56,13 @@ public class OpenEJBListener implements
try {
Properties properties = new Properties();
File webappDir = findOpenEjbWar();
+ if (webappDir == null) {
+ System.out.println("***********************************"); // TODO: logger?
+ System.out.println("ERROR: OpenEJB webapp was not found"); // TODO: logger?
+ System.out.println("***********************************"); // TODO: logger?
+ return;
+ }
+
properties.setProperty("openejb.war", webappDir.getAbsolutePath());
properties.setProperty("openejb.embedder.source", getClass().getSimpleName());
TomcatEmbedder.embed(properties, StandardServer.class.getClassLoader());
Modified: openejb/trunk/openejb3/assembly/openejb-tomcat/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/openejb-tomcat/pom.xml?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/openejb-tomcat/pom.xml (original)
+++ openejb/trunk/openejb3/assembly/openejb-tomcat/pom.xml Tue Jul 19 21:32:28 2011
@@ -35,7 +35,7 @@
<module>openejb-tomcat-catalina</module>
<module>openejb-tomcat-common</module>
<module>openejb-tomcat-webapp</module>
- <module>openejb-tomcat-bundle</module>
+ <!--module>openejb-tomcat-bundle</module-->
</modules>
<repositories>
Modified: openejb/trunk/openejb3/assembly/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/assembly/pom.xml?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/assembly/pom.xml (original)
+++ openejb/trunk/openejb3/assembly/pom.xml Tue Jul 19 21:32:28 2011
@@ -38,7 +38,8 @@
<module>javaee-api-libs</module>
<module>openejb-standalone</module>
<module>openejb-lite</module>
+ <module>openejb-logging</module>
<!-- don't run this just yet, its in progress -->
<!-- <module>itest-runner</module> -->
</modules>
-</project>
\ No newline at end of file
+</project>
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=1148549&r1=1148548&r2=1148549&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 Tue Jul 19 21:32:28 2011
@@ -1589,27 +1589,42 @@ public class AnnotationDeployer implemen
webModule.getRestApplications().add(webXmlApplication);
}
- for (String application : webModule.getRestApplications()) {
- if (application != null) {
- Class<?> clazz;
- try {
- clazz = classLoader.loadClass(application);
- classes.add(clazz);
- } catch (ClassNotFoundException e) {
- throw new OpenEJBException("Unable to load Application class: " + application, e);
+ Collection<String> restApp = webModule.getRestApplications();
+ if (restApp.isEmpty()) {
+ for (String className : webModule.getRestClasses()) {
+ if (className != null) {
+ Class<?> clazz;
+ try {
+ clazz = classLoader.loadClass(className);
+ classes.add(clazz);
+ } catch (ClassNotFoundException e) {
+ throw new OpenEJBException("Unable to load REST class: " + className, e);
+ }
}
-
- try {
- Application app = Application.class.cast(clazz.newInstance());
- classes.addAll(app.getClasses());
- } catch (InstantiationException e) {
- throw new OpenEJBException("Unable to instantiate Application class: " + application, e);
- } catch (IllegalAccessException e) {
- throw new OpenEJBException("Unable to access Application class: " + application, e);
+ }
+ } else {
+ for (String application : restApp) {
+ if (application != null) {
+ Class<?> clazz;
+ try {
+ clazz = classLoader.loadClass(application);
+ classes.add(clazz);
+ } catch (ClassNotFoundException e) {
+ throw new OpenEJBException("Unable to load Application class: " + application, e);
+ }
+ try {
+ Application app = Application.class.cast(clazz.newInstance());
+ classes.addAll(app.getClasses());
+ } catch (InstantiationException e) {
+ throw new OpenEJBException("Unable to instantiate Application class: " + application, e);
+ } catch (IllegalAccessException e) {
+ throw new OpenEJBException("Unable to access Application class: " + application, e);
+ }
}
}
}
+
/*
* Servlet classes are scanned
*/
Modified: openejb/trunk/openejb3/examples/webapps/applet/src/main/java/org/superbiz/applet/CalculatorApplet.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/webapps/applet/src/main/java/org/superbiz/applet/CalculatorApplet.java?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/examples/webapps/applet/src/main/java/org/superbiz/applet/CalculatorApplet.java (original)
+++ openejb/trunk/openejb3/examples/webapps/applet/src/main/java/org/superbiz/applet/CalculatorApplet.java Tue Jul 19 21:32:28 2011
@@ -21,13 +21,8 @@ import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
-import javax.swing.JApplet;
-import javax.swing.JButton;
-import javax.swing.JLabel;
-import javax.swing.JTextArea;
-import javax.swing.JTextField;
-import javax.swing.SwingUtilities;
-import java.awt.GridLayout;
+import javax.swing.*;
+import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Properties;
Added: openejb/trunk/openejb3/examples/webapps/ejb-examples/src/main/resources/log4j.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/webapps/ejb-examples/src/main/resources/log4j.xml?rev=1148549&view=auto
==============================================================================
--- openejb/trunk/openejb3/examples/webapps/ejb-examples/src/main/resources/log4j.xml (added)
+++ openejb/trunk/openejb3/examples/webapps/ejb-examples/src/main/resources/log4j.xml Tue Jul 19 21:32:28 2011
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ 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.
+ -->
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+ <appender name="console" class="org.apache.log4j.ConsoleAppender">
+ <param name="Target" value="System.out"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
+ </layout>
+ </appender>
+
+ <root>
+ <priority value ="debug" />
+ <appender-ref ref="console" />
+ </root>
+</log4j:configuration>
Modified: openejb/trunk/openejb3/examples/webapps/moviefun/app/src/main/java/org/superbiz/moviefun/ActionServlet.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/webapps/moviefun/app/src/main/java/org/superbiz/moviefun/ActionServlet.java?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/examples/webapps/moviefun/app/src/main/java/org/superbiz/moviefun/ActionServlet.java (original)
+++ openejb/trunk/openejb3/examples/webapps/moviefun/app/src/main/java/org/superbiz/moviefun/ActionServlet.java Tue Jul 19 21:32:28 2011
@@ -16,17 +16,16 @@
*/
package org.superbiz.moviefun;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.ListIterator;
-
+import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
-import javax.ejb.EJB;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
/**
* @version $Revision$ $Date$
Modified: openejb/trunk/openejb3/examples/webapps/moviefun/monitor/src/main/java/org/superbiz/moviefun/NotificationMonitor.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/webapps/moviefun/monitor/src/main/java/org/superbiz/moviefun/NotificationMonitor.java?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/examples/webapps/moviefun/monitor/src/main/java/org/superbiz/moviefun/NotificationMonitor.java (original)
+++ openejb/trunk/openejb3/examples/webapps/moviefun/monitor/src/main/java/org/superbiz/moviefun/NotificationMonitor.java Tue Jul 19 21:32:28 2011
@@ -2,13 +2,7 @@ package org.superbiz.moviefun;
import javax.naming.InitialContext;
import javax.naming.NamingException;
-import java.awt.AWTException;
-import java.awt.Image;
-import java.awt.MenuItem;
-import java.awt.PopupMenu;
-import java.awt.SystemTray;
-import java.awt.Toolkit;
-import java.awt.TrayIcon;
+import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
Modified: openejb/trunk/openejb3/examples/webapps/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/examples/webapps/pom.xml?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/examples/webapps/pom.xml (original)
+++ openejb/trunk/openejb3/examples/webapps/pom.xml Tue Jul 19 21:32:28 2011
@@ -34,6 +34,7 @@
<module>jsf</module>
<module>struts</module>
<module>moviefun</module>
+ <module>rest-example</module>
</modules>
<!--
Modified: openejb/trunk/openejb3/server/openejb-cxf-rs/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/pom.xml?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/pom.xml (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/pom.xml Tue Jul 19 21:32:28 2011
@@ -101,10 +101,6 @@
<artifactId>jetty-util</artifactId>
</exclusion>
<exclusion>
- <groupId>org.codehaus.jettison</groupId>
- <artifactId>jettison</artifactId>
- </exclusion>
- <exclusion>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
</exclusion>
Modified: openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java Tue Jul 19 21:32:28 2011
@@ -20,6 +20,8 @@ import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.cxf.jaxrs.provider.JAXBElementProvider;
+import org.apache.cxf.jaxrs.provider.JSONProvider;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
import org.apache.cxf.transport.http.HTTPTransportFactory;
import org.apache.openejb.Injection;
@@ -30,14 +32,17 @@ import org.apache.openejb.server.rest.Rs
import javax.naming.Context;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.ws.rs.core.Application;
+import javax.xml.bind.Marshaller;
import java.net.URI;
import java.net.URISyntaxException;
-import java.util.Collection;
+import java.util.*;
/**
* @author Romain Manni-Bucau
*/
public class CxfRsHttpListener implements RsHttpListener {
+ private static final List<?> PROVIDERS = createProviderList();
+
private HTTPTransportFactory transportFactory;
private AbstractHTTPDestination destination;
private Server server;
@@ -65,7 +70,6 @@ public class CxfRsHttpListener implement
}
- // TODO
public ResourceProvider getResourceProvider(Object o, Collection<Injection> injections, Context context) {
switch (scope) {
case SINGLETON:
@@ -77,7 +81,7 @@ public class CxfRsHttpListener implement
}
private Class<?> getRESTClass(Object o) {
- if (o instanceof Class) {
+ if (scope == Scope.PROTOTYPE) {
return Class.class.cast(o);
}
return o.getClass();
@@ -85,11 +89,12 @@ public class CxfRsHttpListener implement
public void deploy(String address, Object o, Application app, Collection<Injection> injections, Context context) {
JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
- factory.setResourceClasses(o.getClass());
+ factory.setResourceClasses(getRESTClass(o));
factory.setDestinationFactory(transportFactory);
factory.setBus(transportFactory.getBus());
factory.setAddress(address);
factory.setResourceProvider(getResourceProvider(o, injections, context));
+ factory.setProviders(PROVIDERS);
if (scope == Scope.PROTOTYPE) {
factory.setServiceClass(Class.class.cast(o));
} else {
@@ -106,4 +111,16 @@ public class CxfRsHttpListener implement
public void undeploy() {
server.stop();
}
+
+ private static List<?> createProviderList() {
+ JAXBElementProvider jaxb = new JAXBElementProvider();
+ Map<String, Object> jaxbProperties = new HashMap<String, Object> ();
+ jaxbProperties.put(Marshaller.JAXB_FRAGMENT, true);
+ jaxb.setMarshallerProperties(jaxbProperties);
+
+ JSONProvider json = new JSONProvider();
+ json.setSerializeAsArray(true);
+
+ return Arrays.asList(jaxb, json);
+ }
}
Modified: openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestResourceProvider.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestResourceProvider.java?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestResourceProvider.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestResourceProvider.java Tue Jul 19 21:32:28 2011
@@ -22,7 +22,12 @@ import org.apache.openejb.Injection;
import org.apache.openejb.InjectionProcessor;
import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
import javax.ws.rs.WebApplicationException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Collection;
@@ -37,12 +42,30 @@ public class OpenEJBPerRequestResourcePr
super(clazz);
injections = injectionCollection;
context = ctx;
+ if (ctx == null) {
+ // TODO: context shouldn't be null here so it should be removed
+ context = (Context) Proxy.newProxyInstance(clazz.getClassLoader(), new Class<?>[]{Context.class}, new InvocationHandler() {
+ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ Context ctx = new InitialContext();
+ if (method.getName().equals("lookup")) {
+ if (args[0].getClass().equals(String.class)) {
+ try {
+ return ctx.lookup("java:" + String.class.cast(args[0]));
+ } catch (NamingException ne) {
+ // let try it in the normal way (without java:)
+ }
+ }
+ }
+ return method.invoke(ctx, args);
+ }
+ });
+ }
}
protected Object createInstance(Message m) {
Object o = super.createInstance(m);
try {
- InjectionProcessor<?> injector = new InjectionProcessor<Object>(o, new ArrayList<Injection>(injections), context);
+ InjectionProcessor<?> injector = new InjectionProcessor<Object>(o, new ArrayList<Injection>(injections), InjectionProcessor.unwrap(context));
injector.createInstance();
injector.postConstruct();
return injector.getInstance();
Modified: openejb/trunk/openejb3/server/openejb-cxf-transport/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-transport/pom.xml?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-transport/pom.xml (original)
+++ openejb/trunk/openejb3/server/openejb-cxf-transport/pom.xml Tue Jul 19 21:32:28 2011
@@ -75,10 +75,6 @@
<artifactId>jetty-util</artifactId>
</exclusion>
<exclusion>
- <groupId>org.codehaus.jettison</groupId>
- <artifactId>jettison</artifactId>
- </exclusion>
- <exclusion>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
</exclusion>
Modified: openejb/trunk/openejb3/server/openejb-cxf/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf/pom.xml?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf/pom.xml (original)
+++ openejb/trunk/openejb3/server/openejb-cxf/pom.xml Tue Jul 19 21:32:28 2011
@@ -133,10 +133,6 @@
<artifactId>jetty-util</artifactId>
</exclusion>
<exclusion>
- <groupId>org.codehaus.jettison</groupId>
- <artifactId>jettison</artifactId>
- </exclusion>
- <exclusion>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
</exclusion>
Modified: openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpRegistry.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpRegistry.java?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpRegistry.java (original)
+++ openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpRegistry.java Tue Jul 19 21:32:28 2011
@@ -39,7 +39,7 @@ public class OpenEJBHttpRegistry {
}
}
} catch (Exception e) {
- log.error("Unable to build base URIs for Web Service registry", e);
+ log.error("Unable to build base URIs for " + getClass().getSimpleName() + " registry", e);
}
registry = SystemInstance.get().getComponent(HttpListenerRegistry.class);
}
Modified: openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java (original)
+++ openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java Tue Jul 19 21:32:28 2011
@@ -66,84 +66,88 @@ public abstract class RESTService implem
private Assembler assembler;
private CoreContainerSystem containerSystem;
private RsRegistry rsRegistry;
-
private List<String> services = new ArrayList<String>();
+ private String virtualHost;
- @Override public void afterApplicationCreated(final AppInfo appInfo) {
- if (deployedApplications.add(appInfo)) {
- for (final WebAppInfo webApp : appInfo.webApps) {
- final WebContext webContext = containerSystem.getWebContext(webApp.moduleId);
- if (webContext == null) {
- return;
+ public void afterApplicationCreated(final WebAppInfo webApp) {
+ final WebContext webContext = containerSystem.getWebContext(webApp.moduleId);
+ if (webContext == null) {
+ return;
+ }
+
+ if (!deployedWebApps.add(webApp)) {
+ return;
+ }
+
+ final ClassLoader classLoader = getClassLoader(webContext.getClassLoader());
+ Collection<Injection> injections = webContext.getInjections();
+ Context context = webContext.getJndiEnc();
+
+ // 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.
+
+ if (webApp.restApplications.isEmpty()) {
+ for (String clazz : webApp.restClass) {
+ try {
+ deploy(webApp.contextRoot, classLoader.loadClass(clazz), null, classLoader, RsHttpListener.Scope.PROTOTYPE, injections, context);
+ } catch (ClassNotFoundException e) {
+ throw new OpenEJBRestRuntimeException("can't find class " + clazz, e);
+ }
+ LOGGER.info("REST service deployed: " + clazz);
+ }
+ } else {
+ for (String app : webApp.restApplications) { // normally a unique one but we support more
+ Application appInstance;
+ try {
+ appInstance = Application.class.cast(load(classLoader, app));
+ } catch (ClassNotFoundException e) {
+ throw new OpenEJBRestRuntimeException("can't find class " + app, e);
}
- if (!deployedWebApps.add(webApp)) {
- return;
+ for (Object o : appInstance.getSingletons()) {
+ deploy(webApp.contextRoot, o, appInstance, classLoader, RsHttpListener.Scope.SINGLETON, injections, context);
+ LOGGER.info("deployed REST singleton: " + o);
+ }
+ for (Class<?> clazz : appInstance.getClasses()) {
+ deploy(webApp.contextRoot, clazz, appInstance, classLoader, RsHttpListener.Scope.PROTOTYPE, injections, context);
+ LOGGER.info("deployed REST class: " + clazz);
}
- final ClassLoader classLoader = getClassLoader(webContext.getClassLoader());
- Collection<Injection> injections = webContext.getInjections();
- Context context = webContext.getJndiEnc();
-
- // 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.
-
- if (webApp.restApplications.isEmpty()) {
- for (String clazz : webApp.restClass) {
- try {
- deploy(webApp.contextRoot, classLoader.loadClass(clazz), null, classLoader, RsHttpListener.Scope.PROTOTYPE, injections, context);
- } catch (ClassNotFoundException e) {
- throw new OpenEJBRestRuntimeException("can't find class " + clazz, e);
- }
- LOGGER.info("REST service deployed: " + clazz);
- }
- } else {
- for (String app : webApp.restApplications) { // normally a unique one but we support more
- Application appInstance;
- try {
- appInstance = Application.class.cast(load(classLoader, app));
- } catch (ClassNotFoundException e) {
- throw new OpenEJBRestRuntimeException("can't find class " + app, e);
- }
-
- for (Object o : appInstance.getSingletons()) {
- deploy(webApp.contextRoot, o, appInstance, classLoader, RsHttpListener.Scope.SINGLETON, injections, context);
- LOGGER.info("deployed REST singleton: " + o);
- }
- for (Class<?> clazz : appInstance.getClasses()) {
- deploy(webApp.contextRoot, clazz, appInstance, classLoader, RsHttpListener.Scope.PROTOTYPE, injections, context);
- LOGGER.info("deployed REST class: " + clazz);
- }
+ LOGGER.info("REST application deployed: " + app);
+ }
+ }
+ }
- LOGGER.info("REST application deployed: " + app);
- }
- }
+ @Override public void afterApplicationCreated(final AppInfo appInfo) {
+ if (deployedApplications.add(appInfo)) {
+ for (final WebAppInfo webApp : appInfo.webApps) {
+ afterApplicationCreated(webApp);
}
}
}
/**
- * @param context the webapp context
- * @param o the class if scope == prototype or the instance if scope == singleton
- * @param app the Application if exists
+ * @param context the webapp context
+ * @param o the class if scope == prototype or the instance if scope == singleton
+ * @param app the Application if exists
* @param classLoader the webapp classloader
- * @param scope the scope
- * @param injections webapp injections
- * @param ctx webapp context
+ * @param scope the scope
+ * @param injections webapp injections
+ * @param ctx webapp context
*/
private void deploy(String context, Object o, Application app, ClassLoader classLoader, RsHttpListener.Scope scope, Collection<Injection> injections, Context ctx) {
final String nopath = getAddress(NOPATH_PREFIX + context, o, scope) + "/.*";
final RsHttpListener listener = createHttpListener(o, scope);
- final List<String> addresses = rsRegistry.createRsHttpListener(listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1));
+ final List<String> addresses = rsRegistry.createRsHttpListener(listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1), virtualHost);
final String address = HttpUtil.selectSingleAddress(addresses);
services.add(address);
@@ -220,11 +224,14 @@ public abstract class RESTService implem
undeployRestObject(address);
}
}
+ deployedWebApps.remove(webApp);
}
}
}
@Override public void start() throws ServiceException {
+ SystemInstance.get().setComponent(RESTService.class, this);
+
beforeStart();
containerSystem = (CoreContainerSystem) SystemInstance.get().getComponent(ContainerSystem.class);
@@ -269,7 +276,15 @@ public abstract class RESTService implem
return PORT;
}
- @Override public void init(Properties properties) throws Exception {
- // no-op
+ @Override public void init(Properties props) throws Exception {
+ virtualHost = props.getProperty("virtualHost");
+ }
+
+ public String getVirtualHost() {
+ return virtualHost;
+ }
+
+ public void setVirtualHost(String virtualHost) {
+ this.virtualHost = virtualHost;
}
}
Modified: openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistry.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistry.java?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistry.java (original)
+++ openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistry.java Tue Jul 19 21:32:28 2011
@@ -25,6 +25,6 @@ import java.util.List;
* @author Romain Manni-Bucau
*/
public interface RsRegistry {
- List<String> createRsHttpListener(HttpListener listener, ClassLoader classLoader, String path);
+ List<String> createRsHttpListener(HttpListener listener, ClassLoader classLoader, String path, String virtualHost);
HttpListener removeListener(String context);
}
Modified: openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistryImpl.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistryImpl.java?rev=1148549&r1=1148548&r2=1148549&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistryImpl.java (original)
+++ openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistryImpl.java Tue Jul 19 21:32:28 2011
@@ -26,7 +26,7 @@ import java.util.List;
* @author Romain Manni-Bucau
*/
public class RsRegistryImpl extends OpenEJBHttpRegistry implements RsRegistry {
- @Override public List<String> createRsHttpListener(HttpListener listener, ClassLoader classLoader, String path) {
+ @Override public List<String> createRsHttpListener(HttpListener listener, ClassLoader classLoader, String path, String virtualHost) {
addWrappedHttpListener(listener, classLoader, path);
return getResolvedAddresses(path);
}
Added: openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsServlet.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsServlet.java?rev=1148549&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsServlet.java (added)
+++ openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsServlet.java Tue Jul 19 21:32:28 2011
@@ -0,0 +1,65 @@
+/*
+ * 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.rest;
+
+import org.apache.openejb.server.httpd.HttpListener;
+import org.apache.openejb.server.httpd.HttpRequest;
+import org.apache.openejb.server.httpd.HttpResponse;
+import org.apache.openejb.server.httpd.ServletRequestAdapter;
+import org.apache.openejb.server.httpd.ServletResponseAdapter;
+
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public class RsServlet extends HttpServlet {
+ private HttpListener listener;
+ private ServletConfig servletConfig;
+
+ public void init(ServletConfig config) throws ServletException {
+ servletConfig = config;
+ String listenerId = config.getInitParameter(HttpListener.class.getName());
+ if (listenerId != null) {
+ listener = (HttpListener) config.getServletContext().getAttribute(listenerId);
+ }
+ }
+
+ public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
+ if (listener == null) {
+ throw new ServletException("RESTServiceContainer has not been set");
+ }
+
+ HttpRequest httpRequest = new ServletRequestAdapter(req, res, servletConfig.getServletContext());
+ HttpResponse httpResponse = new ServletResponseAdapter(res);
+
+ try {
+ listener.onMessage(httpRequest, httpResponse);
+ } catch (IOException e) {
+ throw e;
+ } catch (ServletException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new ServletException("Error processing webservice request", e);
+ }
+ }
+}