package org.jboss.resteasy.plugins.guice;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Arrays;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.ext.ParamConverter;
import javax.ws.rs.ext.ParamConverterProvider;
import javax.ws.rs.ext.Provider;
import org.jboss.resteasy.core.Dispatcher;
import org.jboss.resteasy.plugins.server.netty.NettyJaxrsServer;
import org.jboss.resteasy.test.TestPortProvider;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Module;
public class GuiceContextTest
{
private NettyJaxrsServer server;
private Dispatcher dispatcher;
@Before
public void before() throws Exception
{
server = new NettyJaxrsServer();
server.setPort(TestPortProvider.getPort());
server.setRootResourcePath("/");
server.start();
dispatcher = server.getDeployment().getDispatcher();
}
@After
public void after() throws Exception
{
server.stop();
server = null;
dispatcher = null;
}
@Test
public void testMethodInjection()
{
final Module module = new Module()
{
@Override
public void configure(final Binder binder)
{
binder.bind(MethodTestResource.class);
}
};
final ModuleProcessor processor = new ModuleProcessor(dispatcher.getRegistry(), dispatcher.getProviderFactory());
processor.processInjector(Guice.createInjector(module));
final TestResource resource = TestPortProvider.createProxy(TestResource.class, TestPortProvider.generateBaseUrl());
Assert.assertEquals("method", resource.getName());
dispatcher.getRegistry().removeRegistrations(MethodTestResource.class);
}
@Test
public void testFieldInjection()
{
final Module module = new Module()
{
@Override
public void configure(final Binder binder)
{
binder.bind(FieldTestResource.class);
}
};
final ModuleProcessor processor = new ModuleProcessor(dispatcher.getRegistry(), dispatcher.getProviderFactory());
processor.processInjector(Guice.createInjector(module));
final TestResource resource = TestPortProvider.createProxy(TestResource.class, TestPortProvider.generateBaseUrl());
Assert.assertEquals("field", resource.getName());
dispatcher.getRegistry().removeRegistrations(FieldTestResource.class);
}
@Test
public void testArbitraryInjection()
{
final Module module = new Module()
{
public void configure(final Binder binder)
{
// currently the order is important, this test does not fail, if we bind the classes in revers order
binder.bind(ConversionTestResource.class);
binder.bind(IntarrayConverterProvider.class);
}
};
final ModuleProcessor processor = new ModuleProcessor(dispatcher.getRegistry(), dispatcher.getProviderFactory());
processor.processInjector(Guice.createInjector(module));
TestPortProvider.createProxy(TestResource.class, TestPortProvider.generateBaseUrl());
}
//@Test // not (yet) supprted
public void testConstructorInjection()
{
final Module module = new Module()
{
@Override
public void configure(final Binder binder)
{
binder.bind(ConstructorTestResource.class);
}
};
final ModuleProcessor processor = new ModuleProcessor(dispatcher.getRegistry(), dispatcher.getProviderFactory());
processor.processInjector(Guice.createInjector(module));
final TestResource resource = TestPortProvider.createProxy(TestResource.class, TestPortProvider.generateBaseUrl());
Assert.assertEquals("constructor", resource.getName());
dispatcher.getRegistry().removeRegistrations(ConstructorTestResource.class);
}
@Path("test")
public interface TestResource
{
@GET
public String getName();
}
@Path("test")
public static class MethodTestResource
{
@GET
public String getName(final @Context UriInfo uriInfo)
{
Assert.assertNotNull(uriInfo);
return "method";
}
}
@Path("test")
public static class FieldTestResource
{
private
@Context
UriInfo uriInfo;
@GET
public String getName()
{
Assert.assertNotNull(uriInfo);
return "field";
}
}
@Path("test")
public static class ConstructorTestResource
{
private final UriInfo uriInfo;
public ConstructorTestResource(@Context final UriInfo uriInfo)
{
this.uriInfo = uriInfo;
}
@GET
public String getName()
{
Assert.assertNotNull(uriInfo);
return "field";
}
}
@Path("test")
public static class ConversionTestResource
{
@QueryParam("values") Intarray intarray;
@GET
public String getName()
{
return intarray == null ? "[]" : String.valueOf(intarray.sum());
}
}
public static class Intarray
{
private int[] values;
public Intarray() {}
public Intarray(int[] values)
{
this.values = values;
}
@Override
public String toString()
{
return values == null ? "[]" : Arrays.asList(values).toString();
}
public int[] getValues()
{
return values;
}
public void setValues(int[] values)
{
this.values = values;
}
public int sum()
{
if (values == null)
{
return 0;
}
int sum = 0;
for (int value : values)
{
sum += value;
}
return sum;
}
}
@Provider
public static class IntarrayConverterProvider implements ParamConverterProvider
{
@Override
public <T> ParamConverter<T> getConverter(final Class<T> tClass, Type type, Annotation[] annotations)
{
return tClass == Intarray.class ?
new ParamConverter<T>()
{
@Override
// for simplicity, does not take "[" and "]" into account
public T fromString(String s)
{
String[] strings = s.split("\\s*,\\s*");
int[] values = new int[strings.length];
for (int i = 0; i < strings.length; i++)
{
values[i] = Integer.valueOf(strings[i]);
}
return tClass.cast(new Intarray(values));
}
@Override
public String toString(T t)
{
return t.toString();
}
} : null;
}
}
}