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);
+        }
+    }
+}