package org.jboss.resteasy.test.nextgen.providers.jackson;
import org.codehaus.jackson.annotate.JsonSubTypes;
import org.codehaus.jackson.annotate.JsonTypeInfo;
import org.codehaus.jackson.annotate.JsonTypeInfo.As;
import org.codehaus.jackson.annotate.JsonTypeInfo.Id;
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;
import org.jboss.resteasy.spi.ResteasyDeployment;
import org.jboss.resteasy.test.EmbeddedContainer;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Response;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;
/**
* @author <a href="holger.morch@navteq.com">Holger Morch</a>
* @author <a href="ron.sigal@jboss.com">Ron Sigal</a>
* @version $Revision: 1.1 $
*
* Copyright Sep 28, 2012
*/
public class ProxyWithGenericReturnTypeJacksonTest
{
protected ResteasyDeployment deployment;
@JsonTypeInfo(use = Id.NAME, include = As.PROPERTY, property = "type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Type1.class, name = "type1"),
@JsonSubTypes.Type(value = Type2.class, name = "type2")})
public abstract static class AbstractParent {
protected long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
}
public static class Type1 extends AbstractParent {
protected String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public static class Type2 extends AbstractParent {
protected String note;
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
}
public interface TestSubResourceIntf
{
@GET
@Path("list")
@Produces("application/*+json")
public List<AbstractParent> resourceMethod();
@GET
@Path("one")
@Produces("application/*+json")
public AbstractParent resourceMethodOne();
}
public interface TestSubResourceSubIntf extends TestSubResourceIntf
{
}
static class TestInvocationHandler implements InvocationHandler
{
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
System.out.println("entered proxied subresource");
System.out.println("method: " + method.getName());
System.out.println("generic return type: " + method.getGenericReturnType());
System.out.println("type of return type: " + method.getGenericReturnType().getClass());
if ("resourceMethod".equals(method.getName())) {
List<AbstractParent> l = new ArrayList<AbstractParent>();
Type1 first = new Type1();
first.setId(1);
first.setName("MyName");
l.add(first);
Type2 second = new Type2();
second.setId(2);
second.setNote("MyNote");
l.add(second);
return l;
}
if ("resourceMethodOne".equals(method.getName())) {
Type1 first = new Type1();
first.setId(1);
first.setName("MyName");
return first;
}
return null;
}
}
@Path("/")
static public class TestResource
{
@Produces("text/plain")
@Path("test")
public TestSubResourceSubIntf resourceLocator()
{
Object proxy = Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),
new Class[]{TestSubResourceSubIntf.class},
new TestInvocationHandler());
return TestSubResourceSubIntf.class.cast(proxy);
}
}
@Before
public void before() throws Exception
{
deployment = EmbeddedContainer.start();
deployment.getRegistry().addPerRequestResource(TestResource.class);
}
@After
public void after() throws Exception
{
EmbeddedContainer.stop();
deployment = null;
}
@Test
public void test() throws Exception
{
ResteasyClient client = new ResteasyClientBuilder().build();
WebTarget target = client.target("http://localhost:8081/test/one/");
System.out.println("Sending request");
Response response = target.request().get();
String entity = response.readEntity(String.class);
System.out.println("Received response: " + entity);
Assert.assertEquals(200, response.getStatus());
Assert.assertTrue("Type property is missing.", entity.contains("type"));
response.close();
target = client.target("http://localhost:8081/test/list/");
System.out.println("Sending request");
response = target.request().get();
entity = response.readEntity(String.class);
System.out.println("Received response: " + entity);
Assert.assertEquals(200, response.getStatus());
Assert.assertTrue("Type property is missing.", entity.contains("type"));
response.close();
client.close();
}
}