mirror of
https://github.com/DSpace/DSpace.git
synced 2025-10-07 01:54:22 +00:00
[CST-5699] add integration tests for import and export via SAF
This commit is contained in:
@@ -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>
|
||||
|
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
@@ -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>
|
@@ -0,0 +1,3 @@
|
||||
<dublin_core schema="dcterms">
|
||||
<dcvalue element="title" qualifier="none">A Tale of Two Cities</dcvalue>
|
||||
</dublin_core>
|
Reference in New Issue
Block a user