From 0cc182d5dbc185853463cf9ee2834ca5b1b70bce Mon Sep 17 00:00:00 2001
From: tudtianus <tudtianus@gmail.com>
Date: Fri, 14 Sep 2018 13:19:57 +0200
Subject: [PATCH] #65 feat: added methods for pdf export of EPortfolio

---
 gemeinsamforschen/pom.xml                     |   9 +-
 .../unipotsdam/gf/interfaces/IJournal.java    |  12 +-
 .../modules/journal/service/IJournalImpl.java | 155 +++++++++++++++++-
 3 files changed, 164 insertions(+), 12 deletions(-)

diff --git a/gemeinsamforschen/pom.xml b/gemeinsamforschen/pom.xml
index 1f8ac102..e48430b7 100644
--- a/gemeinsamforschen/pom.xml
+++ b/gemeinsamforschen/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xmlns="http://maven.apache.org/POM/4.0.0"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
 
@@ -207,6 +207,11 @@
             <version>7.1.1.RELEASE</version>
         </dependency>
 
+        <dependency>
+            <groupId>eu.de-swaef.pdf</groupId>
+            <artifactId>Markdown2Pdf</artifactId>
+            <version>2.0.1</version>
+        </dependency>
 
     </dependencies>
 
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IJournal.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IJournal.java
index 6d28297f..441d3e67 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IJournal.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/interfaces/IJournal.java
@@ -10,8 +10,6 @@ import unipotsdam.gf.modules.researchreport.ResearchReport;
 import java.io.File;
 import java.util.List;
 
-import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
-
 /**
  * Interface for learning journal
  */
