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