Author: rmannibucau
Date: Tue Jul 12 20:43:58 2011
New Revision: 1145761

URL: http://svn.apache.org/viewvc?rev=1145761&view=rev
Log:
adding some feature to REST implementation (starting to inject things)

Added:
    
openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestResourceProvider.java
    
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/HookedRest.java
    
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java
    
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/SimpleEJB.java
    
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/META-INF/ejb-jar.xml
Removed:
    
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/META-INF/beans.xml
Modified:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/config/AnnotationDeployer.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/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/MyRESTApplication.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

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=1145761&r1=1145760&r2=1145761&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 12 20:43:58 2011
@@ -1437,6 +1437,29 @@ public class AnnotationDeployer implemen
 
             ClassLoader classLoader = webModule.getClassLoader();
 
+            for (String application : webModule.getRestApplications()) {
+                if (application != null) {
+                    Class<?> clazz = null;
+                    try {
+                        clazz = classLoader.loadClass(application);
+                        classes.add(clazz);
+                    } catch (ClassNotFoundException e) {
+                        throw new OpenEJBException("Unable to load Application 
class: " + application, e);
+                    }
+
+                    if (clazz != null) {
+                        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/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=1145761&r1=1145760&r2=1145761&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 12 20:43:58 2011
@@ -18,19 +18,21 @@ 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.Injection;
 import org.apache.openejb.server.httpd.HttpRequest;
 import org.apache.openejb.server.httpd.HttpResponse;
 import org.apache.openejb.server.rest.RsHttpListener;
 
+import javax.naming.Context;
 import javax.servlet.http.HttpServletRequestWrapper;
 import javax.ws.rs.core.Application;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.Collection;
 
 /**
  * @author Romain Manni-Bucau
@@ -63,28 +65,39 @@ public class CxfRsHttpListener implement
 
     }
 
-    public ResourceProvider getResourceProvider(Object o) {
+    // TODO
+    public ResourceProvider getResourceProvider(Object o, 
Collection<Injection> injections, Context context) {
         switch (scope) {
             case SINGLETON:
                 return new SingletonResourceProvider(o);
             case PROTOTYPE:
             default:
-                return new PerRequestResourceProvider(o.getClass());
+                return new OpenEJBPerRequestResourceProvider(getRESTClass(o), 
injections, context);
         }
     }
 
-    public void deploy(String address, Object o, Application app) {
+    private Class<?> getRESTClass(Object o) {
+        if (o instanceof Class) {
+            return Class.class.cast(o);
+        }
+        return o.getClass();
+    }
+
+    public void deploy(String address, Object o, Application app, 
Collection<Injection> injections, Context context) {
         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);
+        factory.setResourceProvider(getResourceProvider(o, injections, 
context));
+        if (scope == Scope.PROTOTYPE) {
+            factory.setServiceClass(Class.class.cast(o));
+        } else {
+            factory.setServiceBean(o);
+        }
         if (app != null) {
             factory.setApplication(app);
         }
-        // factory.setServiceFactory(serviceFactory); // TODO: injections, ...
 
         server = factory.create();
         destination = (AbstractHTTPDestination) server.getDestination();

Added: 
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=1145761&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestResourceProvider.java
 (added)
+++ 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/main/java/org/apache/openejb/server/cxf/rs/OpenEJBPerRequestResourceProvider.java
 Tue Jul 12 20:43:58 2011
@@ -0,0 +1,53 @@
+/*
+ * 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.rs;
+
+import org.apache.cxf.jaxrs.lifecycle.PerRequestResourceProvider;
+import org.apache.cxf.message.Message;
+import org.apache.openejb.Injection;
+import org.apache.openejb.InjectionProcessor;
+
+import javax.naming.Context;
+import javax.ws.rs.WebApplicationException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+public class OpenEJBPerRequestResourceProvider extends 
PerRequestResourceProvider {
+    private Collection<Injection> injections;
+    private Context context;
+
+    public OpenEJBPerRequestResourceProvider(Class<?> clazz, 
Collection<Injection> injectionCollection, Context ctx) {
+        super(clazz);
+        injections = injectionCollection;
+        context = ctx;
+    }
+
+    protected Object createInstance(Message m) {
+        Object o = super.createInstance(m);
+        try {
+            InjectionProcessor<?> injector = new InjectionProcessor<Object>(o, 
new ArrayList<Injection>(injections), context);
+            injector.createInstance();
+            injector.postConstruct();
+            return injector.getInstance();
+        } catch (Exception e) {
+            throw new WebApplicationException(e);
+        }
+    }
+}

Modified: 
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=1145761&r1=1145760&r2=1145761&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RestDeploymentTest.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/RestDeploymentTest.java
 Tue Jul 12 20:43:58 2011
@@ -17,6 +17,7 @@
 package org.apache.openejb.server.cxf.rs;
 
 import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.openejb.Injection;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Assembler;
 import org.apache.openejb.assembler.classic.FacilitiesInfo;
@@ -26,20 +27,27 @@ import org.apache.openejb.assembler.clas
 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.AppModule;
 import org.apache.openejb.config.ConfigurationFactory;
+import org.apache.openejb.config.EjbModule;
 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.EjbJar;
+import org.apache.openejb.jee.StatelessBean;
 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.HookedRest;
 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.cxf.rs.beans.RestWithInjections;
+import org.apache.openejb.server.cxf.rs.beans.SimpleEJB;
 import org.apache.openejb.server.httpd.HttpServer;
 import org.apache.openejb.server.httpd.HttpServerFactory;
 import org.apache.openejb.server.httpd.OpenEJBHttpServer;
@@ -50,10 +58,15 @@ import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import javax.naming.Context;
+import javax.naming.InitialContext;
 import javax.servlet.http.HttpServletResponse;
 import javax.ws.rs.core.Response;
 import java.io.InputStream;
 import java.io.StringWriter;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
 import java.util.Properties;
 
 import static junit.framework.Assert.assertEquals;
@@ -76,7 +89,7 @@ public class RestDeploymentTest {
                 Thread.currentThread().getContextClassLoader(), "myapp", 
webApp.getId());
         webModule.setFinder(new AnnotationFinder(new ClassesArchive(
                 MyFirstRestClass.class, MySecondRestClass.class, 
MyNonListedRestClass.class,
-                MyRESTApplication.class, MyExpertRestClass.class)).link());
+                MyRESTApplication.class, MyExpertRestClass.class, 
HookedRest.class, RestWithInjections.class)).link());
 
         Assembler assembler = new Assembler();
         SystemInstance.get().setComponent(Assembler.class, assembler);
@@ -89,16 +102,35 @@ public class RestDeploymentTest {
 
         webModule = annotationDeployer.deploy(webModule);
 
-        ConfigurationFactory factory = new ConfigurationFactory(true);
-        AppInfo appInfo = new AppInfo();
-        appInfo.appId = "rest";
-        appInfo.webApps.add(factory.configureApplication(webModule));
+        EjbJar ejbJar = new EjbJar("ejb");
+        ejbJar.addEnterpriseBean(new StatelessBean(SimpleEJB.class));
+
+        ConfigurationFactory factory = new ConfigurationFactory(false);
+
+        AppModule appModule = new 
AppModule(Thread.currentThread().getContextClassLoader(), "foo");
+        appModule.setModuleId("rest");
+        appModule.getWebModules().add(webModule);
+        appModule.getEjbModules().add(new EjbModule(ejbJar));
+        annotationDeployer.deploy(appModule);
+
+        AppInfo appInfo = factory.configureApplication(appModule);
         assembler.createApplication(appInfo);
 
+        Context ctx = (Context) 
Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new 
Class<?>[]{Context.class}, new InvocationHandler() {
+            @Override public Object invoke(Object proxy, Method method, 
Object[] args) throws Throwable {
+                if (args.length == 1 && args[0].equals("SimpleEJBLocalBean")) {
+                    return new SimpleEJB();
+                }
+                return method.invoke(new InitialContext(), args);
+            }
+        });
+
         CoreContainerSystem containerSystem = new CoreContainerSystem(new 
IvmJndiFactory());
         WebContext webContext = new WebContext();
         webContext.setId(webApp.getId());
         webContext.setClassLoader(webModule.getClassLoader());
+        webContext.getInjections().add(new Injection("SimpleEJBLocalBean", 
"simple", RestWithInjections.class));
+        webContext.setJndiEnc(ctx);
         containerSystem.addWebDeployment(webContext);
         SystemInstance.get().setComponent(ContainerSystem.class, 
containerSystem);
 
@@ -156,4 +188,12 @@ public class RestDeploymentTest {
     @Test public void nonListed() { // default handler from openejb-http
         assertEquals("", 
WebClient.create(BASE_URL).path("/non-listed/yata/foo").get(String.class));
     }
+
+    @Test public void hooked() {
+        assertEquals(true, 
WebClient.create(BASE_URL).path("/hooked/post").get(Boolean.class).booleanValue());
+    }
+
+    @Test public void injectEjb() {
+        assertEquals(true, 
WebClient.create(BASE_URL).path("/inject/ejb").get(Boolean.class).booleanValue());
+    }
 }

Added: 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/HookedRest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/HookedRest.java?rev=1145761&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/HookedRest.java
 (added)
+++ 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/HookedRest.java
 Tue Jul 12 20:43:58 2011
@@ -0,0 +1,37 @@
+/*
+ * 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.rs.beans;
+
+import javax.annotation.PostConstruct;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+@Path("/hooked")
+public class HookedRest {
+    private boolean post = false;
+
+    @PostConstruct public void post() {
+        post  = true;
+    }
+
+    @Path("/post") @GET public boolean wasPosted() {
+        return post;
+    }
+}

Modified: 
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=1145761&r1=1145760&r2=1145761&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyRESTApplication.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/MyRESTApplication.java
 Tue Jul 12 20:43:58 2011
@@ -26,7 +26,7 @@ import java.util.Set;
  */
 public class MyRESTApplication extends Application {
     public Set<Class<?>> getClasses() {
-        return new HashSet<Class<?>>(Arrays.asList(MyExpertRestClass.class));
+        return new HashSet<Class<?>>(Arrays.asList(MyExpertRestClass.class, 
HookedRest.class, RestWithInjections.class));
     }
 
     public Set<Object> getSingletons() {

Added: 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java?rev=1145761&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java
 (added)
+++ 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/RestWithInjections.java
 Tue Jul 12 20:43:58 2011
@@ -0,0 +1,33 @@
+/*
+ * 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.rs.beans;
+
+import javax.ejb.EJB;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+@Path("/inject")
+public class RestWithInjections {
+    @EJB private SimpleEJB simple;
+
+    @Path("/ejb") @GET public boolean ejb() {
+        return simple != null && "ok".equals(simple.ok());
+    }
+}

Added: 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/SimpleEJB.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/SimpleEJB.java?rev=1145761&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/SimpleEJB.java
 (added)
+++ 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/java/org/apache/openejb/server/cxf/rs/beans/SimpleEJB.java
 Tue Jul 12 20:43:58 2011
@@ -0,0 +1,29 @@
+/*
+ * 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.rs.beans;
+
+import javax.ejb.Stateless;
+
+/**
+ * @author Romain Manni-Bucau
+ */
+@Stateless
+public class SimpleEJB {
+    public String ok() {
+        return "ok";
+    }
+}

Added: 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/META-INF/ejb-jar.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/META-INF/ejb-jar.xml?rev=1145761&view=auto
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/META-INF/ejb-jar.xml
 (added)
+++ 
openejb/trunk/openejb3/server/openejb-cxf-rs/src/test/resources/META-INF/ejb-jar.xml
 Tue Jul 12 20:43:58 2011
@@ -0,0 +1,17 @@
+<!--
+  ~ 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.
+  -->
+<ejb-jar />

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=1145761&r1=1145760&r2=1145761&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 12 20:43:58 2011
@@ -17,6 +17,7 @@
 
 package org.apache.openejb.server.rest;
 
+import org.apache.openejb.Injection;
 import org.apache.openejb.assembler.classic.AppInfo;
 import org.apache.openejb.assembler.classic.Assembler;
 import org.apache.openejb.assembler.classic.DeploymentListener;
@@ -33,6 +34,7 @@ import org.apache.openejb.spi.ContainerS
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 
+import javax.naming.Context;
 import javax.ws.rs.core.Application;
 import javax.ws.rs.core.UriBuilder;
 import java.io.IOException;
@@ -43,10 +45,9 @@ import java.net.Socket;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 
@@ -66,7 +67,7 @@ public abstract class RESTService implem
     private CoreContainerSystem containerSystem;
     private RsRegistry rsRegistry;
 
-    private Map<String, Object> restInstances = new HashMap<String, Object>();
+    private List<String> services = new ArrayList<String>();
 
     @Override public void afterApplicationCreated(final AppInfo appInfo) {
         if (deployedApplications.add(appInfo)) {
@@ -81,6 +82,8 @@ public abstract class RESTService implem
                 }
 
                 final ClassLoader classLoader = 
getClassLoader(webContext.getClassLoader());
+                Collection<Injection> injections = webContext.getInjections();
+                Context context = webContext.getJndiEnc();
 
                 // The spec says:
                 //
@@ -97,7 +100,7 @@ public abstract class RESTService implem
                 if (webApp.restApplications.isEmpty()) {
                     for (String clazz : webApp.restClass) {
                         try {
-                            deployRestObject(webApp.contextRoot, 
load(classLoader, clazz), null, classLoader, RsHttpListener.Scope.PROTOTYPE);
+                            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);
                         }
@@ -113,12 +116,12 @@ public abstract class RESTService implem
                         }
 
                         for (Object o : appInstance.getSingletons()) {
-                            deployRestObject(webApp.contextRoot, o, 
appInstance, classLoader, RsHttpListener.Scope.SINGLETON);
-                            LOGGER.info("deploying REST singleton: " + o);
+                            deploy(webApp.contextRoot, o, appInstance, 
classLoader, RsHttpListener.Scope.SINGLETON, injections, context);
+                            LOGGER.info("deployed REST singleton: " + o);
                         }
                         for (Class<?> clazz : appInstance.getClasses()) {
-                            deployRestObject(webApp.contextRoot, 
instantiate(clazz), appInstance, classLoader, RsHttpListener.Scope.PROTOTYPE);
-                            LOGGER.info("deploying REST class: " + clazz);
+                            deploy(webApp.contextRoot, clazz, appInstance, 
classLoader, RsHttpListener.Scope.PROTOTYPE, injections, context);
+                            LOGGER.info("deployed REST class: " + clazz);
                         }
 
                         LOGGER.info("REST application deployed: " + app);
@@ -128,14 +131,23 @@ public abstract class RESTService implem
         }
     }
 
-    private void deployRestObject(String context, Object o, Application app, 
ClassLoader classLoader, RsHttpListener.Scope scope) {
-        final String nopath = getAddress(NOPATH_PREFIX + context, o) + "/.*";
+    /**
+     * @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
+     */
+    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 String address = HttpUtil.selectSingleAddress(addresses);
 
-        restInstances.put(address, o);
-        listener.deploy(getFullContext(address, context), o, app);
+        services.add(address);
+        listener.deploy(getFullContext(address, context), o, app, injections, 
ctx);
     }
 
     protected abstract RsHttpListener createHttpListener(Object o, 
RsHttpListener.Scope scope);
@@ -150,9 +162,14 @@ public abstract class RESTService implem
         return base + context;
     }
 
-    private String getAddress(String context, Object o) {
+    private String getAddress(String context, Object o, RsHttpListener.Scope 
scope) {
+        Class<?> clazz = o.getClass();
+        if (scope == RsHttpListener.Scope.PROTOTYPE) {
+            clazz = Class.class.cast(o);
+        }
+
         try {
-            return UriBuilder.fromUri(new 
URI(context)).path(o.getClass()).build().toURL().toString();
+            return UriBuilder.fromUri(new 
URI(context)).path(clazz).build().toURL().toString();
         } catch (MalformedURLException e) {
             throw new OpenEJBRestRuntimeException("url is malformed", e);
         } catch (URISyntaxException e) {
@@ -198,9 +215,9 @@ public abstract class RESTService implem
     @Override public void beforeApplicationDestroyed(AppInfo appInfo) {
         if (deployedApplications.contains(appInfo)) {
             for (WebAppInfo webApp : appInfo.webApps) {
-                for (Map.Entry<String, Object> instances : 
restInstances.entrySet()) {
-                    if (instances.getKey().endsWith(webApp.contextRoot)) {
-                        undeployRestObject(instances.getKey());
+                for (String address : services) {
+                    if (address.endsWith(webApp.contextRoot)) {
+                        undeployRestObject(address);
                     }
                 }
             }

Modified: 
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=1145761&r1=1145760&r2=1145761&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java
 (original)
+++ 
openejb/trunk/openejb3/server/openejb-rest/src/main/java/org/apache/openejb/server/rest/RsHttpListener.java
 Tue Jul 12 20:43:58 2011
@@ -17,9 +17,12 @@
 
 package org.apache.openejb.server.rest;
 
+import org.apache.openejb.Injection;
 import org.apache.openejb.server.httpd.HttpListener;
 
+import javax.naming.Context;
 import javax.ws.rs.core.Application;
+import java.util.Collection;
 
 /**
  * @author Romain Manni-Bucau
@@ -29,6 +32,6 @@ public interface RsHttpListener extends 
         SINGLETON, PROTOTYPE
     }
 
-    void deploy(String address, Object o, Application app);
+    void deploy(String address, Object o, Application app, 
Collection<Injection> injections, Context ctx);
     void undeploy();
 }


Reply via email to