Author: aparfonov
Date: 2009-09-04 12:36:33 -0400 (Fri, 04 Sep 2009)
New Revision: 138
Modified:
ws/trunk/rest/core/src/main/java/org/exoplatform/services/rest/impl/ResourceBinder.java
ws/trunk/rest/core/src/test/java/org/exoplatform/services/rest/BaseTest.java
ws/trunk/rest/core/src/test/java/org/exoplatform/services/rest/impl/resource/ApplicationTest.java
Log:
EXOJCR-151 : Filters may be setup from javax.ws.rs.core.Application
Modified:
ws/trunk/rest/core/src/main/java/org/exoplatform/services/rest/impl/ResourceBinder.java
===================================================================
---
ws/trunk/rest/core/src/main/java/org/exoplatform/services/rest/impl/ResourceBinder.java 2009-09-04
12:17:16 UTC (rev 137)
+++
ws/trunk/rest/core/src/main/java/org/exoplatform/services/rest/impl/ResourceBinder.java 2009-09-04
16:36:33 UTC (rev 138)
@@ -22,11 +22,15 @@
import org.exoplatform.container.ExoContainerContext;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
+import org.exoplatform.services.rest.Filter;
import org.exoplatform.services.rest.ObjectFactory;
import org.exoplatform.services.rest.PerRequestObjectFactory;
+import org.exoplatform.services.rest.RequestFilter;
+import org.exoplatform.services.rest.ResponseFilter;
import org.exoplatform.services.rest.SingletonObjectFactory;
import org.exoplatform.services.rest.impl.resource.AbstractResourceDescriptorImpl;
import org.exoplatform.services.rest.impl.resource.ResourceDescriptorValidator;
+import org.exoplatform.services.rest.method.MethodInvokerFilter;
import org.exoplatform.services.rest.resource.AbstractResourceDescriptor;
import org.exoplatform.services.rest.resource.ResourceContainer;
import org.exoplatform.services.rest.resource.ResourceDescriptorVisitor;
@@ -101,8 +105,6 @@
*/
private final ResourceDescriptorVisitor rdv =
ResourceDescriptorValidator.getInstance();
- private final ProviderBinder providers;
-
private int size = 0;
/**
@@ -122,7 +124,6 @@
// TODO better solution to initialize RuntimeDelegate
rd = new RuntimeDelegateImpl();
RuntimeDelegate.setInstance(rd);
- providers = ProviderBinder.getInstance();
ExoContainer container = containerContext.getContainer();
@@ -156,6 +157,7 @@
@SuppressWarnings("unchecked")
public void addApplication(Application application)
{
+ ProviderBinder providers = ProviderBinder.getInstance();
for (Object obj : application.getSingletons())
{
if (obj.getClass().getAnnotation(Provider.class) != null)
@@ -178,6 +180,22 @@
providers.addMessageBodyWriter((MessageBodyWriter)obj);
}
}
+ else if (obj.getClass().getAnnotation(Filter.class) != null)
+ {
+ // singleton filter
+ if (obj instanceof MethodInvokerFilter)
+ {
+ providers.addMethodInvokerFilter((MethodInvokerFilter)obj);
+ }
+ if (obj instanceof RequestFilter)
+ {
+ providers.addRequestFilter((RequestFilter)obj);
+ }
+ if (obj instanceof ResponseFilter)
+ {
+ providers.addResponseFilter((ResponseFilter)obj);
+ }
+ }
else
{
bind(obj); // singleton resource
@@ -205,6 +223,22 @@
providers.addMessageBodyWriter(clazz);
}
}
+ else if (clazz.getAnnotation(Filter.class) != null)
+ {
+ // per-request filter
+ if (MethodInvokerFilter.class.isAssignableFrom(clazz))
+ {
+ providers.addMethodInvokerFilter(clazz);
+ }
+ if (RequestFilter.class.isAssignableFrom(clazz))
+ {
+ providers.addRequestFilter(clazz);
+ }
+ if (ResponseFilter.class.isAssignableFrom(clazz))
+ {
+ providers.addResponseFilter(clazz);
+ }
+ }
else
{
bind(clazz); // per-request resource
Modified: ws/trunk/rest/core/src/test/java/org/exoplatform/services/rest/BaseTest.java
===================================================================
---
ws/trunk/rest/core/src/test/java/org/exoplatform/services/rest/BaseTest.java 2009-09-04
12:17:16 UTC (rev 137)
+++
ws/trunk/rest/core/src/test/java/org/exoplatform/services/rest/BaseTest.java 2009-09-04
16:36:33 UTC (rev 138)
@@ -47,6 +47,7 @@
container = StandaloneContainer.getInstance();
binder =
(ResourceBinder)container.getComponentInstanceOfType(ResourceBinder.class);
requestHandler =
(RequestHandlerImpl)container.getComponentInstanceOfType(RequestHandlerImpl.class);
+ // reset providers to be sure it is clean
ProviderBinder.setInstance(new ProviderBinder());
providers = ProviderBinder.getInstance();
// System.out.println("##########################"+providers);
Modified:
ws/trunk/rest/core/src/test/java/org/exoplatform/services/rest/impl/resource/ApplicationTest.java
===================================================================
---
ws/trunk/rest/core/src/test/java/org/exoplatform/services/rest/impl/resource/ApplicationTest.java 2009-09-04
12:17:16 UTC (rev 137)
+++
ws/trunk/rest/core/src/test/java/org/exoplatform/services/rest/impl/resource/ApplicationTest.java 2009-09-04
16:36:33 UTC (rev 138)
@@ -19,6 +19,14 @@
package org.exoplatform.services.rest.impl.resource;
import org.exoplatform.services.rest.AbstractResourceTest;
+import org.exoplatform.services.rest.Filter;
+import org.exoplatform.services.rest.GenericContainerRequest;
+import org.exoplatform.services.rest.GenericContainerResponse;
+import org.exoplatform.services.rest.RequestFilter;
+import org.exoplatform.services.rest.ResponseFilter;
+import org.exoplatform.services.rest.impl.ContainerResponse;
+import org.exoplatform.services.rest.method.MethodInvokerFilter;
+import org.exoplatform.services.rest.resource.GenericMethodResource;
import java.util.HashSet;
import java.util.Set;
@@ -48,10 +56,13 @@
perreq.add(Resource1.class);
perreq.add(Resource2.class);
perreq.add(ExceptionMapper1.class);
+ perreq.add(MethodInvokerFilter1.class);
+ perreq.add(RequestFilter1.class);
singletons.add(new Resource3());
singletons.add(new Resource4());
singletons.add(new ExceptionMapper2());
+ singletons.add(new ResponseFilter1());
}
@Override
@@ -140,46 +151,92 @@
}
}
+
+ @Filter
+ public static class MethodInvokerFilter1 implements MethodInvokerFilter
+ {
+ public void accept(GenericMethodResource genericMethodResource)
+ {
+ invFilter = true;
+ }
+
+ }
+
+ @Filter
+ public static class RequestFilter1 implements RequestFilter
+ {
+
+ public void doFilter(GenericContainerRequest request)
+ {
+ requestFilter = true;
+ }
+
+ }
+
+ @Filter
+ public static class ResponseFilter1 implements ResponseFilter
+ {
+
+ public void doFilter(GenericContainerResponse response)
+ {
+ responseFilter = true;
+ }
+
+ }
+
public void testRegistry()
{
- // binder.addApplication(new Application1());
- // assertEquals(4, binder.getSize());
- // assertNotNull(rd.getExceptionMapper(RuntimeException.class));
+ binder.addApplication(new Application1());
+ assertEquals(4, binder.getSize());
+ assertEquals(1, providers.getRequestFilters(null).size());
+ assertEquals(1, providers.getResponseFilters(null).size());
+ assertEquals(1, providers.getMethodInvokerFilters(null).size());
+ assertNotNull(providers.getExceptionMapper(RuntimeException.class));
+ assertNotNull(providers.getExceptionMapper(IllegalStateException.class));
}
+ private static boolean requestFilter = false;
+ private static boolean responseFilter = false;
+ private static boolean invFilter = false;
+
public void testAsResources() throws Exception
{
- // binder.addApplication(new Application1());
- // // per-request
- // ContainerResponse resp = service("GET", "/a",
"", null, null);
- // assertEquals(200, resp.getStatus());
- // String hash10 = (String) resp.getEntity();
- // resp = service("GET", "/a", "", null, null);
- // String hash11 = (String) resp.getEntity();
- // // new instance of resource for each request
- // assertFalse(hash10.equals(hash11));
- //
- // // singleton
- // resp = service("GET", "/c", "", null, null);
- // assertEquals(200, resp.getStatus());
- // String hash20 = (String) resp.getEntity();
- // resp = service("GET", "/c", "", null, null);
- // String hash21 = (String) resp.getEntity();
- // // singleton resource
- // assertTrue(hash20.equals(hash21));
- //
- // // check per-request ExceptionMapper as example of provider
- // resp = service("GET", "/b", "", null, null);
- // // should be 200 status instead 500 if ExceptionMapper works correct
- // assertEquals(200, resp.getStatus());
- // assertEquals("test Runtime Exception", resp.getEntity());
- //
- // // check singleton ExceptionMapper as example of provider
- // resp = service("GET", "/d", "", null, null);
- // // should be 200 status instead 500 if ExceptionMapper works correct
- // assertEquals(200, resp.getStatus());
- // assertEquals("test Illegal State Exception", resp.getEntity());
+ binder.addApplication(new Application1());
+ // per-request
+ ContainerResponse resp = service("GET", "/a", "",
null, null);
+ assertEquals(200, resp.getStatus());
+ String hash10 = (String)resp.getEntity();
+ resp = service("GET", "/a", "", null, null);
+ String hash11 = (String)resp.getEntity();
+ // new instance of resource for each request
+ assertFalse(hash10.equals(hash11));
+
+ // singleton
+ resp = service("GET", "/c", "", null, null);
+ assertEquals(200, resp.getStatus());
+ String hash20 = (String)resp.getEntity();
+ resp = service("GET", "/c", "", null, null);
+ String hash21 = (String)resp.getEntity();
+ // singleton resource
+ assertTrue(hash20.equals(hash21));
+
+ // check per-request ExceptionMapper as example of provider
+ resp = service("GET", "/b", "", null, null);
+ // should be 200 status instead 500 if ExceptionMapper works correct
+ assertEquals(200, resp.getStatus());
+ assertEquals("test Runtime Exception", resp.getEntity());
+
+ // check singleton ExceptionMapper as example of provider
+ resp = service("GET", "/d", "", null, null);
+ // should be 200 status instead 500 if ExceptionMapper works correct
+ assertEquals(200, resp.getStatus());
+ assertEquals("test Illegal State Exception", resp.getEntity());
+
+ // check are filters were visited
+ assertTrue(requestFilter);
+ assertTrue(responseFilter);
+ assertTrue(invFilter);
}
}