@@ -20,14 +18,14 @@ public interface IJournal {
 
     /**
      * check if all students have prepared their portfolios to be evaluated
-     * @return
-     * @param project
+     * @return true if all students have prepared their portfolios
+     * @param project project
      */
     Boolean getPortfoliosForEvaluationPrepared(Project project) ;
 
     /**
      * find out, who hasn't prepared their portfolio for evaluation and send message or highlight in view
-     * @param project
+     * @param project project
      */
     void assignMissingPortfolioTasks(Project project) ;
 
@@ -52,9 +50,11 @@ public interface IJournal {
 
     /**
      * Gets EPortfolio for assesment
-     * @param project
+     * @param project project
      * @return EPortfolio (containing Report, ProjectDescription and Journal)
      */
 
     EPortfolio getFinalPortfolioForAssessment(Project project, User user) ;
+
+    byte[] exportPortfolioToPdf(EPortfolio ePortfolio);
 }
diff --git a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/IJournalImpl.java b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/IJournalImpl.java
index d4e9d8a8..8ab10e7c 100644
--- a/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/IJournalImpl.java
+++ b/gemeinsamforschen/src/main/java/unipotsdam/gf/modules/journal/service/IJournalImpl.java
@@ -1,5 +1,8 @@
 package unipotsdam.gf.modules.journal.service;
 
+import com.qkyrie.markdown2pdf.Markdown2PdfConverter;
+import com.qkyrie.markdown2pdf.internal.exceptions.ConversionException;
+import com.qkyrie.markdown2pdf.internal.exceptions.Markdown2PdfLogicException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import unipotsdam.gf.core.management.project.Project;
@@ -8,10 +11,14 @@ import unipotsdam.gf.interfaces.IJournal;
 import unipotsdam.gf.modules.assessment.controller.model.StudentIdentifier;
 import unipotsdam.gf.modules.journal.model.EPortfolio;
 import unipotsdam.gf.modules.journal.model.Journal;
+import unipotsdam.gf.modules.peer2peerfeedback.Category;
 import unipotsdam.gf.modules.researchreport.ResearchReport;
 
 import java.io.File;
+import java.io.FileOutputStream;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 public class IJournalImpl implements IJournal {
@@ -21,6 +28,7 @@ public class IJournalImpl implements IJournal {
     private final JournalService journalService = new JournalServiceImpl();
     private final ProjectDescriptionService descriptionService = new ProjectDescriptionImpl();
 
+    private final SimpleDateFormat jdf = new SimpleDateFormat("dd.MM.yyyy HH:mm");
 
     @Override
     public Boolean getPortfoliosForEvaluationPrepared(Project project) {
@@ -33,7 +41,7 @@ public class IJournalImpl implements IJournal {
 
         ArrayList<User> descUser = descriptionService.getOpenUserByProject(project);
 
-        for(User user : descUser){
+        for (User user : descUser) {
 
             log.debug("Send close description message to user {}", user.getId());
             //TODO send message when implemented
@@ -42,7 +50,7 @@ public class IJournalImpl implements IJournal {
 
         ArrayList<User> journalUser = journalService.getOpenUserByProject(project);
 
-        for(User user : journalUser){
+        for (User user : journalUser) {
 
             log.debug("Send close journal message to user {}", user.getId());
             //TODO send message when implemented
@@ -66,14 +74,153 @@ public class IJournalImpl implements IJournal {
     public EPortfolio getFinalPortfolioForAssessment(Project project, User user) {
 
         EPortfolio result = new EPortfolio();
-        StudentIdentifier studentIdentifier = new StudentIdentifier(project.getId(),user.getId());
+        StudentIdentifier studentIdentifier = new StudentIdentifier(project.getId(), user.getId());
 
         result.setDescription(descriptionService.getProjectByStudent(studentIdentifier));
-        result.setJournals(journalService.getAllJournals(user.getId(),project.getId()));
+        result.setJournals(journalService.getAllJournals(user.getId(), project.getId()));
         //TODO result.setReport(...);
 
         return result;
     }
 
+    @Override
+    public byte[] exportPortfolioToPdf(EPortfolio ePortfolio) {
+
+        final byte[][] res = new byte[1][1];
+
+        //Build String
+        String input = ePortfolioToString(ePortfolio);
+
+        //Convert
+        try {
+            Markdown2PdfConverter
+                    .newConverter()
+                    .readFrom(() -> input)
+                    .writeTo(out -> {
+                        //TODO für rest anpassen
+                        FileOutputStream outputStream;
+                        res[0] = out;
+                        try {
+                            outputStream = new FileOutputStream("C:\\Users\\thomas\\Desktop\\test_" + new Date().getTime() + ".pdf");
+                            outputStream.write(out);
+                            outputStream.close();
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                    })
+                    .doIt();
+        } catch (ConversionException | Markdown2PdfLogicException e) {
+            //TODO
+            e.printStackTrace();
+        }
+
+
+        //Return
+        return res[0];
+    }
+
+    //TODO Formatierung
+    private String ePortfolioToString(EPortfolio ePortfolio) {
+
+        StringBuilder result = new StringBuilder();
+
+        //If Description exists, add to pdf
+        if (ePortfolio.getDescription() != null) {
+            result.append("#Portfolio# \n\n");
+            result.append(ePortfolio.getDescription().getDescriptionMD()).append("\n");
+        }
+
+        //If Journals and Report exists combine
+        if (ePortfolio.getReport() != null && ePortfolio.getJournals() != null && !ePortfolio.getJournals().isEmpty()) {
+
+            ArrayList<Journal> journals = ePortfolio.getJournals();
+            ResearchReport researchReport = ePortfolio.getReport();
+
+            //TODO zuordnung Absprechen
+            result.append(researchReport.getTitle()).append("\n");
+            result.append(journalStringByCategory(journals, Category.TITEL));
+
+            result.append(researchReport.getResearchQuestion()).append("\n");
+            result.append(journalStringByCategory(journals, Category.FORSCHUNGSFRAGE));
+
+
+            for (String s : researchReport.getLearningGoals()) {
+                result.append(s).append("\n");
+            }
+
+            result.append(researchReport.getMethod()).append("\n");
+
+            //TODO ???????
+            result.append(journalStringByCategory(journals, Category.UNTERSUCHUNGSKONZEPT));
+            result.append(journalStringByCategory(journals, Category.METHODIK));
+
+            result.append(researchReport.getResearch()).append("\n");
+            result.append(journalStringByCategory(journals, Category.RECHERCHE));
+
+            result.append(researchReport.getResearchResult()).append("\n");
+            result.append(journalStringByCategory(journals, Category.DURCHFUEHRUNG));
+
+
+            result.append(researchReport.getEvaluation()).append("\n");
+            result.append(journalStringByCategory(journals, Category.AUSWERTUNG));
+
+            //TODO Extract String when implemented
+            result.append(researchReport.getBibliography()).append("\n");
+            result.append(journalStringByCategory(journals, Category.LITERATURVERZEICHNIS));
+
+
+        }
+
+        //if Report but no Journals, add Report
+        else if (ePortfolio.getReport() != null) {
+            ResearchReport report = ePortfolio.getReport();
+
+            result.append(report.getTitle()).append("\n");
+
+            result.append(report.getResearchQuestion()).append("\n");
+
+            for (String s : report.getLearningGoals()) {
+                result.append(s).append("\n");
+            }
+
+            result.append(report.getMethod()).append("\n");
+
+            result.append(report.getResearch()).append("\n");
+
+            result.append(report.getResearchResult()).append("\n");
+
+            result.append(report.getEvaluation()).append("\n");
+
+            //TODO Extract String when implemented
+            result.append(report.getBibliography()).append("\n");
+
+        }
+
+        //If Journal but no Report
+        else if (ePortfolio.getJournals() != null) {
+            result.append("##Lerntagebuch## \n\n");
+
+            for (Journal j : ePortfolio.getJournals()) {
+                result.append(journalAsString(j));
+            }
+        }
+
+        return result.toString();
+    }
+
+    private String journalStringByCategory(ArrayList<Journal> journals, Category c) {
+        StringBuilder str = new StringBuilder();
+        for (Journal j : journals) {
+            if (j.getCategory().equals(c)) {
+                str.append(journalAsString(j));
+            }
+        }
+        return str.toString();
+    }
+
+    private String journalAsString(Journal j) {
+        return jdf.format(new Date(j.getTimestamp())) + " " + j.getCategory() + "\n" + j.getEntryMD() + "\n";
+    }
+
 
 }
-- 
GitLab