All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.svws_nrw.module.reporting.html.HtmlBuilder Maven / Gradle / Ivy

Go to download

Diese Bibliothek unterstützt das Generieren von Reports in den Formaten HTML und PDF für die Schulverwaltungssoftware in NRW

There is a newer version: 1.0.1
Show newest version
package de.svws_nrw.module.reporting.html;

import de.svws_nrw.module.reporting.html.contexts.HtmlContext;
import de.svws_nrw.module.reporting.html.dialects.ConvertExpressionDialect;
import jakarta.ws.rs.core.Response;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.StringTemplateResolver;

import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * Erzeugt aus einem Thymeleaf-html-Template (html-Vorlage) und den zugehörigen Daten in den Contexts das finale html inklusive der Daten.
 */
public class HtmlBuilder {

    /** Html-Inhalt der Vorlagendatei. */
    private final String htmlVorlage;

	/** Html-Inhalt der finalen Html-Datei. */
	private String htmlFinal;

    /** Liste mit Daten-Contexts, die zu einem finalen Context zusammengefügt werden, um damit das html-Template zu füllen. */
    private final List contexts;

	/** Dateiname der html-Datei. */
	private String dateiname;



    /**
     * Erstellt einen neunen html-Builder und initialisiert die Variablen
	 * @param htmlVorlage   Der Inhalt einer Html-Vorlagendatei, die mit Daten gefüllt werden soll.
     * @param contexts 	    Liste mit Daten-Contexts, die zu einem finalen Context zusammengefügt werden, um damit das html-Template zu füllen.
	 * @param dateiname 	Dateiname der html-Datei ohne Dateiendung.
     */
    public HtmlBuilder(final String htmlVorlage, final List contexts, final String dateiname) {
		this.htmlVorlage = htmlVorlage;
        this.contexts = contexts;
		this.dateiname = dateiname;
		this.htmlFinal = "";
    }


	/**
	 * Gibt den Dateinamen der Html-Datei zurück.
	 * @return Dateiname der Html-Datei.
	 */
	public String getDateiname() {
		return dateiname;
	}

	/**
	 * Gibt den Dateinamen der Html-Datei mit Dateiendung zurück.
	 * @return Dateiname der Html-Datei mit Endung.
	 */
	public String getDateinameMitEndung() {
		return dateiname + ".html";
	}


	/**
	 * Gibt den finalen Html-Inhalt als String zurück.
	 * @return String des finalen Html-Inhaltes.
	 */
	public String getHtml() {
		return erzeugeHtml();
	}


	/**
	 * Gibt den finalen Html-Inhalt in Form eines Byte-Arrays.
	 * @return 	das Byte-Array des finalen Html-Inhaltes im UTF-8-Format.
	 */
	public byte[] getHtmlByteArray() {
		return erzeugeHtml().getBytes(StandardCharsets.UTF_8);
	}


	/**
	 * Erzeugt eine Response mit einer Html-Datei als Content
	 * @return Response mit der Html-Datei als Content
	 */
	public Response getHtmlResponse() {
		final String encodedFilename = "filename*=UTF-8''" + URLEncoder.encode(dateiname, StandardCharsets.UTF_8);
		final String html = erzeugeHtml();
		return Response.ok(html, "text/html")
			.header("Content-Disposition", "attachment; " + encodedFilename)
			.build();
	}


    /**
     * Erstellt das finale Html-Dokument mit den Daten.
     * Hierzu werden die Variablen in der Html-Vorlage durch Daten ersetzt.
     * @return 	Das finale Html mit den Daten
     */
    private String erzeugeHtml() {

		// Wurde das finale Html bereits erzeugt, gebe dieses zurück.
		if (!htmlFinal.isEmpty())
			return htmlFinal;

        StringTemplateResolver resolver = new StringTemplateResolver();
        resolver.setTemplateMode(TemplateMode.HTML);

        TemplateEngine templateEngine = new TemplateEngine();
		templateEngine.setTemplateResolver(resolver);

		// Dialects des SVWS-Servers für weitere Funktionen hinzufügen.
		templateEngine.addDialect(new ConvertExpressionDialect());

        // Füge die übergebenen Contexts zu einem Context zusammen.
        Context finalContext = new Context();
        if (contexts != null && !contexts.isEmpty()) {
            for (HtmlContext htmlCtx : contexts) {
                for (final String variable : htmlCtx.getContext().getVariableNames()) {
                    finalContext.setVariable(variable, htmlCtx.getContext().getVariable(variable));
                }
            }
        }

		htmlFinal = (!(finalContext.getVariableNames().isEmpty() || htmlVorlage == null)) ? templateEngine.process(htmlVorlage, finalContext) : "";
		return htmlFinal;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy