diff --git a/dmp-backend/pom.xml b/dmp-backend/pom.xml
index 2a0c2a96b..65d13d770 100644
--- a/dmp-backend/pom.xml
+++ b/dmp-backend/pom.xml
@@ -185,6 +185,19 @@
commons-lang3
3.5
+
+
+ org.apache.poi
+ poi-ooxml
+ 3.17
+
+
+
+ org.apache.poi
+ poi
+ 3.17
+
+
@@ -247,6 +260,12 @@
provided
+
+
+ profile
+ production
+
+
\ No newline at end of file
diff --git a/dmp-backend/src/main/java/eu/eudat/controllers/DatasetWizardController.java b/dmp-backend/src/main/java/eu/eudat/controllers/DatasetWizardController.java
index d2fbcbcbf..989406bbf 100644
--- a/dmp-backend/src/main/java/eu/eudat/controllers/DatasetWizardController.java
+++ b/dmp-backend/src/main/java/eu/eudat/controllers/DatasetWizardController.java
@@ -13,11 +13,17 @@ import eu.eudat.models.security.Principal;
import eu.eudat.services.ApiContext;
import eu.eudat.types.ApiMessageCode;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.InputStreamResource;
+import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.transaction.Transactional;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
import java.util.List;
@@ -81,4 +87,22 @@ public class DatasetWizardController extends BaseController {
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new ResponseItem().status(ApiMessageCode.DEFAULT_ERROR_MESSAGE).message(ex.getMessage()));
}
}
+
+ @RequestMapping(method = RequestMethod.GET, value = {"/getWordDocument/{id}"}, produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
+ public @ResponseBody
+ ResponseEntity getWordDocument(@PathVariable String id) {
+ try {
+ File file = new DatasetManager().getWordDocument(this.getApiContext().getDatabaseRepository().getDatasetDao(), id);
+ InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
+
+ return ResponseEntity.ok()
+ .header(HttpHeaders.CONTENT_DISPOSITION,
+ "attachment;filename=" + file.getName())
+ .contentType(MediaType.APPLICATION_PDF).contentLength(file.length())
+ .body(resource);
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return new ResponseEntity(HttpStatus.BAD_REQUEST);
+ }
+ }
}
diff --git a/dmp-backend/src/main/java/eu/eudat/documents/types/ParagraphStyle.java b/dmp-backend/src/main/java/eu/eudat/documents/types/ParagraphStyle.java
new file mode 100644
index 000000000..bd38cdbd1
--- /dev/null
+++ b/dmp-backend/src/main/java/eu/eudat/documents/types/ParagraphStyle.java
@@ -0,0 +1,41 @@
+package eu.eudat.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);
+
+ private Integer value;
+
+ private ParagraphStyle(Integer value) {
+ this.value = value;
+ }
+
+ public Integer getValue() {
+ return value;
+ }
+
+ public static ParagraphStyle fromInteger(Integer value) {
+ switch (value) {
+ case 0:
+ return TEXT;
+ case 1:
+ return HEADER1;
+ case 2:
+ return HEADER2;
+ case 3:
+ return HEADER3;
+ case 4:
+ return HEADER4;
+ case 5:
+ return TITLE;
+ case 6:
+ return FOOTER;
+ case 7:
+ return COMMENT;
+ default:
+ throw new RuntimeException("Unsupported ParagraphStyle Code");
+ }
+ }
+}
diff --git a/dmp-backend/src/main/java/eu/eudat/documents/types/TextStyle.java b/dmp-backend/src/main/java/eu/eudat/documents/types/TextStyle.java
new file mode 100644
index 000000000..ad42d9eec
--- /dev/null
+++ b/dmp-backend/src/main/java/eu/eudat/documents/types/TextStyle.java
@@ -0,0 +1,31 @@
+package eu.eudat.documents.types;
+
+/**
+ * Created by ikalyvas on 2/27/2018.
+ */
+public enum TextStyle {
+ ITALIC(0), BOLD(1), CAPS(2);
+
+ private Integer value;
+
+ private TextStyle(Integer value) {
+ this.value = value;
+ }
+
+ public Integer getValue() {
+ return value;
+ }
+
+ public static TextStyle fromInteger(Integer value) {
+ switch (value) {
+ case 0:
+ return ITALIC;
+ case 1:
+ return BOLD;
+ case 2:
+ return CAPS;
+ default:
+ throw new RuntimeException("Unsupported TextStyle Code");
+ }
+ }
+}
diff --git a/dmp-backend/src/main/java/eu/eudat/documents/word/WordBuilder.java b/dmp-backend/src/main/java/eu/eudat/documents/word/WordBuilder.java
new file mode 100644
index 000000000..ee390b215
--- /dev/null
+++ b/dmp-backend/src/main/java/eu/eudat/documents/word/WordBuilder.java
@@ -0,0 +1,193 @@
+package eu.eudat.documents.word;
+
+import eu.eudat.documents.types.ParagraphStyle;
+import eu.eudat.documents.types.TextStyle;
+import eu.eudat.models.user.components.datasetprofile.Field;
+import eu.eudat.models.user.components.datasetprofile.FieldSet;
+import eu.eudat.models.user.components.datasetprofile.Section;
+import eu.eudat.models.user.composite.DatasetProfilePage;
+import eu.eudat.models.user.composite.PagedDatasetProfile;
+import eu.eudat.utilities.interfaces.Applier;
+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;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+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 {
+
+ private Map> options = new HashMap<>();
+ private CTAbstractNum cTAbstractNum;
+ private BigInteger numId;
+
+ public WordBuilder() {
+ this.cTAbstractNum = CTAbstractNum.Factory.newInstance();
+ this.cTAbstractNum.setAbstractNumId(BigInteger.valueOf(1));
+ }
+
+ 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();
+ 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();
+ XWPFRun run = paragraph.createRun();
+ run.setText(item);
+ run.setBold(true);
+ run.setFontSize(12);
+ run.setUnderline(UnderlinePatterns.SINGLE);
+ return paragraph;
+ });
+ this.options.put(ParagraphStyle.HEADER2, (mainDocumentPart, item) -> {
+ XWPFParagraph paragraph = mainDocumentPart.createParagraph();
+ XWPFRun run = paragraph.createRun();
+ run.setText(item);
+ run.setBold(true);
+ run.setFontSize(12);
+ run.setUnderline(UnderlinePatterns.SINGLE);
+ return paragraph;
+ });
+ this.options.put(ParagraphStyle.HEADER3, (mainDocumentPart, item) -> {
+ XWPFParagraph paragraph = mainDocumentPart.createParagraph();
+ XWPFRun run = paragraph.createRun();
+ run.setText(item);
+ run.setBold(true);
+ run.setFontSize(11);
+ run.setUnderline(UnderlinePatterns.SINGLE);
+ return paragraph;
+ });
+ this.options.put(ParagraphStyle.FOOTER, (mainDocumentPart, item) -> {
+ XWPFParagraph paragraph = mainDocumentPart.createParagraph();
+ XWPFRun run = paragraph.createRun();
+ run.setText(item);
+ return paragraph;
+ });
+ }
+
+ public File build(PagedDatasetProfile pagedDatasetProfile) throws IOException {
+ XWPFDocument document = new XWPFDocument();
+
+ this.buildOptions();
+ createPages(pagedDatasetProfile.getPages(), document, true);
+ XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum);
+ XWPFNumbering numbering = document.createNumbering();
+ BigInteger abstractNumID = numbering.addAbstractNum(abstractNum);
+ this.numId = numbering.addNum(abstractNumID);
+ createPages(pagedDatasetProfile.getPages(), document, false);
+ File exportFile = new File("welcome.docx");
+ FileOutputStream out = new FileOutputStream(exportFile);
+ document.write(out);
+ out.close();
+ return exportFile;
+ }
+
+ public void createPages(List datasetProfilePages, XWPFDocument mainDocumentPart, Boolean createListing) {
+ //if (createListing) this.addListing(mainDocumentPart, 0, false, true);
+ datasetProfilePages.forEach(item -> {
+ createSections(item.getSections(), mainDocumentPart, ParagraphStyle.TITLE, 0, createListing);
+ });
+ }
+
+ public void createSections(List sections, XWPFDocument mainDocumentPart, ParagraphStyle style, Integer indent, Boolean createListing) {
+ if (createListing) this.addListing(mainDocumentPart, indent, false, true);
+ BigInteger listing = numId;
+ sections.forEach(section -> {
+ if (!createListing) {
+ XWPFParagraph paragraph = addParagraphContent(section.getTitle(), mainDocumentPart, style, listing);
+ CTDecimalNumber number = paragraph.getCTP().getPPr().getNumPr().addNewIlvl();
+ number.setVal(BigInteger.valueOf(indent));
+ }
+ createSections(section.getSections(), mainDocumentPart, ParagraphStyle.HEADER2, 1, createListing);
+ createCompositeFields(section.getCompositeFields(), mainDocumentPart, 2, createListing);
+ });
+ }
+
+ public void createCompositeFields(List