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 2013/05/02 14:12:43 UTC
svn commit: r1478342 - in /cxf/trunk:
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/blueprint/
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/lifecycle/
rt/frontend/jaxrs/src/main/java/...
Author: sergeyb
Date: Thu May 2 12:12:43 2013
New Revision: 1478342
URL: http://svn.apache.org/r1478342
Log:
[CXF-4988] Making sure providers can get Application injected via field or setters and Application itself can get the contexrs injected, same as for the root resource
Modified:
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/blueprint/BlueprintResourceFactory.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProvider.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/SpringResourceFactory.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProviderTest.java
cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookApplication.java
cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerNonSpringBookTest.java
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java?rev=1478342&r1=1478341&r2=1478342&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/JAXRSInvoker.java Thu May 2 12:12:43 2013
@@ -169,8 +169,7 @@ public class JAXRSInvoker extends Abstra
}
}
if (cri.isRoot()) {
- ProviderInfo<?> appProvider =
- (ProviderInfo<?>)exchange.getEndpoint().get(Application.class.getName());
+ ProviderInfo<Application> appProvider = providerFactory.getApplicationProvider();
if (appProvider != null) {
InjectionUtils.injectContexts(appProvider.getProvider(),
appProvider,
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/blueprint/BlueprintResourceFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/blueprint/BlueprintResourceFactory.java?rev=1478342&r1=1478341&r2=1478342&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/blueprint/BlueprintResourceFactory.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/blueprint/BlueprintResourceFactory.java Thu May 2 12:12:43 2013
@@ -21,9 +21,15 @@ package org.apache.cxf.jaxrs.blueprint;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
+import java.util.Collections;
+import java.util.Map;
+
+import javax.ws.rs.core.Application;
import org.apache.cxf.common.util.ClassHelper;
+import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
+import org.apache.cxf.jaxrs.model.ProviderInfo;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.jaxrs.utils.ResourceUtils;
import org.apache.cxf.message.Message;
@@ -70,11 +76,15 @@ public class BlueprintResourceFactory im
public Object getInstance(Message m) {
//TODO -- This is not the BP way.
- Object[] values = ResourceUtils.createConstructorArguments(c, m, !isSingleton());
+ ProviderInfo<?> application = m == null ? null
+ : (ProviderInfo<?>)m.getExchange().getEndpoint().get(Application.class.getName());
+ Map<Class<?>, Object> mapValues = CastUtils.cast(application == null ? null
+ : Collections.singletonMap(Application.class, application.getProvider()));
+ Object[] values = ResourceUtils.createConstructorArguments(c, m, !isSingleton(), mapValues);
//TODO Very springish...
Object instance = values.length > 0 ? blueprintContainer.getComponentInstance(beanId)
: blueprintContainer.getComponentInstance(beanId);
- if (!isSingleton || m == null) {
+ if (!isSingleton() || m == null) {
InjectionUtils.invokeLifeCycleMethod(instance, postConstructMethod);
}
return instance;
@@ -85,7 +95,7 @@ public class BlueprintResourceFactory im
}
public void releaseInstance(Message m, Object o) {
- if (!isSingleton) {
+ if (!isSingleton()) {
InjectionUtils.invokeLifeCycleMethod(o, preDestroyMethod);
}
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProvider.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProvider.java?rev=1478342&r1=1478341&r2=1478342&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProvider.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProvider.java Thu May 2 12:12:43 2013
@@ -22,10 +22,15 @@ package org.apache.cxf.jaxrs.lifecycle;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.Map;
import javax.ws.rs.InternalServerErrorException;
+import javax.ws.rs.core.Application;
import javax.ws.rs.core.Response;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.jaxrs.model.ProviderInfo;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.jaxrs.utils.JAXRSUtils;
import org.apache.cxf.jaxrs.utils.ResourceUtils;
@@ -65,8 +70,11 @@ public class PerRequestResourceProvider
}
protected Object createInstance(Message m) {
-
- Object[] values = ResourceUtils.createConstructorArguments(c, m, true);
+ ProviderInfo<?> application =
+ (ProviderInfo<?>)m.getExchange().getEndpoint().get(Application.class.getName());
+ Map<Class<?>, Object> mapValues = CastUtils.cast(application == null ? null
+ : Collections.singletonMap(Application.class, application.getProvider()));
+ Object[] values = ResourceUtils.createConstructorArguments(c, m, true, mapValues);
try {
Object instance = values.length > 0 ? c.newInstance(values) : c.newInstance(new Object[]{});
InjectionUtils.invokeLifeCycleMethod(instance, postConstructMethod);
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java?rev=1478342&r1=1478341&r2=1478342&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ProviderFactory.java Thu May 2 12:12:43 2013
@@ -38,6 +38,7 @@ import java.util.Set;
import java.util.logging.Logger;
import javax.ws.rs.Produces;
+import javax.ws.rs.core.Application;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.ContextResolver;
@@ -255,7 +256,7 @@ public abstract class ProviderFactory {
}
- protected static <T> void handleMapper(List<T> candidates,
+ protected <T> void handleMapper(List<T> candidates,
ProviderInfo<T> em,
Class<?> expectedType,
Message m,
@@ -526,7 +527,7 @@ public abstract class ProviderFactory {
}
//CHECKSTYLE:ON
- static void injectContextValues(ProviderInfo<?> pi, Message m) {
+ protected void injectContextValues(ProviderInfo<?> pi, Message m) {
if (m != null) {
InjectionUtils.injectContexts(pi.getProvider(), pi, m);
}
@@ -541,9 +542,13 @@ public abstract class ProviderFactory {
}
}
- void injectContextProxiesIntoProvider(ProviderInfo<?> pi) {
+ protected void injectContextProxiesIntoProvider(ProviderInfo<?> pi) {
+ injectContextProxiesIntoProvider(pi, null);
+ }
+
+ void injectContextProxiesIntoProvider(ProviderInfo<?> pi, Application app) {
if (pi.contextsAvailable()) {
- InjectionUtils.injectContextProxies(pi, pi.getProvider());
+ InjectionUtils.injectContextProxiesAndApplication(pi, pi.getProvider(), app);
injectedProviders.add(pi);
}
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java?rev=1478342&r1=1478341&r2=1478342&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/provider/ServerProviderFactory.java Thu May 2 12:12:43 2013
@@ -61,6 +61,7 @@ import org.apache.cxf.jaxrs.model.Operat
import org.apache.cxf.jaxrs.model.ProviderInfo;
import org.apache.cxf.jaxrs.model.wadl.WadlGenerator;
import org.apache.cxf.jaxrs.utils.AnnotationUtils;
+import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.message.Message;
public final class ServerProviderFactory extends ProviderFactory {
@@ -237,8 +238,8 @@ public final class ServerProviderFactory
Class<?> providerCls = null;
Object realObject = null;
if (o instanceof Constructor) {
- Map<Class<?>, Object> values = CastUtils.cast((application == null ? null
- : Collections.singletonMap(Application.class, application.getProvider())));
+ Map<Class<?>, Object> values = CastUtils.cast(application == null ? null
+ : Collections.singletonMap(Application.class, application.getProvider()));
provider = createProviderFromConstructor((Constructor<?>)o, values);
providerCls = provider.getProvider().getClass();
realObject = provider;
@@ -283,6 +284,21 @@ public final class ServerProviderFactory
}
//CHECKSTYLE:ON
+ @Override
+ protected void injectContextProxiesIntoProvider(ProviderInfo<?> pi) {
+ injectContextProxiesIntoProvider(pi, application == null ? null : application.getProvider());
+ }
+
+ @Override
+ protected void injectContextValues(ProviderInfo<?> pi, Message m) {
+ if (m != null) {
+ InjectionUtils.injectContexts(pi.getProvider(), pi, m);
+ if (application != null && application.contextsAvailable()) {
+ InjectionUtils.injectContexts(application.getProvider(), application, m);
+ }
+ }
+ }
+
private void addContainerRequestFilter(
List<ProviderInfo<ContainerRequestFilter>> postMatchFilters,
ProviderInfo<ContainerRequestFilter> p) {
@@ -307,6 +323,10 @@ public final class ServerProviderFactory
application = app;
}
+ public ProviderInfo<Application> getApplicationProvider() {
+ return application;
+ }
+
public void setRequestPreprocessor(RequestPreprocessor rp) {
this.requestPreprocessor = rp;
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/SpringResourceFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/SpringResourceFactory.java?rev=1478342&r1=1478341&r2=1478342&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/SpringResourceFactory.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/spring/SpringResourceFactory.java Thu May 2 12:12:43 2013
@@ -21,9 +21,15 @@ package org.apache.cxf.jaxrs.spring;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
+import java.util.Collections;
+import java.util.Map;
+
+import javax.ws.rs.core.Application;
import org.apache.cxf.common.util.ClassHelper;
+import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
+import org.apache.cxf.jaxrs.model.ProviderInfo;
import org.apache.cxf.jaxrs.utils.InjectionUtils;
import org.apache.cxf.jaxrs.utils.ResourceUtils;
import org.apache.cxf.message.Message;
@@ -71,9 +77,13 @@ public class SpringResourceFactory imple
* {@inheritDoc}
*/
public Object getInstance(Message m) {
- Object[] values = ResourceUtils.createConstructorArguments(c, m, !isSingleton());
+ ProviderInfo<?> application = m == null ? null
+ : (ProviderInfo<?>)m.getExchange().getEndpoint().get(Application.class.getName());
+ Map<Class<?>, Object> mapValues = CastUtils.cast(application == null ? null
+ : Collections.singletonMap(Application.class, application.getProvider()));
+ Object[] values = ResourceUtils.createConstructorArguments(c, m, !isSingleton(), mapValues);
Object instance = values.length > 0 ? ac.getBean(beanId, values) : ac.getBean(beanId);
- if (!isSingleton || m == null) {
+ if (!isSingleton() || m == null) {
InjectionUtils.invokeLifeCycleMethod(instance, postConstructMethod);
}
return instance;
@@ -90,7 +100,7 @@ public class SpringResourceFactory imple
* {@inheritDoc}
*/
public void releaseInstance(Message m, Object o) {
- if (!isSingleton) {
+ if (!isSingleton()) {
InjectionUtils.invokeLifeCycleMethod(o, preDestroyMethod);
}
}
Modified: cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProviderTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProviderTest.java?rev=1478342&r1=1478341&r2=1478342&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProviderTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/lifecycle/PerRequestResourceProviderTest.java Thu May 2 12:12:43 2013
@@ -18,9 +18,17 @@
*/
package org.apache.cxf.jaxrs.lifecycle;
+import javax.ws.rs.core.Application;
+
+import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.jaxrs.Customer;
+import org.apache.cxf.jaxrs.provider.ProviderFactory;
+import org.apache.cxf.jaxrs.provider.ServerProviderFactory;
+import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.ExchangeImpl;
import org.apache.cxf.message.Message;
import org.apache.cxf.message.MessageImpl;
+import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
@@ -30,7 +38,7 @@ public class PerRequestResourceProviderT
@Test
public void testGetInstance() {
PerRequestResourceProvider rp = new PerRequestResourceProvider(Customer.class);
- Message message = new MessageImpl();
+ Message message = createMessage();
message.put(Message.QUERY_STRING, "a=aValue");
Customer c = (Customer)rp.getInstance(message);
assertNotNull(c.getUriInfo());
@@ -39,6 +47,29 @@ public class PerRequestResourceProviderT
rp.releaseInstance(message, c);
assertTrue(c.isPreDestroyCalled());
}
+
+ private Message createMessage() {
+ ProviderFactory factory = ServerProviderFactory.getInstance();
+ Message m = new MessageImpl();
+ m.put("org.apache.cxf.http.case_insensitive_queries", false);
+ Exchange e = new ExchangeImpl();
+ m.setExchange(e);
+ e.setInMessage(m);
+ 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();
+ EasyMock.expectLastCall().andReturn(true).anyTimes();
+ endpoint.get(ServerProviderFactory.class.getName());
+ EasyMock.expectLastCall().andReturn(factory).anyTimes();
+ EasyMock.replay(endpoint);
+ e.put(Endpoint.class, endpoint);
+ return m;
+ }
}
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=1478342&r1=1478341&r2=1478342&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 Thu May 2 12:12:43 2013
@@ -240,7 +240,7 @@ public class JAXRSUtilsTest extends Asse
ClassResourceInfo cri = sf.getServiceFactory().getClassResourceInfo().get(0);
Customer customer = (Customer)cri.getResourceProvider().getInstance(
- new MessageImpl());
+ createMessage());
assertNull(customer.getApplication1());
assertNull(customer.getApplication2());
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookApplication.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookApplication.java?rev=1478342&r1=1478341&r2=1478342&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookApplication.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/BookApplication.java Thu May 2 12:12:43 2013
@@ -24,6 +24,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
+import javax.annotation.Priority;
import javax.servlet.ServletContext;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.container.ContainerRequestContext;
@@ -55,6 +56,7 @@ public class BookApplication extends App
classes.add(org.apache.cxf.systest.jaxrs.jaxws.BookStoreJaxrsJaxws.class);
classes.add(org.apache.cxf.systest.jaxrs.RuntimeExceptionMapper.class);
classes.add(BookRequestFilter.class);
+ classes.add(BookRequestFilter2.class);
return classes;
}
@@ -83,6 +85,7 @@ public class BookApplication extends App
defaultId = Long.valueOf(sb.toString());
}
+ @Priority(1)
public static class BookRequestFilter implements ContainerRequestFilter {
private UriInfo ui;
private Application ap;
@@ -98,7 +101,31 @@ public class BookApplication extends App
throw new RuntimeException();
}
if (ui.getRequestUri().toString().endsWith("/application11/thebooks/bookstore2/bookheaders")) {
- context.getHeaders().put("BOOK", Arrays.asList("1", "2", "3"));
+ context.getHeaders().put("BOOK", Arrays.asList("1", "2"));
+ }
+
+ }
+
+ }
+
+ @Priority(2)
+ public static class BookRequestFilter2 implements ContainerRequestFilter {
+ private UriInfo ui;
+ @Context
+ private Application ap;
+
+ @Context
+ public void setUriInfo(UriInfo context) {
+ this.ui = context;
+ }
+
+ @Override
+ public void filter(ContainerRequestContext context) throws IOException {
+ if (ap == null) {
+ throw new RuntimeException();
+ }
+ if (ui.getRequestUri().toString().endsWith("/application11/thebooks/bookstore2/bookheaders")) {
+ context.getHeaders().add("BOOK", "3");
}
}
Modified: cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerNonSpringBookTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerNonSpringBookTest.java?rev=1478342&r1=1478341&r2=1478342&view=diff
==============================================================================
--- cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerNonSpringBookTest.java (original)
+++ cxf/trunk/systests/jaxrs/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSClientServerNonSpringBookTest.java Thu May 2 12:12:43 2013
@@ -156,6 +156,7 @@ public class JAXRSClientServerNonSpringB
@Test
public void testGetBook123Application11PerRequest() throws Exception {
WebClient wc = WebClient.create("http://localhost:" + PORT + "/application11/thebooks/bookstore2/bookheaders");
+ WebClient.getConfig(wc).getHttpConduit().getClient().setReceiveTimeout(100000000L);
wc.accept("application/xml");
Book book = wc.get(Book.class);
assertEquals("CXF in Action", book.getName());