diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java index abe8c4f20..0b8b1d4b7 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/DMPs.java @@ -235,9 +235,9 @@ public class DMPs extends BaseController { } @RequestMapping(method = RequestMethod.POST, value = {"/upload"}) - public ResponseEntity dmpUpload(@RequestParam("file") MultipartFile[] files, Principal principal) throws Exception { + public ResponseEntity dmpUpload(@RequestParam("file") MultipartFile[] files, @RequestParam("profiles")String[] profiles, Principal principal) throws Exception { if (files[0].getContentType().equals(APPLICATION_JSON.toString())) { - this.dataManagementPlanManager.createFromRDA(files, principal); + this.dataManagementPlanManager.createFromRDA(files, principal, profiles); } else if (files[0].getContentType().equals(APPLICATION_ATOM_XML.toString())) { this.dataManagementPlanManager.createDmpFromXml(this.getApiContext(), files, principal); } 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 56bb8e41d..23330fc74 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 @@ -1379,13 +1379,13 @@ public class DataManagementPlanManager { return dataManagementPlans; } - public List createFromRDA(MultipartFile[] files, Principal principal) throws IOException { + public List createFromRDA(MultipartFile[] files, Principal principal, String[] profiles) throws IOException { if (principal.getId() == null) { throw new UnauthorisedException("No user is logged in"); } List result = new ArrayList<>(); for (MultipartFile file: files) { - DMP dmp = rdaManager.convertToEntity(new String(file.getBytes(), "UTF-8")); + DMP dmp = rdaManager.convertToEntity(new String(file.getBytes(), "UTF-8"), profiles); dmp.setLabel(file.getOriginalFilename()); UserInfo me = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); dmp.setModified(new Date()); diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RDAManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RDAManager.java index 4462a36ea..4145a094f 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RDAManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/RDAManager.java @@ -40,13 +40,13 @@ public class RDAManager { return result; } - public DMP convertToEntity(String json) throws IOException { + public DMP convertToEntity(String json, String[] profiles) throws IOException { ObjectMapper mapper = new ObjectMapper(); mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")); Dmp rda = mapper.readValue(json, DMPWrap.class).getDmp(); - return dmpRDAMapper.toEntity(rda); + return dmpRDAMapper.toEntity(rda, profiles); } public static class DMPWrap implements Serializable { diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DatasetRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DatasetRDAMapper.java index 9ceb8f2d1..c85036cf1 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DatasetRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DatasetRDAMapper.java @@ -134,7 +134,7 @@ public class DatasetRDAMapper { } - public eu.eudat.data.entities.Dataset toEntity(Dataset rda) { + public eu.eudat.data.entities.Dataset toEntity(Dataset rda, DatasetProfile defaultProfile) { eu.eudat.data.entities.Dataset entity = new eu.eudat.data.entities.Dataset(); entity.setLabel(rda.getTitle()); entity.setDescription(rda.getDescription()); @@ -143,6 +143,7 @@ public class DatasetRDAMapper { entity.setProfile(profile); }catch(Exception e) { logger.warn(e.getMessage(), e); + entity.setProfile(defaultProfile); } try { Map properties = new HashMap<>(); @@ -176,7 +177,7 @@ public class DatasetRDAMapper { properties.put(qaIds.get(i), rda.getDataQualityAssurance().get(i)); }*/ List qaNodes = JsonSearcher.findNodes(datasetDescriptionObj, "rdaProperty", "dataset.data_quality_assurance"); - if (!qaNodes.isEmpty()) { + if (!qaNodes.isEmpty() && rda.getDataQualityAssurance() != null && !rda.getDataQualityAssurance().isEmpty()) { properties.put(qaNodes.get(0).get("id").asText(), rda.getDataQualityAssurance().get(0)); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java index 72c967f3a..94438e084 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/rda/mapper/DmpRDAMapper.java @@ -54,25 +54,33 @@ public class DmpRDAMapper { return rda; } - public DMP toEntity(Dmp rda) { + public DMP toEntity(Dmp rda, String[] profiles) { DMP entity = new DMP(); entity.setLabel(rda.getTitle()); if (rda.getDmpId().getType() == DmpId.Type.DOI) { entity.setDoi(rda.getDmpId().getIdentifier()); } + if (((List) rda.getAdditionalProperties().get("templates")) != null && !((List) rda.getAdditionalProperties().get("templates")).isEmpty()) { + entity.setAssociatedDmps(((List) rda.getAdditionalProperties().get("templates")).stream().map(this::getProfile).collect(Collectors.toSet())); + } + if (entity.getAssociatedDmps() == null) { + entity.setAssociatedDmps(new HashSet<>()); + } + for (String profile: profiles) { + DatasetProfile exProfile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(UUID.fromString(profile)); + entity.getAssociatedDmps().add(exProfile); + } if (rda.getContributor() != null && !rda.getContributor().isEmpty()) { entity.setResearchers(rda.getContributor().stream().map(ContributorRDAMapper::toEntity).collect(Collectors.toSet())); } entity.setCreated(rda.getCreated()); entity.setModified(rda.getModified()); entity.setDescription(rda.getDescription()); - entity.setDataset(rda.getDataset().stream().map(rda1 -> datasetRDAMapper.toEntity(rda1)).collect(Collectors.toSet())); + DatasetProfile defaultProfile = ((DatasetProfile)entity.getAssociatedDmps().toArray()[0]); + entity.setDataset(rda.getDataset().stream().map(rda1 -> datasetRDAMapper.toEntity(rda1, defaultProfile)).collect(Collectors.toSet())); Map result = ProjectRDAMapper.toEntity(rda.getProject().get(0), apiContext); entity.setProject((Project) result.get("project")); result.entrySet().stream().filter(entry -> entry.getKey().startsWith("grant")).forEach(entry -> entity.setGrant((Grant) entry.getValue())); - if (((List) rda.getAdditionalProperties().get("templates")) != null && !((List) rda.getAdditionalProperties().get("templates")).isEmpty()) { - entity.setAssociatedDmps(((List) rda.getAdditionalProperties().get("templates")).stream().map(this::getProfile).collect(Collectors.toSet())); - } return entity; } diff --git a/dmp-frontend/src/app/core/services/dmp/dmp.service.ts b/dmp-frontend/src/app/core/services/dmp/dmp.service.ts index 7d6e8d33e..9819c90e3 100644 --- a/dmp-frontend/src/app/core/services/dmp/dmp.service.ts +++ b/dmp-frontend/src/app/core/services/dmp/dmp.service.ts @@ -123,7 +123,7 @@ export class DmpService { return this.httpClient.get(this.actionUrl + 'rda/' + id, { responseType: 'blob', observe: 'response' }); } - public uploadXml(fileList: FileList, dmpTitle: string): Observable { + public uploadXml(fileList: FileList, dmpTitle: string, dmpProfiles: any[]): Observable { const formData: FormData = new FormData(); if (fileList instanceof FileList) { for (let i = 0; i < fileList.length; i++) { @@ -132,6 +132,9 @@ export class DmpService { } else { formData.append('file', fileList); } + for (let j = 0; j < dmpProfiles.length; j++) { + formData.append('profiles', dmpProfiles[j].id); + } const params = new BaseHttpParams(); params.interceptorContext = { excludedInterceptors: [InterceptorType.JSONContentType] diff --git a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts index 21f2eed19..90239048f 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/dmp-listing.component.ts @@ -240,7 +240,7 @@ export class DmpListingComponent extends BaseComponent implements OnInit, IBread }); dialogRef.afterClosed().pipe(takeUntil(this._destroyed)).subscribe(result => { if (result && result.success) { - this.dmpService.uploadXml(result.fileList, result.dmpTitle) + this.dmpService.uploadXml(result.fileList, result.dmpTitle, result.dmpProfiles) .pipe(takeUntil(this._destroyed)) .subscribe((complete) => this.onCallbackImportComplete(), (error) => this.onCallbackImportFail(error.error)); diff --git a/dmp-frontend/src/app/ui/dmp/listing/upload-dialogue/dmp-upload-dialogue.component.html b/dmp-frontend/src/app/ui/dmp/listing/upload-dialogue/dmp-upload-dialogue.component.html index f9669094e..b1b7e5c29 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/upload-dialogue/dmp-upload-dialogue.component.html +++ b/dmp-frontend/src/app/ui/dmp/listing/upload-dialogue/dmp-upload-dialogue.component.html @@ -14,6 +14,10 @@ + + + +
diff --git a/dmp-frontend/src/app/ui/dmp/listing/upload-dialogue/dmp-upload-dialogue.component.ts b/dmp-frontend/src/app/ui/dmp/listing/upload-dialogue/dmp-upload-dialogue.component.ts index 09780ab33..adcddfd03 100644 --- a/dmp-frontend/src/app/ui/dmp/listing/upload-dialogue/dmp-upload-dialogue.component.ts +++ b/dmp-frontend/src/app/ui/dmp/listing/upload-dialogue/dmp-upload-dialogue.component.ts @@ -1,6 +1,12 @@ import { Component, Inject } from '@angular/core'; import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; import { DmpService } from '../../../../core/services/dmp/dmp.service'; +import { MultipleAutoCompleteConfiguration } from '@app/library/auto-complete/multiple/multiple-auto-complete-configuration'; +import { map } from 'rxjs/operators'; +import { Observable } from 'rxjs'; +import { DatasetProfileModel } from '@app/core/model/dataset/dataset-profile'; +import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; +import { DatasetProfileCriteria } from '@app/core/query/dataset-profile/dataset-profile-criteria'; @Component({ selector: 'dmp-upload-dialogue', @@ -9,10 +15,20 @@ import { DmpService } from '../../../../core/services/dmp/dmp.service'; }) export class DmpUploadDialogue { dmpTitle: string; + dmpProfiles: any[] = []; + + profilesAutoCompleteConfiguration: MultipleAutoCompleteConfiguration = { + filterFn: this.filterProfiles.bind(this), + initialItems: (excludedItems: any[]) => this.filterProfiles('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))), + displayFn: (item) => item['label'], + titleFn: (item) => item['label'], + subtitleFn: (item) => item['description'] + }; constructor( public dialogRef: MatDialogRef, + private _service: DmpService, @Inject(MAT_DIALOG_DATA) public data: any, ) {} @@ -24,6 +40,7 @@ export class DmpUploadDialogue { confirm() { this.data.success = true; this.data.dmpTitle = this.dmpTitle; + this.data.dmpProfiles = this.dmpProfiles; this.dialogRef.close(this.data); } @@ -34,4 +51,13 @@ export class DmpUploadDialogue { this.dmpTitle = fileList.item(0).name; } } + + filterProfiles(value: string): Observable { + + const request = new DataTableRequest(null, null, {fields: ['+label']}); + const criteria = new DatasetProfileCriteria(); + criteria.like = value; + request.criteria = criteria; + return this._service.searchDMPProfiles(request); + } }