From b23c249b5f0abbb1d97e4f2ca66d050159c336f3 Mon Sep 17 00:00:00 2001
From: felmer <felmer>
Date: Mon, 10 Sep 2012 08:55:57 +0000
Subject: [PATCH] BIS-142 Improve RegressionTestCase, add missing annotations
 in AbstractServer, remove listGridCustomColumns from ICommonServer because it
 is already defined in super class, overrides (un)archiveDatasets() in
 CommonServer and ETLService because of different annotations.

SVN: 26566
---
 .../generic/server/AbstractServer.java        |  3 ++
 .../openbis/generic/server/CommonServer.java  | 20 ++++++++
 .../openbis/generic/server/ETLService.java    | 20 ++++++++
 .../openbis/generic/shared/ICommonServer.java |  8 ----
 .../generic/shared/RegressionTestCase.java    | 48 +++++++++++++++----
 .../shared/ServerInterfaceRegressionTest.java |  7 ++-
 6 files changed, 86 insertions(+), 20 deletions(-)

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
index f8caa8bfb60..ba64b914ca7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
@@ -59,6 +59,7 @@ import ch.systemsx.cisd.openbis.generic.server.plugin.SampleServerPluginRegistry
 import ch.systemsx.cisd.openbis.generic.shared.IRemoteHostValidator;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 import ch.systemsx.cisd.openbis.generic.shared.ResourceNames;
+import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.ReturnValueFilter;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RolesAllowed;
 import ch.systemsx.cisd.openbis.generic.shared.authorization.validator.ExpressionValidator;
 import ch.systemsx.cisd.openbis.generic.shared.basic.EntityVisitComparatorByTimeStamp;
@@ -801,6 +802,8 @@ public abstract class AbstractServer<T> extends AbstractServiceWithLogger<T> imp
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
+    @ReturnValueFilter(validatorClass = ExpressionValidator.class)
     public List<GridCustomColumn> listGridCustomColumns(String sessionToken, String gridId)
     {
         Session session = getSession(sessionToken);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index 5f52cbb24b2..26a4cbece12 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -2444,6 +2444,26 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
                 serviceDescription.getDatastoreCode(), datasetCodes, parameterBindings);
     }
 
+    @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_POWER_USER)
+    @Capability("ARCHIVE_DATASET")
+    public int archiveDatasets(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodeCollectionPredicate.class)
+            List<String> datasetCodes, boolean removeFromDataStore)
+    {
+        return super.archiveDatasets(sessionToken, datasetCodes, removeFromDataStore);
+    }
+
+    @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_USER)
+    @Capability("UNARCHIVE_DATASET")
+    public int unarchiveDatasets(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodeCollectionPredicate.class)
+            List<String> datasetCodes)
+    {
+        return super.unarchiveDatasets(sessionToken, datasetCodes);
+    }
+
     @Override
     @RolesAllowed(RoleWithHierarchy.INSTANCE_ADMIN)
     public void registerAuthorizationGroup(String sessionToken,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
index edf69412cfd..5bce84346f0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
@@ -414,6 +414,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_ETL_SERVER)
     public long drawANewUniqueID(String sessionToken,
             ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind entityKind)
             throws UserFailureException
@@ -984,6 +985,24 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
         return dataBO.compareAndSetDataSetStatus(oldStatus, newStatus, newPresentInArchive);
     }
 
