diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FileUploadDao.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FileUploadDao.java index 868a58e71..c334b63d4 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FileUploadDao.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FileUploadDao.java @@ -3,7 +3,9 @@ package eu.eudat.data.dao.entities; import eu.eudat.data.dao.DatabaseAccessLayer; import eu.eudat.data.entities.FileUpload; +import java.util.List; import java.util.UUID; public interface FileUploadDao extends DatabaseAccessLayer { + List getFileUploads(UUID entityId); } diff --git a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FileUploadDaoImpl.java b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FileUploadDaoImpl.java index d50780bc5..47cc10066 100644 --- a/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FileUploadDaoImpl.java +++ b/dmp-backend/data/src/main/java/eu/eudat/data/dao/entities/FileUploadDaoImpl.java @@ -7,6 +7,7 @@ import eu.eudat.queryable.QueryableList; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import java.util.List; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -33,6 +34,11 @@ public class FileUploadDaoImpl extends DatabaseAccess implements Fil return getDatabaseService().getQueryable(FileUpload.class).where((builder, root) -> builder.equal(root.get("id"), id)).getSingle(); } + @Override + public List getFileUploads(UUID entityId) { + return this.getDatabaseService().getQueryable(FileUpload.class).where((builder, root) -> builder.equal(root.get("entityId"), entityId)).toList(); + } + @Override public FileUpload find(UUID id, String hint) { return null; diff --git a/dmp-backend/dataverseRepository/src/main/java/eu/eudat/depositinterface/dataverserepository/interfaces/DataverseDeposit.java b/dmp-backend/dataverseRepository/src/main/java/eu/eudat/depositinterface/dataverserepository/interfaces/DataverseDeposit.java index 1dc6264bf..ebaf15298 100644 --- a/dmp-backend/dataverseRepository/src/main/java/eu/eudat/depositinterface/dataverserepository/interfaces/DataverseDeposit.java +++ b/dmp-backend/dataverseRepository/src/main/java/eu/eudat/depositinterface/dataverserepository/interfaces/DataverseDeposit.java @@ -149,6 +149,8 @@ public class DataverseDeposit implements RepositoryDeposit { } this.uploadFile(jsonFileName, rdaJson, doi); Files.deleteIfExists(rdaJson.toPath()); + + this.uploadFile(dmpDepositModel.getSupportingFilesZip().getName(), dmpDepositModel.getSupportingFilesZip(), doi); } private Map getDatasetIdentifier(String previousDOI) { diff --git a/dmp-backend/depositinterface/src/main/java/eu/eudat/depositinterface/models/DMPDepositModel.java b/dmp-backend/depositinterface/src/main/java/eu/eudat/depositinterface/models/DMPDepositModel.java index 15fdd8e24..620f7b91a 100644 --- a/dmp-backend/depositinterface/src/main/java/eu/eudat/depositinterface/models/DMPDepositModel.java +++ b/dmp-backend/depositinterface/src/main/java/eu/eudat/depositinterface/models/DMPDepositModel.java @@ -19,6 +19,7 @@ public class DMPDepositModel { private File pdfFile; private String pdfFileName; private ResponseEntity rdaJson; + private File supportingFilesZip; private String previousDOI; private String extraProperties; @@ -106,6 +107,13 @@ public class DMPDepositModel { this.rdaJson = rdaJson; } + public File getSupportingFilesZip() { + return supportingFilesZip; + } + public void setSupportingFilesZip(File supportingFilesZip) { + this.supportingFilesZip = supportingFilesZip; + } + public String getPreviousDOI() { return previousDOI; } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 1d13b72a9..6abdff7b5 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -95,6 +95,8 @@ import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import java.util.stream.Stream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; @Component public class DataManagementPlanManager { @@ -2090,7 +2092,9 @@ public class DataManagementPlanManager { } String previousDOI = this.getPreviousDOI(dmp.getGroupId(), dmp.getId(), "Zenodo"); - DMPDepositModel dmpDepositModel = DMPToDepositMapper.fromDMP(dmp, pdfFile, fileName, jsonFile, previousDOI); + File supportingFilesZip = this.createSupportingFilesZip(dmp); + + DMPDepositModel dmpDepositModel = DMPToDepositMapper.fromDMP(dmp, pdfFile, fileName, jsonFile, supportingFilesZip, previousDOI); String zenodoToken = ""; try { @@ -2122,6 +2126,7 @@ public class DataManagementPlanManager { } } } + Files.deleteIfExists(supportingFilesZip.toPath()); Files.deleteIfExists(file.getFile().toPath()); return finalDoi; @@ -2148,16 +2153,9 @@ public class DataManagementPlanManager { } String previousDOI = this.getPreviousDOI(dmp.getGroupId(), dmp.getId(), depositRequest.getRepositoryId()); - DMPDepositModel dmpDepositModel = DMPToDepositMapper.fromDMP(dmp, pdfFile, fileName, jsonFile, previousDOI); + File supportingFilesZip = this.createSupportingFilesZip(dmp); -// String zenodoToken = ""; -// try { -// if (this.userManager.isDOITokenValid(principal)) { -// zenodoToken = principal.getZenodoToken(); -// } -// } catch (NonValidTokenException e) { -// zenodoToken = this.environment.getProperty("zenodo.access_token"); -// } + DMPDepositModel dmpDepositModel = DMPToDepositMapper.fromDMP(dmp, pdfFile, fileName, jsonFile, supportingFilesZip, previousDOI); Optional repo = this.repositoriesDeposit.stream().filter(x -> x.getConfiguration().getRepositoryId().equals(depositRequest.getRepositoryId())).findFirst(); String finalDoi = repo.map(r -> { @@ -2188,11 +2186,37 @@ public class DataManagementPlanManager { doiModel = new Doi().fromDataModel(doiEntity); } + Files.deleteIfExists(supportingFilesZip.toPath()); Files.deleteIfExists(file.getFile().toPath()); return doiModel; } + private File createSupportingFilesZip(DMP dmp) throws IOException { + FileOutputStream fout = new FileOutputStream(this.environment.getProperty("temp.temp") + "supportingFiles.zip"); + ZipOutputStream zout = new ZipOutputStream(fout); + + //List supportingFiles = new ArrayList<>(); + Set datasets = dmp.getDataset(); + for (Dataset dataset : datasets) { + List files = this.apiContext.getOperationsContext().getDatabaseRepository().getFileUploadDao().getFileUploads(dataset.getId()); + for (FileUpload f : files) { + if(!f.getIsDeleted()){ + File exportFile = new File(this.environment.getProperty("file.storage") + f.getId()); + String filename = f.getName().replace(" ", "_").replace(",", "_"); + byte[] content = Files.readAllBytes(exportFile.toPath()); + ZipEntry ze = new ZipEntry(filename); + zout.putNextEntry(ze); + zout.write(content, 0, content.length); + zout.closeEntry(); + + } + } + } + zout.close(); + return new File(this.environment.getProperty("temp.temp") + "supportingFiles.zip"); + } + /* * Misc * */ diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/security/repositorydeposit/mapper/DMPToDepositMapper.java b/dmp-backend/web/src/main/java/eu/eudat/logic/security/repositorydeposit/mapper/DMPToDepositMapper.java index 2cbe5e20b..2997f534c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/security/repositorydeposit/mapper/DMPToDepositMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/security/repositorydeposit/mapper/DMPToDepositMapper.java @@ -9,7 +9,7 @@ import java.util.stream.Collectors; public class DMPToDepositMapper { - public static DMPDepositModel fromDMP(DMP entity, File pdfFile, String fileName, ResponseEntity jsonFile, String previousDOI) { + public static DMPDepositModel fromDMP(DMP entity, File pdfFile, String fileName, ResponseEntity jsonFile, File supportingFilesZip, String previousDOI) { DMPDepositModel deposit = new DMPDepositModel(); deposit.setId(entity.getId()); deposit.setVersion(entity.getVersion()); @@ -24,6 +24,7 @@ public class DMPToDepositMapper { deposit.setPdfFile(pdfFile); deposit.setPdfFileName(fileName); deposit.setRdaJson(jsonFile); + deposit.setSupportingFilesZip(supportingFilesZip); deposit.setPreviousDOI(previousDOI); deposit.setExtraProperties(entity.getExtraProperties()); diff --git a/dmp-backend/zenodoRepository/src/main/java/eu/eudat/depositinterface/zenodorepository/interfaces/ZenodoDeposit.java b/dmp-backend/zenodoRepository/src/main/java/eu/eudat/depositinterface/zenodorepository/interfaces/ZenodoDeposit.java index a538f46d4..0255d2e21 100644 --- a/dmp-backend/zenodoRepository/src/main/java/eu/eudat/depositinterface/zenodorepository/interfaces/ZenodoDeposit.java +++ b/dmp-backend/zenodoRepository/src/main/java/eu/eudat/depositinterface/zenodorepository/interfaces/ZenodoDeposit.java @@ -141,6 +141,15 @@ public class ZenodoDeposit implements RepositoryDeposit { restTemplate.put(addFileUrl, addFileMapRequest); Files.deleteIfExists(tempJsonFile.toPath()); + if(dmpDepositModel.getSupportingFilesZip() != null) { + File supportinFilesZip = dmpDepositModel.getSupportingFilesZip(); + String supportinFilesZipName = dmpDepositModel.getSupportingFilesZip().getName(); + fileSystemResource = new FileSystemResource(supportinFilesZip); + addFileMapRequest = new HttpEntity<>(fileSystemResource, null); + + addFileUrl = links.get("bucket") + "/" + supportinFilesZipName + "?access_token=" + zenodoToken; + restTemplate.put(addFileUrl, addFileMapRequest); + } // Third post call to Zenodo to publish the entry and return the DOI. publishUrl = links.get("publish") + "?access_token=" + zenodoToken;