argos/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/documents/word/WordBuilder.java

239 lines
11 KiB
Java
Raw Normal View History

2018-06-27 12:29:21 +02:00
package eu.eudat.logic.utilities.documents.word;
2018-03-01 10:14:10 +01:00
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
2018-10-08 17:14:27 +02:00
import eu.eudat.logic.services.forms.VisibilityRuleService;
2018-06-27 12:29:21 +02:00
import eu.eudat.logic.utilities.documents.types.ParagraphStyle;
import eu.eudat.logic.utilities.documents.types.TextStyle;
2018-10-08 17:14:27 +02:00
import eu.eudat.logic.utilities.interfaces.ApplierWithValue;
import eu.eudat.models.data.components.commons.datafield.CheckBoxData;
import eu.eudat.models.data.components.commons.datafield.ComboBoxData;
2018-06-27 12:29:21 +02:00
import eu.eudat.models.data.user.components.datasetprofile.Field;
import eu.eudat.models.data.user.components.datasetprofile.FieldSet;
import eu.eudat.models.data.user.components.datasetprofile.Section;
import eu.eudat.models.data.user.composite.DatasetProfilePage;
import eu.eudat.models.data.user.composite.PagedDatasetProfile;
2018-03-01 10:14:10 +01:00
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTAbstractNum;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDecimalNumber;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTLvl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STNumberFormat;
2018-10-08 17:14:27 +02:00
import java.io.IOException;
2018-03-01 10:14:10 +01:00
import java.math.BigInteger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by ikalyvas on 2/26/2018.
*/
public class WordBuilder {
2018-03-05 17:18:45 +01:00
private Map<ParagraphStyle, ApplierWithValue<XWPFDocument, String, XWPFParagraph>> options = new HashMap<>();
2018-03-01 10:14:10 +01:00
private CTAbstractNum cTAbstractNum;
private BigInteger numId;
public WordBuilder() {
this.cTAbstractNum = CTAbstractNum.Factory.newInstance();
this.cTAbstractNum.setAbstractNumId(BigInteger.valueOf(1));
this.buildOptions();
2018-03-01 10:14:10 +01:00
}
private void buildOptions() {
this.options.put(ParagraphStyle.TEXT, (mainDocumentPart, item) -> {
XWPFParagraph paragraph = mainDocumentPart.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText(item);
run.setFontSize(11);
return paragraph;
});
this.options.put(ParagraphStyle.TITLE, (mainDocumentPart, item) -> {
XWPFParagraph paragraph = mainDocumentPart.createParagraph();
paragraph.setStyle("Title");
paragraph.setAlignment(ParagraphAlignment.CENTER);
2018-03-01 10:14:10 +01:00
XWPFRun run = paragraph.createRun();
run.setText(item);
run.setBold(true);
run.setFontSize(14);
return paragraph;
});
this.options.put(ParagraphStyle.HEADER1, (mainDocumentPart, item) -> {
XWPFParagraph paragraph = mainDocumentPart.createParagraph();
paragraph.setStyle("Heading1");
2018-03-01 10:14:10 +01:00
XWPFRun run = paragraph.createRun();
run.setText(item);
run.setBold(true);
run.setFontSize(12);
return paragraph;
});
this.options.put(ParagraphStyle.HEADER2, (mainDocumentPart, item) -> {
XWPFParagraph paragraph = mainDocumentPart.createParagraph();
paragraph.setStyle("Heading2");
2018-03-01 10:14:10 +01:00
XWPFRun run = paragraph.createRun();
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");
2018-03-01 10:14:10 +01:00
XWPFRun run = paragraph.createRun();
run.setText(item);
run.setBold(true);
run.setFontSize(11);
return paragraph;
});
this.options.put(ParagraphStyle.FOOTER, (mainDocumentPart, item) -> {
XWPFParagraph paragraph = mainDocumentPart.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText(item);
return paragraph;
});
2018-10-22 12:34:39 +02:00
this.options.put(ParagraphStyle.COMMENT, (mainDocumentPart, item) -> {
XWPFParagraph paragraph = mainDocumentPart.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText(item);
run.setItalic(true);
return paragraph;
});
2018-03-01 10:14:10 +01:00
}
public XWPFDocument build(XWPFDocument document, PagedDatasetProfile pagedDatasetProfile, VisibilityRuleService visibilityRuleService) throws IOException {
2018-03-05 17:18:45 +01:00
createPages(pagedDatasetProfile.getPages(), document, true, visibilityRuleService);
2018-03-01 10:14:10 +01:00
XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
XWPFNumbering numbering = document.createNumbering();
BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
this.numId = numbering.addNum(abstractNumID);
2018-03-05 17:18:45 +01:00
createPages(pagedDatasetProfile.getPages(), document, false, visibilityRuleService);
return document;
2018-03-01 10:14:10 +01:00
}
2018-03-05 17:18:45 +01:00
public void createPages(List<DatasetProfilePage> datasetProfilePages, XWPFDocument mainDocumentPart, Boolean createListing, VisibilityRuleService visibilityRuleService) {
2018-03-01 10:14:10 +01:00
datasetProfilePages.forEach(item -> {
createSections(item.getSections(), mainDocumentPart, ParagraphStyle.HEADER1, 0, createListing, visibilityRuleService);
2018-03-01 10:14:10 +01:00
});
}
2018-03-05 17:18:45 +01:00
public void createSections(List<Section> sections, XWPFDocument mainDocumentPart, ParagraphStyle style, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService) {
2018-03-01 10:14:10 +01:00
if (createListing) this.addListing(mainDocumentPart, indent, false, true);
sections.forEach(section -> {
2018-03-05 17:18:45 +01:00
if (visibilityRuleService.isElementVisible(section.getId())) {
if (!createListing) {
2018-10-18 14:36:43 +02:00
XWPFParagraph paragraph = addParagraphContent(section.getNumbering() + " " + section.getTitle(), mainDocumentPart, style, numId);
2018-03-05 17:18:45 +01:00
CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl();
number.setVal(BigInteger.valueOf(indent));
}
createSections(section.getSections(), mainDocumentPart, ParagraphStyle.HEADER2, 1, createListing, visibilityRuleService);
createCompositeFields(section.getCompositeFields(), mainDocumentPart, 2, createListing, visibilityRuleService);
2018-03-01 10:14:10 +01:00
}
});
}
2018-03-05 17:18:45 +01:00
public void createCompositeFields(List<FieldSet> compositeFields, XWPFDocument mainDocumentPart, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService) {
2018-03-01 10:14:10 +01:00
if (createListing) this.addListing(mainDocumentPart, indent, true, true);
compositeFields.forEach(compositeField -> {
2018-03-05 17:18:45 +01:00
if (visibilityRuleService.isElementVisible(compositeField.getId())) {
if (compositeField.getTitle() != null && !compositeField.getTitle().isEmpty() && !createListing) {
2018-10-18 14:36:43 +02:00
XWPFParagraph paragraph = addParagraphContent(compositeField.getNumbering() + " " + compositeField.getTitle(), mainDocumentPart, ParagraphStyle.HEADER3, numId);
2018-03-05 17:18:45 +01:00
CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl();
number.setVal(BigInteger.valueOf(indent));
}
createFields(compositeField.getFields(), mainDocumentPart, 3, createListing, visibilityRuleService);
2018-10-22 12:34:39 +02:00
if (compositeField.getHasCommentField() && !createListing) {
XWPFParagraph paragraph = addParagraphContent("Comment: " + compositeField.getCommentFieldValue(), mainDocumentPart, ParagraphStyle.COMMENT, numId);
CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl();
number.setVal(BigInteger.valueOf(indent));
}
2018-03-01 10:14:10 +01:00
}
});
}
2018-03-05 17:18:45 +01:00
public void createFields(List<Field> fields, XWPFDocument mainDocumentPart, Integer indent, Boolean createListing, VisibilityRuleService visibilityRuleService) {
2018-03-01 10:14:10 +01:00
if (createListing) this.addListing(mainDocumentPart, indent, false, false);
fields.forEach(field -> {
2018-03-05 17:18:45 +01:00
if (visibilityRuleService.isElementVisible(field.getId())) {
if (!createListing) {
try {
XWPFParagraph paragraph = addParagraphContent(this.formatter(field), mainDocumentPart, ParagraphStyle.TEXT, numId);
CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl();
number.setVal(BigInteger.valueOf(indent));
} catch (IOException e) {
e.printStackTrace();
}
2018-03-05 17:18:45 +01:00
}
2018-03-01 10:14:10 +01:00
}
});
}
public XWPFParagraph addParagraphContent(String text, XWPFDocument mainDocumentPart, ParagraphStyle style, BigInteger numId) {
XWPFParagraph paragraph = this.options.get(style).apply(mainDocumentPart, text);
if (numId != null) {
paragraph.setNumID(numId);
}
2018-03-01 10:14:10 +01:00
return paragraph;
}
public void addStyling(List<TextStyle> styles, String color) {
}
public void addListing(XWPFDocument document, int indent, Boolean question, Boolean hasIndication) {
CTLvl cTLvl = this.cTAbstractNum.addNewLvl();
String textLevel = "";
for (int i = 0; i <= indent; i++) {
textLevel += "%" + (i + 1) + ".";
}
if (question) {
cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);
2018-03-05 17:18:45 +01:00
cTLvl.setIlvl(BigInteger.valueOf(indent));
2018-03-01 10:14:10 +01:00
} else if (!question && hasIndication) {
cTLvl.addNewNumFmt().setVal(STNumberFormat.DECIMAL);
2018-03-05 17:18:45 +01:00
cTLvl.setIlvl(BigInteger.valueOf(indent));
2018-03-01 10:14:10 +01:00
}
if (!question && !hasIndication) {
cTLvl.addNewNumFmt().setVal(STNumberFormat.NONE);
2018-03-05 17:18:45 +01:00
cTLvl.setIlvl(BigInteger.valueOf(indent));
2018-03-01 10:14:10 +01:00
}
}
public String formatter(Field field) throws IOException {
switch (field.getViewStyle().getRenderStyle()) {
case "combobox": {
String comboboxType = ((ComboBoxData) field.getData()).getType();
if (comboboxType.equals("autocomplete")) {
ObjectMapper mapper = new ObjectMapper();
if (field.getValue() == null) return null;
Map<String, String> map = mapper.readValue(field.getValue(), new TypeReference<Map<String, String>>() {
});
return map.get("label");
} else if (comboboxType.equals("wordlist")) {
ObjectMapper mapper = new ObjectMapper();
if (field.getValue() == null) return null;
Map<String, String> map = mapper.readValue(field.getValue(), new TypeReference<Map<String, String>>() {
});
return map.get("label");
}
}
case "booleanDecision":
if (field.getValue() != null && field.getValue().equals("true")) return "Yes";
else return "No";
case "radiobox":
return field.getValue();
case "checkBox":
CheckBoxData data = (CheckBoxData) field.getData();
2018-10-22 12:34:39 +02:00
if (field.getValue() == null || field.getValue().equals("false")) return null;
return data.getLabel();
case "freetext":
return field.getValue();
case "textarea":
return field.getValue();
}
return null;
}
2018-03-01 10:14:10 +01:00
}