+    @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_ETL_SERVER)
+    public int archiveDatasets(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodeCollectionPredicate.class)
+            List<String> datasetCodes, boolean removeFromDataStore)
+    {
+        return super.archiveDatasets(sessionToken, datasetCodes, removeFromDataStore);
+    }
+
+    @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_ETL_SERVER)
+    public int unarchiveDatasets(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodeCollectionPredicate.class)
+            List<String> datasetCodes)
+    {
+        return super.unarchiveDatasets(sessionToken, datasetCodes);
+    }
+
     @Override
     @RolesAllowed(value =
         { RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
@@ -1172,6 +1191,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
     }
 
     @Override
+    @RolesAllowed(RoleWithHierarchy.SPACE_ETL_SERVER)
     public List<String> generateCodes(String sessionToken, String prefix,
             ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind entityKind, int number)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
index 8917709fde1..8463a84c16d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
@@ -60,7 +60,6 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Grantee;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomColumn;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomFilter;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IExpressionUpdates;
@@ -1122,13 +1121,6 @@ public interface ICommonServer extends IServer
 
     // columns
 
-    /**
-     * Lists columns available for selected grid.
-     */
-    @Override
-    @Transactional
-    public List<GridCustomColumn> listGridCustomColumns(String sessionToken, String gridId);
-
     /**
      * Creates a new column.
      */
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/RegressionTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/RegressionTestCase.java
index 33472a4dd53..e60cf495c7f 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/RegressionTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/RegressionTestCase.java
@@ -25,6 +25,8 @@ import org.apache.commons.lang.StringUtils;
 import org.springframework.transaction.annotation.Transactional;
 import org.testng.AssertJUnit;
 
+import ch.systemsx.cisd.openbis.generic.shared.authorization.annotation.RolesAllowed;
+
 /**
  * @author Franz-Josef Elmer
  */
@@ -32,33 +34,59 @@ public class RegressionTestCase extends AssertJUnit
 {
     protected void assertMandatoryMethodAnnotations(Class<?> clazz)
     {
-        assertMandatoryMethodAnnotations(clazz, "");
+        assertMandatoryMethodAnnotations(clazz, clazz);
     }
 
-    protected void assertMandatoryMethodAnnotations(Class<?> clazz, String exceptions)
+    protected void assertMandatoryMethodAnnotations(Class<?> interfaceClass,
+            Class<?> implementingClass)
+    {
+        assertMandatoryMethodAnnotations(interfaceClass, implementingClass, "");
+    }
+
+    protected void assertMandatoryMethodAnnotations(Class<?> interfaceClass,
+            Class<?> implementingClass, String exceptions)
     {
         List<Class<? extends Annotation>> mandatoryAnnotations =
                 new ArrayList<Class<? extends Annotation>>();
-        // TODO: Check RolesAllowed for implementing class
-        // mandatoryAnnotations.add(RolesAllowed.class);
+        mandatoryAnnotations.add(RolesAllowed.class);
         mandatoryAnnotations.add(Transactional.class);
 
         final String noMissingAnnotationsMsg =
-                "Missing annotations in class " + clazz.getCanonicalName() + ":\n";
+                "Annotation checking for interface " + interfaceClass.getName()
+                        + " and implementing class " + implementingClass.getName()
+                        + ": The mandatory annotations doesn't appear in the following methods:\n";
+        assertEquals(true, interfaceClass.isInterface());
+        assertEquals(true, interfaceClass.isAssignableFrom(implementingClass));
+
         StringBuilder problems = new StringBuilder(noMissingAnnotationsMsg);
-        for (Method m : clazz.getDeclaredMethods())
+        for (Method interfaceMethod : interfaceClass.getDeclaredMethods())
         {
             List<String> missingAnnotations = new ArrayList<String>();
-            for (Class<? extends Annotation> c : mandatoryAnnotations)
+            for (Class<? extends Annotation> annotationClass : mandatoryAnnotations)
             {
-                if (m.getAnnotation(c) == null)
+                if (interfaceMethod.getAnnotation(annotationClass) == null)
                 {
-                    missingAnnotations.add(c.getSimpleName());
+                    try
+                    {
+                        Method implementedMethod =
+                                implementingClass.getMethod(interfaceMethod.getName(),
+                                        interfaceMethod.getParameterTypes());
+                        if (implementedMethod.getAnnotation(annotationClass) == null)
+                        {
+                            missingAnnotations.add(annotationClass.getSimpleName());
+                        }
+                    } catch (Exception ex)
+                    {
+                        fail("Method '" + interfaceMethod.toGenericString() + "' of interface "
+                                + interfaceClass.getName()
+                                + " is not defined in implementing class "
+                                + implementingClass.getName() + ".");
+                    }
                 }
             }
             if (missingAnnotations.size() > 0)
             {
-                problems.append(String.format("%s: %s\n", m.getName(),
+                problems.append(String.format("%s: %s\n", interfaceMethod.getName(),
                         StringUtils.join(missingAnnotations, ", ")));
             }
         }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ServerInterfaceRegressionTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ServerInterfaceRegressionTest.java
index 062192e8149..141ca7d11c8 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ServerInterfaceRegressionTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ServerInterfaceRegressionTest.java
@@ -18,6 +18,9 @@ package ch.systemsx.cisd.openbis.generic.shared;
 
 import org.testng.annotations.Test;
 
+import ch.systemsx.cisd.openbis.generic.server.CommonServer;
+import ch.systemsx.cisd.openbis.generic.server.ETLService;
+
 /**
  * @author Franz-Josef Elmer
  */
@@ -27,13 +30,13 @@ public class ServerInterfaceRegressionTest extends RegressionTestCase
     @Test
     public void testICommonServer()
     {
-        assertMandatoryMethodAnnotations(ICommonServer.class,
+        assertMandatoryMethodAnnotations(ICommonServer.class, CommonServer.class,
                 "getLastModificationState: Transactional\n");
     }
 
     @Test
     public void testIETLLIMSService()
     {
-        assertMandatoryMethodAnnotations(IETLLIMSService.class);
+        assertMandatoryMethodAnnotations(IETLLIMSService.class, ETLService.class);
     }
 }
-- 
GitLab