You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2011/03/16 18:18:05 UTC
svn commit: r1082223 - in /cxf/trunk/rt/frontend/jaxrs/src:
main/java/org/apache/cxf/jaxrs/ main/java/org/apache/cxf/jaxrs/model/
main/java/org/apache/cxf/jaxrs/utils/ test/java/org/apache/cxf/jaxrs/
test/java/org/apache/cxf/jaxrs/utils/
Author: sergeyb
Date: Wed Mar 16 17:18:05 2011
New Revision: 1082223
URL: http://svn.apache.org/viewvc?rev=1082223&view=rev
Log:
[CXF-3379] Support for the injection of JAX-RS Applications
Added:
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerApplication.java (with props)
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AnnotationUtils.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java?rev=1082223&r1=1082222&r2=1082223&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSServerFactoryBean.java Wed Mar 16 17:18:05 2011
@@ -25,6 +25,8 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import javax.ws.rs.core.Application;
+
import org.apache.cxf.BusException;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.endpoint.EndpointException;
@@ -70,6 +72,7 @@ public class JAXRSServerFactoryBean exte
private Map<Object, Object> languageMappings;
private Map<Object, Object> extensionMappings;
private ResourceComparator rc;
+ private Application application;
public JAXRSServerFactoryBean() {
this(new JAXRSServiceFactoryBean());
@@ -80,6 +83,14 @@ public class JAXRSServerFactoryBean exte
}
/**
+ * Saves the reference to the JAX-RS {@link Application}
+ * @param app
+ */
+ public void setApplication(Application app) {
+ application = app;
+ }
+
+ /**
* Resource comparator which may be used to customize the way
* a root resource or resource method is selected
* @param rcomp comparator
@@ -127,6 +138,7 @@ public class JAXRSServerFactoryBean exte
ep.getService().setInvoker(invoker);
}
+ ep.put(Application.class.getName(), application);
ProviderFactory factory = setupFactory(ep);
factory.setRequestPreprocessor(
new RequestPreprocessor(languageMappings, extensionMappings));
@@ -311,8 +323,9 @@ public class JAXRSServerFactoryBean exte
private void injectContexts() {
for (ClassResourceInfo cri : serviceFactory.getClassResourceInfo()) {
if (cri.isSingleton()) {
- InjectionUtils.injectContextProxies(cri,
- cri.getResourceProvider().getInstance(null));
+ InjectionUtils.injectContextProxiesAndApplication(cri,
+ cri.getResourceProvider().getInstance(null),
+ application);
}
}
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java?rev=1082223&r1=1082222&r2=1082223&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/model/AbstractResourceInfo.java Wed Mar 16 17:18:05 2011
@@ -29,6 +29,7 @@ import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
+import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import org.apache.cxf.jaxrs.impl.tl.ThreadLocalProxy;
@@ -81,23 +82,15 @@ public abstract class AbstractResourceIn
for (Field f : cls.getDeclaredFields()) {
for (Annotation a : f.getAnnotations()) {
if (a.annotationType() == Context.class) {
- if (contextFields == null) {
- contextFields = new HashMap<Class<?>, List<Field>>();
+ contextFields = addContextField(contextFields, f);
+ if (f.getType() != Application.class) {
+ fieldProxyMap = getProxyMap(Field.class, fieldProxyMap);
+ addToMap(fieldProxyMap, f, InjectionUtils.createThreadLocalProxy(f.getType()));
}
- addContextField(contextFields, f);
- if (fieldProxyMap == null) {
- fieldProxyMap = new HashMap<Class<?>, Map<Field, ThreadLocalProxy>>();
- }
- addToMap(fieldProxyMap, f, InjectionUtils.createThreadLocalProxy(f.getType()));
} else if (a.annotationType() == Resource.class
&& AnnotationUtils.isContextClass(f.getType())) {
- if (resourceFields == null) {
- resourceFields = new HashMap<Class<?>, List<Field>>();
- }
- addContextField(resourceFields, f);
- if (resourceProxyMap == null) {
- resourceProxyMap = new HashMap<Class<?>, Map<Field, ThreadLocalProxy>>();
- }
+ resourceFields = addContextField(resourceFields, f);
+ resourceProxyMap = getProxyMap(Field.class, resourceProxyMap);
addToMap(resourceProxyMap, f, InjectionUtils.createThreadLocalProxy(f.getType()));
}
}
@@ -105,6 +98,11 @@ public abstract class AbstractResourceIn
findContextFields(cls.getSuperclass());
}
+ private <T> Map<Class<?>, Map<T, ThreadLocalProxy>> getProxyMap(Class<T> keyClass,
+ Map<Class<?>, Map<T, ThreadLocalProxy>> map) {
+ return map == null ? new HashMap<Class<?>, Map<T, ThreadLocalProxy>>() : map;
+ }
+
private void findContextSetterMethods(Class<?> cls) {
for (Method m : cls.getMethods()) {
@@ -145,11 +143,11 @@ public abstract class AbstractResourceIn
contextMethods = new HashMap<Class<?>, Map<Class<?>, Method>>();
}
addToMap(contextMethods, contextClass, m);
- if (setterProxyMap == null) {
- setterProxyMap = new HashMap<Class<?>, Map<Method, ThreadLocalProxy>>();
+ if (m.getParameterTypes()[0] != Application.class) {
+ setterProxyMap = getProxyMap(Method.class, setterProxyMap);
+ addToMap(setterProxyMap, m,
+ InjectionUtils.createThreadLocalProxy(m.getParameterTypes()[0]));
}
- addToMap(setterProxyMap, m,
- InjectionUtils.createThreadLocalProxy(m.getParameterTypes()[0]));
}
public boolean isRoot() {
@@ -200,7 +198,10 @@ public abstract class AbstractResourceIn
}
}
- private void addContextField(Map<Class<?>, List<Field>> theFields, Field f) {
+ private Map<Class<?>, List<Field>> addContextField(Map<Class<?>, List<Field>> theFields, Field f) {
+
+ theFields = theFields == null ? new HashMap<Class<?>, List<Field>>() : theFields;
+
List<Field> fields = theFields.get(serviceClass);
if (fields == null) {
fields = new ArrayList<Field>();
@@ -209,6 +210,7 @@ public abstract class AbstractResourceIn
if (!fields.contains(f)) {
fields.add(f);
}
+ return theFields;
}
private <T, V> void addToMap(Map<Class<?>, Map<T, V>> theFields,
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AnnotationUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AnnotationUtils.java?rev=1082223&r1=1082222&r2=1082223&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AnnotationUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/AnnotationUtils.java Wed Mar 16 17:18:05 2011
@@ -41,6 +41,7 @@ import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Request;
@@ -80,6 +81,7 @@ public final class AnnotationUtils {
classes.add(ContextResolver.class);
classes.add(Providers.class);
classes.add(Request.class);
+ classes.add(Application.class);
// Servlet API
try {
classes.add(HttpServletRequest.class);
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java?rev=1082223&r1=1082222&r2=1082223&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/InjectionUtils.java Wed Mar 16 17:18:05 2011
@@ -48,6 +48,7 @@ import java.util.TreeSet;
import java.util.logging.Logger;
import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Application;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
@@ -769,19 +770,23 @@ public final class InjectionUtils {
}
}
- public static void injectContextProxies(AbstractResourceInfo cri, Object instance) {
+ public static void injectContextProxiesAndApplication(AbstractResourceInfo cri,
+ Object instance,
+ Application app) {
if (!cri.isSingleton()) {
return;
}
for (Map.Entry<Class<?>, Method> entry : cri.getContextMethods().entrySet()) {
- ThreadLocalProxy proxy = cri.getContextSetterProxy(entry.getValue());
- InjectionUtils.injectThroughMethod(instance, entry.getValue(), proxy);
+ Method method = entry.getValue();
+ Object value = method.getParameterTypes()[0] == Application.class
+ ? app : cri.getContextSetterProxy(method);
+ InjectionUtils.injectThroughMethod(instance, method, value);
}
for (Field f : cri.getContextFields()) {
- ThreadLocalProxy proxy = cri.getContextFieldProxy(f);
- InjectionUtils.injectFieldValue(f, instance, proxy);
+ Object value = f.getType() == Application.class ? app : cri.getContextFieldProxy(f);
+ InjectionUtils.injectFieldValue(f, instance, value);
}
for (Field f : cri.getResourceFields()) {
@@ -790,6 +795,10 @@ public final class InjectionUtils {
}
}
+ public static void injectContextProxies(AbstractResourceInfo cri, Object instance) {
+ injectContextProxiesAndApplication(cri, instance, null);
+ }
+
@SuppressWarnings("unchecked")
public static void injectContextField(AbstractResourceInfo cri,
Field f, Object o, Object value,
@@ -809,16 +818,21 @@ public final class InjectionUtils {
public static void injectContextMethods(Object requestObject,
AbstractResourceInfo cri,
Message message) {
+
for (Map.Entry<Class<?>, Method> entry : cri.getContextMethods().entrySet()) {
+ Method method = entry.getValue();
+ if (method.getParameterTypes()[0] == Application.class && cri.isSingleton()) {
+ continue;
+ }
Object o = JAXRSUtils.createContextValue(message,
- entry.getValue().getGenericParameterTypes()[0],
+ method.getGenericParameterTypes()[0],
entry.getKey());
if (o != null) {
if (!cri.isSingleton()) {
- InjectionUtils.injectThroughMethod(requestObject, entry.getValue(), o);
+ InjectionUtils.injectThroughMethod(requestObject, method, o);
} else {
- ThreadLocalProxy proxy = cri.getContextSetterProxy(entry.getValue());
+ ThreadLocalProxy proxy = cri.getContextSetterProxy(method);
if (proxy != null) {
proxy.set(o);
}
@@ -835,6 +849,9 @@ public final class InjectionUtils {
Message m) {
for (Field f : cri.getContextFields()) {
+ if (f.getType() == Application.class && cri.isSingleton()) {
+ continue;
+ }
Object value = JAXRSUtils.createContextValue(m, f.getGenericType(), f.getType());
InjectionUtils.injectContextField(cri, f, o, value, false);
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java?rev=1082223&r1=1082222&r2=1082223&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java Wed Mar 16 17:18:05 2011
@@ -49,6 +49,7 @@ import javax.servlet.http.HttpServletRes
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Application;
import javax.ws.rs.core.Cookie;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
@@ -813,6 +814,8 @@ public final class JAXRSUtils {
o = new MessageContextImpl(m);
} else if (SearchContext.class.isAssignableFrom(clazz)) {
o = new SearchContextImpl(m);
+ } else if (Application.class.isAssignableFrom(clazz)) {
+ o = contextMessage.getExchange().getEndpoint().get(Application.class.getName());
}
if (o == null && contextMessage != null && !MessageUtils.isRequestor(contextMessage)) {
o = createServletResourceValue(contextMessage, clazz);
@@ -862,8 +865,8 @@ public final class JAXRSUtils {
value = m.get(AbstractHTTPDestination.HTTP_REQUEST);
}
if (HttpServletResponse.class.isAssignableFrom(clazz)) {
- value = new HttpServletResponseFilter(
- (HttpServletResponse)m.get(AbstractHTTPDestination.HTTP_RESPONSE), m);
+ HttpServletResponse response = (HttpServletResponse)m.get(AbstractHTTPDestination.HTTP_RESPONSE);
+ value = response != null ? new HttpServletResponseFilter(response, m) : null;
}
if (ServletContext.class.isAssignableFrom(clazz)) {
value = m.get(AbstractHTTPDestination.HTTP_CONTEXT);
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java?rev=1082223&r1=1082222&r2=1082223&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ResourceUtils.java Wed Mar 16 17:18:05 2011
@@ -592,6 +592,7 @@ public final class ResourceUtils {
for (Map.Entry<Class, ResourceProvider> entry : map.entrySet()) {
bean.setResourceProvider(entry.getKey(), entry.getValue());
}
+ bean.setApplication(app);
return bean;
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java?rev=1082223&r1=1082222&r2=1082223&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java Wed Mar 16 17:18:05 2011
@@ -34,12 +34,14 @@ import javax.ws.rs.Consumes;
import javax.ws.rs.CookieParam;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.MatrixParam;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.Cookie;
import javax.ws.rs.core.HttpHeaders;
@@ -100,6 +102,9 @@ public class Customer extends AbstractCu
@Context private Request request;
@Context private SecurityContext sContext;
@Context private Providers bodyWorkers;
+ @Context private Application application1;
+ private Application application2;
+ private int applicationInjections;
@Resource private HttpServletRequest servletRequest;
@Resource private HttpServletResponse servletResponse;
@@ -176,6 +181,23 @@ public class Customer extends AbstractCu
}
+ public Application getApplication1() {
+ return application1;
+ }
+
+ public Application getApplication2() {
+ if (applicationInjections > 1) {
+ throw new RuntimeException();
+ }
+ return application2;
+ }
+
+ @Context
+ public void setApplication(Application app) {
+ applicationInjections++;
+ application2 = app;
+ }
+
public UriInfo getUriInfo() {
return uriInfo;
}
@@ -255,6 +277,7 @@ public class Customer extends AbstractCu
@Produces("text/xml")
@Consumes("text/xml")
+ @GET
public void test() {
// complete
}
Added: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerApplication.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerApplication.java?rev=1082223&view=auto
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerApplication.java (added)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerApplication.java Wed Mar 16 17:18:05 2011
@@ -0,0 +1,25 @@
+/**
+ * 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.cxf.jaxrs;
+
+import javax.ws.rs.core.Application;
+
+public class CustomerApplication extends Application {
+
+}
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerApplication.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/CustomerApplication.java
------------------------------------------------------------------------------
svn:keywords = Rev Date
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java?rev=1082223&r1=1082222&r2=1082223&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java Wed Mar 16 17:18:05 2011
@@ -33,6 +33,7 @@ import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.Application;
import javax.ws.rs.core.Cookie;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
@@ -46,11 +47,15 @@ import javax.ws.rs.ext.Providers;
import javax.xml.bind.JAXBContext;
import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxrs.Customer;
import org.apache.cxf.jaxrs.Customer2;
+import org.apache.cxf.jaxrs.CustomerApplication;
import org.apache.cxf.jaxrs.CustomerGender;
import org.apache.cxf.jaxrs.CustomerParameterHandler;
import org.apache.cxf.jaxrs.JAXBContextProvider;
+import org.apache.cxf.jaxrs.JAXRSInvoker;
+import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.JAXRSServiceFactoryBean;
import org.apache.cxf.jaxrs.JAXRSServiceImpl;
import org.apache.cxf.jaxrs.SimpleFactory;
@@ -113,6 +118,57 @@ public class JAXRSUtilsTest extends Asse
}
@Test
+ public void testInjectApplicationInSingleton() throws Exception {
+ Application app = new CustomerApplication();
+ JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
+ Customer customer = new Customer();
+ sf.setServiceBeanObjects(customer);
+ sf.setApplication(app);
+ sf.setStart(false);
+ Server server = sf.create();
+ assertSame(app, customer.getApplication1());
+ assertSame(app, customer.getApplication2());
+ invokeCustomerMethod(sf.getServiceFactory().getClassResourceInfo().get(0),
+ customer, server);
+ assertSame(app, customer.getApplication2());
+ }
+
+ @Test
+ public void testInjectApplicationInPerRequestResource() throws Exception {
+ Application app = new CustomerApplication();
+ JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
+ sf.setServiceClass(Customer.class);
+ sf.setApplication(app);
+ sf.setStart(false);
+ Server server = sf.create();
+
+ ClassResourceInfo cri = sf.getServiceFactory().getClassResourceInfo().get(0);
+
+ Customer customer = (Customer)cri.getResourceProvider().getInstance(
+ new MessageImpl());
+
+ assertNull(customer.getApplication1());
+ assertNull(customer.getApplication2());
+
+ invokeCustomerMethod(cri, customer, server);
+ assertSame(app, customer.getApplication1());
+ assertSame(app, customer.getApplication2());
+ }
+
+ private void invokeCustomerMethod(ClassResourceInfo cri,
+ Customer customer, Server server) throws Exception {
+ OperationResourceInfo ori = cri.getMethodDispatcher().getOperationResourceInfo(
+ Customer.class.getMethod("test", new Class[]{}));
+ JAXRSInvoker invoker = new JAXRSInvoker();
+ Exchange exc = new ExchangeImpl();
+ exc.put(Endpoint.class, server.getEndpoint());
+ Message inMessage = new MessageImpl();
+ exc.setInMessage(inMessage);
+ exc.put(OperationResourceInfo.class, ori);
+ invoker.invoke(exc, Collections.emptyList(), customer);
+ }
+
+ @Test
public void testSelectBetweenMultipleResourceClasses2() throws Exception {
JAXRSServiceFactoryBean sf = new JAXRSServiceFactoryBean();
sf.setResourceClasses(org.apache.cxf.jaxrs.resources.TestResourceTemplate1.class,
@@ -1385,7 +1441,7 @@ public class JAXRSUtilsTest extends Asse
Customer c = new Customer();
OperationResourceInfo ori = new OperationResourceInfo(Customer.class.getMethods()[0],
cri);
- Message m = new MessageImpl();
+ Message m = createMessage();
MultivaluedMap<String, String> headers = new MetadataMap<String, String>();
headers.add("AHeader2", "theAHeader2");
m.put(Message.PROTOCOL_HEADERS, headers);
@@ -1402,7 +1458,8 @@ public class JAXRSUtilsTest extends Asse
Customer c = new Customer();
OperationResourceInfo ori = new OperationResourceInfo(Customer.class.getMethods()[0],
cri);
- Message m = new MessageImpl();
+ Message m = createMessage();
+
MultivaluedMap<String, String> headers = new MetadataMap<String, String>();
headers.add("AHeader", "theAHeader");
m.put(Message.PROTOCOL_HEADERS, headers);
@@ -1411,7 +1468,7 @@ public class JAXRSUtilsTest extends Asse
assertEquals("bValue", c.getB());
assertEquals("theAHeader", c.getAHeader());
}
-
+
@Test
public void testContextResolverParam() throws Exception {
@@ -1554,6 +1611,8 @@ public class JAXRSUtilsTest extends Asse
Endpoint endpoint = EasyMock.createMock(Endpoint.class);
endpoint.getEndpointInfo();
EasyMock.expectLastCall().andReturn(null).anyTimes();
+ endpoint.get(Application.class.getName());
+ EasyMock.expectLastCall().andReturn(null);
endpoint.size();
EasyMock.expectLastCall().andReturn(0).anyTimes();
endpoint.isEmpty();