Author: dkulp
Date: Wed Apr 2 14:22:29 2008
New Revision: 644075
URL: http://svn.apache.org/viewvc?rev=644075&view=rev
Log:
[CXF-1498] Patch from Mickael Goujon applied.
Support injection of servlet things
Modified:
incubator/cxf/trunk/rt/frontend/jaxrs/pom.xml
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSUtils.java
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/JAXRSUtilsTest.java
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java
Modified: incubator/cxf/trunk/rt/frontend/jaxrs/pom.xml
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxrs/pom.xml?rev=644075&r1=644074&r2=644075&view=diff
==============================================================================
--- incubator/cxf/trunk/rt/frontend/jaxrs/pom.xml (original)
+++ incubator/cxf/trunk/rt/frontend/jaxrs/pom.xml Wed Apr 2 14:22:29 2008
@@ -68,6 +68,11 @@
<version>0.6</version>
</dependency>
<dependency>
+ <groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-transports-http</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
</dependency>
Modified:
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java?rev=644075&r1=644074&r2=644075&view=diff
==============================================================================
---
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
(original)
+++
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
Wed Apr 2 14:22:29 2008
@@ -62,6 +62,9 @@
JAXRSUtils.injectHttpContextValues(resourceObject,
ori,
exchange.getInMessage());
+ JAXRSUtils.injectServletResourceValues(resourceObject,
+ ori,
+ exchange.getInMessage());
}
List<Object> params = null;
Modified:
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSUtils.java
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSUtils.java?rev=644075&r1=644074&r2=644075&view=diff
==============================================================================
---
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSUtils.java
(original)
+++
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSUtils.java
Wed Apr 2 14:22:29 2008
@@ -40,6 +40,9 @@
import java.util.SortedMap;
import java.util.TreeMap;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.ConsumeMime;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.HttpMethod;
@@ -70,6 +73,7 @@
import org.apache.cxf.jaxrs.provider.SecurityContextImpl;
import org.apache.cxf.jaxrs.provider.UriInfoImpl;
import org.apache.cxf.message.Message;
+import org.apache.cxf.transport.http.AbstractHTTPDestination;
public final class JAXRSUtils {
@@ -390,6 +394,21 @@
return null;
}
+ public static Object createServletResourceValue(Message m, Class<?> clazz)
{
+
+ if (HttpServletRequest.class.isAssignableFrom(clazz)) {
+ return (HttpServletRequest)
m.get(AbstractHTTPDestination.HTTP_REQUEST);
+ }
+ if (HttpServletResponse.class.isAssignableFrom(clazz)) {
+ return (HttpServletResponse)
m.get(AbstractHTTPDestination.HTTP_RESPONSE);
+ }
+ if (ServletContext.class.isAssignableFrom(clazz)) {
+ return (ServletContext)
m.get(AbstractHTTPDestination.HTTP_CONTEXT);
+ }
+
+ return null;
+ }
+
private static Object readFromUriParam(PathParam uriParamAnnotation,
Class<?> parameter,
Type parameterType,
@@ -594,6 +613,21 @@
}
}
+ public static void injectServletResourceValues(Object o,
+ OperationResourceInfo ori,
+ Message m) {
+
+ for (Field f : ori.getClassResourceInfo().getResources()) {
+ Object value = createServletResourceValue(m, f.getType());
+ f.setAccessible(true);
+ try {
+ f.set(o, value);
+ } catch (IllegalAccessException ex) {
+ // ignore
+ }
+ }
+ }
+
private static <K, V> MultivaluedMap<K, V> cloneMap(MultivaluedMap<K, V>
map1) {
MultivaluedMap<K, V> map2 = new MetadataMap<K, V>();
Modified:
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java?rev=644075&r1=644074&r2=644075&view=diff
==============================================================================
---
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
(original)
+++
incubator/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/ClassResourceInfo.java
Wed Apr 2 14:22:29 2008
@@ -24,6 +24,7 @@
import java.util.Collections;
import java.util.List;
+import javax.annotation.Resource;
import javax.ws.rs.core.Context;
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
@@ -37,6 +38,7 @@
private ResourceProvider resourceProvider;
private List<ClassResourceInfo> subClassResourceInfo = new
ArrayList<ClassResourceInfo>();
private List<Field> httpContexts;
+ private List<Field> resources;
public ClassResourceInfo(Class<?> theResourceClass) {
this(theResourceClass, false);
@@ -46,6 +48,7 @@
resourceClass = theResourceClass;
root = theRoot;
initHttpContexts();
+ initResources();
}
public boolean isRoot() {
@@ -106,11 +109,41 @@
}
}
}
+
+ private void initResources() {
+ if (resourceClass == null || !root) {
+ return;
+ }
+ resources = new ArrayList<Field>();
+ Field[] fields = resourceClass.getDeclaredFields();
+
+ for (Field f : fields) {
+ Resource resource = f.getAnnotation(Resource.class);
+ if (resource != null) {
+ resources.add(f);
+ }
+ }
+ }
+
- @SuppressWarnings("unchecked")
public List<Field> getHttpContexts() {
- return httpContexts == null ? Collections.EMPTY_LIST
- : Collections.unmodifiableList(httpContexts);
+ List<Field> ret;
+ if (httpContexts != null) {
+ ret = Collections.unmodifiableList(httpContexts);
+ } else {
+ ret = Collections.emptyList();
+ }
+ return ret;
+ }
+
+ public List<Field> getResources() {
+ List<Field> ret;
+ if (resources != null) {
+ ret = Collections.unmodifiableList(resources);
+ } else {
+ ret = Collections.emptyList();
+ }
+ return ret;
}
}
Modified:
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/JAXRSUtilsTest.java
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/JAXRSUtilsTest.java?rev=644075&r1=644074&r2=644075&view=diff
==============================================================================
---
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/JAXRSUtilsTest.java
(original)
+++
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/JAXRSUtilsTest.java
Wed Apr 2 14:22:29 2008
@@ -24,6 +24,10 @@
import java.util.HashMap;
import java.util.List;
+import javax.annotation.Resource;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.ConsumeMime;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.MatrixParam;
@@ -47,11 +51,16 @@
import org.apache.cxf.jaxrs.provider.UriInfoImpl;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
+import org.apache.cxf.transport.http.AbstractHTTPDestination;
+
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.replay;
+
public class JAXRSUtilsTest extends Assert {
public class Customer {
@@ -60,6 +69,9 @@
@Context private HttpHeaders headers;
@Context private Request request;
@Context private SecurityContext sContext;
+ @Resource private HttpServletRequest servletRequest;
+ @Resource private HttpServletResponse servletResponse;
+ @Resource private ServletContext servletContext;
public UriInfo getUriInfo() {
return uriInfo;
@@ -77,6 +89,18 @@
return sContext;
}
+ public HttpServletRequest getServletRequest() {
+ return servletRequest;
+ }
+
+ public HttpServletResponse getServletResponse() {
+ return servletResponse;
+ }
+
+ public ServletContext getServletContext() {
+ return servletContext;
+ }
+
@ProduceMime("text/xml")
@ConsumeMime("text/xml")
public void test() {
@@ -582,6 +606,34 @@
assertSame(HttpHeadersImpl.class, c.getHeaders().getClass());
assertSame(RequestImpl.class, c.getRequest().getClass());
assertSame(SecurityContextImpl.class,
c.getSecurityContext().getClass());
+
+ }
+
+ @Test
+ public void testServletResourceFields() throws Exception {
+
+ ClassResourceInfo cri = new ClassResourceInfo(Customer.class, true);
+ OperationResourceInfo ori = new OperationResourceInfo(null, cri);
+
+ Customer c = new Customer();
+
+ // Creating mocks for the servlet request, response and context
+ HttpServletRequest request = createMock(HttpServletRequest.class);
+ HttpServletResponse response = createMock(HttpServletResponse.class);
+ ServletContext context = createMock(ServletContext.class);
+ replay(request);
+ replay(response);
+ replay(context);
+
+ Message m = new MessageImpl();
+ m.put(AbstractHTTPDestination.HTTP_REQUEST, request);
+ m.put(AbstractHTTPDestination.HTTP_RESPONSE, response);
+ m.put(AbstractHTTPDestination.HTTP_CONTEXT, context);
+
+ JAXRSUtils.injectServletResourceValues(c, ori, m);
+ assertSame(request.getClass(), c.getServletRequest().getClass());
+ assertSame(response.getClass(), c.getServletResponse().getClass());
+ assertSame(context.getClass(), c.getServletContext().getClass());
}
}
Modified:
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java
URL:
http://svn.apache.org/viewvc/incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java?rev=644075&r1=644074&r2=644075&view=diff
==============================================================================
---
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java
(original)
+++
incubator/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/model/ClassResourceInfoTest.java
Wed Apr 2 14:22:29 2008
@@ -20,8 +20,14 @@
package org.apache.cxf.jaxrs.model;
import java.lang.reflect.Field;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
+import javax.annotation.Resource;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.UriInfo;
@@ -34,6 +40,9 @@
private static class TestClass {
@Context UriInfo u;
@Context HttpHeaders h;
+ @Resource HttpServletRequest req;
+ @Resource HttpServletResponse res;
+ @Resource ServletContext c;
int i;
}
@@ -51,6 +60,24 @@
|| fields.get(1).getType() == UriInfo.class)
&& (fields.get(0).getType() == HttpHeaders.class
|| fields.get(1).getType() == HttpHeaders.class));
+ }
+
+ @Test
+ public void testGetResources() {
+ ClassResourceInfo c = new ClassResourceInfo(TestClass.class);
+ List<Field> fields = c.getResources();
+ assertEquals("Only root classes should check these fields", 0,
fields.size());
+ c = new ClassResourceInfo(TestClass.class, true);
+ fields = c.getResources();
+ Set<Class<?>> clses = new HashSet<Class<?>>();
+ for (Field f : fields) {
+ clses.add(f.getType());
+ }
+ assertEquals("3 resources fields available", 3, fields.size());
+ assertTrue("Wrong fields selected",
+ clses.contains(HttpServletRequest.class)
+ && clses.contains(HttpServletResponse.class)
+ && clses.contains(ServletContext.class));
}
}