From f6f501d37cb7e4dae75da39bf30a1b77b5fbdf1e Mon Sep 17 00:00:00 2001 From: Luca Giamminonni Date: Thu, 17 Sep 2020 18:13:17 +0200 Subject: [PATCH] Script to delete all the values of a specified metadata field --- .../dspace/app/bulkedit/MetadataDeletion.java | 72 +++++++++++++++++++ .../app/bulkedit/MetadataDeletionCli.java | 18 +++++ ...etadataDeletionCliScriptConfiguration.java | 18 +++++ .../MetadataDeletionScriptConfiguration.java | 62 ++++++++++++++++ .../config/spring/api/scripts.xml | 5 ++ .../app/bulkedit/MetadataDeletionIT.java | 70 ++++++++++++++++++ .../config/spring/rest/scripts.xml | 5 ++ dspace/config/spring/api/scripts.xml | 5 ++ dspace/config/spring/rest/scripts.xml | 5 ++ 9 files changed, 260 insertions(+) create mode 100644 dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletion.java create mode 100644 dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletionCli.java create mode 100644 dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletionCliScriptConfiguration.java create mode 100644 dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletionScriptConfiguration.java create mode 100644 dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataDeletionIT.java diff --git a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletion.java b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletion.java new file mode 100644 index 0000000000..a9cffa29c4 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletion.java @@ -0,0 +1,72 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.bulkedit; + +import java.sql.SQLException; + +import org.apache.commons.cli.ParseException; +import org.dspace.content.MetadataField; +import org.dspace.content.factory.ContentServiceFactory; +import org.dspace.content.service.MetadataFieldService; +import org.dspace.content.service.MetadataValueService; +import org.dspace.core.Context; +import org.dspace.scripts.DSpaceRunnable; +import org.dspace.utils.DSpace; + +/** + * {@link DSpaceRunnable} implementation to delete all the values of the given + * metadata field. + * + * @author Luca Giamminonni (luca.giamminonni at 4science.it) + * + */ +public class MetadataDeletion extends DSpaceRunnable> { + + private String metadataField; + + @Override + public void internalRun() throws Exception { + Context context = new Context(); + context.turnOffAuthorisationSystem(); + + MetadataValueService metadataValueService = ContentServiceFactory.getInstance() + .getMetadataValueService(); + + MetadataFieldService metadataFieldService = ContentServiceFactory.getInstance() + .getMetadataFieldService(); + + try { + + MetadataField field = metadataFieldService.findByString(context, metadataField, '.'); + if (field == null) { + throw new IllegalArgumentException("No metadata field found with name " + metadataField); + } + + metadataValueService.deleteByMetadataField(context, field); + + } catch (SQLException e) { + handler.handleException(e); + } + + context.restoreAuthSystemState(); + context.complete(); + } + + @Override + @SuppressWarnings("unchecked") + public MetadataDeletionScriptConfiguration getScriptConfiguration() { + return new DSpace().getServiceManager() + .getServiceByName("metadata-deletion", MetadataDeletionScriptConfiguration.class); + } + + @Override + public void setup() throws ParseException { + metadataField = commandLine.getOptionValue('m'); + } + +} diff --git a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletionCli.java b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletionCli.java new file mode 100644 index 0000000000..f7fad894a7 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletionCli.java @@ -0,0 +1,18 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.bulkedit; + +/** + * The {@link MetadataDeletion} for CLI. + * + * @author Luca Giamminonni (luca.giamminonni at 4science.it) + * + */ +public class MetadataDeletionCli extends MetadataDeletion { + +} diff --git a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletionCliScriptConfiguration.java b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletionCliScriptConfiguration.java new file mode 100644 index 0000000000..bcc1e118d1 --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletionCliScriptConfiguration.java @@ -0,0 +1,18 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.bulkedit; + +/** + * Script configuration for {@link MetadataDeletionCli}. + * + * @author Luca Giamminonni (luca.giamminonni at 4science.it) + * + */ +public class MetadataDeletionCliScriptConfiguration extends MetadataDeletionScriptConfiguration { + +} diff --git a/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletionScriptConfiguration.java b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletionScriptConfiguration.java new file mode 100644 index 0000000000..caf9cbddcf --- /dev/null +++ b/dspace-api/src/main/java/org/dspace/app/bulkedit/MetadataDeletionScriptConfiguration.java @@ -0,0 +1,62 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.bulkedit; + +import java.sql.SQLException; + +import org.apache.commons.cli.Options; +import org.dspace.authorize.service.AuthorizeService; +import org.dspace.core.Context; +import org.dspace.scripts.configuration.ScriptConfiguration; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * The {@link ScriptConfiguration} for the {@link MetadataDeletion} script. + */ +public class MetadataDeletionScriptConfiguration extends ScriptConfiguration { + + @Autowired + private AuthorizeService authorizeService; + + private Class dspaceRunnableClass; + + @Override + public boolean isAllowedToExecute(Context context) { + try { + return authorizeService.isAdmin(context); + } catch (SQLException e) { + throw new RuntimeException("SQLException occurred when checking if the current user is an admin", e); + } + } + + @Override + public Options getOptions() { + if (options == null) { + Options options = new Options(); + options.addOption("m", "metadata", true, "metadata field name"); + options.getOption("m").setType(String.class); + super.options = options; + } + return options; + } + + @Override + public Class getDspaceRunnableClass() { + return dspaceRunnableClass; + } + + /** + * Generic setter for the dspaceRunnableClass + * @param dspaceRunnableClass The dspaceRunnableClass to be set on this MetadataDeletionScriptConfiguration + */ + @Override + public void setDspaceRunnableClass(Class dspaceRunnableClass) { + this.dspaceRunnableClass = dspaceRunnableClass; + } + +} diff --git a/dspace-api/src/test/data/dspaceFolder/config/spring/api/scripts.xml b/dspace-api/src/test/data/dspaceFolder/config/spring/api/scripts.xml index e6e01f449c..36e425ba6b 100644 --- a/dspace-api/src/test/data/dspaceFolder/config/spring/api/scripts.xml +++ b/dspace-api/src/test/data/dspaceFolder/config/spring/api/scripts.xml @@ -34,6 +34,11 @@ + + + + + diff --git a/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataDeletionIT.java b/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataDeletionIT.java new file mode 100644 index 0000000000..6da45ea22d --- /dev/null +++ b/dspace-api/src/test/java/org/dspace/app/bulkedit/MetadataDeletionIT.java @@ -0,0 +1,70 @@ +/** + * The contents of this file are subject to the license and copyright + * detailed in the LICENSE and NOTICE files at the root of the source + * tree and available online at + * + * http://www.dspace.org/license/ + */ +package org.dspace.app.bulkedit; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.dspace.AbstractIntegrationTestWithDatabase; +import org.dspace.app.launcher.ScriptLauncher; +import org.dspace.app.scripts.handler.impl.TestDSpaceRunnableHandler; +import org.dspace.builder.CollectionBuilder; +import org.dspace.builder.CommunityBuilder; +import org.dspace.builder.ItemBuilder; +import org.dspace.content.Collection; +import org.dspace.content.Community; +import org.dspace.content.MetadataField; +import org.dspace.content.factory.ContentServiceFactory; +import org.dspace.content.service.MetadataFieldService; +import org.dspace.content.service.MetadataValueService; +import org.junit.Test; + +/** + * Integration tests for {@link MetadataDeletion}. + * + * @author Luca Giamminonni (luca.giamminonni at 4science.it) + * + */ +public class MetadataDeletionIT extends AbstractIntegrationTestWithDatabase { + + private MetadataValueService metadataValueService = ContentServiceFactory.getInstance().getMetadataValueService(); + + private MetadataFieldService metadataFieldService = ContentServiceFactory.getInstance().getMetadataFieldService(); + + @Test + public void metadataDeletionTest() throws Exception { + + context.turnOffAuthorisationSystem(); + Community community = CommunityBuilder.createCommunity(context).build(); + Collection collection = CollectionBuilder.createCollection(context, community).build(); + createItem(collection, "My First publication", "Mario Rossi"); + createItem(collection, "Another publication", "John Smith"); + context.restoreAuthSystemState(); + + MetadataField titleField = metadataFieldService.findByElement(context, "dc", "title", null); + MetadataField authorField = metadataFieldService.findByElement(context, "dc", "contributor", "author"); + + assertEquals(2, metadataValueService.findByField(context, titleField).size()); + assertEquals(2, metadataValueService.findByField(context, authorField).size()); + + TestDSpaceRunnableHandler testDSpaceRunnableHandler = new TestDSpaceRunnableHandler(); + + String[] args = new String[] { "metadata-deletion", "-m", "dc.title" }; + ScriptLauncher.handleScript(args, ScriptLauncher.getConfig(kernelImpl), testDSpaceRunnableHandler, kernelImpl); + + assertTrue(metadataValueService.findByField(context, titleField).isEmpty()); + assertEquals(2, metadataValueService.findByField(context, authorField).size()); + } + + private void createItem(Collection collection, String title, String author) { + ItemBuilder.createItem(context, collection) + .withTitle(title) + .withAuthor(author) + .build(); + } +} diff --git a/dspace-server-webapp/src/test/data/dspaceFolder/config/spring/rest/scripts.xml b/dspace-server-webapp/src/test/data/dspaceFolder/config/spring/rest/scripts.xml index 294e197b70..ab9826b84d 100644 --- a/dspace-server-webapp/src/test/data/dspaceFolder/config/spring/rest/scripts.xml +++ b/dspace-server-webapp/src/test/data/dspaceFolder/config/spring/rest/scripts.xml @@ -22,4 +22,9 @@ + + + + + \ No newline at end of file diff --git a/dspace/config/spring/api/scripts.xml b/dspace/config/spring/api/scripts.xml index c13fcfd6ef..52467dabde 100644 --- a/dspace/config/spring/api/scripts.xml +++ b/dspace/config/spring/api/scripts.xml @@ -35,4 +35,9 @@ + + + + + diff --git a/dspace/config/spring/rest/scripts.xml b/dspace/config/spring/rest/scripts.xml index 55602c82c8..2027b979bf 100644 --- a/dspace/config/spring/rest/scripts.xml +++ b/dspace/config/spring/rest/scripts.xml @@ -28,4 +28,9 @@ + + + + +