package org.jboss.resteasy.test.providers;
import org.jboss.resteasy.plugins.providers.DefaultTextPlain;
import org.jboss.resteasy.plugins.providers.RegisterBuiltin;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
import org.jboss.resteasy.test.providers.resource.ProviderFactoryPrecedenceBase;
import org.jboss.resteasy.test.providers.resource.ProviderFactoryPrecedenceIntegerPlainTextWriter;
import org.jboss.resteasy.test.providers.resource.ProviderFactoryPrecendencePlainTextWriter;
import org.jboss.resteasy.util.Types;
import org.junit.Assert;
import org.junit.Test;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;
/**
* @tpSubChapter Providers
* @tpChapter Unit tests
* @tpSince RESTEasy 3.0.16
*/
public class ProviderFactoryPrecedenceTest {
@Provider
@Produces("text/plain")
public static class Concrete extends ProviderFactoryPrecedenceBase<Double> {
}
@Provider
@Produces("text/plain")
public static class Concrete2 extends ProviderFactoryPrecedenceBase<Boolean> {
}
public static class BaseMultiple<V, X> extends ProviderFactoryPrecedenceBase<X> {
}
public static class ConcreteMultiple extends BaseMultiple<String, Short> {
}
/**
* @tpTestDetails Test that classes which extends generic MessageBodyWriter of generic type are of the correct type
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testTypes() {
Assert.assertNull("PlainTextWriter is should be of generic type",
Types.getTemplateParameterOfInterface(ProviderFactoryPrecendencePlainTextWriter.class, MessageBodyWriter.class));
Assert.assertEquals("IntegerPlainTextWriter should be Integer type",
Integer.class, Types.getTemplateParameterOfInterface(ProviderFactoryPrecedenceIntegerPlainTextWriter.class, MessageBodyWriter.class));
Assert.assertEquals("Concrete class should be Double type",
Double.class, Types.getTemplateParameterOfInterface(Concrete.class, MessageBodyWriter.class));
Assert.assertEquals("Concrete2 class should be Double type",
Boolean.class, Types.getTemplateParameterOfInterface(Concrete2.class, MessageBodyWriter.class));
Assert.assertEquals("ConcreteMultiple class should be Short type",
Short.class, Types.getTemplateParameterOfInterface(ConcreteMultiple.class, MessageBodyWriter.class));
}
/**
* @tpTestDetails ResteasyProviderFactory - register default provider instance, test that correct DefaultTextPlain provider is taken
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testMatching2() {
ResteasyProviderFactory factory = new ResteasyProviderFactory();
RegisterBuiltin.register(factory);
MessageBodyWriter<Boolean> writer = factory.getMessageBodyWriter(Boolean.class, null, null, new MediaType("text", "plain"));
Assert.assertNotNull("No writer exists for the given media type", writer);
Assert.assertEquals("The type of the writer is incorrect", writer.getClass(), DefaultTextPlain.class);
}
/**
* @tpTestDetails ResteasyProviderFactory - register provider instances, test that application providers take precedence over builtin
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testUserPrecendence1() throws Exception {
// Register Built In first
ResteasyProviderFactory factory = new ResteasyProviderFactory();
RegisterBuiltin.register(factory);
factory.registerProviderInstance(new ProviderFactoryPrecendencePlainTextWriter());
// Test that application providers take precedence over builtin
verifyPlainWriter(factory);
factory.registerProviderInstance(new ProviderFactoryPrecedenceIntegerPlainTextWriter());
verifyIntegerWriter(factory);
}
/**
* @tpTestDetails ResteasyProviderFactory - register provider instances, verify they are available in user ordered
* precedence
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testUserPrecendence2() throws Exception {
// register PlainTextWriter first
ResteasyProviderFactory factory = new ResteasyProviderFactory();
factory.registerProviderInstance(new ProviderFactoryPrecendencePlainTextWriter());
RegisterBuiltin.register(factory);
verifyPlainWriter(factory);
factory.registerProviderInstance(new ProviderFactoryPrecedenceIntegerPlainTextWriter());
verifyIntegerWriter(factory);
}
/**
* @tpTestDetails ResteasyProviderFactory - register provider instances, verify they are available in user ordered
* precedence
* @tpSince RESTEasy 3.0.16
*/
@Test
public void testUserPrecendence3() throws Exception {
ResteasyProviderFactory factory = new ResteasyProviderFactory();
factory.registerProviderInstance(new ProviderFactoryPrecedenceIntegerPlainTextWriter());
factory.registerProviderInstance(new ProviderFactoryPrecendencePlainTextWriter());
RegisterBuiltin.register(factory);
verifyIntegerWriter(factory);
}
private void verifyPlainWriter(ResteasyProviderFactory factory) {
MessageBodyWriter writer2 = factory.getMessageBodyWriter(Boolean.class, null, null, MediaType.TEXT_PLAIN_TYPE);
Assert.assertNotNull("No writer exists for the given media type", writer2);
Assert.assertTrue("The type of the writer is incorrect", writer2 instanceof ProviderFactoryPrecendencePlainTextWriter);
}
private void verifyIntegerWriter(ResteasyProviderFactory factory) {
MessageBodyWriter writer2;
// Test that type specific template providers take precedence over others
writer2 = factory.getMessageBodyWriter(Integer.class, null, null, MediaType.TEXT_PLAIN_TYPE);
Assert.assertNotNull("No writer exists for the given media type", writer2);
Assert.assertTrue("The type of the writer is incorrect", writer2 instanceof ProviderFactoryPrecedenceIntegerPlainTextWriter);
}
}