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/11 16:28:12 UTC

svn commit: r1145190 [1/2] - in /openejb/trunk/openejb3: ./ container/openejb-core/src/main/java/org/apache/openejb/util/ container/openejb-core/src/main/resources/ server/ server/openejb-cxf-rs/ server/openejb-cxf-rs/src/ server/openejb-cxf-rs/src/mai...

Author: rmannibucau
Date: Mon Jul 11 14:28:10 2011
New Revision: 1145190

URL: http://svn.apache.org/viewvc?rev=1145190&view=rev
Log:
OPENEJB-1237 openejb REST support - first refactoring to avoid to copy/paste code

Added:
    openejb/trunk/openejb3/server/openejb-cxf-rs/
    openejb/trunk/openejb3/server/openejb-cxf-rs/pom.xml
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
    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/resources/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/resources/META-INF/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/resources/META-INF/org.apache.openejb.server.ServerService/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/resources/META-INF/org.apache.openejb.server.ServerService/cxf-rs
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RestDeploymentTest.java
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyExpertRestClass.java
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyFirstRestClass.java
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyNonListedRestClass.java
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyRESTApplication.java
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MySecondRestClass.java
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/META-INF/
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/META-INF/beans.xml
    openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/log4j.properties
    openejb/trunk/openejb3/server/openejb-cxf-transport/
    openejb/trunk/openejb3/server/openejb-cxf-transport/pom.xml
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/HttpDestination.java
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/HttpTransportFactory.java
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/test/
    openejb/trunk/openejb3/server/openejb-cxf-transport/src/test/java/
    openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BasicAuthHttpListenerWrapper.java
      - copied, changed from r1144000, openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/BasicAuthHttpListenerWrapper.java
    openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpRegistry.java
    openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/util/
    openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/util/HttpUtil.java
    openejb/trunk/openejb3/server/openejb-rest/
    openejb/trunk/openejb3/server/openejb-rest/pom.xml
    openejb/trunk/openejb3/server/openejb-rest/src/
    openejb/trunk/openejb3/server/openejb-rest/src/main/
    openejb/trunk/openejb3/server/openejb-rest/src/main/java/
    openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/
    openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/
    openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/
    openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/
    openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/
    openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/OpenEJBRestRuntimeException.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/RsHttpListener.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
    openejb/trunk/openejb3/server/openejb-rest/src/test/
    openejb/trunk/openejb3/server/openejb-rest/src/test/java/
