diff --git a/dmp-backend/dataverseRepository/pom.xml b/dmp-backend/dataverseRepository/pom.xml new file mode 100644 index 000000000..1772a86c1 --- /dev/null +++ b/dmp-backend/dataverseRepository/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.4 + + + eu.eudat.depositinterface + dataverseRepository + 0.0.1-SNAPSHOT + dataverseRepository + + + 11 + + + + + jitpack.io + https://jitpack.io + + + + + + org.springframework.boot + spring-boot-starter-web + + + + eu.eudat + depositinterface + 1.0-SNAPSHOT + + + + com.github.IQSS + dataverse-client-java + master-dv14-12-compatible-ge2dc343-7 + + + + 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 new file mode 100644 index 000000000..52f0f1802 --- /dev/null +++ b/dmp-backend/dataverseRepository/src/main/java/eu/eudat/depositinterface/dataverserepository/interfaces/DataverseDeposit.java @@ -0,0 +1,159 @@ +package eu.eudat.depositinterface.dataverserepository.interfaces; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.researchspace.dataverse.api.v1.DataverseAPI; +import com.researchspace.dataverse.api.v1.DataverseConfig; +import com.researchspace.dataverse.entities.DataverseContacts; +import com.researchspace.dataverse.entities.DataversePost; +import com.researchspace.dataverse.entities.DataverseResponse; +import com.researchspace.dataverse.entities.Identifier; +import com.researchspace.dataverse.entities.facade.DatasetAuthor; +import com.researchspace.dataverse.entities.facade.DatasetContact; +import com.researchspace.dataverse.entities.facade.DatasetDescription; +import com.researchspace.dataverse.entities.facade.DatasetFacade; +import com.researchspace.dataverse.http.DataverseAPIImpl; +import eu.eudat.depositinterface.models.DMPDepositModel; +import eu.eudat.depositinterface.repository.RepositoryDeposit; +import eu.eudat.depositinterface.repository.RepositoryDepositConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.http.*; +import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.Objects; +import java.util.stream.Collectors; + +import static eu.eudat.depositinterface.repository.RepositoryDepositConfiguration.DepositAccountStatus.SystemDeposit; + +@Component +public class DataverseDeposit implements RepositoryDeposit { + private static final Logger logger = LoggerFactory.getLogger(DataverseDeposit.class); + private static final ObjectMapper objectMapper = new ObjectMapper(); + + private static final String API_TOKEN = ""; + private static final String SYSTEM_PARENT_DATAVERSE_ALIAS = ""; + private static final String SERVER = ""; + private static final String SYSTEM_EMAIL = ""; + + private DataverseAPI api; + private boolean isApiSet; + + private Environment environment; + + @Autowired + public DataverseDeposit(Environment environment){ + this.environment = environment; + this.isApiSet = false; + } + + private void setDataverseApi() throws MalformedURLException { + if(!this.isApiSet) { + this.api = new DataverseAPIImpl(); + DataverseConfig config = new DataverseConfig(new URL(SERVER), API_TOKEN, SYSTEM_PARENT_DATAVERSE_ALIAS); + api.configure(config); + this.isApiSet = true; + } + } + + @Override + public String deposit(DMPDepositModel dmpDepositModel, boolean update, String repositoryAccessToken) throws Exception { + + if(!this.isApiSet) + this.setDataverseApi(); + + DataversePost entity = new DataversePost(); + entity.setName(dmpDepositModel.getLabel()); + entity.setAlias(dmpDepositModel.getLabel().replace(" ", "_")); + entity.setDescription(dmpDepositModel.getDescription()); + entity.setCreationDate(new Date()); + entity.setDataverseContacts(Collections.singletonList(new DataverseContacts(SYSTEM_EMAIL))); + DataverseResponse response = this.api.getDataverseOperations().createNewDataverse(SYSTEM_PARENT_DATAVERSE_ALIAS, entity); + + DatasetFacade dataset = DatasetFacade.builder() + .title(dmpDepositModel.getLabel()) + .authors(dmpDepositModel.getUsers().stream().map(x -> DatasetAuthor.builder().authorName(x.getUser().getName()).build()).collect(Collectors.toList())) + .contacts(dmpDepositModel.getUsers().stream().map(x -> DatasetContact.builder().datasetContactEmail(x.getUser().getEmail()).build()).collect(Collectors.toList())) + .subject("Other") + .description(DatasetDescription.builder().description(dmpDepositModel.getDescription()).build()) + .languages(new ArrayList<>()) + .depositor("") + .build(); + Identifier id = this.api.getDataverseOperations().createDataset(dataset, entity.getAlias()); + + String doi = this.api.getDatasetOperations().getDataset(id).getDoiId().orElse(null); + + this.uploadFile(dmpDepositModel.getPdfFileName(), dmpDepositModel.getPdfFile(), doi); + + String contentDisposition = dmpDepositModel.getRdaJson().getHeaders().get("Content-Disposition").get(0); + String jsonFileName = contentDisposition.substring(contentDisposition.lastIndexOf('=') + 1); + File rdaJson = new File(this.environment.getProperty("storage.temp") + jsonFileName); + OutputStream output = new FileOutputStream(rdaJson); + try { + output.write(Objects.requireNonNull(dmpDepositModel.getRdaJson().getBody())); + output.flush(); + output.close(); + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + this.uploadFile(jsonFileName, rdaJson, doi); + Files.deleteIfExists(rdaJson.toPath()); + + return doi; + + } + + private void uploadFile(String filename, File file, String doi) throws IOException { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + headers.set("X-Dataverse-key", API_TOKEN); + MultiValueMap fileMap = new LinkedMultiValueMap<>(); + ContentDisposition contentDisposition = ContentDisposition + .builder("form-data") + .name("file") + .filename(filename) + .build(); + fileMap.add(HttpHeaders.CONTENT_DISPOSITION, contentDisposition.toString()); + HttpEntity fileEntity = new HttpEntity<>(Files.readAllBytes(file.toPath()), fileMap); + MultiValueMap body = new LinkedMultiValueMap<>(); + body.add("file", fileEntity); + body.add("jsonData", "{\"restrict\":\"true\", \"tabIngest\":\"false\"}"); + HttpEntity> requestEntity + = new HttpEntity<>(body, headers); + + String serverUrl = SERVER + "/api/datasets/:persistentId/add?persistentId=doi:" + doi; + + RestTemplate restTemplate = new RestTemplate(); + ResponseEntity resp = restTemplate.postForEntity(serverUrl, requestEntity, Object.class); + } + + @Override + public RepositoryDepositConfiguration getConfiguration() { + RepositoryDepositConfiguration conf = new RepositoryDepositConfiguration(); + conf.setRepositoryId("Dataverse"); + conf.setDepositAccountStatus(SystemDeposit.getValue()); + conf.setAccessToken(API_TOKEN); + conf.setRepositoryUrl(SERVER + "/api/"); + conf.setRepositoryRecordUrl(SERVER + "/dataverse/"); + return conf; + } + + @Override + public String authenticate(String code) { + return null; + } +} diff --git a/dmp-backend/dataverseRepository/src/main/resources/application.properties b/dmp-backend/dataverseRepository/src/main/resources/application.properties new file mode 100644 index 000000000..0ef26534a --- /dev/null +++ b/dmp-backend/dataverseRepository/src/main/resources/application.properties @@ -0,0 +1 @@ +storage.temp= diff --git a/dmp-backend/depositinterface/src/main/java/eu/eudat/depositinterface/models/UserInfoDepositModel.java b/dmp-backend/depositinterface/src/main/java/eu/eudat/depositinterface/models/UserInfoDepositModel.java index 2b8cec04e..aeb6d5f19 100644 --- a/dmp-backend/depositinterface/src/main/java/eu/eudat/depositinterface/models/UserInfoDepositModel.java +++ b/dmp-backend/depositinterface/src/main/java/eu/eudat/depositinterface/models/UserInfoDepositModel.java @@ -2,6 +2,7 @@ package eu.eudat.depositinterface.models; public class UserInfoDepositModel { private String name; + private String email; public String getName() { return name; @@ -9,4 +10,11 @@ public class UserInfoDepositModel { public void setName(String name) { this.name = name; } + + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } } 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 a2a8ccc5c..825592d16 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 @@ -2115,14 +2115,9 @@ public class DataManagementPlanManager { throw new Exception("DMP already has a DOI");*/ FileEnvelope file = getWordDocument(depositRequest.getDmpId(), principal, configLoader); - String name = file.getFilename().substring(0, file.getFilename().length() - 5); - //File pdfFile = PDFUtils.convertToPDF(file, environment); - String uuid = UUID.randomUUID().toString(); - File pdfFile = new File(environment.getProperty("temp.temp") + uuid + ".pdf"); - FileOutputStream output = new FileOutputStream(pdfFile); - IOUtils.write("testing".getBytes(StandardCharsets.UTF_8), output); + String name = file.getFilename().substring(0, file.getFilename().length() - 5).replace(" ", "_").replace(",", "_"); + File pdfFile = PDFUtils.convertToPDF(file, environment); String fileName = name + ".pdf"; - output.close(); ResponseEntity jsonFile; try { jsonFile = getRDAJsonDocument(depositRequest.getDmpId(), principal); 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 052c13607..2cbe5e20b 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 @@ -40,6 +40,7 @@ public class DMPToDepositMapper { private static UserInfoDepositModel fromUserInfo(UserInfo entity){ UserInfoDepositModel deposit = new UserInfoDepositModel(); deposit.setName(entity.getName()); + deposit.setEmail(entity.getEmail()); return deposit; } diff --git a/dmp-backend/zenodoRepository/src/main/java/eu/eudat/depositinterface/dummyrepository/TestDummy.java b/dmp-backend/zenodoRepository/src/main/java/eu/eudat/depositinterface/dummyrepository/TestDummy.java deleted file mode 100644 index cc9087d61..000000000 --- a/dmp-backend/zenodoRepository/src/main/java/eu/eudat/depositinterface/dummyrepository/TestDummy.java +++ /dev/null @@ -1,29 +0,0 @@ -package eu.eudat.depositinterface.dummyrepository; - -import eu.eudat.depositinterface.models.DMPDepositModel; -import eu.eudat.depositinterface.repository.RepositoryDeposit; -import eu.eudat.depositinterface.repository.RepositoryDepositConfiguration; -import org.springframework.stereotype.Component; - -import static eu.eudat.depositinterface.repository.RepositoryDepositConfiguration.DepositAccountStatus.BothWaysDeposit; - -@Component -public class TestDummy implements RepositoryDeposit { - @Override - public String deposit(DMPDepositModel dmpDepositModel, boolean update, String repositoryAccessToken) throws Exception { - return "test2"; - } - - @Override - public RepositoryDepositConfiguration getConfiguration() { - RepositoryDepositConfiguration conf = new RepositoryDepositConfiguration(); - conf.setRepositoryId("Dummy"); - conf.setDepositAccountStatus(BothWaysDeposit.getValue()); - return conf; - } - - @Override - public String authenticate(String code) { - return "accessToken"; - } -} \ No newline at end of file diff --git a/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dialog/dmp-deposit-dialog.component.ts b/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dialog/dmp-deposit-dialog.component.ts index 88364d012..005eba99d 100644 --- a/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dialog/dmp-deposit-dialog.component.ts +++ b/dmp-frontend/src/app/ui/dmp/editor/dmp-deposit-dialog/dmp-deposit-dialog.component.ts @@ -93,6 +93,18 @@ export class DmpDepositDialogComponent extends BaseComponent implements OnInit { }); } + else if(repo.depositAccountStatus == DepositConfigurationStatus.System){ + this.depositRepositoriesService.createDoi(repo.repositoryId, this.dmp.id, null) + .pipe(takeUntil(this._destroyed)) + .subscribe(doi =>{ + this.onDOICallbackSuccess(); + this.outputRepos.push(doi); + this.inputRepos = this.inputRepos.filter(function(x) { return x.repositoryId !== repo.repositoryId; }); + if(this.inputRepos.length == 0){ + this.close(); + } + }, error => this.onDOICallbackError(error)); + } } onDOICallbackSuccess(): void {