[CST-5699] add integration tests for import and export via SAF

This commit is contained in:
Francesco Pio Scognamiglio
2022-05-25 09:34:13 +02:00
parent 3443bd5d48
commit 504f7fecf3
5 changed files with 883 additions and 0 deletions

View File

@@ -33,4 +33,14 @@
<property name="dspaceRunnableClass" value="org.dspace.app.scripts.TypeConversionTestScript"/>
</bean>
<bean id="import" class="org.dspace.app.itemimport.ItemImportScriptConfiguration" primary="true">
<property name="description" value="Batch Import" />
<property name="dspaceRunnableClass" value="org.dspace.app.itemimport.ItemImportCLITool"/>
</bean>
<bean id="export" class="org.dspace.app.itemexport.ItemExportScriptConfiguration" primary="true">
<property name="description" value="Batch Export"/>
<property name="dspaceRunnableClass" value="org.dspace.app.itemexport.ItemExportCLITool"/>
</bean>
</beans>

View File

@@ -0,0 +1,342 @@
/**
* 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.itemexport;
import static com.jayway.jsonpath.JsonPath.read;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.codec.CharEncoding;
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.file.PathUtils;
import org.dspace.app.rest.converter.DSpaceRunnableParameterConverter;
import org.dspace.app.rest.model.ParameterValueRest;
import org.dspace.app.rest.projection.Projection;
import org.dspace.app.rest.test.AbstractControllerIntegrationTest;
import org.dspace.builder.BitstreamBuilder;
import org.dspace.builder.CollectionBuilder;
import org.dspace.builder.CommunityBuilder;
import org.dspace.builder.ItemBuilder;
import org.dspace.builder.ProcessBuilder;
import org.dspace.content.Bitstream;
import org.dspace.content.Collection;
import org.dspace.content.Item;
import org.dspace.content.service.CollectionService;
import org.dspace.content.service.ItemService;
import org.dspace.scripts.DSpaceCommandLineParameter;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Basic integration testing for the SAF Export feature
* https://wiki.lyrasis.org/display/DSDOC7x/Importing+and+Exporting+Items+via+Simple+Archive+Format
*
* @author Francesco Pio Scognamiglio (francescopio.scognamiglio at 4science.com)
*/
public class ItemExportCLIToolIT extends AbstractControllerIntegrationTest {
private static final String title = "A Tale of Two Cities";
private static final String dateIssued = "1990";
private static final String titleAlternative = "J'aime les Printemps";
@Autowired
private ItemService itemService;
@Autowired
private CollectionService collectionService;
@Autowired
private DSpaceRunnableParameterConverter dSpaceRunnableParameterConverter;
private Collection collection;
private Path tempDir;
@Before
public void setup() throws Exception {
context.turnOffAuthorisationSystem();
parentCommunity = CommunityBuilder.createCommunity(context)
.withName("Parent Community")
.build();
collection = CollectionBuilder.createCollection(context, parentCommunity)
.withName("Collection")
.withEntityType("Publication")
.build();
context.restoreAuthSystemState();
tempDir = Files.createTempDirectory("safExportTest");
}
@After
@Override
public void destroy() throws Exception {
PathUtils.deleteDirectory(tempDir);
super.destroy();
}
@Test
public void exportCollection() throws Exception {
// create items
context.turnOffAuthorisationSystem();
Item item1 = ItemBuilder.createItem(context, collection)
.withTitle(title)
.withMetadata("dc", "date", "issued", dateIssued)
.withMetadata("dc", "title", "alternative", titleAlternative)
.build();
Item item2 = ItemBuilder.createItem(context, collection)
.withTitle(title + " 2")
.withMetadata("dc", "date", "issued", dateIssued)
.withMetadata("dc", "title", "alternative", titleAlternative)
.build();
context.restoreAuthSystemState();
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-t", "COLLECTION"));
parameters.add(new DSpaceCommandLineParameter("-i", collection.getHandle()));
parameters.add(new DSpaceCommandLineParameter("-d", tempDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-n", "1"));
perfomExportScript(parameters);
checkDir();
}
@Test
public void exportItemWithMetadataOnly() throws Exception {
// create item
context.turnOffAuthorisationSystem();
Item item = ItemBuilder.createItem(context, collection)
.withTitle(title)
.withMetadata("dc", "date", "issued", dateIssued)
.withMetadata("dc", "title", "alternative", titleAlternative)
.build();
context.restoreAuthSystemState();
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-t", "ITEM"));
parameters.add(new DSpaceCommandLineParameter("-i", item.getHandle()));
parameters.add(new DSpaceCommandLineParameter("-d", tempDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-n", "1"));
perfomExportScript(parameters);
checkDir();
}
@Test
public void exportItemWithBitstreams() throws Exception {
// create item
context.turnOffAuthorisationSystem();
Item item = ItemBuilder.createItem(context, collection)
.withTitle(title)
.withMetadata("dc", "date", "issued", dateIssued)
.withMetadata("dc", "title", "alternative", titleAlternative)
.build();
// create bitstream
String bitstreamContent = "TEST TEST TEST";
try (InputStream is = IOUtils.toInputStream(bitstreamContent, CharEncoding.UTF_8)) {
Bitstream bitstream = BitstreamBuilder.createBitstream(context, item, is)
.withName("Bitstream")
.withMimeType("text/plain")
.build();
}
context.restoreAuthSystemState();
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-t", "ITEM"));
parameters.add(new DSpaceCommandLineParameter("-i", item.getHandle()));
parameters.add(new DSpaceCommandLineParameter("-d", tempDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-n", "1"));
perfomExportScript(parameters);
checkDir();
}
@Test
public void exportItemWithAnotherMetadataSchema() throws Exception {
// create item
context.turnOffAuthorisationSystem();
Item item = ItemBuilder.createItem(context, collection)
.withTitle(title)
.withMetadata("dc", "date", "issued", dateIssued)
.withMetadata("dc", "title", "alternative", titleAlternative)
.withMetadata("dcterms", "title", "", title)
.build();
context.restoreAuthSystemState();
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-t", "ITEM"));
parameters.add(new DSpaceCommandLineParameter("-i", item.getHandle()));
parameters.add(new DSpaceCommandLineParameter("-d", tempDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-n", "1"));
perfomExportScript(parameters);
checkDir();
}
@Test
public void migrateCollection() throws Exception {
// create items
context.turnOffAuthorisationSystem();
Item item1 = ItemBuilder.createItem(context, collection)
.withTitle(title)
.withMetadata("dc", "date", "issued", dateIssued)
.withMetadata("dc", "title", "alternative", titleAlternative)
.build();
Item item2 = ItemBuilder.createItem(context, collection)
.withTitle(title + " 2")
.withMetadata("dc", "date", "issued", dateIssued)
.withMetadata("dc", "title", "alternative", titleAlternative)
.build();
context.restoreAuthSystemState();
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-t", "COLLECTION"));
parameters.add(new DSpaceCommandLineParameter("-i", collection.getHandle()));
parameters.add(new DSpaceCommandLineParameter("-d", tempDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-n", "1"));
parameters.add(new DSpaceCommandLineParameter("-m", ""));
perfomExportScript(parameters);
checkDir();
checkCollectionMigration();
checkItemMigration(item1);
checkItemMigration(item2);
}
@Test
public void migrateItemWithMetadataOnly() throws Exception {
// create item
context.turnOffAuthorisationSystem();
Item item = ItemBuilder.createItem(context, collection)
.withTitle(title)
.withMetadata("dc", "date", "issued", dateIssued)
.withMetadata("dc", "title", "alternative", titleAlternative)
.build();
context.restoreAuthSystemState();
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-t", "ITEM"));
parameters.add(new DSpaceCommandLineParameter("-i", item.getHandle()));
parameters.add(new DSpaceCommandLineParameter("-d", tempDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-n", "1"));
parameters.add(new DSpaceCommandLineParameter("-m", ""));
perfomExportScript(parameters);
checkDir();
checkItemMigration(item);
}
@Test
public void migrateItemWithBitstreams() throws Exception {
// create item
context.turnOffAuthorisationSystem();
Item item = ItemBuilder.createItem(context, collection)
.withTitle(title)
.withMetadata("dc", "date", "issued", dateIssued)
.withMetadata("dc", "title", "alternative", titleAlternative)
.build();
// create bitstream
String bitstreamContent = "TEST TEST TEST";
try (InputStream is = IOUtils.toInputStream(bitstreamContent, CharEncoding.UTF_8)) {
Bitstream bitstream = BitstreamBuilder.createBitstream(context, item, is)
.withName("Bitstream")
.withMimeType("text/plain")
.build();
}
context.restoreAuthSystemState();
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-t", "ITEM"));
parameters.add(new DSpaceCommandLineParameter("-i", item.getHandle()));
parameters.add(new DSpaceCommandLineParameter("-d", tempDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-n", "1"));
parameters.add(new DSpaceCommandLineParameter("-m", ""));
perfomExportScript(parameters);
checkDir();
checkItemMigration(item);
}
@Test
public void migrateItemWithAnotherMetadataSchema() throws Exception {
// create item
context.turnOffAuthorisationSystem();
Item item = ItemBuilder.createItem(context, collection)
.withTitle(title)
.withMetadata("dc", "date", "issued", dateIssued)
.withMetadata("dc", "title", "alternative", titleAlternative)
.withMetadata("dcterms", "title", "", title)
.build();
context.restoreAuthSystemState();
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-t", "ITEM"));
parameters.add(new DSpaceCommandLineParameter("-i", item.getHandle()));
parameters.add(new DSpaceCommandLineParameter("-d", tempDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-n", "1"));
parameters.add(new DSpaceCommandLineParameter("-m", ""));
perfomExportScript(parameters);
checkDir();
checkItemMigration(item);
}
/**
* Check created export directory
* @throws Exception
*/
private void checkDir() throws Exception {
assertTrue(Files.list(tempDir).findAny().isPresent());
}
/**
* Check migration of collection
* @throws Exception
*/
private void checkCollectionMigration() throws Exception {
assertNotNull(collectionService.find(context, collection.getID()));
}
/**
* Check migration of item
* @param item
* @throws Exception
*/
private void checkItemMigration(Item item) throws Exception {
assertNotNull(itemService.find(context, item.getID()));
}
private void perfomExportScript(LinkedList<DSpaceCommandLineParameter> parameters)
throws Exception {
AtomicReference<Integer> idRef = new AtomicReference<>();
List<ParameterValueRest> list = parameters.stream()
.map(dSpaceCommandLineParameter -> dSpaceRunnableParameterConverter
.convert(dSpaceCommandLineParameter, Projection.DEFAULT))
.collect(Collectors.toList());
try {
String token = getAuthToken(admin.getEmail(), password);
getClient(token)
.perform(multipart("/api/system/scripts/export/processes")
.param("properties", new ObjectMapper().writeValueAsString(list)))
.andExpect(status().isAccepted())
.andDo(result -> idRef
.set(read(result.getResponse().getContentAsString(), "$.processId")));
} finally {
ProcessBuilder.deleteProcess(idRef.get());
}
}
}

View File

@@ -0,0 +1,523 @@
/**
* 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.itemimport;
import static com.jayway.jsonpath.JsonPath.read;
import static org.dspace.app.rest.matcher.MetadataMatcher.matchMetadata;
import static org.hamcrest.Matchers.allOf;
import static org.junit.Assert.assertEquals;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.io.file.PathUtils;
import org.dspace.app.rest.converter.DSpaceRunnableParameterConverter;
import org.dspace.app.rest.model.ParameterValueRest;
import org.dspace.app.rest.projection.Projection;
import org.dspace.app.rest.test.AbstractControllerIntegrationTest;
import org.dspace.builder.CollectionBuilder;
import org.dspace.builder.CommunityBuilder;
import org.dspace.builder.ItemBuilder;
import org.dspace.builder.ProcessBuilder;
import org.dspace.content.Bitstream;
import org.dspace.content.Collection;
import org.dspace.content.Item;
import org.dspace.content.service.ItemService;
import org.dspace.scripts.DSpaceCommandLineParameter;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
/**
* Basic integration testing for the SAF Import feature
* https://wiki.lyrasis.org/display/DSDOC7x/Importing+and+Exporting+Items+via+Simple+Archive+Format
*
* @author Francesco Pio Scognamiglio (francescopio.scognamiglio at 4science.com)
*/
public class ItemImportCLIToolIT extends AbstractControllerIntegrationTest {
private static final String title = "A Tale of Two Cities";
@Autowired
private ItemService itemService;
@Autowired
private DSpaceRunnableParameterConverter dSpaceRunnableParameterConverter;
private Collection collection;
private Path tempDir;
@Before
public void setup() throws Exception {
context.turnOffAuthorisationSystem();
parentCommunity = CommunityBuilder.createCommunity(context)
.withName("Parent Community")
.build();
collection = CollectionBuilder.createCollection(context, parentCommunity)
.withName("Collection")
.withEntityType("Publication")
.build();
context.restoreAuthSystemState();
tempDir = Files.createTempDirectory("safImportTest");
}
@After
@Override
public void destroy() throws Exception {
PathUtils.deleteDirectory(tempDir);
super.destroy();
}
@Test
public void importItemBySafWithMetadataOnly() throws Exception {
// create simple SAF
Path safDir = Files.createDirectory(Path.of(tempDir.toString() + "/test"));
Path itemDir = Files.createDirectory(Path.of(safDir.toString() + "/item_000"));
Files.copy(getClass().getResourceAsStream("dublin_core.xml"),
Path.of(itemDir.toString() + "/dublin_core.xml"));
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-a", ""));
parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail()));
parameters.add(new DSpaceCommandLineParameter("-c", collection.getID().toString()));
parameters.add(new DSpaceCommandLineParameter("-s", safDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-m", tempDir.toString() + "/mapfile.out"));
perfomImportScript(parameters);
checkMetadata();
}
@Test
public void importItemBySafWithBitstreams() throws Exception {
// create simple SAF
Path safDir = Files.createDirectory(Path.of(tempDir.toString() + "/test"));
Path itemDir = Files.createDirectory(Path.of(safDir.toString() + "/item_000"));
Files.copy(getClass().getResourceAsStream("dublin_core.xml"),
Path.of(itemDir.toString() + "/dublin_core.xml"));
// add bitstream
Path contentsFile = Files.createFile(Path.of(itemDir.toString() + "/contents"));
Files.writeString(contentsFile,
"file1.txt");
Path bitstreamFile = Files.createFile(Path.of(itemDir.toString() + "/file1.txt"));
Files.writeString(bitstreamFile,
"TEST TEST TEST");
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-a", ""));
parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail()));
parameters.add(new DSpaceCommandLineParameter("-c", collection.getID().toString()));
parameters.add(new DSpaceCommandLineParameter("-s", safDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-m", tempDir.toString() + "/mapfile.out"));
perfomImportScript(parameters);
checkMetadata();
checkBitstream();
}
@Test
public void importItemBySafWithAnotherMetadataSchema() throws Exception {
// create simple SAF
Path safDir = Files.createDirectory(Path.of(tempDir.toString() + "/test"));
Path itemDir = Files.createDirectory(Path.of(safDir.toString() + "/item_000"));
Files.copy(getClass().getResourceAsStream("dublin_core.xml"),
Path.of(itemDir.toString() + "/dublin_core.xml"));
// add metadata with another schema
Files.copy(getClass().getResourceAsStream("metadata_dcterms.xml"),
Path.of(itemDir.toString() + "/metadata_dcterms.xml"));
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-a", ""));
parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail()));
parameters.add(new DSpaceCommandLineParameter("-c", collection.getID().toString()));
parameters.add(new DSpaceCommandLineParameter("-s", safDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-m", tempDir.toString() + "/mapfile.out"));
perfomImportScript(parameters);
checkMetadata();
checkMetadataWithAnotherSchema();
}
@Test
public void resumeImportItemBySafWithMetadataOnly() throws Exception {
// create simple SAF
Path safDir = Files.createDirectory(Path.of(tempDir.toString() + "/test"));
Path itemDir = Files.createDirectory(Path.of(safDir.toString() + "/item_000"));
Files.copy(getClass().getResourceAsStream("dublin_core.xml"),
Path.of(itemDir.toString() + "/dublin_core.xml"));
// add mapfile
Path mapFile = Files.createFile(Path.of(tempDir.toString() + "/mapfile.out"));
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-a", ""));
parameters.add(new DSpaceCommandLineParameter("-R", ""));
parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail()));
parameters.add(new DSpaceCommandLineParameter("-c", collection.getID().toString()));
parameters.add(new DSpaceCommandLineParameter("-s", safDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-m", mapFile.toString()));
perfomImportScript(parameters);
checkMetadata();
}
@Test
public void resumeImportItemBySafWithBitstreams() throws Exception {
// create simple SAF
Path safDir = Files.createDirectory(Path.of(tempDir.toString() + "/test"));
Path itemDir = Files.createDirectory(Path.of(safDir.toString() + "/item_000"));
Files.copy(getClass().getResourceAsStream("dublin_core.xml"),
Path.of(itemDir.toString() + "/dublin_core.xml"));
// add bitstream
Path contentsFile = Files.createFile(Path.of(itemDir.toString() + "/contents"));
Files.writeString(contentsFile,
"file1.txt");
Path bitstreamFile = Files.createFile(Path.of(itemDir.toString() + "/file1.txt"));
Files.writeString(bitstreamFile,
"TEST TEST TEST");
// add mapfile
Path mapFile = Files.createFile(Path.of(tempDir.toString() + "/mapfile.out"));
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-a", ""));
parameters.add(new DSpaceCommandLineParameter("-R", ""));
parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail()));
parameters.add(new DSpaceCommandLineParameter("-c", collection.getID().toString()));
parameters.add(new DSpaceCommandLineParameter("-s", safDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-m", mapFile.toString()));
perfomImportScript(parameters);
checkMetadata();
checkBitstream();
}
@Test
public void resumeImportItemBySafWithAnotherMetadataSchema() throws Exception {
// create simple SAF
Path safDir = Files.createDirectory(Path.of(tempDir.toString() + "/test"));
Path itemDir = Files.createDirectory(Path.of(safDir.toString() + "/item_000"));
Files.copy(getClass().getResourceAsStream("dublin_core.xml"),
Path.of(itemDir.toString() + "/dublin_core.xml"));
// add metadata with another schema
Files.copy(getClass().getResourceAsStream("metadata_dcterms.xml"),
Path.of(itemDir.toString() + "/metadata_dcterms.xml"));
// add mapfile
Path mapFile = Files.createFile(Path.of(tempDir.toString() + "/mapfile.out"));
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-a", ""));
parameters.add(new DSpaceCommandLineParameter("-R", ""));
parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail()));
parameters.add(new DSpaceCommandLineParameter("-c", collection.getID().toString()));
parameters.add(new DSpaceCommandLineParameter("-s", safDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-m", mapFile.toString()));
perfomImportScript(parameters);
checkMetadata();
checkMetadataWithAnotherSchema();
}
@Test
public void resumeImportItemSkippingTheFirstOneBySafWithMetadataOnly()
throws Exception {
// create item
context.turnOffAuthorisationSystem();
Item item = ItemBuilder.createItem(context, collection)
.withTitle("Another Title")
.build();
context.restoreAuthSystemState();
// create simple SAF
Path safDir = Files.createDirectory(Path.of(tempDir.toString() + "/test"));
Path itemDir = Files.createDirectory(Path.of(safDir.toString() + "/item_001"));
Files.copy(getClass().getResourceAsStream("dublin_core.xml"),
Path.of(itemDir.toString() + "/dublin_core.xml"));
// add mapfile
Path mapFile = Files.createFile(Path.of(tempDir.toString() + "/mapfile.out"));
Files.writeString(mapFile, "item_000 " + item.getHandle());
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-a", ""));
parameters.add(new DSpaceCommandLineParameter("-R", ""));
parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail()));
parameters.add(new DSpaceCommandLineParameter("-c", collection.getID().toString()));
parameters.add(new DSpaceCommandLineParameter("-s", safDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-m", mapFile.toString()));
perfomImportScript(parameters);
checkMetadata();
}
@Test
public void resumeImportItemSkippingTheFirstOneBySafWithBitstreams()
throws Exception {
// create item
context.turnOffAuthorisationSystem();
Item item = ItemBuilder.createItem(context, collection)
.withTitle("Another Title")
.build();
context.restoreAuthSystemState();
// create simple SAF
Path safDir = Files.createDirectory(Path.of(tempDir.toString() + "/test"));
Path itemDir = Files.createDirectory(Path.of(safDir.toString() + "/item_001"));
Files.copy(getClass().getResourceAsStream("dublin_core.xml"),
Path.of(itemDir.toString() + "/dublin_core.xml"));
// add bitstream
Path contentsFile = Files.createFile(Path.of(itemDir.toString() + "/contents"));
Files.writeString(contentsFile,
"file1.txt");
Path bitstreamFile = Files.createFile(Path.of(itemDir.toString() + "/file1.txt"));
Files.writeString(bitstreamFile,
"TEST TEST TEST");
// add mapfile
Path mapFile = Files.createFile(Path.of(tempDir.toString() + "/mapfile.out"));
Files.writeString(mapFile, "item_000 " + item.getHandle());
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-a", ""));
parameters.add(new DSpaceCommandLineParameter("-R", ""));
parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail()));
parameters.add(new DSpaceCommandLineParameter("-c", collection.getID().toString()));
parameters.add(new DSpaceCommandLineParameter("-s", safDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-m", mapFile.toString()));
perfomImportScript(parameters);
checkMetadata();
checkBitstream();
}
@Test
public void resumeImportItemSkippingTheFirstOneBySafWithAnotherMetadataSchema()
throws Exception {
// create item
context.turnOffAuthorisationSystem();
Item item = ItemBuilder.createItem(context, collection)
.withTitle("Another Title")
.build();
context.restoreAuthSystemState();
// create simple SAF
Path safDir = Files.createDirectory(Path.of(tempDir.toString() + "/test"));
Path itemDir = Files.createDirectory(Path.of(safDir.toString() + "/item_001"));
Files.copy(getClass().getResourceAsStream("dublin_core.xml"),
Path.of(itemDir.toString() + "/dublin_core.xml"));
// add metadata with another schema
Files.copy(getClass().getResourceAsStream("metadata_dcterms.xml"),
Path.of(itemDir.toString() + "/metadata_dcterms.xml"));
// add mapfile
Path mapFile = Files.createFile(Path.of(tempDir.toString() + "/mapfile.out"));
Files.writeString(mapFile, "item_000 " + item.getHandle());
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-a", ""));
parameters.add(new DSpaceCommandLineParameter("-R", ""));
parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail()));
parameters.add(new DSpaceCommandLineParameter("-c", collection.getID().toString()));
parameters.add(new DSpaceCommandLineParameter("-s", safDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-m", mapFile.toString()));
perfomImportScript(parameters);
checkMetadata();
checkMetadataWithAnotherSchema();
}
@Test
public void replaceItemBySafWithMetadataOnly() throws Exception {
// create item
context.turnOffAuthorisationSystem();
Item item = ItemBuilder.createItem(context, collection)
.withTitle("Another Title")
.build();
context.restoreAuthSystemState();
// create simple SAF
Path safDir = Files.createDirectory(Path.of(tempDir.toString() + "/test"));
Path itemDir = Files.createDirectory(Path.of(safDir.toString() + "/item_000"));
Files.copy(getClass().getResourceAsStream("dublin_core.xml"),
Path.of(itemDir.toString() + "/dublin_core.xml"));
// add mapfile
Path mapFile = Files.createFile(Path.of(tempDir.toString() + "/mapfile.out"));
Files.writeString(mapFile, "item_000 " + item.getHandle());
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-r", ""));
parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail()));
parameters.add(new DSpaceCommandLineParameter("-c", collection.getID().toString()));
parameters.add(new DSpaceCommandLineParameter("-s", safDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-m", mapFile.toString()));
perfomImportScript(parameters);
checkMetadata();
}
@Test
public void replaceItemBySafWithBitstreams() throws Exception {
// create item
context.turnOffAuthorisationSystem();
Item item = ItemBuilder.createItem(context, collection)
.withTitle("Another Title")
.build();
context.restoreAuthSystemState();
// create simple SAF
Path safDir = Files.createDirectory(Path.of(tempDir.toString() + "/test"));
Path itemDir = Files.createDirectory(Path.of(safDir.toString() + "/item_000"));
Files.copy(getClass().getResourceAsStream("dublin_core.xml"),
Path.of(itemDir.toString() + "/dublin_core.xml"));
// add bitstream
Path contentsFile = Files.createFile(Path.of(itemDir.toString() + "/contents"));
Files.writeString(contentsFile,
"file1.txt");
Path bitstreamFile = Files.createFile(Path.of(itemDir.toString() + "/file1.txt"));
Files.writeString(bitstreamFile,
"TEST TEST TEST");
// add mapfile
Path mapFile = Files.createFile(Path.of(tempDir.toString() + "/mapfile.out"));
Files.writeString(mapFile, "item_000 " + item.getHandle());
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-r", ""));
parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail()));
parameters.add(new DSpaceCommandLineParameter("-c", collection.getID().toString()));
parameters.add(new DSpaceCommandLineParameter("-s", safDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-m", mapFile.toString()));
perfomImportScript(parameters);
checkMetadata();
checkBitstream();
}
@Test
public void replaceItemBySafWithAnotherMetadataSchema() throws Exception {
// create item
context.turnOffAuthorisationSystem();
Item item = ItemBuilder.createItem(context, collection)
.withTitle("Another Title")
.build();
context.restoreAuthSystemState();
// create simple SAF
Path safDir = Files.createDirectory(Path.of(tempDir.toString() + "/test"));
Path itemDir = Files.createDirectory(Path.of(safDir.toString() + "/item_000"));
Files.copy(getClass().getResourceAsStream("dublin_core.xml"),
Path.of(itemDir.toString() + "/dublin_core.xml"));
// add metadata with another schema
Files.copy(getClass().getResourceAsStream("metadata_dcterms.xml"),
Path.of(itemDir.toString() + "/metadata_dcterms.xml"));
// add mapfile
Path mapFile = Files.createFile(Path.of(tempDir.toString() + "/mapfile.out"));
Files.writeString(mapFile, "item_000 " + item.getHandle());
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-r", ""));
parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail()));
parameters.add(new DSpaceCommandLineParameter("-c", collection.getID().toString()));
parameters.add(new DSpaceCommandLineParameter("-s", safDir.toString()));
parameters.add(new DSpaceCommandLineParameter("-m", mapFile.toString()));
perfomImportScript(parameters);
checkMetadata();
checkMetadataWithAnotherSchema();
}
@Test
public void deleteItemByMapFile() throws Exception {
// create item
context.turnOffAuthorisationSystem();
Item item = ItemBuilder.createItem(context, collection)
.withTitle(title)
.build();
context.restoreAuthSystemState();
// add mapfile
Path mapFile = Files.createFile(Path.of(tempDir.toString() + "/mapfile.out"));
Files.writeString(mapFile, "item_000 " + item.getHandle());
LinkedList<DSpaceCommandLineParameter> parameters = new LinkedList<>();
parameters.add(new DSpaceCommandLineParameter("-d", ""));
parameters.add(new DSpaceCommandLineParameter("-e", admin.getEmail()));
parameters.add(new DSpaceCommandLineParameter("-m", mapFile.toString()));
perfomImportScript(parameters);
checkItemDeletion();
}
/**
* Check metadata on imported item
* @throws Exception
*/
private void checkMetadata() throws Exception {
Item item = itemService.findByMetadataField(context, "dc", "title", null, title).next();
getClient().perform(get("/api/core/items/" + item.getID()))
.andExpect(status().isOk())
.andExpect(jsonPath("$.metadata", allOf(
matchMetadata("dc.title", title),
matchMetadata("dc.date.issued", "1990"),
matchMetadata("dc.title.alternative", "J'aime les Printemps"))));
}
/**
* Check metadata on imported item
* @throws Exception
*/
private void checkMetadataWithAnotherSchema() throws Exception {
Item item = itemService.findByMetadataField(context, "dc", "title", null, title).next();
getClient().perform(get("/api/core/items/" + item.getID()))
.andExpect(status().isOk())
.andExpect(jsonPath("$.metadata", allOf(
matchMetadata("dcterms.title", title))));
}
/**
* Check bitstreams on imported item
* @throws Exception
*/
private void checkBitstream() throws Exception {
Bitstream bitstream = itemService.findByMetadataField(context, "dc", "title", null, title).next()
.getBundles("ORIGINAL").get(0).getBitstreams().get(0);
getClient().perform(get("/api/core/bitstreams/" + bitstream.getID()))
.andExpect(status().isOk())
.andExpect(jsonPath("$.metadata", allOf(
matchMetadata("dc.title", "file1.txt"))));
}
/**
* Check deletion of item by mapfile
* @throws Exception
*/
private void checkItemDeletion() throws Exception {
Iterator<Item> itemIterator = itemService.findByMetadataField(context, "dc", "title", null, title);
assertEquals(itemIterator.hasNext(), false);
}
private void perfomImportScript(LinkedList<DSpaceCommandLineParameter> parameters)
throws Exception {
AtomicReference<Integer> idRef = new AtomicReference<>();
List<ParameterValueRest> list = parameters.stream()
.map(dSpaceCommandLineParameter -> dSpaceRunnableParameterConverter
.convert(dSpaceCommandLineParameter, Projection.DEFAULT))
.collect(Collectors.toList());
try {
String token = getAuthToken(admin.getEmail(), password);
getClient(token)
.perform(multipart("/api/system/scripts/import/processes")
.param("properties", new ObjectMapper().writeValueAsString(list)))
.andExpect(status().isAccepted())
.andDo(result -> idRef
.set(read(result.getResponse().getContentAsString(), "$.processId")));
} finally {
ProcessBuilder.deleteProcess(idRef.get());
}
}
}

View File

@@ -0,0 +1,5 @@
<dublin_core>
<dcvalue element="title" qualifier="none">A Tale of Two Cities</dcvalue>
<dcvalue element="date" qualifier="issued">1990</dcvalue>
<dcvalue element="title" qualifier="alternative" language="fr">J'aime les Printemps</dcvalue>
</dublin_core>

View File

@@ -0,0 +1,3 @@
<dublin_core schema="dcterms">
<dcvalue element="title" qualifier="none">A Tale of Two Cities</dcvalue>
</dublin_core>