From 2a745ad334589796e29219146a0bc3139e72c40a Mon Sep 17 00:00:00 2001 From: gkolokythas Date: Thu, 31 Oct 2019 12:07:28 +0200 Subject: [PATCH] Moves DMP information under element "Data Management information" on DMP docx export. --- .../managers/DataManagementPlanManager.java | 47 +++++++++++------- .../eudat/logic/managers/DatasetManager.java | 2 +- .../documents/types/ParagraphStyle.java | 4 +- .../utilities/documents/word/WordBuilder.java | 13 +++-- .../src/main/resources/documents/h2020.docx | Bin 14127 -> 14212 bytes 5 files changed, 42 insertions(+), 24 deletions(-) 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 3107e0e67..ffbaab817 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 @@ -187,28 +187,26 @@ public class DataManagementPlanManager { if (!dmpEntity.isPublic() && dmpEntity.getUsers().stream().filter(userInfo -> userInfo.getUser().getId() == principal.getId()).collect(Collectors.toList()).size() == 0) throw new UnauthorisedException(); + // DMP info on top of the document. + wordBuilder.addParagraphContent("Data Management Plan Information", document, ParagraphStyle.HEADER1, BigInteger.ZERO); // DMP title custom style. - wordBuilder.addParagraphContent(dmpEntity.getLabel(), document, ParagraphStyle.HEADER1, BigInteger.ZERO); - - // Space below DMP title. - XWPFParagraph parBelowDmpTitle = document.createParagraph(); - + wordBuilder.addParagraphContent(dmpEntity.getLabel(), document, ParagraphStyle.HEADER2, BigInteger.ZERO); wordBuilder.addParagraphContent(dmpEntity.getDescription(), document, ParagraphStyle.TEXT, BigInteger.ZERO); - wordBuilder.addParagraphContent("Funder", document, ParagraphStyle.HEADER2, BigInteger.ZERO); + wordBuilder.addParagraphContent("Funder", document, ParagraphStyle.HEADER3, BigInteger.ZERO); if (dmpEntity.getGrant().getFunder() != null) wordBuilder.addParagraphContent(dmpEntity.getGrant().getFunder().getLabel(), document, ParagraphStyle.TEXT, BigInteger.ZERO); - wordBuilder.addParagraphContent("Grant", document, ParagraphStyle.HEADER2, BigInteger.ZERO); + wordBuilder.addParagraphContent("Grant", document, ParagraphStyle.HEADER3, BigInteger.ZERO); wordBuilder.addParagraphContent(dmpEntity.getGrant().getLabel(), document, ParagraphStyle.TEXT, BigInteger.ZERO); - wordBuilder.addParagraphContent("Organisations", document, ParagraphStyle.HEADER2, BigInteger.ZERO); + wordBuilder.addParagraphContent("Organisations", document, ParagraphStyle.HEADER3, BigInteger.ZERO); if (dmpEntity.getOrganisations().size() > 0) { wordBuilder.addParagraphContent(dmpEntity.getOrganisations().stream().map(Organisation::getLabel).collect(Collectors.joining(", ")) , document, ParagraphStyle.TEXT, BigInteger.ZERO); } - wordBuilder.addParagraphContent("Researchers", document, ParagraphStyle.HEADER2, BigInteger.ZERO); + wordBuilder.addParagraphContent("Researchers", document, ParagraphStyle.HEADER3, BigInteger.ZERO); if (dmpEntity.getResearchers().size() > 0) { wordBuilder.addParagraphContent(dmpEntity.getResearchers().stream().map(Researcher::getLabel).collect(Collectors.joining(", ")) , document, ParagraphStyle.TEXT, BigInteger.ZERO); @@ -223,7 +221,9 @@ public class DataManagementPlanManager { XWPFParagraph parBreakDMP = document.createParagraph(); parBreakDMP.setPageBreak(true); - wordBuilder.addParagraphContent("Datasets", document, ParagraphStyle.TITLE, BigInteger.ZERO); + wordBuilder.addParagraphContent("Datasets", document, ParagraphStyle.HEADER1, BigInteger.ZERO); + // Space below Datasets. + XWPFParagraph parBreakDatasets = document.createParagraph(); dmpEntity.getDataset().stream() .filter(item -> item.getStatus() != Dataset.Status.CANCELED.getValue()) .filter(item -> item.getStatus() != Dataset.Status.DELETED.getValue()) @@ -237,7 +237,7 @@ public class DataManagementPlanManager { // Custom style for the Dataset title. //wordBuilder.addParagraphContent("Title: " + datasetEntity.getLabel(), document, ParagraphStyle.HEADER1, BigInteger.ZERO); XWPFParagraph datasetLabelParagraph = document.createParagraph(); - datasetLabelParagraph.setStyle("Heading1"); + datasetLabelParagraph.setStyle("Heading2"); XWPFRun runDatasetTitle1 = datasetLabelParagraph.createRun(); runDatasetTitle1.setText("Title: "); runDatasetTitle1.setBold(true); @@ -249,7 +249,7 @@ public class DataManagementPlanManager { runDatasetTitle.setFontSize(12); XWPFParagraph datasetTemplateParagraph = document.createParagraph(); - datasetTemplateParagraph.setStyle("Heading2"); + datasetTemplateParagraph.setStyle("Heading3"); XWPFRun runDatasetTemplate1 = datasetTemplateParagraph.createRun(); runDatasetTemplate1.setText("Template: "); runDatasetTemplate1.setBold(true); @@ -261,29 +261,29 @@ public class DataManagementPlanManager { runDatasetTemplate.setFontSize(12); XWPFParagraph externalReferencesParagraph = document.createParagraph(); - externalReferencesParagraph.setStyle("Heading2"); + externalReferencesParagraph.setStyle("Heading3"); XWPFRun externalReferencesRun = externalReferencesParagraph.createRun(); externalReferencesRun.setText("External References"); externalReferencesRun.setColor("2E75B6"); externalReferencesRun.setBold(true); externalReferencesRun.setFontSize(12); - wordBuilder.addParagraphContent("Data Repositories", document, ParagraphStyle.HEADER3, BigInteger.ZERO); + wordBuilder.addParagraphContent("Data Repositories", document, ParagraphStyle.HEADER4, BigInteger.ZERO); if (datasetEntity.getDatasetDataRepositories().size() > 0) { wordBuilder.addParagraphContent(datasetEntity.getDatasetDataRepositories().stream().map(DatasetDataRepository::getDataRepository).map(DataRepository::getLabel).collect(Collectors.joining(", ")) , document, ParagraphStyle.TEXT, BigInteger.ZERO); } - wordBuilder.addParagraphContent("External Datasets", document, ParagraphStyle.HEADER3, BigInteger.ZERO); + wordBuilder.addParagraphContent("External Datasets", document, ParagraphStyle.HEADER4, BigInteger.ZERO); if (datasetEntity.getDatasetExternalDatasets().size() > 0) { wordBuilder.addParagraphContent(datasetEntity.getDatasetExternalDatasets().stream().map(DatasetExternalDataset::getExternalDataset).map(ExternalDataset::getLabel).collect(Collectors.joining(", ")) , document, ParagraphStyle.TEXT, BigInteger.ZERO); } - wordBuilder.addParagraphContent("Registries", document, ParagraphStyle.HEADER3, BigInteger.ZERO); + wordBuilder.addParagraphContent("Registries", document, ParagraphStyle.HEADER4, BigInteger.ZERO); if (datasetEntity.getRegistries().size() > 0) { wordBuilder.addParagraphContent(datasetEntity.getRegistries().stream().map(Registry::getLabel).collect(Collectors.joining(", ")) , document, ParagraphStyle.TEXT, BigInteger.ZERO); } - wordBuilder.addParagraphContent("Services", document, ParagraphStyle.HEADER3, BigInteger.ZERO); + wordBuilder.addParagraphContent("Services", document, ParagraphStyle.HEADER4, BigInteger.ZERO); if (datasetEntity.getServices().size() > 0) { wordBuilder.addParagraphContent(datasetEntity.getServices().stream().map(DatasetService::getService).map(Service::getLabel).collect(Collectors.joining(", ")) , document, ParagraphStyle.TEXT, BigInteger.ZERO); @@ -296,7 +296,16 @@ public class DataManagementPlanManager { wordBuilder.addParagraphContent(datasetEntity.getDescription(), document, ParagraphStyle.TEXT, BigInteger.ZERO); - wordBuilder.addParagraphContent("Dataset Description", document, ParagraphStyle.HEADER2, BigInteger.ZERO); + + // Dataset Description custom style. + XWPFParagraph datasetDescriptionParagraph = document.createParagraph(); + datasetDescriptionParagraph.setStyle("Heading3"); + XWPFRun datasetDescriptionRun = datasetDescriptionParagraph.createRun(); + datasetDescriptionRun.setText("Dataset Description"); + datasetDescriptionRun.setColor("2E75B6"); + datasetDescriptionRun.setBold(true); + datasetDescriptionRun.setFontSize(12); + PagedDatasetProfile pagedDatasetProfile = datasetManager.getPagedProfile(dataset, datasetEntity); visibilityRuleService.setProperties(properties); visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); @@ -310,7 +319,7 @@ public class DataManagementPlanManager { }); // Removes the top empty headings. - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 6; i++) { document.removeBodyElement(0); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index 1624732bd..b9f6711c3 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -319,7 +319,7 @@ public class DatasetManager { File exportFile = new File(label + ".docx"); // Removes the top empty headings. - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 6; i++) { document.removeBodyElement(0); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/types/ParagraphStyle.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/types/ParagraphStyle.java index 981b3f66c..ba104013d 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/types/ParagraphStyle.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/types/ParagraphStyle.java @@ -4,7 +4,7 @@ package eu.eudat.logic.utilities.documents.types; * Created by ikalyvas on 2/26/2018. */ public enum ParagraphStyle { - TEXT(0), HEADER1(1), HEADER2(2), HEADER3(3), HEADER4(4), TITLE(5), FOOTER(6), COMMENT(7), HEADER5(8); + TEXT(0), HEADER1(1), HEADER2(2), HEADER3(3), HEADER4(4), TITLE(5), FOOTER(6), COMMENT(7), HEADER5(8), HEADER6(9); private Integer value; @@ -36,6 +36,8 @@ public enum ParagraphStyle { return COMMENT; case 8: return HEADER5; + case 9: + return HEADER6; default: throw new RuntimeException("Unsupported ParagraphStyle Code"); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java index 24a9ac492..f8733633a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java @@ -100,6 +100,13 @@ public class WordBuilder { run.setText(" " + item); return paragraph; }); + this.options.put(ParagraphStyle.HEADER6, (mainDocumentPart, item) -> { + XWPFParagraph paragraph = mainDocumentPart.createParagraph(); + paragraph.setStyle("Heading6"); + XWPFRun run = paragraph.createRun(); + run.setText(" " + item); + return paragraph; + }); this.options.put(ParagraphStyle.FOOTER, (mainDocumentPart, item) -> { XWPFParagraph paragraph = mainDocumentPart.createParagraph(); XWPFRun run = paragraph.createRun(); @@ -127,7 +134,7 @@ public class WordBuilder { public void createPages(List datasetProfilePages, XWPFDocument mainDocumentPart, Boolean createListing, VisibilityRuleService visibilityRuleService) { datasetProfilePages.forEach(item -> { - createSections(item.getSections(), mainDocumentPart, ParagraphStyle.HEADER3, 0, createListing, visibilityRuleService); + createSections(item.getSections(), mainDocumentPart, ParagraphStyle.HEADER4, 0, createListing, visibilityRuleService); }); } @@ -140,7 +147,7 @@ public class WordBuilder { CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); number.setVal(BigInteger.valueOf(indent)); } - createSections(section.getSections(), mainDocumentPart, ParagraphStyle.HEADER4, 1, createListing, visibilityRuleService); + createSections(section.getSections(), mainDocumentPart, ParagraphStyle.HEADER5, 1, createListing, visibilityRuleService); createCompositeFields(section.getCompositeFields(), mainDocumentPart, 2, createListing, visibilityRuleService); } }); @@ -151,7 +158,7 @@ public class WordBuilder { compositeFields.forEach(compositeField -> { if (visibilityRuleService.isElementVisible(compositeField.getId()) && hasVisibleFields(compositeField, visibilityRuleService)) { if (compositeField.getTitle() != null && !compositeField.getTitle().isEmpty() && !createListing) { - XWPFParagraph paragraph = addParagraphContent(compositeField.getNumbering() + " " + compositeField.getTitle(), mainDocumentPart, ParagraphStyle.HEADER5, numId); + XWPFParagraph paragraph = addParagraphContent(compositeField.getNumbering() + " " + compositeField.getTitle(), mainDocumentPart, ParagraphStyle.HEADER6, numId); CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); number.setVal(BigInteger.valueOf(indent)); } diff --git a/dmp-backend/web/src/main/resources/documents/h2020.docx b/dmp-backend/web/src/main/resources/documents/h2020.docx index b4b2bb2f1445c22eaa174e27a2ab45d46e4ee75b..2f98459a0c8276857ba4a675c61522ed10179ebb 100644 GIT binary patch delta 8275 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 delta 8307 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