Removed:
    openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/HttpDestination.java
    openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/HttpTransportFactory.java
    openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/BasicAuthHttpListenerWrapper.java
Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/LogCategory.java
    openejb/trunk/openejb3/container/openejb-core/src/main/resources/logging.properties
    openejb/trunk/openejb3/pom.xml
    openejb/trunk/openejb3/server/openejb-cxf/pom.xml
    openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfEndpoint.java
    openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java
    openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java
    openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/ejb/EjbWsContainer.java
    openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java
    openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
    openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/OpenEJBHttpWsRegistry.java
    openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/WsService.java
    openejb/trunk/openejb3/server/pom.xml

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/LogCategory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/LogCategory.java?rev=1145190&r1=1145189&r2=1145190&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/LogCategory.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/util/LogCategory.java Mon Jul 11 14:28:10 2011
@@ -43,6 +43,7 @@ public final class LogCategory {
 	public static final LogCategory OPENEJB_DEPLOY = OPENEJB.createChild("deploy");
 	public static final LogCategory OPENEJB_HSQL = OPENEJB.createChild("hsql");
 	public static final LogCategory OPENEJB_WS = OPENEJB.createChild("ws");
+	public static final LogCategory OPENEJB_RS = OPENEJB.createChild("rs");
 	public static final LogCategory TRANSACTION = new LogCategory( "Transaction");
 	public static final LogCategory ACTIVEMQ = new LogCategory( "org.apache.activemq");
 	public static final LogCategory GERONIMO = new LogCategory( "org.apache.geronimo");

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/resources/logging.properties
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/logging.properties?rev=1145190&r1=1145189&r2=1145190&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/resources/logging.properties (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/resources/logging.properties Mon Jul 11 14:28:10 2011
@@ -14,6 +14,7 @@ log4j.category.OpenEJB.startup.service =
 log4j.category.OpenEJB.startup.config = info
 log4j.category.OpenEJB.hsql        = info
 log4j.category.OpenEJB.ws          = info
+log4j.category.OpenEJB.rs          = info
 log4j.category.OpenEJB.tomcat      = info
 log4j.category.CORBA-Adapter       = error,R
 log4j.category.Transaction         = warn,TX

Modified: openejb/trunk/openejb3/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/pom.xml?rev=1145190&r1=1145189&r2=1145190&view=diff
==============================================================================
--- openejb/trunk/openejb3/pom.xml (original)
+++ openejb/trunk/openejb3/pom.xml Mon Jul 11 14:28:10 2011
@@ -120,6 +120,7 @@
     <tomcat.version>7.0.16</tomcat.version>
 
     <!-- used mainly by jetty modules -->
+    <cxf.version>2.4.1</cxf.version>
     <jetty.version>7.4.2.v20110526</jetty.version>
 
     <!--
@@ -575,6 +576,16 @@
   <dependencyManagement>
     <dependencies>
       <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-bundle</artifactId>
+      <version>${cxf.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>xml-resolver</groupId>
+      <artifactId>xml-resolver</artifactId>
+      <version>1.2</version>
+    </dependency>
+    <dependency>
       <groupId>org.eclipse.jetty</groupId>
       <artifactId>jetty-server</artifactId>
         <version>${jetty.version}</version>

Added: 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=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/pom.xml (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/pom.xml Mon Jul 11 14:28:10 2011
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>server</artifactId>
+    <groupId>org.apache.openejb</groupId>
+    <version>4.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>openejb-cxf-rs</artifactId>
+  <name>OpenEJB :: Server :: CXF RS</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>openejb-http</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>openejb-rest</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>openejb-cxf-transport</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-log4j12</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>log4j</groupId>
+      <artifactId>log4j</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-bundle</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>antlr</groupId>
+          <artifactId>antlr</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>asm</groupId>
+          <artifactId>asm</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>aopalliance</groupId>
+          <artifactId>aopalliance</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-server</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-continuation</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-io</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-http</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-security</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.eclipse.jetty</groupId>
+          <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>
+        <exclusion>
+          <groupId>org.codehaus.woodstox</groupId>
+          <artifactId>woodstox-core-asl</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.codehaus.woodstox</groupId>
+          <artifactId>stax2-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-servlet_3.0_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-stax-api_1.0_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-activation_1.1_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-annotation_1.0_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-javamail_1.4_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-jms_1.1_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.codehaus.jra</groupId>
+          <artifactId>jra</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>rhino</groupId>
+          <artifactId>js</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>javax.xml.bind</groupId>
+          <artifactId>jaxb-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.velocity</groupId>
+          <artifactId>velocity</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>oro</groupId>
+          <artifactId>oro</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.sun.xml.bind</groupId>
+          <artifactId>jaxb-impl</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.sun.xml.bind</groupId>
+          <artifactId>jaxb-xjc</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>javax.xml.soap</groupId>
+          <artifactId>saaj-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-ws-metadata_2.0_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-jaxws_2.2_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-beans</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-expression</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-aop</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-asm</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-context</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-core</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-jms</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-tx</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-web</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>joda-time</groupId>
+          <artifactId>joda-time</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.opensaml</groupId>
+          <artifactId>opensaml</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.opensaml</groupId>
+          <artifactId>openws</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.opensaml</groupId>
+          <artifactId>xmltooling</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>xalan</groupId>
+      <artifactId>xalan</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>xml-resolver</groupId>
+      <artifactId>xml-resolver</artifactId>
+    </dependency>
+  </dependencies>
+
+</project>

Added: openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRSService.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,47 @@
+package org.apache.openejb.server.cxf.rs;
+
+import org.apache.openejb.server.ServiceException;
+import org.apache.openejb.server.cxf.transport.HttpTransportFactory;
+import org.apache.openejb.server.cxf.transport.util.CxfUtil;
+import org.apache.openejb.server.rest.RESTService;
+import org.apache.openejb.server.rest.RsHttpListener;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.Socket;
+import java.util.Properties;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public class CxfRSService extends RESTService {
+    private static final String NAME = "cxf-rs";
+    private HttpTransportFactory httpTransportFactory;
+
+
+    @Override public void service(InputStream in, OutputStream out) throws ServiceException, IOException {
+        throw new UnsupportedOperationException(getClass().getName() + " cannot be invoked directly");
+    }
+
+    @Override public void service(Socket socket) throws ServiceException, IOException {
+        throw new UnsupportedOperationException(getClass().getName() + " cannot be invoked directly");
+    }
+
+    @Override public String getName() {
+        return NAME;
+    }
+
+    @Override public void init(Properties properties) throws Exception {
+        // no-op
+    }
+
+    @Override protected void beforeStart() {
+        super.beforeStart();
+        httpTransportFactory = new HttpTransportFactory(CxfUtil.getBus());
+    }
+
+    @Override protected RsHttpListener createHttpListener(Object o, RsHttpListener.Scope scope) {
+        return new CxfRsHttpListener(scope, httpTransportFactory);
+    }
+}

Added: 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=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/CxfRsHttpListener.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,80 @@
+package org.apache.openejb.server.cxf.rs;
+
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
+import org.apache.cxf.jaxrs.lifecycle.PerRequestResourceProvider;
+import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
+import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
+import org.apache.cxf.transport.http.AbstractHTTPDestination;
+import org.apache.cxf.transport.http.HTTPTransportFactory;
+import org.apache.openejb.server.httpd.HttpRequest;
+import org.apache.openejb.server.httpd.HttpResponse;
+import org.apache.openejb.server.rest.RsHttpListener;
+
+import javax.servlet.http.HttpServletRequestWrapper;
+import javax.ws.rs.core.Application;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public class CxfRsHttpListener implements RsHttpListener {
+    private HTTPTransportFactory transportFactory;
+    private AbstractHTTPDestination destination;
+    private Server server;
+    private Scope scope;
+
+    public CxfRsHttpListener(Scope scp, HTTPTransportFactory httpTransportFactory) {
+        transportFactory = httpTransportFactory;
+        scope = scp;
+    }
+
+    @Override public void onMessage(final HttpRequest httpRequest, final HttpResponse httpResponse) throws Exception {
+        destination.invoke(null, httpRequest.getServletContext(), new HttpServletRequestWrapper(httpRequest) {
+            // see org.apache.cxf.jaxrs.utils.HttpUtils.getPathToMatch()
+            // cxf uses implicitly getRawPath() from the endpoint but not for the request URI
+            // so without stripping the address until the context the behavior is weird
+            // this is just a workaround waiting for something better
+            @Override public String getRequestURI() {
+                try {
+                    return new URI(httpRequest.getRequestURI()).getRawPath();
+                } catch (URISyntaxException e) {
+                    return "/";
+                }
+            }
+        }, httpResponse);
+
+    }
+
+    public ResourceProvider getResourceProvider(Object o) {
+        switch (scope) {
+            case SINGLETON:
+                return new SingletonResourceProvider(o);
+            case PROTOTYPE:
+            default:
+                return new PerRequestResourceProvider(o.getClass());
+        }
+    }
+
+    public void deploy(String address, Object o, Application app) {
+        JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
+        factory.setResourceClasses(o.getClass());
+        factory.setResourceProvider(getResourceProvider(o));
+        factory.setDestinationFactory(transportFactory);
+        factory.setBus(transportFactory.getBus());
+        factory.setAddress(address);
+        factory.setServiceBean(o);
+        if (app != null) {
+            factory.setApplication(app);
+        }
+        // factory.setServiceFactory(serviceFactory); // TODO: injections, ...
+
+        server = factory.create();
+        destination = (AbstractHTTPDestination) server.getDestination();
+    }
+
+    public void undeploy() {
+        server.stop();
+    }
+}

Added: openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/resources/META-INF/org.apache.openejb.server.ServerService/cxf-rs
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/resources/META-INF/org.apache.openejb.server.ServerService/cxf-rs?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/resources/META-INF/org.apache.openejb.server.ServerService/cxf-rs (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/resources/META-INF/org.apache.openejb.server.ServerService/cxf-rs Mon Jul 11 14:28:10 2011
@@ -0,0 +1 @@
+server      = org.apache.openejb.server.cxf.rs.CxfRSService

Added: openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RestDeploymentTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RestDeploymentTest.java?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RestDeploymentTest.java (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RestDeploymentTest.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,134 @@
+package org.apache.openejb.server.cxf.rs;
+
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.openejb.assembler.classic.AppInfo;
+import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.assembler.classic.FacilitiesInfo;
+import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
+import org.apache.openejb.assembler.classic.ProxyFactoryInfo;
+import org.apache.openejb.assembler.classic.SecurityServiceInfo;
+import org.apache.openejb.assembler.classic.ServiceInfo;
+import org.apache.openejb.assembler.classic.TransactionServiceInfo;
+import org.apache.openejb.config.AnnotationDeployer;
+import org.apache.openejb.config.ConfigurationFactory;
+import org.apache.openejb.config.WebModule;
+import org.apache.openejb.core.CoreContainerSystem;
+import org.apache.openejb.core.WebContext;
+import org.apache.openejb.core.ivm.naming.IvmJndiFactory;
+import org.apache.openejb.jee.WebApp;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.ServiceDaemon;
+import org.apache.openejb.server.ServiceException;
+import org.apache.openejb.server.cxf.rs.beans.MyExpertRestClass;
+import org.apache.openejb.server.cxf.rs.beans.MyFirstRestClass;
+import org.apache.openejb.server.cxf.rs.beans.MyNonListedRestClass;
+import org.apache.openejb.server.cxf.rs.beans.MyRESTApplication;
+import org.apache.openejb.server.cxf.rs.beans.MySecondRestClass;
+import org.apache.openejb.server.httpd.HttpServer;
+import org.apache.openejb.server.httpd.HttpServerFactory;
+import org.apache.openejb.server.httpd.OpenEJBHttpServer;
+import org.apache.openejb.spi.ContainerSystem;
+import org.apache.xbean.finder.AnnotationFinder;
+import org.apache.xbean.finder.archive.ClassesArchive;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.core.Response;
+import java.io.InputStream;
+import java.io.StringWriter;
+import java.util.Properties;
+
+import static junit.framework.Assert.assertEquals;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public class RestDeploymentTest {
+    private static CxfRSService service;
+    private static HttpServer server;
+    private static ServiceDaemon daemon;
+    public static final String BASE_URL = "http://localhost:4204/my-web-app";
+
+    @BeforeClass public static void start() throws Exception {
+        WebApp webApp = new WebApp();
+        webApp.setContextRoot("/my-web-app");
+        webApp.setId("web");
+        webApp.setVersion("2.5");
+        WebModule webModule = new WebModule(webApp, webApp.getContextRoot(),
+                Thread.currentThread().getContextClassLoader(), "myapp", webApp.getId());
+        webModule.setFinder(new AnnotationFinder(new ClassesArchive(
+                MyFirstRestClass.class, MySecondRestClass.class, MyNonListedRestClass.class,
+                MyRESTApplication.class, MyExpertRestClass.class)).link());
+
+        Assembler assembler = new Assembler();
+        SystemInstance.get().setComponent(Assembler.class, assembler);
+
+        AnnotationDeployer annotationDeployer = new AnnotationDeployer();
+        ConfigurationFactory config = new ConfigurationFactory();
+        assembler.createProxyFactory(config.configureService(ProxyFactoryInfo.class));
+        assembler.createTransactionManager(config.configureService(TransactionServiceInfo.class));
+        assembler.createSecurityService(config.configureService(SecurityServiceInfo.class));
+
+        webModule = annotationDeployer.deploy(webModule);
+
+        ConfigurationFactory factory = new ConfigurationFactory(true);
+        AppInfo appInfo = new AppInfo();
+        appInfo.appId = "rest";
+        appInfo.webApps.add(factory.configureApplication(webModule));
+        assembler.createApplication(appInfo);
+
+        CoreContainerSystem containerSystem = new CoreContainerSystem(new IvmJndiFactory());
+        WebContext webContext = new WebContext();
+        webContext.setId(webApp.getId());
+        webContext.setClassLoader(webModule.getClassLoader());
+        containerSystem.addWebDeployment(webContext);
+        SystemInstance.get().setComponent(ContainerSystem.class, containerSystem);
+
+        ServiceInfo serviceInfo = new ServiceInfo();
+        serviceInfo.className = HttpServerFactory.class.getName();
+        serviceInfo.properties = new Properties();
+        serviceInfo.properties.setProperty("port", "-1");
+        serviceInfo.properties.setProperty("bind", "foo");
+
+        OpenEjbConfiguration configuration = new OpenEjbConfiguration();
+        SystemInstance.get().setComponent(OpenEjbConfiguration.class, configuration);
+        configuration.facilities = new FacilitiesInfo();
+        configuration.facilities.services.add(serviceInfo);
+
+        server = new OpenEJBHttpServer();
+        daemon = new ServiceDaemon(server, 4204, "localhost");
+        daemon.start();
+        server.start();
+
+        service = new CxfRSService();
+        service.start();
+    }
+
+    @AfterClass public static void close() throws ServiceException {
+        service.stop();
+        daemon.stop();
+        server.stop();
+    }
+
+    @Test public void first() {
+        String hi = WebClient.create(BASE_URL).path("/first/hi").get(String.class);
+        assertEquals("Hi from REST World!", hi);
+    }
+
+    @Test public void expert() throws Exception {
+        Response response = WebClient.create(BASE_URL).path("/expert/still-hi").post("Pink Floyd");
+        assertEquals(HttpServletResponse.SC_OK, response.getStatus());
+
+        // convert entity to String
+        // could be done with WebClient.create(BASE_URL).path("/expert/still-hi").post("Pink Floyd", String.class); too
+        InputStream is = (InputStream) response.getEntity();
+        StringWriter writer = new StringWriter();
+        int c;
+        while ((c = is.read()) != -1) {
+            writer.write(c);
+        }
+        assertEquals("hi Pink Floyd", writer.toString());
+    }
+}

Added: openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyExpertRestClass.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyExpertRestClass.java?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyExpertRestClass.java (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyExpertRestClass.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,14 @@
+package org.apache.openejb.server.cxf.rs.beans;
+
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+@Path("/expert")
+public class MyExpertRestClass {
+    @Path("/still-hi/") @POST public String hi(String you) {
+        return "hi " + you;
+    }
+}

Added: openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyFirstRestClass.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyFirstRestClass.java?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyFirstRestClass.java (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyFirstRestClass.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,14 @@
+package org.apache.openejb.server.cxf.rs.beans;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+@Path("/first")
+public class MyFirstRestClass {
+    @Path("/hi") @GET public String hi() {
+        return "Hi from REST World!";
+    }
+}

Added: openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyNonListedRestClass.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyNonListedRestClass.java?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyNonListedRestClass.java (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyNonListedRestClass.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,15 @@
+package org.apache.openejb.server.cxf.rs.beans;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.QueryParam;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+@Path("/non-listed")
+public class MyNonListedRestClass {
+    @Path("/yata") @GET public String yata(@QueryParam("did")String iDidIt) {
+        return "Yata! " + iDidIt;
+    }
+}

Added: openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyRESTApplication.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyRESTApplication.java?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyRESTApplication.java (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyRESTApplication.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,19 @@
+package org.apache.openejb.server.cxf.rs.beans;
+
+import javax.ws.rs.core.Application;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public class MyRESTApplication extends Application {
+    public Set<Class<?>> getClasses() {
+        return new HashSet<Class<?>>(Arrays.asList(MyExpertRestClass.class));
+    }
+
+    public Set<Object> getSingletons() {
+        return new HashSet<Object>(Arrays.asList(new MyFirstRestClass(), new MySecondRestClass()));
+    }
+}

Added: openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MySecondRestClass.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MySecondRestClass.java?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MySecondRestClass.java (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MySecondRestClass.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,15 @@
+package org.apache.openejb.server.cxf.rs.beans;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+@Path("/second")
+public class MySecondRestClass {
+    @Path("/hi2/{you}") @GET public String hi(@PathParam("you") String you) {
+        return "hi " + you;
+    }
+}

Added: openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/META-INF/beans.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/META-INF/beans.xml?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/META-INF/beans.xml (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/META-INF/beans.xml Mon Jul 11 14:28:10 2011
@@ -0,0 +1 @@
+<beans />

Added: openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/log4j.properties?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/log4j.properties (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/log4j.properties Mon Jul 11 14:28:10 2011
@@ -0,0 +1,5 @@
+log4j.category.OpenEJB.rs = debug
+# log4j.category.org.apache.cxf = debug, C
+log4j.appender.C = org.apache.log4j.ConsoleAppender
+log4j.appender.C.layout = org.apache.log4j.PatternLayout
+log4j.appender.C.layout.ConversionPattern = %d - %-5c - %m%n
\ No newline at end of file

Added: 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=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-transport/pom.xml (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-transport/pom.xml Mon Jul 11 14:28:10 2011
@@ -0,0 +1,200 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>server</artifactId>
+    <groupId>org.apache.openejb</groupId>
+    <version>4.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>openejb-cxf-transport</artifactId>
+  <name>OpenEJB :: Server :: CXF Transport</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>openejb-http</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.cxf</groupId>
+      <artifactId>cxf-bundle</artifactId>
+      <exclusions>
+        <exclusion>
+          <groupId>antlr</groupId>
+          <artifactId>antlr</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>asm</groupId>
+          <artifactId>asm</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>aopalliance</groupId>
+          <artifactId>aopalliance</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-server</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-continuation</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-io</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-http</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.eclipse.jetty</groupId>
+          <artifactId>jetty-security</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.eclipse.jetty</groupId>
+          <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>
+        <exclusion>
+          <groupId>org.apache.xmlbeans</groupId>
+          <artifactId>xmlbeans</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.codehaus.woodstox</groupId>
+          <artifactId>woodstox-core-asl</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.codehaus.woodstox</groupId>
+          <artifactId>stax2-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-servlet_3.0_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-stax-api_1.0_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-activation_1.1_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-annotation_1.0_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-javamail_1.4_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-jms_1.1_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.codehaus.jra</groupId>
+          <artifactId>jra</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>rhino</groupId>
+          <artifactId>js</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>javax.xml.bind</groupId>
+          <artifactId>jaxb-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.velocity</groupId>
+          <artifactId>velocity</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>oro</groupId>
+          <artifactId>oro</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.sun.xml.bind</groupId>
+          <artifactId>jaxb-impl</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>com.sun.xml.bind</groupId>
+          <artifactId>jaxb-xjc</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>javax.xml.soap</groupId>
+          <artifactId>saaj-api</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-ws-metadata_2.0_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.apache.geronimo.specs</groupId>
+          <artifactId>geronimo-jaxws_2.2_spec</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-beans</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-expression</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-aop</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-asm</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-context</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-core</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-jms</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-tx</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.springframework</groupId>
+          <artifactId>spring-web</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>joda-time</groupId>
+          <artifactId>joda-time</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.opensaml</groupId>
+          <artifactId>opensaml</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.opensaml</groupId>
+          <artifactId>openws</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>org.opensaml</groupId>
+          <artifactId>xmltooling</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+  </dependencies>
+</project>

Added: openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/HttpDestination.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/HttpDestination.java?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/HttpDestination.java (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/HttpDestination.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,41 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.server.cxf.transport;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.transport.http.AbstractHTTPDestination;
+import org.apache.cxf.transport.http.DestinationRegistry;
+import org.apache.openejb.server.httpd.HttpRequest;
+import org.apache.openejb.server.httpd.HttpResponse;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.logging.Logger;
+
+public class HttpDestination extends AbstractHTTPDestination {
+    public HttpDestination(Bus bus, DestinationRegistry registry, EndpointInfo endpointInfo, String path) throws IOException {
+        super(bus, registry, endpointInfo, path, true);
+    }
+
+    @Override public Logger getLogger() {
+        return Logger.getLogger(HttpDestination.class.getName());
+    }
+}

Added: openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/HttpTransportFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/HttpTransportFactory.java?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/HttpTransportFactory.java (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/HttpTransportFactory.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,40 @@
+/**
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.openejb.server.cxf.transport;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.service.model.EndpointInfo;
+import org.apache.cxf.transport.Destination;
+import org.apache.cxf.transport.http.HTTPTransportFactory;
+
+import java.io.IOException;
+
+public class HttpTransportFactory extends HTTPTransportFactory {
+    public HttpTransportFactory() {
+    	// no-op
+    }
+  
+    public HttpTransportFactory(Bus bus) {
+        setBus(bus);
+
+    }
+
+    @Override public Destination getDestination(EndpointInfo endpointInfo) throws IOException {
+        return new HttpDestination(getBus(), getRegistry(), endpointInfo, endpointInfo.getAddress());
+    }
+}

Added: openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java (added)
+++ openejb/trunk/openejb3/server/openejb-cxf-transport/src/main/java/org/apache/openejb/server/cxf/transport/util/CxfUtil.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,38 @@
+package org.apache.openejb.server.cxf.transport.util;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.bus.extension.ExtensionManagerBus;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public final class CxfUtil {
+    private CxfUtil() {
+        // no-op
+    }
+
+    /*
+     * Ensure the bus created is unqiue and non-shared.
+     * The very first bus created is set as a default bus which then can
+     * be (re)used in other places.
+     */
+    public static Bus getBus() {
+        getDefaultBus();
+        return new ExtensionManagerBus();
+    }
+
+    /*
+     * Ensure the Spring bus is initialized with the CXF module classloader
+     * instead of the application classloader.
+     */
+    public static Bus getDefaultBus() {
+        ClassLoader cl = Thread.currentThread().getContextClassLoader();
+        Thread.currentThread().setContextClassLoader(CxfUtil.class.getClassLoader());
+        try {
+            return BusFactory.getDefaultBus();
+        } finally {
+            Thread.currentThread().setContextClassLoader(cl);
+        }
+    }
+}

Modified: openejb/trunk/openejb3/server/openejb-cxf/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf/pom.xml?rev=1145190&r1=1145189&r2=1145190&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf/pom.xml (original)
+++ openejb/trunk/openejb3/server/openejb-cxf/pom.xml Mon Jul 11 14:28:10 2011
@@ -36,19 +36,6 @@
       *
     </openejb.osgi.import.pkg>
   </properties>
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>rat-maven-plugin</artifactId>
-        <configuration>
-          <excludes>
-            <exclude>src/main/resources/META-INF/cxf.extension</exclude>
-          </excludes>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
   <dependencies>
     <dependency>
       <groupId>junit</groupId>
@@ -56,11 +43,16 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.openejb</groupId>
+      <groupId>${project.groupId}</groupId>
       <artifactId>openejb-webservices</artifactId>
       <version>${project.version}</version>
     </dependency>
     <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>openejb-cxf-transport</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
       <groupId>wsdl4j</groupId>
       <artifactId>wsdl4j</artifactId>
     </dependency>
@@ -103,7 +95,6 @@
     <dependency>
       <groupId>org.apache.cxf</groupId>
       <artifactId>cxf-bundle</artifactId>
-      <version>2.4.1</version>
       <exclusions>
         <exclusion>
           <groupId>antlr</groupId>
@@ -286,7 +277,6 @@
     <dependency>
       <groupId>xml-resolver</groupId>
       <artifactId>xml-resolver</artifactId>
-      <version>1.2</version>
     </dependency>
     <!-- This is required on IBM JDKs (and potentially others) because saaj-impl depends
          on Sun's internal copy of Xerces. See OPENEJB-1126. -->

Modified: openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfEndpoint.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfEndpoint.java?rev=1145190&r1=1145189&r2=1145190&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfEndpoint.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfEndpoint.java Mon Jul 11 14:28:10 2011
@@ -27,13 +27,7 @@ import org.apache.cxf.jaxws.support.JaxW
 import org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean;
 import org.apache.cxf.service.Service;
 import org.apache.cxf.service.model.BindingInfo;
-import org.apache.cxf.service.model.EndpointInfo;
-import org.apache.cxf.transport.Destination;
-import org.apache.cxf.transport.DestinationFactory;
-import org.apache.cxf.transport.http.AbstractHTTPDestination;
-import org.apache.cxf.transport.http.DestinationRegistry;
 import org.apache.cxf.transport.http.HTTPTransportFactory;
-import org.apache.cxf.transport.http.HttpDestinationFactory;
 import org.apache.openejb.core.webservices.HandlerResolverImpl;
 import org.apache.openejb.core.webservices.PortData;
 
@@ -43,10 +37,8 @@ import javax.xml.ws.Binding;
 import javax.xml.ws.handler.Handler;
 import javax.xml.ws.http.HTTPBinding;
 import javax.xml.ws.soap.SOAPBinding;
-import java.io.IOException;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.Executor;
 
 public abstract class CxfEndpoint {

Modified: openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java?rev=1145190&r1=1145189&r2=1145190&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfService.java Mon Jul 11 14:28:10 2011
@@ -20,9 +20,10 @@ package org.apache.openejb.server.cxf;
 import org.apache.cxf.Bus;
 import org.apache.openejb.BeanContext;
 import org.apache.openejb.core.webservices.PortData;
+import org.apache.openejb.server.cxf.client.SaajInterceptor;
 import org.apache.openejb.server.cxf.ejb.EjbWsContainer;
 import org.apache.openejb.server.cxf.pojo.PojoWsContainer;
-import org.apache.openejb.server.cxf.client.SaajInterceptor;
+import org.apache.openejb.server.cxf.transport.util.CxfUtil;
 import org.apache.openejb.server.httpd.HttpListener;
 import org.apache.openejb.server.webservices.WsService;
 
@@ -43,7 +44,7 @@ public class CxfService extends WsServic
     }
 
     protected HttpListener createEjbWsContainer(URL moduleBaseUrl, PortData port, BeanContext beanContext) {
-        Bus bus = CxfWsContainer.getBus();
+        Bus bus = CxfUtil.getBus();
 
         CxfCatalogUtils.loadOASISCatalog(bus, moduleBaseUrl, "META-INF/jax-ws-catalog.xml");
 
@@ -61,7 +62,7 @@ public class CxfService extends WsServic
     }
 
     protected HttpListener createPojoWsContainer(URL moduleBaseUrl, PortData port, String serviceId, Class target, Context context, String contextRoot) {
-        Bus bus = CxfWsContainer.getBus();
+        Bus bus = CxfUtil.getBus();
 
         CxfCatalogUtils.loadOASISCatalog(bus, moduleBaseUrl, "META-INF/jax-ws-catalog.xml");
 

Modified: openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java?rev=1145190&r1=1145189&r2=1145190&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/CxfWsContainer.java Mon Jul 11 14:28:10 2011
@@ -23,6 +23,7 @@ import org.apache.cxf.bus.extension.Exte
 import org.apache.cxf.transport.http.AbstractHTTPDestination;
 import org.apache.cxf.transport.http.HTTPTransportFactory;
 import org.apache.openejb.core.webservices.PortData;
+import org.apache.openejb.server.cxf.transport.HttpTransportFactory;
 import org.apache.openejb.server.httpd.HttpListener;
 import org.apache.openejb.server.httpd.HttpRequest;
 import org.apache.openejb.server.httpd.HttpResponse;
@@ -70,28 +71,4 @@ public abstract class CxfWsContainer imp
     public void onMessage(HttpRequest request, HttpResponse response) throws Exception {
         destination.invoke(null, request.getServletContext(), request, response);
     }
-
-    /*
-     * Ensure the bus created is unqiue and non-shared.
-     * The very first bus created is set as a default bus which then can
-     * be (re)used in other places.
-     */
-    public static Bus getBus() {
-        getDefaultBus();
-        return new ExtensionManagerBus();
-    }
-
-    /*
-     * Ensure the Spring bus is initialized with the CXF module classloader
-     * instead of the application classloader.
-     */
-    public static Bus getDefaultBus() {
-        ClassLoader cl = Thread.currentThread().getContextClassLoader();
-        Thread.currentThread().setContextClassLoader(CxfEndpoint.class.getClassLoader());
-        try {
-            return BusFactory.getDefaultBus();
-        } finally {
-            Thread.currentThread().setContextClassLoader(cl);
-        }
-    }
 }

Modified: openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/ejb/EjbWsContainer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/ejb/EjbWsContainer.java?rev=1145190&r1=1145189&r2=1145190&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/ejb/EjbWsContainer.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/ejb/EjbWsContainer.java Mon Jul 11 14:28:10 2011
@@ -35,9 +35,4 @@ public class EjbWsContainer extends CxfW
     	EjbEndpoint ep = new EjbEndpoint(bus, port, beanContext, httpTransportFactory);
         return ep;
     }
-
-    public void start() {
-        super.start();
-        // removed?: this.destination.setPassSecurityContext(true);
-    }
 }

Modified: openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java?rev=1145190&r1=1145189&r2=1145190&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java (original)
+++ openejb/trunk/openejb3/server/openejb-cxf/src/main/java/org/apache/openejb/server/cxf/pojo/PojoWsContainer.java Mon Jul 11 14:28:10 2011
@@ -35,12 +35,6 @@ public class PojoWsContainer extends Cxf
     }
 
     protected PojoEndpoint createEndpoint() {
-        PojoEndpoint ep = new PojoEndpoint(bus, port, context, target);
-        return ep;
-    }
-
-    public void start() {
-        super.start();
-        // removed?: this.destination.setPassSecurityContext(true);
+        return new PojoEndpoint(bus, port, context, target);
     }
 }

Copied: openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BasicAuthHttpListenerWrapper.java (from r1144000, openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/BasicAuthHttpListenerWrapper.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BasicAuthHttpListenerWrapper.java?p2=openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BasicAuthHttpListenerWrapper.java&p1=openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/BasicAuthHttpListenerWrapper.java&r1=1144000&r2=1145190&rev=1145190&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-webservices/src/main/java/org/apache/openejb/server/webservices/BasicAuthHttpListenerWrapper.java (original)
+++ openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BasicAuthHttpListenerWrapper.java Mon Jul 11 14:28:10 2011
@@ -15,14 +15,11 @@
  * limitations under the License.
  */
 
-package org.apache.openejb.server.webservices;
+package org.apache.openejb.server.httpd;
 
-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.util.Base64;
-import org.apache.openejb.spi.SecurityService;
 import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.spi.SecurityService;
+import org.apache.openejb.util.Base64;
 
 import javax.security.auth.login.LoginException;
 

Modified: openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java?rev=1145190&r1=1145189&r2=1145190&view=diff
==============================================================================
--- openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java (original)
+++ openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java Mon Jul 11 14:28:10 2011
@@ -52,9 +52,11 @@ public class HttpListenerRegistry implem
         }
     }
 
-    public void removeHttpListener(String regex) {
+    public HttpListener removeHttpListener(String regex) {
+        HttpListener listener;
         synchronized (registry) {
-            registry.remove(regex);
+            listener = registry.remove(regex);
         }
+        return listener;
     }
 }

Added: 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=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpRegistry.java (added)
+++ openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/OpenEJBHttpRegistry.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,86 @@
+package org.apache.openejb.server.httpd;
+
+import org.apache.openejb.assembler.classic.OpenEjbConfiguration;
+import org.apache.openejb.assembler.classic.ServiceInfo;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
+
+import java.net.InetAddress;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public class OpenEJBHttpRegistry {
+    public static final Logger log = Logger.getInstance(LogCategory.HTTPSERVER, OpenEJBHttpRegistry.class);
+
+    protected final HttpListenerRegistry registry;
+    protected final List<URI> baseUris = new ArrayList<URI>();
+
+    public OpenEJBHttpRegistry() {
+        try {
+            OpenEjbConfiguration configuration = SystemInstance.get().getComponent(OpenEjbConfiguration.class);
+            for (ServiceInfo service : configuration.facilities.services) {
+                if (service.className.equals(HttpServerFactory.class.getName())) {
+                    int port = Integer.parseInt(service.properties.getProperty("port"));
+                    String ip = service.properties.getProperty("bind");
+                    if ("0.0.0.0".equals(ip)) {
+                        InetAddress[] addresses = InetAddress.getAllByName(ip);
+                        for (InetAddress address : addresses) {
+                            baseUris.add(new URI("http", null, address.getHostAddress(), port, null, null, null));
+                        }
+                    } else {
+                        baseUris.add(new URI("http", null, ip, port, null, null, null));
+                    }
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            log.error("Unable to build base URIs for Web Service registry", e);
+        }
+        registry = SystemInstance.get().getComponent(HttpListenerRegistry.class);
+    }
+
+    public HttpListener addWrappedHttpListener(HttpListener httpListener, ClassLoader classLoader, String regex) {
+        HttpListener listener = new ClassLoaderHttpListener(httpListener, classLoader);
+        registry.addHttpListener(listener, regex);
+        return listener;
+    }
+
+    public List<String> getResolvedAddresses(String path) {
+        String suffix = path;
+        if (!path.startsWith("/")) {
+            suffix = '/' + suffix;
+        }
+
+        List<String> addresses = new ArrayList<String>();
+        for (URI baseUri : baseUris) {
+            URI address = baseUri.resolve(suffix);
+            addresses.add(address.toString());
+        }
+        return  addresses;
+    }
+
+    private static class ClassLoaderHttpListener implements HttpListener {
+        private final HttpListener delegate;
+        private final ClassLoader classLoader;
+
+        private ClassLoaderHttpListener(HttpListener delegate, ClassLoader classLoader) {
+            this.delegate = delegate;
+            this.classLoader = classLoader;
+        }
+
+        public void onMessage(HttpRequest request, HttpResponse response) throws Exception {
+            ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
+            Thread.currentThread().setContextClassLoader(classLoader);
+            try {
+                delegate.onMessage(request, response);
+            } finally {
+                Thread.currentThread().setContextClassLoader(oldCl);
+            }
+        }
+    }
+}

Added: openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/util/HttpUtil.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/util/HttpUtil.java?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/util/HttpUtil.java (added)
+++ openejb/trunk/openejb3/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/util/HttpUtil.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,34 @@
+package org.apache.openejb.server.httpd.util;
+
+import java.util.List;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public final class HttpUtil {
+    private HttpUtil() {
+        // no-op
+    }
+
+    public static String selectSingleAddress(List<String> addresses) {
+        if (addresses == null || addresses.isEmpty()) {
+            return null;
+        }
+
+        // return the first http address
+        for (String address : addresses) {
+            if (address.startsWith("http:")) {
+                return address;
+            }
+        }
+        // return the first https address
+        for (String address : addresses) {
+            if (address.startsWith("https:")) {
+                return address;
+            }
+        }
+        // just return the first address
+        String address = addresses.iterator().next();
+        return address;
+    }
+}

Added: openejb/trunk/openejb3/server/openejb-rest/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-rest/pom.xml?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-rest/pom.xml (added)
+++ openejb/trunk/openejb3/server/openejb-rest/pom.xml Mon Jul 11 14:28:10 2011
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>server</artifactId>
+    <groupId>org.apache.openejb</groupId>
+    <version>4.0.0-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>openejb-rest</artifactId>
+  <name>OpenEJB :: Server :: REST</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>openejb-http</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+  </dependencies>
+</project>

Added: openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/OpenEJBRestRuntimeException.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/OpenEJBRestRuntimeException.java?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/OpenEJBRestRuntimeException.java (added)
+++ openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/OpenEJBRestRuntimeException.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,10 @@
+package org.apache.openejb.server.rest;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public class OpenEJBRestRuntimeException extends RuntimeException {
+    public OpenEJBRestRuntimeException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}

Added: 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=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java (added)
+++ openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RESTService.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,247 @@
+package org.apache.openejb.server.rest;
+
+import org.apache.openejb.assembler.classic.AppInfo;
+import org.apache.openejb.assembler.classic.Assembler;
+import org.apache.openejb.assembler.classic.DeploymentListener;
+import org.apache.openejb.assembler.classic.WebAppInfo;
+import org.apache.openejb.core.CoreContainerSystem;
+import org.apache.openejb.core.WebContext;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.server.SelfManaging;
+import org.apache.openejb.server.ServerService;
+import org.apache.openejb.server.ServiceException;
+import org.apache.openejb.server.httpd.HttpListenerRegistry;
+import org.apache.openejb.server.httpd.util.HttpUtil;
+import org.apache.openejb.spi.ContainerSystem;
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
+
+import javax.ws.rs.core.Application;
+import javax.ws.rs.core.UriBuilder;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.MalformedURLException;
+import java.net.Socket;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public abstract class RESTService implements ServerService, SelfManaging, DeploymentListener {
+    public static final Logger LOGGER = Logger.getInstance(LogCategory.OPENEJB_RS, RESTService.class);
+
+    private static final String IP = "n/a";
+    private static final int PORT = -1;
+    public static final String NOPATH_PREFIX = "http://nopath/";
+
+    private final Set<AppInfo> deployedApplications = new HashSet<AppInfo>();
+    private final Set<WebAppInfo> deployedWebApps = new HashSet<WebAppInfo>();
+    private final Map<String, Application> deployedRESTApplications = new HashMap<String, Application>();
+    private Assembler assembler;
+    private CoreContainerSystem containerSystem;
+    private RsRegistry rsRegistry;
+
+    private Map<String, Object> restInstances = new HashMap<String, Object>();
+
+    @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;
+                }
+
+                if (!deployedWebApps.add(webApp)) {
+                    return;
+                }
+
+                final ClassLoader classLoader = getClassLoader(webContext.getClassLoader());
+
+                // 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 {
+                            deployRestObject(webApp.contextRoot, load(classLoader, clazz), null, classLoader, RsHttpListener.Scope.PROTOTYPE);
+                        } 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()) {
+                            deployRestObject(webApp.contextRoot, o, appInstance, classLoader, RsHttpListener.Scope.SINGLETON);
+                            LOGGER.info("deploying REST singleton: " + o);
+                        }
+                        for (Class<?> clazz : appInstance.getClasses()) {
+                            deployRestObject(webApp.contextRoot, instantiate(clazz), appInstance, classLoader, RsHttpListener.Scope.PROTOTYPE);
+                            LOGGER.info("deploying REST class: " + clazz);
+                        }
+
+                        LOGGER.info("REST application deployed: " + app);
+                    }
+                }
+            }
+        }
+    }
+
+    private void deployRestObject(String context, Object o, Application app, ClassLoader classLoader, RsHttpListener.Scope scope) {
+        final String nopath = getAddress(NOPATH_PREFIX + context, o) + "/.*";
+        final RsHttpListener listener = createHttpListener(o, scope);
+        final List<String> addresses = rsRegistry.createRsHttpListener(listener, classLoader, nopath.substring(NOPATH_PREFIX.length() - 1));
+        final String address = HttpUtil.selectSingleAddress(addresses);
+
+        restInstances.put(address, o);
+        listener.deploy(getFullContext(address, context), o, app);
+    }
+
+    protected abstract RsHttpListener createHttpListener(Object o, RsHttpListener.Scope scope);
+
+
+    private static String getFullContext(String address, String context) {
+        int idx = address.indexOf(context);
+        String base = address.substring(0, idx);
+        if (!base.endsWith("/") && !context.startsWith("/")) {
+            base = base + '/';
+        }
+        return base + context;
+    }
+
+    private String getAddress(String context, Object o) {
+        try {
+            return UriBuilder.fromUri(new URI(context)).path(o.getClass()).build().toURL().toString();
+        } catch (MalformedURLException e) {
+            throw new OpenEJBRestRuntimeException("url is malformed", e);
+        } catch (URISyntaxException e) {
+            throw new OpenEJBRestRuntimeException("uri syntax is not correct", e);
+        }
+    }
+
+    private void undeployRestObject(String context) {
+        RsHttpListener.class.cast(rsRegistry.removeListener(context)).undeploy();
+    }
+
+    private Object load(ClassLoader classLoader, String clazz) throws ClassNotFoundException {
+        Class<?> loaded;
+        loaded = classLoader.loadClass(clazz);
+        return instantiate(loaded);
+    }
+
+    private <T> T instantiate(Class<T> clazz) {
+        try {
+            return clazz.newInstance();
+        } catch (InstantiationException e) {
+            final String msg = "can't instantiate REST object " + clazz;
+            LOGGER.error(msg, e);
+            throw new OpenEJBRestRuntimeException(msg, e);
+        } catch (IllegalAccessException e) {
+            final String msg = "can't access REST object " + clazz + clazz;
+            LOGGER.error(msg, e);
+            throw new OpenEJBRestRuntimeException(msg, e);
+        }
+    }
+
+    private static ClassLoader getClassLoader(ClassLoader classLoader) {
+        ClassLoader cl = classLoader;
+        if (cl == null) {
+            cl = Thread.currentThread().getContextClassLoader();
+        }
+        if (cl == null) {
+            cl = RESTService.class.getClassLoader();
+        }
+        return cl;
+    }
+
+    @Override public void beforeApplicationDestroyed(AppInfo appInfo) {
+        if (deployedApplications.contains(appInfo)) {
+            for (WebAppInfo webApp : appInfo.webApps) {
+                for (Map.Entry<String, Application> restApp : deployedRESTApplications.entrySet()) {
+                    if (restApp.getKey().endsWith(webApp.contextRoot)) {
+                        deployedRESTApplications.remove(restApp.getKey());
+                    }
+                }
+                for (Map.Entry<String, Object> instances : restInstances.entrySet()) {
+                    if (instances.getKey().endsWith(webApp.contextRoot)) {
+                        undeployRestObject(instances.getKey());
+                    }
+                }
+            }
+        }
+    }
+
+    @Override public void start() throws ServiceException {
+        beforeStart();
+
+        containerSystem = (CoreContainerSystem) SystemInstance.get().getComponent(ContainerSystem.class);
+        assembler = SystemInstance.get().getComponent(Assembler.class);
+        if (assembler != null) {
+            assembler.addDeploymentListener(this);
+            for (AppInfo appInfo : assembler.getDeployedApplications()) {
+                afterApplicationCreated(appInfo);
+            }
+        }
+    }
+
+    protected void beforeStart() {
+        rsRegistry = SystemInstance.get().getComponent(RsRegistry.class);
+        if (rsRegistry == null && SystemInstance.get().getComponent(HttpListenerRegistry.class) != null) {
+            rsRegistry = new RsRegistryImpl();
+        }
+    }
+
+    @Override public void stop() throws ServiceException {
+        if (assembler != null) {
+            assembler.removeDeploymentListener(this);
+            for (AppInfo appInfo : new ArrayList<AppInfo>(deployedApplications)) {
+                beforeApplicationDestroyed(appInfo);
+            }
+        }
+    }
+
+    @Override public void service(InputStream in, OutputStream out) throws ServiceException, IOException {
+        throw new UnsupportedOperationException(getClass().getName() + " cannot be invoked directly");
+    }
+
+    @Override public void service(Socket socket) throws ServiceException, IOException {
+        throw new UnsupportedOperationException(getClass().getName() + " cannot be invoked directly");
+    }
+
+    @Override public String getIP() {
+        return IP;
+    }
+
+    @Override public int getPort() {
+        return PORT;
+    }
+
+    @Override public void init(Properties properties) throws Exception {
+        // no-op
+    }
+}

Added: openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java?rev=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java (added)
+++ openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,17 @@
+package org.apache.openejb.server.rest;
+
+import org.apache.openejb.server.httpd.HttpListener;
+
+import javax.ws.rs.core.Application;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public interface RsHttpListener extends HttpListener {
+    public static enum Scope {
+        SINGLETON, PROTOTYPE
+    }
+
+    void deploy(String address, Object o, Application app);
+    void undeploy();
+}

Added: 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=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistry.java (added)
+++ openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistry.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,13 @@
+package org.apache.openejb.server.rest;
+
+import org.apache.openejb.server.httpd.HttpListener;
+
+import java.util.List;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public interface RsRegistry {
+    List<String> createRsHttpListener(HttpListener listener, ClassLoader classLoader, String path);
+    HttpListener removeListener(String context);
+}

Added: 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=1145190&view=auto
==============================================================================
--- openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistryImpl.java (added)
+++ openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsRegistryImpl.java Mon Jul 11 14:28:10 2011
@@ -0,0 +1,20 @@
+package org.apache.openejb.server.rest;
+
+import org.apache.openejb.server.httpd.HttpListener;
+import org.apache.openejb.server.httpd.OpenEJBHttpRegistry;
+
+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) {
+        addWrappedHttpListener(listener, classLoader, path);
+        return getResolvedAddresses(path);
+    }
+
+    @Override public HttpListener removeListener(String context) {
+        return registry.removeHttpListener(context);
+    }
+}