/**
* The contents of this file are subject to the license and copyright
* detailed in the LICENSE file at the root of the source
* tree and available online at
*
* https://github.com/keeps/roda
*/
package org.roda.core.index;
import static org.testng.AssertJUnit.assertEquals;
import java.nio.file.Path;
import java.text.ParseException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.roda.core.RodaCoreFactory;
import org.roda.core.TestsHelper;
import org.roda.core.data.common.RodaConstants;
import org.roda.core.data.exceptions.RODAException;
import org.roda.core.data.v2.index.filter.Filter;
import org.roda.core.data.v2.index.filter.NotSimpleFilterParameter;
import org.roda.core.data.v2.index.filter.SimpleFilterParameter;
import org.roda.core.data.v2.index.select.SelectedItemsFilter;
import org.roda.core.data.v2.ip.AIP;
import org.roda.core.data.v2.ip.IndexedAIP;
import org.roda.core.data.v2.ip.Permissions;
import org.roda.core.data.v2.ip.Permissions.PermissionType;
import org.roda.core.data.v2.jobs.Job;
import org.roda.core.data.v2.jobs.PluginType;
import org.roda.core.data.v2.user.User;
import org.roda.core.model.ModelService;
import org.roda.core.plugins.plugins.internal.UpdateAIPPermissionsPlugin;
import org.roda.core.storage.fs.FSUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
@Test(groups = {RodaConstants.TEST_GROUP_ALL, RodaConstants.TEST_GROUP_TRAVIS})
public class PermissionsRecursiveTest {
private static final Logger LOGGER = LoggerFactory.getLogger(PermissionsRecursiveTest.class);
private static Path basePath;
private static ModelService model;
private static IndexService index;
@BeforeClass
public static void setUp() throws Exception {
basePath = TestsHelper.createBaseTempDir(PermissionsRecursiveTest.class, true);
boolean deploySolr = true;
boolean deployLdap = true;
boolean deployFolderMonitor = false;
boolean deployOrchestrator = true;
boolean deployPluginManager = true;
boolean deployDefaultResources = false;
RodaCoreFactory.instantiateTest(deploySolr, deployLdap, deployFolderMonitor, deployOrchestrator,
deployPluginManager, deployDefaultResources);
model = RodaCoreFactory.getModelService();
index = RodaCoreFactory.getIndexService();
LOGGER.debug("Running index tests under storage {}", basePath);
}
@AfterClass
public static void tearDown() throws Exception {
RodaCoreFactory.shutdown();
FSUtils.deletePath(basePath);
}
@Test
public void testUpdatePermissionsRecursively() throws RODAException, ParseException {
AIP parent = model.createAIP(null, "", new Permissions(), RodaConstants.ADMIN);
AIP firstChild = model.createAIP(parent.getId(), "", new Permissions(), RodaConstants.ADMIN);
AIP otherChild = model.createAIP(parent.getId(), "", new Permissions(), RodaConstants.ADMIN);
model.createAIP(otherChild.getId(), "", new Permissions(), RodaConstants.ADMIN);
User user = new User();
user.setName("rodauser");
user.setFullName("Roda User");
user.setEmail("rodauser@example.com");
model.registerUser(user, "rodapassword", false);
// change parent permissions
Set<PermissionType> userPermissions = new HashSet<>();
userPermissions.add(PermissionType.READ);
parent.getPermissions().setUserPermissions(user.getName(), userPermissions);
model.updateAIPPermissions(parent, RodaConstants.ADMIN);
// change a child permissions as well
firstChild.getPermissions().setUserPermissions(user.getName(), userPermissions);
model.updateAIPPermissions(firstChild, RodaConstants.ADMIN);
index.commitAIPs();
Filter filter = new Filter(new SimpleFilterParameter(RodaConstants.AIP_ANCESTORS, parent.getId()),
new NotSimpleFilterParameter("permission_users_READ", user.getName()));
SelectedItemsFilter<IndexedAIP> selectedItems = new SelectedItemsFilter<>(filter, IndexedAIP.class.getName(),
Boolean.FALSE);
Map<String, String> pluginParameters = new HashMap<>();
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_AIP_ID, parent.getId());
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_DETAILS, "Update descendant AIPs");
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_EVENT_DESCRIPTION,
"The process of updating an object of the repository.");
pluginParameters.put(RodaConstants.PLUGIN_PARAMS_OUTCOME_TEXT,
"Parent permissions were updated and all sublevels will be too");
Job job = TestsHelper.executeJob(UpdateAIPPermissionsPlugin.class, pluginParameters, PluginType.INTERNAL,
selectedItems);
assertEquals(2, job.getJobStats().getSourceObjectsCount());
Set<PermissionType> permissions = model.retrieveAIP(otherChild.getId()).getPermissions()
.getUserPermissions(user.getName());
assertEquals(permissions.contains(PermissionType.READ), true);
}
}