package eu.eudat.logic.managers; import eu.eudat.configurations.dynamicproject.DynamicProjectConfiguration; import eu.eudat.configurations.dynamicproject.entities.Property; import eu.eudat.data.dao.criteria.*; import eu.eudat.data.dao.entities.*; import eu.eudat.data.entities.*; import eu.eudat.data.entities.Organisation; import eu.eudat.data.entities.Researcher; import eu.eudat.data.query.items.item.dmp.DataManagementPlanCriteriaRequest; import eu.eudat.data.query.items.table.dmp.DataManagementPlanTableRequest; import eu.eudat.exceptions.datamanagementplan.DMPWithDatasetsDeleteException; import eu.eudat.exceptions.security.UnauthorisedException; import eu.eudat.logic.builders.entity.UserInfoBuilder; import eu.eudat.logic.services.ApiContext; import eu.eudat.logic.services.forms.VisibilityRuleService; import eu.eudat.logic.services.operations.DatabaseRepository; import eu.eudat.logic.services.utilities.UtilitiesService; import eu.eudat.logic.utilities.builders.XmlBuilder; import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; import eu.eudat.logic.utilities.documents.types.ParagraphStyle; import eu.eudat.logic.utilities.documents.word.WordBuilder; import eu.eudat.logic.utilities.documents.xml.ExportXmlBuilder; import eu.eudat.models.HintedModelFactory; import eu.eudat.models.data.datasetwizard.DatasetWizardModel; import eu.eudat.models.data.dmp.*; import eu.eudat.models.data.dynamicfields.DynamicFieldWithValue; import eu.eudat.models.data.helpermodels.Tuple; import eu.eudat.models.data.helpers.common.DataTableData; import eu.eudat.models.data.listingmodels.DataManagementPlanListingModel; import eu.eudat.models.data.listingmodels.DatasetListingModel; import eu.eudat.models.data.security.Principal; import eu.eudat.models.data.user.composite.PagedDatasetProfile; import eu.eudat.queryable.QueryableList; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.json.JSONObject; 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.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import javax.activation.MimetypesFileTypeMap; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import java.io.*; import java.math.BigInteger; import java.net.URL; import java.nio.file.Files; import java.nio.file.Paths; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @Component public class DataManagementPlanManager { private ApiContext apiContext; private DatasetManager datasetManager; private UtilitiesService utilitiesService; private DatabaseRepository databaseRepository; private Environment environment; @Autowired public DataManagementPlanManager(ApiContext apiContext, DatasetManager datasetManager, Environment environment) { this.apiContext = apiContext; this.datasetManager = datasetManager; this.utilitiesService = apiContext.getUtilitiesService(); this.databaseRepository = apiContext.getOperationsContext().getDatabaseRepository(); this.environment = environment; } public DataTableData getPaged(DataManagementPlanTableRequest dataManagementPlanTableRequest, Principal principal, String fieldsGroup) throws Exception { UserInfo userInfo = new UserInfo(); userInfo.setId(principal.getId()); QueryableList items = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getWithCriteria(dataManagementPlanTableRequest.getCriteria()).withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)); QueryableList authItems = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().getAuthenticated(items, userInfo); QueryableList pagedItems = PaginationManager.applyPaging(authItems, dataManagementPlanTableRequest); DataTableData dataTable = new DataTableData<>(); CompletableFuture itemsFuture; if(fieldsGroup.equals("listing")){ itemsFuture = pagedItems.withHint(HintedModelFactory.getHint(DataManagementPlanListingModel.class)) .selectAsync(item -> { item.setDataset( item.getDataset().stream() .filter(dataset -> dataset.getDmp().getCreator().getId().equals(userInfo.getId()) || dataset.isPublic() || dataset.getDmp().getUsers().stream() .filter(x -> x.getId().equals(userInfo.getId())).collect(Collectors.toList()).size() > 0).collect(Collectors.toSet())); return new DataManagementPlanListingModel().fromDataModelDatasets(item); }) .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); } else{ itemsFuture = pagedItems .selectAsync(item -> new DataManagementPlanListingModel().fromDataModel(item) ) .whenComplete((resultList, throwable) -> dataTable.setData(resultList)); } CompletableFuture countFuture = authItems.countAsync().whenComplete((count, throwable) -> { dataTable.setTotalCount(count); }); CompletableFuture.allOf(itemsFuture, countFuture).join(); return dataTable; } public void unlock(UUID uuid) throws Exception { apiContext.getOperationsContext().getDatabaseRepository().getDmpDao() .asQueryable().where((builder, root) -> builder.equal(root.get("id"), uuid)) .update(root -> root.get("status"), DMP.DMPStatus.ACTIVE.getValue()); return; } public File getWordDocument(String id) throws InstantiationException, IllegalAccessException, IOException { WordBuilder wordBuilder = new WordBuilder(); VisibilityRuleService visibilityRuleService = this.utilitiesService.getVisibilityRuleService(); DatasetWizardModel dataset = new DatasetWizardModel(); String fileUrl = environment.getProperty("configuration.h2020template"); InputStream is = new URL(Paths.get(fileUrl).toUri().toURL().toString()).openStream(); XWPFDocument document = new XWPFDocument(is); eu.eudat.data.entities.DMP dmpEntity = databaseRepository.getDmpDao().find(UUID.fromString(id)); wordBuilder.addParagraphContent(dmpEntity.getLabel(), document, ParagraphStyle.TITLE, BigInteger.ZERO); wordBuilder.addParagraphContent(dmpEntity.getDescription(), document, ParagraphStyle.TEXT, BigInteger.ZERO); wordBuilder.addParagraphContent("Organisations", document, ParagraphStyle.HEADER2, BigInteger.ZERO); if (dmpEntity.getOrganisations().size() > 0) { wordBuilder.addParagraphContent(dmpEntity.getOrganisations().stream().map(x -> x.getLabel()).collect(Collectors.joining(", ")) , document, ParagraphStyle.TEXT, BigInteger.ZERO); } wordBuilder.addParagraphContent("Researchers", document, ParagraphStyle.HEADER2, BigInteger.ZERO); if (dmpEntity.getResearchers().size() > 0) { wordBuilder.addParagraphContent(dmpEntity.getResearchers().stream().map(x -> x.getLabel()).collect(Collectors.joining(", ")) , document, ParagraphStyle.TEXT, BigInteger.ZERO); } /*wordBuilder.addParagraphContent("DMP Profile", document, ParagraphStyle.HEADER2, BigInteger.ZERO); if (dmpEntity.getProfile() != null){ wordBuilder.addParagraphContent(dmpEntity.getProfile().getLabel(), document, ParagraphStyle.TEXT, BigInteger.ZERO); }*/ wordBuilder.addParagraphContent("Datasets", document, ParagraphStyle.TITLE, BigInteger.ZERO); dmpEntity.getDataset().stream().forEach(datasetEntity -> { Map properties = new HashMap<>(); if (datasetEntity.getProperties() != null) { JSONObject jobject = new JSONObject(datasetEntity.getProperties()); properties = jobject.toMap(); } wordBuilder.addParagraphContent("Title: " + datasetEntity.getLabel(), document, ParagraphStyle.HEADER1, BigInteger.ZERO); wordBuilder.addParagraphContent(datasetEntity.getDescription(), document, ParagraphStyle.TEXT, BigInteger.ZERO); wordBuilder.addParagraphContent("Dataset Description", document, ParagraphStyle.HEADER1, BigInteger.ZERO); PagedDatasetProfile pagedDatasetProfile = datasetManager.getPagedProfile(dataset, datasetEntity); visibilityRuleService.setProperties(properties); visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); try { wordBuilder.build(document, pagedDatasetProfile, visibilityRuleService); } catch (IOException e) { e.printStackTrace(); } }); String fileName = dmpEntity.getLabel(); fileName = fileName.replaceAll("[^a-zA-Z0-9+ ]", ""); File exportFile = new File( fileName + ".docx"); FileOutputStream out = new FileOutputStream(exportFile); document.write(out); out.close(); return exportFile; } public eu.eudat.models.data.dmp.DataManagementPlan getSingle(String id, Principal principal, DynamicProjectConfiguration dynamicProjectConfiguration) throws InstantiationException, IllegalAccessException { DMP dataManagementPlanEntity = databaseRepository.getDmpDao().find(UUID.fromString(id)); if (dataManagementPlanEntity.getCreator().getId() != principal.getId() && dataManagementPlanEntity.getUsers().stream().filter(userInfo -> userInfo.getId() == principal.getId()).collect(Collectors.toList()).size() == 0) throw new UnauthorisedException(); eu.eudat.models.data.dmp.DataManagementPlan datamanagementPlan = new eu.eudat.models.data.dmp.DataManagementPlan(); datamanagementPlan.fromDataModel(dataManagementPlanEntity); Map dmpProperties = dataManagementPlanEntity.getDmpProperties() != null ? new org.json.JSONObject(dataManagementPlanEntity.getDmpProperties()).toMap() : null; datamanagementPlan.setDynamicFields(dynamicProjectConfiguration.getFields().stream().map(item -> { DynamicFieldWithValue fieldWithValue = new DynamicFieldWithValue(); fieldWithValue.setId(item.getId()); fieldWithValue.setDependencies(item.getDependencies()); fieldWithValue.setName(item.getName()); fieldWithValue.setQueryProperty(item.getQueryProperty()); fieldWithValue.setRequired(item.getRequired()); return fieldWithValue; }).collect(Collectors.toList())); if (dmpProperties != null && datamanagementPlan.getDynamicFields() != null) datamanagementPlan.getDynamicFields().forEach(item -> { Map properties = (Map) dmpProperties.get(item.getId()); if (properties != null) item.setValue(new Tuple<>(properties.get("id"), properties.get("label"))); }); return datamanagementPlan; } public List getWithCriteria(DMPDao dmpsRepository, DataManagementPlanCriteriaRequest dataManagementPlanCriteria, Principal principal) throws IllegalAccessException, InstantiationException { UserInfo userInfo = new UserInfo(); userInfo.setId(principal.getId()); QueryableList items = dmpsRepository.getWithCriteria(dataManagementPlanCriteria.getCriteria()).withHint(HintedModelFactory.getHint(DataManagementPlan.class)); QueryableList authenticatedItems = dmpsRepository.getAuthenticated(items, userInfo); List datamanagementPlans = authenticatedItems.select(item -> new DataManagementPlan().fromDataModel(item)); return datamanagementPlans; } public List> getDynamicFields(String id, DynamicProjectConfiguration dynamicProjectConfiguration, DynamicFieldsCriteria criteria) throws IllegalAccessException, InstantiationException { List> result = new LinkedList<>(); RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity entity = new HttpEntity<>("parameters", headers); Property property = dynamicProjectConfiguration.getConfiguration().getConfigurationProperties().stream() .filter(item -> item.getId().equals(id)).findFirst().orElse(null); StringBuilder stringBuilder = new StringBuilder(); if (criteria.getLike() != null) stringBuilder.append("?search=" + criteria.getLike()); if (property.getDependencies() != null && !property.getDependencies().isEmpty() && criteria.getDynamicFields() != null && !criteria.getDynamicFields().isEmpty()) { property.getDependencies().stream().forEach(item -> { DynamicFieldsCriteria.DynamicFieldDependencyCriteria dependencyCriteria = criteria.getDynamicFields().stream().filter(dfield -> dfield.getProperty().equals(item.getId())) .findFirst().orElse(null); if (dependencyCriteria != null) { if (criteria.getLike() != null || property.getDependencies().indexOf(item) > 0) stringBuilder.append("&"); stringBuilder.append(item.getQueryProperty() + "=" + dependencyCriteria.getValue()); } }); ResponseEntity response = restTemplate.exchange(property.getSourceUrl() + stringBuilder.toString(), HttpMethod.GET, entity, ArrayList.class); response.getBody().forEach(item -> { Tuple tuple = new Tuple<>(); tuple.setId((String) (((Map) item).get(property.getExternalFieldId()))); tuple.setLabel((String) (((Map) item).get(property.getExternalFieldLabel()))); result.add(tuple); }); } else { ResponseEntity response = restTemplate.exchange(property.getSourceUrl() + stringBuilder.toString(), HttpMethod.GET, entity, ArrayList.class); response.getBody().forEach(item -> { Tuple tuple = new Tuple<>(); tuple.setId((String) (((Map) item).get(property.getExternalFieldId()))); tuple.setLabel((String) (((Map) item).get(property.getExternalFieldLabel()))); result.add(tuple); }); } return result; } public void createOrUpdate(ApiContext apiContext, DataManagementPlan dataManagementPlan, Principal principal) throws Exception { DMP newDmp = dataManagementPlan.toDataModel(); createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao()); UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao(), user); newDmp.setCreator(user); newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); if (dataManagementPlan.getStatus() == DMP.DMPStatus.FINALISED.getValue()) { apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao() .asQueryable().where((builder, root) -> root.get("id").in(dataManagementPlan.getDatasets() .stream().map(x -> UUID.fromString(x.getId())).collect(Collectors.toList()))) .update(root -> root.get("status"), Dataset.Status.FINALISED.getValue()); } if (dataManagementPlan.getAssociatedUsers().stream().filter(item -> item.getId() == principal.getId()).collect(Collectors.toList()).size() == 0) assignUser(newDmp, user, apiContext); } public void assignUser(DMP dmp, UserInfo userInfo, ApiContext apiContext) { UserDMP userDMP = new UserDMP(); userDMP.setDmp(dmp); userDMP.setUser(userInfo); userDMP.setRole(UserDMP.UserDMPRoles.OWNER.getValue()); apiContext.getOperationsContext().getDatabaseRepository().getUserDmpDao().createOrUpdate(userDMP); } public void newVersion(UUID uuid, DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { DMP oldDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(uuid); DMP newDmp = dataManagementPlan.toDataModel(); createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao()); UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao(), user); newDmp.setCreator(user); newDmp.setGroupId(oldDmp.getGroupId()); newDmp.setVersion(oldDmp.getVersion() + 1); newDmp.setId(null); newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); copyDatasets(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()); } public void clone(UUID uuid, DataManagementPlanNewVersionModel dataManagementPlan, Principal principal) throws Exception { DMP newDmp = dataManagementPlan.toDataModel(); createOrganisationsIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getOrganisationDao()); createResearchersIfTheyDontExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getResearcherDao()); UserInfo user = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); createProjectIfItDoesntExist(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getProjectDao(), user); newDmp.setCreator(user); newDmp.setGroupId(UUID.randomUUID()); newDmp.setVersion(0); newDmp.setId(null); newDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(newDmp); copyDatasets(newDmp, apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao()); } public void delete(UUID uuid) throws DMPWithDatasetsDeleteException { DatasetCriteria criteria = new DatasetCriteria(); List dmpIds = Collections.singletonList(uuid); criteria.setDmpIds(dmpIds); if (apiContext.getOperationsContext().getDatabaseRepository().getDatasetDao().getWithCriteria(criteria).toList().size()>0) throw new DMPWithDatasetsDeleteException("You cannot Remove Datamanagement Plan with Datasets"); DMP oldDmp = apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(uuid); oldDmp.setStatus(DMP.DMPStatus.DELETED.getValue()); apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(oldDmp); } private void createResearchersIfTheyDontExist(DMP newDmp, ResearcherDao researcherRepository) { if (newDmp.getResearchers() != null && !newDmp.getResearchers().isEmpty()) { for (eu.eudat.data.entities.Researcher researcher : newDmp.getResearchers()) { ResearcherCriteria criteria = new ResearcherCriteria(); criteria.setLike(researcher.getReference()); List entries = researcherRepository.getWithCriteria(criteria).toList(); if (entries != null && !entries.isEmpty()) researcher.setId(entries.get(0).getId()); else researcher = researcherRepository.createOrUpdate(researcher); } } } private void createOrganisationsIfTheyDontExist(DMP newDmp, OrganisationDao organisationRepository) { if (newDmp.getOrganisations() != null && !newDmp.getOrganisations().isEmpty()) { for (eu.eudat.data.entities.Organisation organisation : newDmp.getOrganisations()) { OrganisationCriteria criteria = new OrganisationCriteria(); criteria.setLike(organisation.getReference()); List entries = organisationRepository.getWithCriteria(criteria).toList(); if (entries != null && !entries.isEmpty()) organisation.setId(entries.get(0).getId()); else organisation = organisationRepository.createOrUpdate(organisation); } } } private void createProjectIfItDoesntExist(DMP newDmp, ProjectDao projectDao, UserInfo userInfo) { if (newDmp.getProject() != null) { Project project = newDmp.getProject(); ProjectCriteria criteria = new ProjectCriteria(); criteria.setReference(project.getReference()); eu.eudat.data.entities.Project projectEntity = projectDao.getWithCriteria(criteria).getSingleOrDefault(); if (projectEntity != null) project.setId(projectEntity.getId()); else { project.setType(Project.ProjectType.EXTERNAL.getValue()); projectDao.createOrUpdate(project); } } } private void copyDatasets(DMP newDmp, DatasetDao datasetDao) { List> futures = new LinkedList<>(); for (Dataset dataset : newDmp.getDataset()) { datasetDao.asQueryable().withHint(HintedModelFactory.getHint(DatasetListingModel.class)).where((builder, root) -> builder.equal(root.get("id"), dataset.getId())).getSingleAsync() .thenApplyAsync(entityDataset -> { Dataset newDataset = new Dataset(); newDataset.update(entityDataset); newDataset.setDmp(newDmp); newDataset.setStatus(Dataset.Status.SAVED.getValue()); if (newDataset.getDatasetDataRepositories() != null) { newDataset.setDatasetDataRepositories(newDataset.getDatasetDataRepositories().stream().map(item -> { DataRepository dataRepository = new DataRepository(); dataRepository.setId(item.getId()); DatasetDataRepository datasetDataRepository = new DatasetDataRepository(); datasetDataRepository.setDataRepository(dataRepository); datasetDataRepository.setDataset(newDataset); return datasetDataRepository; }).collect(Collectors.toSet())); } if (newDataset.getDatasetExternalDatasets() != null) { newDataset.setDatasetExternalDatasets(newDataset.getDatasetExternalDatasets().stream().map(item -> { ExternalDataset externalDataset = new ExternalDataset(); externalDataset.setId(item.getId()); DatasetExternalDataset datasetExternalDataset = new DatasetExternalDataset(); datasetExternalDataset.setExternalDataset(externalDataset); datasetExternalDataset.setDataset(newDataset); return datasetExternalDataset; }).collect(Collectors.toSet())); } if (newDataset.getRegistries() != null) { newDataset.setRegistries(newDataset.getRegistries().stream().map(item -> { Registry registry = new Registry(); registry.setId(item.getId()); return registry; }).collect(Collectors.toSet())); } if (newDataset.getServices() != null) { newDataset.setServices(newDataset.getServices().stream().map(item -> { Service service = new Service(); service.setId(item.getId()); DatasetService datasetService = new DatasetService(); datasetService.setService(service); datasetService.setDataset(newDataset); return datasetService; }).collect(Collectors.toSet())); } newDataset.setCreated(new Date()); return newDataset; }).thenApplyAsync(item -> { futures.add(datasetDao.createOrUpdateAsync(item)); return futures; }).join(); } } public FileEnvelope getXmlDocument(String id) throws InstantiationException, IllegalAccessException, IOException { ExportXmlBuilder xmlBuilder = new ExportXmlBuilder(); VisibilityRuleService visibilityRuleService = utilitiesService.getVisibilityRuleService(); eu.eudat.data.entities.DMP dmp = databaseRepository.getDmpDao().find(UUID.fromString(id)); List datasets = dmp.getDataset().stream().collect(Collectors.toList()); String fileName = dmp.getLabel(); fileName = fileName.replaceAll("[^a-zA-Z0-9+ ]", ""); File xmlFile = new File(fileName + ".xml"); BufferedWriter writer = new BufferedWriter(new FileWriter(xmlFile, true)); Document xmlDoc = XmlBuilder.getDocument(); Element dmpElement = xmlDoc.createElement("dmp"); Element dmpDescription = xmlDoc.createElement("description"); dmpDescription.setTextContent(dmp.getDescription()); dmpElement.appendChild(dmpDescription); Element dmpName = xmlDoc.createElement("dmpName"); dmpName.setTextContent(dmp.getLabel()); dmpElement.appendChild(dmpName); DMPProfile dmpProfile = dmp.getProfile(); Element dmpProfileElement = xmlDoc.createElement("dmpProfile"); Element dmpProfileName = xmlDoc.createElement("dmpProfileName"); if (!(dmpProfile == null)){ dmpProfileName.setTextContent(dmpProfile.getLabel()); dmpProfileElement.appendChild(dmpProfileName); Element dmpProfileId = xmlDoc.createElement("dmpProfileId"); dmpProfileId.setTextContent(dmpProfile.getId().toString()); dmpProfileElement.appendChild(dmpProfileId); } dmpElement.appendChild(dmpProfileElement); Element project = xmlDoc.createElement("project"); Element label = xmlDoc.createElement("label"); label.setTextContent(dmp.getProject().getLabel()); project.appendChild(label); Element projectId = xmlDoc.createElement("id"); projectId.setTextContent(dmp.getProject().getId().toString()); project.appendChild(projectId); dmpElement.appendChild(project); Element organisationsElement = xmlDoc.createElement("organisations"); for (Organisation organisation : dmp.getOrganisations()) { Element organisationElement = xmlDoc.createElement("organisation"); Element organisationNameElement = xmlDoc.createElement("name"); organisationNameElement.setTextContent(organisation.getLabel()); Element organisationReferenceElement = xmlDoc.createElement("reference"); organisationReferenceElement.setTextContent(organisation.getReference()); organisationElement.appendChild(organisationNameElement); organisationElement.appendChild(organisationReferenceElement); organisationsElement.appendChild(organisationElement); } dmpElement.appendChild(organisationsElement); Element researchersElement = xmlDoc.createElement("researchers"); for (Researcher researcher : dmp.getResearchers()) { Element researcherElement = xmlDoc.createElement("researcher"); Element researcherNameElement = xmlDoc.createElement("name"); researcherNameElement.setTextContent(researcher.getLabel()); Element researcherReferenceElement = xmlDoc.createElement("reference"); researcherReferenceElement.setTextContent(researcher.getReference()); researcherElement.appendChild(researcherNameElement); researcherElement.appendChild(researcherReferenceElement); researchersElement.appendChild(researcherElement); } dmpElement.appendChild(researchersElement); Element datasetsElement = xmlDoc.createElement("datasets"); for (Dataset dataset : datasets) { Element datasetElement = xmlDoc.createElement("dataset"); DatasetWizardModel datasetWizardModel = new DatasetWizardModel(); Map properties = new HashMap<>(); if (dataset.getProperties() != null) { JSONObject jobject = new JSONObject(dataset.getProperties()); properties = jobject.toMap(); } PagedDatasetProfile pagedDatasetProfile = datasetManager.getPagedProfile(datasetWizardModel, dataset); visibilityRuleService.setProperties(properties); visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); datasetElement.appendChild(xmlBuilder.createPages(pagedDatasetProfile.getPages(), visibilityRuleService, xmlDoc)); datasetsElement.appendChild(datasetElement); } Element profiles = xmlDoc.createElement("profiles"); // Get DatasetProfiles from dmp to add to XML. if (dmp.getAssociatedDmps() != null && !dmp.getAssociatedDmps().isEmpty()) { Document viewStyleDoc = XmlBuilder.fromXml(dmp.getAssociatedDmps()); Element item = (Element) viewStyleDoc.getElementsByTagName("profiles").item(0); if (item != null) { NodeList associatedProfilesElement = item.getChildNodes(); for (int temp = 0; temp < associatedProfilesElement.getLength(); temp++) { Node associatedProfileElement = associatedProfilesElement.item(temp); if (associatedProfileElement.getNodeType() == Node.ELEMENT_NODE) { Element profile = xmlDoc.createElement("profile"); Element profileLabel = xmlDoc.createElement("profilelabel"); Node labelNode = associatedProfileElement.getAttributes().item(0); profileLabel.setTextContent(labelNode.getNodeValue()); profile.appendChild(profileLabel); Element profileId = xmlDoc.createElement("profileId"); Node idNode = associatedProfileElement.getAttributes().item(1); profileId.setTextContent(idNode.getNodeValue()); profile.appendChild(profileId); profiles.appendChild(profile); } } } } dmpElement.appendChild(profiles); dmpElement.appendChild(datasetsElement); xmlDoc.appendChild(dmpElement); String xml = XmlBuilder.generateXml(xmlDoc); writer.write(xml); writer.close(); FileEnvelope fileEnvelope = new FileEnvelope(); fileEnvelope.setFile(xmlFile); fileEnvelope.setFilename(dmp.getLabel()); return fileEnvelope; } public ResponseEntity getDocument(String id, String contentType) throws InstantiationException, IllegalAccessException, IOException{ File file; VisibilityRuleService visibilityRuleService = this.utilitiesService.getVisibilityRuleService(); DMPDao dmpDao = databaseRepository.getDmpDao(); switch (contentType){ case "application/xml": file = getXmlDocument(id).getFile(); break; case "application/msword": file = getWordDocument(id); break; default: file = getXmlDocument(id).getFile(); } InputStream resource = new FileInputStream(file); System.out.println("Mime Type of " + file.getName() + " is " + new MimetypesFileTypeMap().getContentType(file)); HttpHeaders responseHeaders = new HttpHeaders(); responseHeaders.setContentLength(file.length()); responseHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); responseHeaders.set("Content-Disposition", "attachment;filename=" + file.getName()); responseHeaders.set("Access-Control-Expose-Headers", "Content-Disposition"); responseHeaders.get("Access-Control-Expose-Headers").add("Content-Type"); byte[] content = org.apache.poi.util.IOUtils.toByteArray(resource); resource.close(); Files.deleteIfExists(file.toPath()); return new ResponseEntity<>(content, responseHeaders, HttpStatus.OK); } public List createDmpFromXml( ApiContext apiContext, MultipartFile[] files, Principal principal) throws IOException, JAXBException, Exception { List dataManagementPlans = new ArrayList<>(); // Jaxb approach. JAXBContext jaxbContext; for (MultipartFile multipartFile : Arrays.asList(files)){ // Gets one item from the array. try{ InputStream in = multipartFile.getInputStream(); // Transforms item to InputStream. jaxbContext = JAXBContext.newInstance(DmpImportModel.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); DmpImportModel dmpImportModel = (DmpImportModel)jaxbUnmarshaller.unmarshal(in); System.out.println(dmpImportModel.getDmpNameImport()); dataManagementPlans.add(dmpImportModel); } catch (IOException | JAXBException ex){ ex.printStackTrace(); } // TODO Iterate through the list of dataManagmentPlans. // Creates new dataManagmentPlan to fill it with the data model that was parsed from the xml. // Creates properties. DataManagementPlan dm = new DataManagementPlan(); Tuple tuple = new Tuple(); tuple.setId(dataManagementPlans.get(0).getDmpProfile().getDmpProfileId()); tuple.setLabel(dataManagementPlans.get(0).getDmpProfile().getDmpProfileName()); eu.eudat.models.data.project.Project project = new eu.eudat.models.data.project.Project(); ProjectImportModels projectImport = dataManagementPlans.get(0).getProjectImport(); project.setId(projectImport.getId()); project.setLabel(projectImport.getLabel()); project.setAbbreviation(projectImport.getAbbreviation()); project.setDescription(projectImport.getDescription()); List associatedProfiles = new LinkedList<>(); for(AssociatedProfileImportModels a : dataManagementPlans.get(0).getProfilesImportModels()) { AssociatedProfile associatedProfile = new AssociatedProfile(); associatedProfile.setId(a.getId()); associatedProfile.setLabel(a.getLabel()); associatedProfiles.add(associatedProfile); } List< eu.eudat.models.data.dmp.Organisation > organisations = new ArrayList<>(); List researchers = new LinkedList<>(); List associatedUsers = new LinkedList<>(); List dynamicFields = new LinkedList<>(); // Sets properties. dm.setLabel(files[0].getOriginalFilename()); // Sets label. dm.setProject(project); //Sets project property. dm.setDescription(dataManagementPlans.get(0).getDescriptionImport()); // Sets description property. dm.setProfiles(associatedProfiles); dm.setOrganisations(organisations); // Sets organisations property. dm.setResearchers(researchers); // Sets researchers property. dm.setAssociatedUsers(associatedUsers); // Sets associatedUsers property. dm.setDynamicFields(dynamicFields); // Sets dynamicFields property. dm.setProfile(tuple); createOrUpdate(apiContext, dm, principal); System.out.println(dm); } return dataManagementPlans; } }