[exo-jcr-commits] exo-jcr SVN: r138 - in ws/trunk/rest/core/src: test/java/org/exoplatform/services/rest and 1 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Fri Sep 4 12:36:33 EDT 2009


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);
    }
 
 }



More information about the exo-jcr-commits mailing list