Für ein paar Testfälle wird valides HTML geprinted. Ich weiß aber nicht ob immer.
print(name, "") -> Leerzeile im Kontext name einfügen print(name, val) -> val im Kontext name einfügen ODER neuen Kontext name mit val einfügen, wenn nicht bereits im Kontext name
Beispiel:
print("TABELLE", tabelle); // nur Tabelle dann hr
// ....
for (Item item : items) {
print("ITEMS", item); // Item und item
}
print("ITEMS", ""); // br in Item
for (int i = 0; i < 3; i++) {
Item item = items.get(i);
print("ITEMS", item); // item in Item
// ....
print("TABELLE", tabelle);
// ....
print("Click: " + url, ""); // nur Click dann hr
// ....
print("TABELLE", tabelle);
// ....
Ein Teil markieren, refactor -> Extract Method und passenden Namen nehmen.
System.out.println ist wenn man automatisiert Testen möchte nicht unbedingt das geeignetste.
Du kannst der Methode auch einfach einen PrintSream übergeben und dort dann print und println aufrufen.
Und in der main-Methode übergibst du dann für den PrintStream einfach System.out.
Die andere Alternative ist String als Rückgabetyp deiner printMethode anstelle von void und System.out.println(…);
Jetzt kann man natürlich auch hingehen und das HTML abstrahieren oder man verwendet eine Templatesprache wie zum Beispiel Apache Velocity, StringTemplate, FreeMarker oder Thymeleaf.
Der Vorteil eines Templates ist, dass es eben schon sehr stark nach HTML aussieht und dann nur die Platzhalter via Model gesetzt werden müssen.
Und wenn man nun noch anstelle der < br /> für den Zeilenumbruch das ganze in ein < p > -Paragraph wrappt und einfach am Ende dann eine Horizontale Linie einzieht, dann spart man sich auch die meisten dieser Verzweigungen. Der Paragraph sorgt in der Regel automatisch für die nötigen Umbrüche.
Generell hast du es schon richtig erkannt: die Methode ist zu komplex. Viel zu komplex. Eine einfache Faustregel nach der du gehen kannst: Wenn du einen Einzeiler-Kommentar in deiner Methode drin irgendwo ranpacken willst, dann kannst du das auch direkt als Methode auslagern.
Anstelle von Create customer account könntest du hier eine Methode erstellen die createCustomerAccount heißt. Die kann dokumentiert sein + kann einzeln getestet werden.
Ansonsten wie ionutbalu schon gesagt hat: System.out.println ist keine gute Idee. Gib das Ergebnis zurück und auch hier gilt: wähle den kleinsten gemeinsamen Nenner: string. Klar könntest du einen PrintStream übergeben - aber dann wäre das Ergebnis auf den Stream limitiert. Es gibt keinen Grund für diese Limitierung. Das ganze als String zurückgeben sorgt dafür, dass die Methode eine höhere Wiederverwendbarkeit aufweist.
Lohnt sich. Das würde es dir erheblich vereinfachen.
Ansonsten wird die Ausgabe in eine Datei umgeleitet, das HTML überprüft und aus dem HTML ein PDF erstellt. Das sieht dann (wieder nach Grafik umgewandelt) zum Bleistift so aus:
Im unteren Drittel sieht man, dass unter Items ein Zeilenumbruch eingefügt wurde, und die Zeilenumbrüche auch richtig gesetzt wurden.
.renderFormatted() liefert auf jeden Fall wohlgeformtes, valides, hübsches HTML zurück…
addNameToDivTag() startet sozusagen eine neue Überschrift,
addValueToDivTag() fügt einen Wert zu der sozusagen bereits Überschrift hinzu.
(leider verwenden die render-Methoden Stringjoins und diese gibt’s erst in Java 8 deswegen kann ich j2html nicht verwenden)