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 f8caa8bfb60f4672ca8d7ef231fb47c319de698b..ba64b914ca704a6ecaab8f3bb9d9662037422d68 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 5f52cbb24b221398cf683aecbdfa115d6ecc08ea..26a4cbece12ddb32445c528560fb19316cb1680c 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 edf69412cfdff493ff89647a00738a5a726ba8d6..5bce84346f0b17a77ded48a3faef0aba222b0d3a 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 8917709fde11dc05a12654b97c802926c1aa5b8c..8463a84c16d1ba9bd9ac680638a672047043a439 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 33472a4dd535d0783a4b60ed87e2c17c2cd3007c..e60cf495c7f03ee9d331bd1fafddf259773115d7 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 062192e8149399fcc30814f60181a0a14660e81d..141ca7d11c8a94eb65b77d4b9d493c310a649d94 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); } }