From 36ce246f0b47f38cd67289dcaf4c15630eaf594d Mon Sep 17 00:00:00 2001 From: gkolokythas Date: Wed, 30 Oct 2019 14:30:31 +0200 Subject: [PATCH] Refactors DMP docx export by adding navigation pane and using Header styles from "template" document. --- .../managers/DataManagementPlanManager.java | 21 ++++----- .../documents/types/ParagraphStyle.java | 4 +- .../utilities/documents/word/WordBuilder.java | 44 ++++++++++++------ .../src/main/resources/documents/h2020.docx | Bin 13462 -> 14127 bytes 4 files changed, 42 insertions(+), 27 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 fa8195411..8c204a44d 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 @@ -188,18 +188,13 @@ public class DataManagementPlanManager { throw new UnauthorisedException(); // Space above DMP title. - XWPFParagraph parAboveDmpTitle = document.createParagraph(); +/* XWPFParagraph parAboveDmpTitle = document.createParagraph(); XWPFParagraph parAboveDmpTitle1 = document.createParagraph(); XWPFParagraph parAboveDmpTitle2 = document.createParagraph(); - XWPFParagraph parAboveDmpTitle3 = document.createParagraph(); + XWPFParagraph parAboveDmpTitle3 = document.createParagraph();*/ // DMP title custom style. - //wordBuilder.addParagraphContent(dmpEntity.getLabel(), document, ParagraphStyle.TITLE, BigInteger.ZERO); - XWPFParagraph dmpLabelParagraph = document.createParagraph(); - XWPFRun run = dmpLabelParagraph.createRun(); - run.setText(dmpEntity.getLabel()); - run.setBold(true); - run.setFontSize(20); + wordBuilder.addParagraphContent(dmpEntity.getLabel(), document, ParagraphStyle.HEADER1, BigInteger.ZERO); // Space below DMP title. XWPFParagraph parBelowDmpTitle = document.createParagraph(); @@ -241,6 +236,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"); XWPFRun runDatasetTitle1 = datasetLabelParagraph.createRun(); runDatasetTitle1.setText("Title: "); runDatasetTitle1.setBold(true); @@ -252,6 +248,7 @@ public class DataManagementPlanManager { runDatasetTitle.setFontSize(12); XWPFParagraph datasetTemplateParagraph = document.createParagraph(); + datasetTemplateParagraph.setStyle("Heading2"); XWPFRun runDatasetTemplate1 = datasetTemplateParagraph.createRun(); runDatasetTemplate1.setText("Template: "); runDatasetTemplate1.setBold(true); @@ -263,7 +260,7 @@ public class DataManagementPlanManager { runDatasetTemplate.setFontSize(12); wordBuilder.addParagraphContent(datasetEntity.getDescription(), document, ParagraphStyle.TEXT, BigInteger.ZERO); - wordBuilder.addParagraphContent("Dataset Description", document, ParagraphStyle.HEADER1, BigInteger.ZERO); + wordBuilder.addParagraphContent("Dataset Description", document, ParagraphStyle.HEADER2, BigInteger.ZERO); PagedDatasetProfile pagedDatasetProfile = datasetManager.getPagedProfile(dataset, datasetEntity); visibilityRuleService.setProperties(properties); visibilityRuleService.buildVisibilityContext(pagedDatasetProfile.getRules()); @@ -463,7 +460,7 @@ public class DataManagementPlanManager { newDmp.setCreated(dmp.getCreated() == null ? new Date() : dmp.getCreated()); if (newDmp.getUsers()!= null && newDmp.getUsers().stream().filter(userInfo -> userInfo.getUser().getId() == principal.getId()) .collect(Collectors.toList()).size() == 0) { - List userDMPList = newDmp.getUsers().stream().collect(Collectors.toList()); + List userDMPList = new ArrayList<>(newDmp.getUsers()); for (UserInfoListingModel userInfoListingModel : dataManagementPlan.getUsers()) { for (UserDMP userDMP : userDMPList) { if (!(userDMP.getUser().getId().equals(userInfoListingModel.getId()))) { @@ -970,8 +967,8 @@ public class DataManagementPlanManager { } 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. + // TODO Iterate through the list of dataManagementPlans. + // Creates new dataManagementPlan to fill it with the data model that was parsed from the xml. // Creates properties. DataManagementPlan dm = new DataManagementPlan(); DataManagementPlanProfile dmpProfile = new DataManagementPlanProfile(); 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 c908ca0b1..981b3f66c 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); + TEXT(0), HEADER1(1), HEADER2(2), HEADER3(3), HEADER4(4), TITLE(5), FOOTER(6), COMMENT(7), HEADER5(8); private Integer value; @@ -34,6 +34,8 @@ public enum ParagraphStyle { return FOOTER; case 7: return COMMENT; + case 8: + return HEADER5; 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 657946e0a..e241a835f 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 @@ -25,6 +25,7 @@ import java.math.BigInteger; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; /** * Created by ikalyvas on 2/26/2018. @@ -46,7 +47,7 @@ public class WordBuilder { XWPFParagraph paragraph = mainDocumentPart.createParagraph(); XWPFRun run = paragraph.createRun(); if (item != null) - run.setText(" " + item); + run.setText(item); run.setFontSize(11); return paragraph; }); @@ -65,26 +66,41 @@ public class WordBuilder { paragraph.setStyle("Heading1"); XWPFRun run = paragraph.createRun(); run.setText(item); - run.setBold(true); - run.setFontSize(12); +// run.setBold(true); +// run.setFontSize(12); +// run.setStyle("0"); return paragraph; }); this.options.put(ParagraphStyle.HEADER2, (mainDocumentPart, item) -> { XWPFParagraph paragraph = mainDocumentPart.createParagraph(); paragraph.setStyle("Heading2"); XWPFRun run = paragraph.createRun(); - run.setText(" " + item); - run.setBold(true); - run.setFontSize(12); + run.setText(item); +// run.setBold(true); +// run.setFontSize(12); return paragraph; }); this.options.put(ParagraphStyle.HEADER3, (mainDocumentPart, item) -> { XWPFParagraph paragraph = mainDocumentPart.createParagraph(); paragraph.setStyle("Heading3"); XWPFRun run = paragraph.createRun(); - run.setText(" " + item); - run.setBold(true); - run.setFontSize(11); + run.setText(item); +// run.setBold(true); +// run.setFontSize(11); + return paragraph; + }); + this.options.put(ParagraphStyle.HEADER4, (mainDocumentPart, item) -> { + XWPFParagraph paragraph = mainDocumentPart.createParagraph(); + paragraph.setStyle("Heading4"); + XWPFRun run = paragraph.createRun(); + run.setText(item); + return paragraph; + }); + this.options.put(ParagraphStyle.HEADER5, (mainDocumentPart, item) -> { + XWPFParagraph paragraph = mainDocumentPart.createParagraph(); + paragraph.setStyle("Heading5"); + XWPFRun run = paragraph.createRun(); + run.setText(item); return paragraph; }); this.options.put(ParagraphStyle.FOOTER, (mainDocumentPart, item) -> { @@ -96,7 +112,7 @@ public class WordBuilder { this.options.put(ParagraphStyle.COMMENT, (mainDocumentPart, item) -> { XWPFParagraph paragraph = mainDocumentPart.createParagraph(); XWPFRun run = paragraph.createRun(); - run.setText(" " + item); + run.setText(item); run.setItalic(true); return paragraph; }); @@ -114,7 +130,7 @@ public class WordBuilder { public void createPages(List datasetProfilePages, XWPFDocument mainDocumentPart, Boolean createListing, VisibilityRuleService visibilityRuleService) { datasetProfilePages.forEach(item -> { - createSections(item.getSections(), mainDocumentPart, ParagraphStyle.HEADER1, 0, createListing, visibilityRuleService); + createSections(item.getSections(), mainDocumentPart, ParagraphStyle.HEADER3, 0, createListing, visibilityRuleService); }); } @@ -127,7 +143,7 @@ public class WordBuilder { CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); number.setVal(BigInteger.valueOf(indent)); } - createSections(section.getSections(), mainDocumentPart, ParagraphStyle.HEADER2, 1, createListing, visibilityRuleService); + createSections(section.getSections(), mainDocumentPart, ParagraphStyle.HEADER4, 1, createListing, visibilityRuleService); createCompositeFields(section.getCompositeFields(), mainDocumentPart, 2, createListing, visibilityRuleService); } }); @@ -138,12 +154,12 @@ 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.HEADER3, numId); + XWPFParagraph paragraph = addParagraphContent(compositeField.getNumbering() + " " + compositeField.getTitle(), mainDocumentPart, ParagraphStyle.HEADER5, numId); CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl(); number.setVal(BigInteger.valueOf(indent)); } createFields(compositeField.getFields(), mainDocumentPart, 3, createListing, visibilityRuleService); - if (!compositeField.getMultiplicityItems().isEmpty()) { + if (compositeField.getMultiplicityItems() != null && !compositeField.getMultiplicityItems().isEmpty()) { for (FieldSet multiplicityFieldset : compositeField.getMultiplicityItems()) { createFields(multiplicityFieldset.getFields(), mainDocumentPart, 3, createListing, visibilityRuleService); } diff --git a/dmp-backend/web/src/main/resources/documents/h2020.docx b/dmp-backend/web/src/main/resources/documents/h2020.docx index 6eb9003215c954cd5219b5a2a266d98ecf29c4e6..b4b2bb2f1445c22eaa174e27a2ab45d46e4ee75b 100644 GIT binary patch delta 8536 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 F{{jkYS~36t delta 7831 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