Skip to content

Commit

Permalink
[RESTEASY-1997] Make ResteasyProviderFactory spec compliant (#1666)
Browse files Browse the repository at this point in the history
Signed-off-by: NicoNes <nicolas.nesmon@gmail.com>
  • Loading branch information
NicoNes authored and asoldano committed Aug 29, 2018
1 parent 9350ebb commit 1fdb98d
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 20 deletions.
Expand Up @@ -2561,18 +2561,7 @@ public Collection<String> getPropertyNames()
@Override
public boolean isEnabled(Feature feature)
{
Collection<Feature> enabled = getEnabledFeatures();
//logger.info("********* isEnabled(Feature): " + feature.getClass().getName() + " # enabled: " + enabled.size());
for (Feature f : enabled)
{
//logger.info(" looking at: " + f.getClass());
if (f == feature)
{
//logger.info(" found: " + f.getClass().getName());
return true;
}
}
return false;
return getEnabledFeatures().contains(feature);
}

@Override
Expand Down Expand Up @@ -2603,12 +2592,7 @@ public boolean isRegistered(Object component)
@Override
public boolean isRegistered(Class<?> componentClass)
{
if (getProviderClasses().contains(componentClass)) return true;
for (Object obj : getProviderInstances())
{
if (obj.getClass().equals(componentClass)) return true;
}
return false;
return getClassContracts().containsKey(componentClass);
}

@Override
Expand All @@ -2627,13 +2611,19 @@ public Map<Class<?>, Integer> getContracts(Class<?> componentClass)
@Override
public Set<Class<?>> getClasses()
{
return getProviderClasses();
Set<Class<?>> providerClasses = getProviderClasses();
return (providerClasses == null || providerClasses.isEmpty())
? Collections.emptySet()
: Collections.unmodifiableSet(providerClasses);
}

@Override
public Set<Object> getInstances()
{
return getProviderInstances();
Set<Object> providerInstances = getProviderInstances();
return (providerInstances == null || providerInstances.isEmpty())
? Collections.emptySet()
: Collections.unmodifiableSet(providerInstances);
}

@Override
Expand Down
Expand Up @@ -18,6 +18,7 @@
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.container.DynamicFeature;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.Feature;
import javax.ws.rs.core.FeatureContext;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.ReaderInterceptor;
Expand All @@ -27,6 +28,7 @@
import java.lang.reflect.Field;
import java.sql.Date;
import java.util.List;
import java.util.Set;

import static org.junit.Assert.assertNotNull;

Expand Down Expand Up @@ -147,6 +149,103 @@ public void configure(ResourceInfo resourceInfo, FeatureContext context)
ResteasyProviderFactory.setInstance(orig);
}
}

@Test
public void testProviderFactoryAsJaxRsConfiguration()
{
ResteasyProviderFactory emptyResteasyProviderFactory = new ResteasyProviderFactory();
ResteasyProviderFactory resteasyProviderFactory = new ResteasyProviderFactory();
resteasyProviderFactory.register(new MyFeature());

// test that getClasses() behavior is spec compliant
Set<Class<?>> emptyProviderFactoryClasses = emptyResteasyProviderFactory.getClasses();
Assert.assertFalse("Configuration.getClasses() MUST never be null.", emptyProviderFactoryClasses == null);
Assert.assertTrue("Configuration.getClasses() MUST be empty.", emptyProviderFactoryClasses.isEmpty());
try
{
emptyProviderFactoryClasses.add(Object.class);
Assert.fail("Configuration.getClasses() MUST return an immutable set");
}
catch (UnsupportedOperationException e)
{
}

Set<Class<?>> providerFactoryClasses = resteasyProviderFactory.getClasses();
Assert.assertTrue(providerFactoryClasses.size() == 1);
Assert.assertTrue(providerFactoryClasses.contains(MyInterceptor.class));
try
{
providerFactoryClasses.add(Object.class);
Assert.fail("Configuration.getClasses() MUST return an immutable set");
}
catch (UnsupportedOperationException e)
{
}

// test that getInstances() behavior is spec compliant
Set<Object> emptyProviderFactoryInstances = emptyResteasyProviderFactory.getInstances();
Assert.assertFalse("Configuration.getInstances() MUST never be null.", emptyProviderFactoryInstances == null);
Assert.assertTrue("Configuration.getInstances() MUST be empty.", emptyProviderFactoryInstances.isEmpty());
try
{
emptyProviderFactoryInstances.add(new Object());
Assert.fail("Configuration.getInstances() MUST return an immutable set");
}
catch (UnsupportedOperationException e)
{
}

Set<Object> providerFactoryInstances = resteasyProviderFactory.getInstances();
Assert.assertTrue(providerFactoryInstances.size() == 2);
Assert.assertTrue(providerFactoryInstances.contains(new MyFeature()));
try
{
providerFactoryInstances.add(new Object());
Assert.fail("Configuration.getInstances() MUST return an immutable set");
}
catch (UnsupportedOperationException e)
{
}

// test that isEnabled(Feature feature) behavior is spec compliant
Assert.assertFalse(emptyResteasyProviderFactory.isEnabled(new MyFeature()));
Assert.assertTrue(resteasyProviderFactory.isEnabled(new MyFeature()));

// test that isEnabled(Class<Feature> featureClass) behavior is spec compliant
Assert.assertFalse(emptyResteasyProviderFactory.isEnabled(MyFeature.class));
Assert.assertTrue(resteasyProviderFactory.isEnabled(MyFeature.class));
}

@Provider
public static class MyFeature implements Feature
{
@Override
public boolean configure(FeatureContext featureContext)
{
featureContext.register(MyInterceptor.class);
featureContext.register(new ContainerRequestFilter()
{
@Override
public void filter(ContainerRequestContext arg0) throws IOException
{
}
});
return true;
}

@Override
public int hashCode()
{
return MyFeature.class.hashCode();
}

@Override
public boolean equals(Object obj)
{
return obj instanceof MyFeature;
}

}

@Provider
public static class MyInterceptor implements ReaderInterceptor
Expand Down

0 comments on commit 1fdb98d

Please sign in to comment.