Update of exercises

main
Thomas Smits 2025-09-16 17:09:16 +02:00
parent feef1aa28e
commit 7c9616863f
19 changed files with 1449 additions and 2 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,179 @@
# Umgebung aufsetzen
**🎓 Benotetes Assignment 🎓**
📆 **Fällig: 01.10.2025** 📆
## Lernziel
Umgebung für die Vorlesung aufsetzen.
## Beschreibung
In diesem Assignment werden Sie die notwendige Tool-Umgebung für die Bearbeitung der Aufgaben aus der Vorlesung aufsetzen.
Die Abgabe der Aufgaben und die Tests sind automatisiert, sodass Sie auf jeden Fall die passenden Werkzeuge installieren müssen, damit Sie die Übungen durchführen können. Bitte halten Sie sich an die folgenden Anweisungen und nehmen Sie keine "Abkürzungen".
## Softwareausstattung
### Linux
Wenn Sie einen eigenen Rechner für die Veranstaltung verwenden wollen -- was dringend zu empfehlen ist, installieren Sie bitte (direkt auf dem Gerät oder in einer VM) ein **64-Bit Ubuntu Linux** in einer aktuellen Version (z.B. 24.04). Eine Anleitung und Unterstützung finden Sie [hier](https://github.com/informatik-mannheim/linux-hsma/blob/master/doc/readme.md). Die Anleitung ist umfangreich und beschreibt, wie Sie ein vollständiges System aufsetzen. Wenn Sie Linux in einer VM betreiben, können Sie sich das vollständige Setup sparen und nur ein grundlegendes System installieren.
Wenn Sie ein anderes Linux verwenden wollen, prüfen Sie vorher, ob es für dieses ein JDK 21 gibt. Mit Ubuntu 24.04 sind Sie auf der sicheren Seite.
Bitte versuchen Sie nicht, die Übungen ohne Linux zu lösen, es wartet eine Welt der Frustration und des Schmerzes 😭 auf Sie, durch die schon viele andere gegangen sind, die diesen einen wichtigen Tipp ignoriert haben.
### Programme
Bevor Sie Programme installieren, sollten Sie vorweg einmal das Kommando `sudo apt update` ausführen. Mit `sudo apt upgrade` halten Sie Ihr System jederzeit aktuell.
Nachdem Sie Linux installiert haben, fügen Sie die folgende Software in mindestens der angegebenen Version hinzu:
* **Java JDK 21**<br>`sudo apt install openjdk-21-jdk openjdk-21-source openjdk-21-doc`
* **Git** und Git-Frontends<br>`sudo apt install git meld git-cola`
* **Maven 3.8 oder neuer**<br>`sudo apt install maven`
* **Eclipse**<br>Von der [Webseite](https://www.eclipse.org/downloads/) herunterladen und installieren. Bitte verwenden Sie die neueste Version von **Eclipse IDE for Java Developers**
## Aufsetzen der Arbeitsumgebung
### Setup von Git
Setzen Sie bei Git die notwendigen Nutzerinformationen, über die passenden Kommandos:
```console
$ git config --global user.name "Mona Lisa"
$ git config --global user.email "mona.lisa@louvre.fr"
```
_Benutzen Sie bitte Ihren Namen und Ihre HS-Mannheim-E-Mail-Adresse. Jede Abgabe als Mona Lisa wird mit Punktabzug bestraft_!
Nun sollten Sie noch die Merge-Strategie konfigurieren. Damit teilen Sie Git mit, wie Änderungen zusammengeführt werden sollen.
```console
$ git config --global pull.rebase false
```
### ssh-Key erzeugen
Damit Sie Ihre Abgaben automatisiert durchführen können und nicht immer wieder Ihren Benutzernamen und Ihr Passwort eingeben müssen, erzeugen Sie sich einen SSH-Key. `hugo` müssen Sie durch Ihren wirklichen Benutzernamen ersetzen,
```console
$ mkdir -p ~/.ssh
$ chmod og-rwx ~/.ssh
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/hugo/.ssh/id_rsa): ⏎
Enter passphrase (empty for no passphrase): ⏎
Enter same passphrase again: ⏎
Your identification has been saved in /home/hugo/.ssh/id_rsa
Your public key has been saved in /home/hugo/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:jnxRiAreSWFBlHP3zOzggy9YIhd8T+A5AFBA2f8ioKQ hugo@meinrechnername
The key's randomart image is:
+---[RSA 3072]----+
|+==+*o |
| . o+.o... |
| ..o=.+.=. |
| + +o+= o.= |
|+ o +o.*So |
|E ..ooo++.. |
| o.++.o. |
| . ... |
| . |
+----[SHA256]-----+
```
Der ssh-Key liegen jetzt im Verzeichnis `.ssh` in Ihrem Home-Directory. Im Beispiel haben wir den Default-Namen `id_rsa` für den Key verwendet. Sie finden in dem Verzeichnis jetzt mindestens zwei Dateien:
* `id_rsa` für den Secret-Key
* `id_rsa.pub` für den Public-Key
Haben Sie einen anderen Namen angegeben, dann heißen die Schlüssel natürlich entsprechend anders. In diesem Fall kann es auch nötig sein, den Schlüssel `ssh` erst bekannt zu machen.
Den __Public-Key__ müssen Sie dann auf dem Git-Server hinterlegen.
1. Öffnen Sie die URL `https://gitty.informatik.hs-mannheim.de` und melden Sie sich mit Ihrem Hochschulaccount an
2. Gehen Sie auf Ihren Nutzer, dann auf "Settings" und danach auch "SSH/GPG Keys".
3. Fügen Sie über den Knopf _Add Key_ den **Public Key** des soeben erzeugten Schlüssels hinzu, also den Inhalt der Datei `.ssh/id_rsa.pub`.
4. Testen Sie den Schlüssel:
* Falls Sie nicht an der Hochschule sind, bauen Sie eine VPN-Verbindung auf, damit Sie sich im Netz der Hochschule befinden
* Öffnen Sie eine Konsole
* Geben Sie `ssh gitea@gitty.informatik.hs-mannheim.de` ein.
* Sie sollten die Meldung bekommen, mit welchem Schlüssel Sie sich authentifiziert haben.
```console
$ ssh gitea@gitty.informatik.hs-mannheim.de
Hi there, hugo! You've successfully authenticated with the key named hugo@meinrechnername, but Gitea does not provide shell access.
If this is unexpected, please log in with password and setup Gitea under another user.
Connection to gitty.informatik.hs-mannheim.de closed.
```
### Repository
Alle Ihre Abgaben erfolgen über ein Ihnen zugeordnetes Repository. Dieses Repository werden anhand der Gruppen angelegt, in die Sie sich eingetragen haben. Sobald es für Sie erzeugt wurde, sollte es Ihnen nach dem Login angezeigt werden, wenn Sie in die [Organisation pr2-lecture](https://gitty.informatik.hs-mannheim.de/pr2-lecture) gehen. (Sollten Sie einen `Fehler 404` bekommen, haben Sie vergessen sich auf der Webseite anzumelden.)
Gehen Sie auf Ihre Repository und kopieren Sie sich die "Clone URL" für ssh:
<img src="img/gitty_clone.png" width="500">
**Achtung:** Verwenden Sie **nicht** die https-URL.
### Working Directory
Suchen Sie sich auf Ihrem Rechner eine Stelle, an der Sie in Zukunft alle Quelltexte und Aufgaben für PR2 bearbeiten wollen (__Working Directory__). Wir gehen im Folgenden davon aus, dass Sie einfach innerhalb von `~/Documents` arbeiten. Verwenden Sie keinen Dropbox-, Google- oder OneDrive-Ordner, weil diese häufig zu Problemen im Zusammenhang mit Git führen.
Öffnen Sie das Working Directory in einer Konsole und clonen Sie Ihr Git-Repository mit der URL, die Sie im vorhergehenden Schritt ausgelesen haben. Hier als Beispiel für `team-01`.
```console
$ git clone gitea@gitty.informatik.hs-mannheim.de:pr2-lecture/team-01.git
$ cd team-01/
```
In dem Verzeichnis sollten bereits ein paar Dateien vorhanden sein, insbesondere ein Ordner `bin`.
### Aktuelle Aufgaben holen
Im Ordner `bin` Ihres Working Directory finden Sie zwei Skripte:
* `update.sh`: Aktualisiert Ihr Verzeichnis und holt die aktuellen Aufgaben.
* `submit.sh`: Reicht Ihre Lösungen ein.
Holen Sie nun die aktuellen Aufgaben, indem Sie das `update.sh`-Skript ausführen.
Führen Sie das Skript aus dem Arbeitsverzeichnis mit `bin/update.sh` aus und gehen Sie **nicht** in den `bin`-Ordner.
```console
$ bin/update.sh
Cloning into '.assignments'...
remote: Enumerating objects: 142, done.
remote: Counting objects: 100% (15/15), done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 142 (delta 0), reused 0 (delta 0), pack-reused 127
Receiving objects: 100% (142/142), 56.99 KiB | 3.00 MiB/s, done.
Resolving deltas: 100% (59/59), done.
---------------------------------------------------------------
Hole neue Aufgaben und Quelltexte
---------------------------------------------------------------
From gitty.informatik.hs-mannheim.de:pr2-lecture/assignments
* branch master -> FETCH_HEAD
Already up to date.
```
Sie sehen jetzt folgende Dateien und Ordner in Ihrem Verzeichnis (Anzeige mit `ls -axl`):
* `.assignments` - Arbeitsverzeichnis für das Laden der Aufgaben
* `.git` - Arbeitsverzeichnis für GIT
* `.gitignore` - Konfiguration für GIT
* `bin` - Skripte
* `Assignment_xx` - einzelne Aufgaben
* `README.md` - Überblick über alle Aufgaben
* `sources` - Quelltexte
Wenn Sie bei dem Versuch das Skript zu starten, die **Fehlermeldung** `cannot execute: required file not found` bekommen, ist Ihre `bash` an einer anderen Stelle als `/usr/bin` installiert. Rufen Sie das Skript in diesem Fall einfach mit `bash bin/update.sh` auf.
## Abgabe
Für dieses Assignment gibt es __keine Abgabe__.

View File

@ -0,0 +1,109 @@
# Erster Commit
**🎓 Benotetes Assignment 🎓**
📆 **Fällig: 01.10.2025** 📆
## Lernziel
Einen ersten Commit erfolgreich einchecken, pushen und testen.
## Aufgabe
Es ist wichtig, dass Sie diese Aufgabe erfolgreich abschließen. Der Ablauf ist die Vorlage für alle weiteren Übungen, welche Sie fristgerecht einreichen müssen. Diese Aufgabe ist zwar trivial, zeigt Ihnen aber den generellen Ablauf.
Lesen Sie deswegen dieses Assignment sehr sorgfältig und führen Sie die beschriebenen Schritte durch.
Die folgenden Schritte beziehen sich auf Ihr persönliches Repository, dass Sie im vorhergehenden Assignment angelegt und konfiguriert haben. Sie arbeiten in Ihrer lokalen Kopie, dem __Working Directory__ und übertragen Ihre Ergebnisse am Ende in das Repository auf dem zentralen Git-Server.
Wie Sie die Umgebung aufsetzen, wurde im vorhergehenden Assignment erläutert. Sorgen Sie dafür, dass Sie den aktuellen Stand der Aufgaben haben, indem Sie in Ihrem Working Directory `bin/update.sh` aufrufen.
### Eclipse einrichten
Hier erhalten Sie eine Anleitung, wie Sie Eclipse für die Bearbeitung der Aufgaben einrichten.
1. Legen Sie einen neuen Workspace für die Vorlesung PR2 an. Es empfiehlt sich, diesen in einem Unterverzeichnis, z.B. `eclipse-workspace` in Ihrem Working Directory anzulegen. Allerdings sollten Sie das Verzeichnis dann über die `.gitignore`-Datei von der Versionsverwaltung ausschließen. Auf keinen Fall sollten Sie den Workspace mit unter die Versionsverwaltung stellen.
2. Erzeugen Sie mit `File` -> `New` -> `Java Project` ein neues Java-Projekt.
* Geben Sie dem Projekt einen beliebigen Namen, z.B. "pr2"
* _Entfernen_ Sie das Häkchen für `Use Default Location` und tragen Sie den Pfad zu dem `sources`-Ordner in Ihrem Working Directory ein.
* _Entfernen_ Sie das Häkchen für `Create module-info.java file`.
* Drücken Sie auf `Finish`.
Wenn alles richtig funktioniert hat, findet Eclipse die Datei `.classpath` im `sources`-Verzeichnis und macht automatisch die notwendigen Einstellungen. Überprüfen Sie aber die folgenden Punkte trotzdem und passen Sie sie gegebenenfalls an.
1. Gehen Sie auf die Projekteigenschaften (`Properties`), wählen Sie `Java Build Path` und dann die Registrierkarte `Libraries`. Selektieren Sie den `Classpath`.
* Gehen Sie auf den Knopf `Add Library` und wählen Sie `JUnit` aus. Im Folgenden Dialog selektieren Sie die Version 5 von JUnit.
* Gehen Sie auf den Knopf `Add JARs` und wählen Sie aus dem `lib`-Ordner das JAR mit dem Namen `game-framework-1.0.jar` aus.
* Entfernen Sie, falls vorhanden, ein JAR namens `solutions-1.0...`.
2. Gehen Sie auf die Projekteigenschaften (`Properties`), wählen Sie `Java Build Path` und dann die Registrierkarte `Source`.
* Stellen Sie sicher, dass der Ordner `src/main/java` eingetragen ist.
* Stellen Sie sicher, dass der Eintrag `Default output folder` `.../target/classes` entspricht.
Es gibt noch ein paar weitere Einstellungen, die Sie in Eclipse vornehmen sollten. Eine Anleitung dazu finden Sie [hier](../help/eclipse.md).
### HelloWorld programmieren
In dieser Aufgabe geht es darum, ein einfaches Hello-World-Programm zu schreiben und dann einzureichen.
1. Bitte gehen Sie in das Paket [pr2.bootstrap.hello](../sources/src/main/java/pr2/bootstrap/hello/)
2. Schauen Sie sich die Klassen `HelloWorld` und `Greeter` an.
3. Vervollständigen Sie den Code, achten Sie dabei insbesondere auf die `// TODO:`-Kommentare. Entfernen Sie diese Kommentare, nachdem Sie die entsprechenden Aktionen durchgeführt haben.
4. Testen Sie Ihr Programm und geben es danach ab.
## Abgabe
Alle Abgaben für die Vorlesung erfolgen über `git`.
Hierzu gehen Sie wie folgt vor:
1. Öffnen Sie eine Kommandozeile (Terminal).
2. Gehen Sie in Ihr Working Directory.
3. Rufen Sie mit `bin/submit.sh` das Skript auf, das die Lösungen testet und kompiliert. Wenn Maven eine Fehlermeldung zeigt, beheben Sie diese zuerst, bevor Sie mit dem nächsten Schritt fortfahren.
4. Wenn Sie Meldung "✅ Projekt gebaut" bekommen, checken Sie Ihre Änderungen in `git` **auf der Kommandozeile** ein (comitten), d.h. mit `git add` und `git commit`. Verwenden Sie **nicht** Eclipse für diesen Schritt.
5. Rufen Sie mit `bin/submit.sh` erneut das Skript auf. Wenn alles klappt, bekommen Sie die Anzeige "✅ Aktuelle Lösungen eingereicht" und Ihre Lösung ist im System angekommen.
Wenn beim Bauen des Programms durch Maven Fehler auftreten, dann lesen Sie die Fehlermeldungen sorgfältig **von oben nach unten**. Sie müssen immer den ersten Fehler (von oben gesehen) zuerst beheben.
Als Beispiel soll folgende Ausgabe von Maven dienen:
```console
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< de.hs_mannheim.pr2:solutions >--------------------
[INFO] Building PR2 Excercises 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-checkstyle-plugin:3.2.0:check (validate) @ solutions ---
[INFO] Starting audit...
[ERROR] /tmp/team-79/sources/src/main/java/pr2/auffrischung/schnick/
SchnickSchnackSchnuck.java:3:8: Unused import - java.util.Random. [UnusedImports]
[ERROR] /tmp/team-79/sources/src/main/java/pr2/auffrischung/schnick/
SchnickSchnackSchnuck.java:4:8: Unused import - java.util.Scanner. [UnusedImports]
[ERROR] /tmp/team-79/sources/src/main/java/pr2/bootstrap/hello/
HelloWorld.java:17:11: Comment matches to-do format 'TODO:'. [TodoComment]
[ERROR] /tmp/team-79/sources/src/main/java/pr2/bootstrap/hello/
HelloWorld.java:18:11: Comment matches to-do format 'TODO:'. [TodoComment]
[ERROR] /tmp/team-79/sources/src/main/java/pr2/bootstrap/hello/
HelloWorld.java:19:11: Comment matches to-do format 'TODO:'. [TodoComment]
Audit done.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.988 s
[INFO] Finished at: 2023-03-23T16:39:26+01:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.2.0:check (validate) on project solutions: Failed during checkstyle execution: There are 5 errors reported by Checkstyle 10.4 with checkstyle.xml ruleset. -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
```
Dann ist der **erste Fehler, den Sie beheben müssen**, der unbenutzte Import in der Datei `SchnickSchnackSchnuck.java` in Zeile 3.
```console
[ERROR] /tmp/team-79/sources/src/main/java/pr2/auffrischung/schnick/SchnickSchnackSchnuck.java:3:8: Unused import - java.util.Random. [UnusedImports]
```

50
help/eclipse.md 100644
View File

@ -0,0 +1,50 @@
## Workspace und Projekt einrichten
Hier erhalten Sie eine Anleitung, wie Sie Eclipse für die Bearbeitung der Aufgaben einrichten.
1. Legen Sie einen neuen Workspace für die Vorlesung PR2 an. Es empfiehlt sich, diesen in einem Unterverzeichnis, z.B. `eclipse-workspace` in Ihrem Working Directory anzulegen. Allerdings sollten Sie das Verzeichnis dann über die `.gitignore`-Datei von der Versionsverwaltung ausschließen. Auf keinen Fall sollten Sie den Workspace mit unter die Versionsverwaltung stellen.
2. Erzeugen Sie mit `File` -> `New` -> `Java Project` ein neues Java-Projekt.
* Geben Sie dem Projekt einen beliebigen Namen, z.B. "pr2"
* _Entfernen_ Sie das Häkchen für `Use Default Location` und tragen Sie den Pfad zu dem `sources`-Ordner in Ihrem Working Directory ein.
* _Entfernen_ Sie das Häkchen für `Create module-info.java file`. (**Wichtig!!!!**)
* Drücken Sie auf `Finish`.
Wenn alles richtig funktioniert hat, findet Eclipse die Datei `.classpath` im `sources`-Verzeichnis und macht automatisch die notwendigen Einstellungen. Überprüfen Sie aber die folgenden Punkte trotzdem und passen Sie sie gegebenenfalls an.
1. Gehen Sie auf die Projekteigenschaften (`Properties`), wählen Sie `Java Build Path` und dann die Registrierkarte `Libraries`. Selektieren Sie den `Classpath`.
* Gehen Sie auf den Knopf `Add Library` und wählen Sie `JUnit` aus. Im folgenden Dialog selektieren Sie die Version 5 von JUnit.
2. Gehen Sie auf die Projekteigenschaften (`Properties`), wählen Sie `Java Build Path` und dann die Registrierkarte `Source`.
* Stellen Sie sicher, dass der Ordner `src/main/java` eingetragen ist.
* Stellen Sie sicher, dass der Eintrag `Default output folder` `.../target/classes` entspricht.
## Tabs in Eclipse
Eclipse verwendet standardmäßig Tabulatoren für die Einrückung von Quelltexten. Da dies aber dem Coding-Standard widerspricht und auch von den Check-Tools bemängelt wird, sollten Sie Eclipse entsprechend konfigurieren.
Öffnen Sie die Properties für das aktuelle Projekt über `File` -> `Properties`.
<img style="width: 30em;" src="img/tab_1.png">
Wählen Sie im Dialog die Option `Java Code Style` und dann `Formater`. Setzen Sie das Häkchen bei `Enable project specific settings` und klicken Sie auf `New`.
<img style="width: 15em;" src="img/tab_2.png">
Geben Sie dem Profil einen Namen, z.B. `PR2`.
<img style="width: 40em;" src="img/tab_3.png">
Wählen Sie unter dem Punkt `Indentation` als `Tab policy` den Eintrag `Spaces only` uns setzen Sie die Breiten auf jeweils `4`.
Schließen Sie den Dialog mit `OK` und das Properties-Fenster mit `Apply and Close`.
## Encoding und Zeilenende
Eclipse verwendet teilweise ein anderes Encoding als UTF-8 und benutzt Windows-Zeilenenden. Um dies zu verhindern nehmen Sie bitte folgende Einstellung vor:
Öffnen Sie die Properties für das aktuelle Projekt über `File` -> `Properties`.
Wählen Sie im Dialog die Option `Resources`.
<img style="width: 30em;" src="img/crlf.png">
Setzen Sie die Option `Text file encoding` auf `UTF-8` und `New text file line delimiter` auf `Unix`.

BIN
help/img/crlf.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

BIN
help/img/tab_1.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 223 KiB

BIN
help/img/tab_2.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
help/img/tab_3.png 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 KiB

View File

@ -0,0 +1,9 @@
## Softwareausstattung
* **Ubuntu Linux** als Installation oder VM
* **Java JDK 21**<br>`sudo apt install openjdk-21-jdk openjdk-21-source openjdk-21-doc`
* **Git** und Git-Frontends<br>`sudo apt install git meld git-cola`
* **Maven 3.8 oder neuer**<br>`sudo apt install maven`
* **Eclipse**<br>Von der [Webseite](https://www.eclipse.org/downloads/) herunterladen und installieren. Bitte verwenden Sie die neueste Version **Eclipse IDE for Java Developers**
Eine Anleitung zur Installation von Ubuntu Linux finden Sie [hier](https://github.com/informatik-mannheim/linux-hsma/blob/master/doc/readme.md). Diese Anleitung bezieht sich auf Ubuntu 21.04, funktioniert so aber auch mit einer neueren Version.

178
readme.md
View File

@ -1,3 +1,177 @@
# assignments
# Programmieren 2 (Wintersemester 2025/2026)
Repository for Team
## 👋 Willkommen zum Kurs Programmieren 2 (PR2)
In Programmieren 2 lernen Sie die Programmierung in Java auf einem fortgeschrittenen Niveau. Sie werden alle wichtigen Konzepte von Java kennenlernen und diese in praktischen Übungen anwenden. Hierbei werden Sie in kleinen Teams arbeiten und komplexere, objektorientierte Programme in Java entwickeln. Die dazu nötigen objektorientierten Konzepte (Polymorphie, Vererbung, Interfaces, etc.) werden Sie ebenso im Kurs anwenden, wie die dazu grundlegenden Algorithmen und Datenstrukturen.
## 🏛️ Aufbau der Veranstaltung
Die folgende Tabelle zeigt Ihnen die Themen der Woche und welche Kapitel Sie bis wann vorbereitet haben müssen. Da die Veranstaltung als **Inverted Classroom** durchgeführt wird, ist es **Ihre Aufgabe** das entsprechende **Kapitel** im Skript **bis zum genannten Termin** durchgearbeitet zu haben.
| # | 📢 Motto | 🎓 Themen | 📚 Kapitel | Übungen | 📆 bis |
|----|--------------------------------------------|-------------------------------------------------------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------|
| 1 | Auffrischen, einchecken und loslegen | Auffrischung | [1][1] | [1][au_001], [2][au_002], [3][au_003], [4][au_004], [5][au_005], [6][au_006] | ¹ |
| 2 | Wie Julius Caesar programmieren | JUnit, JavaDoc, Programmierstil, Pakete, Module, JARs | [2][2], [3][3] | [1][ei_001], [2][ei_002], [3][ei_003], [4][st_001], [5][st_002] | **29.09** |
| 3 | Erben und vererben | Vererbung, Überladen, Verdecken, Konstruktoren | [4][4] | [1][ve_001], [2][ve_002], [3][ve_003], [4][ve_004], [5][ve_005] | **06.10** |
| 4 | Verhaltenstherapie für Klassen | Überschreiben, Polymorphie, static, final | [4][4] | [6][ve_006], [7][ve_007], [8][ve_008], [9][ve_009], [10][ve_010], [11][ve_011], [12][ve_012] | **13.10** |
| 5 | Mit Interfaces geht es noch abstrakter | Interfaces, abstrakte Klassen, SOLID, STUPID | [5][5] | [1][ab_001], [2][ab_002], [3][in_001], [4][in_002], [5][in_003], [6][in_004] | **20.10** |
| 6 | Wer sortiert, muss trotzdem suchen | Suchen, Sortieren, Regex | [6][6] | | **27.10** |
| 7 | Geschenkverpackungen und andere Feinheiten | Object, Wrapper, Optional, Enums, Records | [7][7], [8][8] | [1][ob_001], [2][ob_002], [3][ob_003], [4][ob_004], [5][ob_005], [6][ob_006], [7][ob_007], [8][en_001], [9][en_002], [10][en_003], [11][en_004] | **03.11** |
| 8 | Wenn es mal schief geht, Ausnahmen | Exceptions, try, catch | [9][9] | [1][as_001], [2][as_002], [3][as_003], [4][as_004], [5][as_005] | **10.11** |
| 10 | Rein oder raus, die Daten müssen fließen | Input/Output mit Streams und Reader/Writer | [10][10] | [1][io_001], [2][io_002], [3][io_003], [4][io_004], [5][io_005], [6][io_006], [7][io_007], [8][io_008], [9][io_009], [10][io_010], [11][io_011], [12][io_012], [13][io_013], [14][io_014], [15][io_015], [16][io_016] | **17.11** |
| 11 | One size fits all, mit generischen Typen | Generische Typen, Wildcards | [11][11] | [1][ge_001], [2][ge_002], [3][ge_003], [4][ge_004], [5][ge_005], [6][ge_006], [7][ge_007], [8][ge_008], [9][ge_009] | **24.11** |
| 12 | Matroschka-Klassen | Geschachtelte Klassen, Lambdas | [12][12] | [1][gk_001], [2][gk_002], [3][gk_003], [4][la_001], [5][la_002] | **01.12** |
| 13 | Daten brauchen Struktur | Abstrakte Datentypen | [13][13] | | **08.12** |
| 14 | Objekte sammeln | Collections und Streams | [14][14], [15][15] | [1][co_001], [2][co_002], [3][co_003], [4][co_004], [5][co_005], [6][co_006], [7][co_007], [8][co_008], [9][co_009], [10][co_010], [11][co_011] | **15.12** |
| 15 | Parallel läuft es schneller | Threads, Probleme der Thread-Programmierung | [16][16] | [1][th_001], [2][th_002], [3][th_003], [4][th_004], [5][th_005], [6][th_006], [7][th_007], [8][th_008] | **07.01** |
¹ = Wird als aus PR1 bekannt vorausgesetzt
[1]: https://smits-net.de/files/pr2/html/01_auffrischung/
[2]: https://smits-net.de/files/pr2/html/02_intro/
[3]: https://smits-net.de/files/pr2/html/03_strukturierung/
[4]: https://smits-net.de/files/pr2/html/04_vererbung/
[5]: https://smits-net.de/files/pr2/html/05_interfaces/
[6]: https://smits-net.de/files/pr2/html/06_algorithmen/
[7]: https://smits-net.de/files/pr2/html/07_object_wrapper/
[8]: https://smits-net.de/files/pr2/html/08_enumerationen/
[9]: https://smits-net.de/files/pr2/html/09_exceptions/
[10]: https://smits-net.de/files/pr2/html/10_io/
[11]: https://smits-net.de/files/pr2/html/11_generics/
[12]: https://smits-net.de/files/pr2/html/12_geschachtelte_klassen/
[13]: https://smits-net.de/files/pr2/html/13_datenstrukturen/
[14]: https://smits-net.de/files/pr2/html/14_collections/
[15]: https://smits-net.de/files/pr2/html/15_streams/
[16]: https://smits-net.de/files/pr2/html/16_threads/
[au_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Auffrischung_001/readme.md
[au_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Auffrischung_002/readme.md
[au_003]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Auffrischung_003/readme.md
[au_004]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Auffrischung_004/readme.md
[au_005]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Auffrischung_005/readme.md
[au_006]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Auffrischung_006/readme.md
[ei_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Einfuehrung_001/readme.md
[ei_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Einfuehrung_002/readme.md
[ei_003]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Einfuehrung_003/readme.md
[st_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Strukturierung_001/readme.md
[st_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Strukturierung_002/readme.md
[ve_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Vererbung_001/readme.md
[ve_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Vererbung_002/readme.md
[ve_003]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Vererbung_003/readme.md
[ve_004]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Vererbung_004/readme.md
[ve_005]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Vererbung_005/readme.md
[ve_006]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Vererbung_006/readme.md
[ve_007]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Vererbung_007/readme.md
[ve_008]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Vererbung_008/readme.md
[ve_009]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Vererbung_009/readme.md
[ve_010]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Vererbung_010/readme.md
[ve_011]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Vererbung_011/readme.md
[ve_012]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Vererbung_012/readme.md
[ab_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Abstrakte_Klassen_001/readme.md
[ab_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Abstrakte_Klassen_002/readme.md
[in_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Interfaces_001/readme.md
[in_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Interfaces_002/readme.md
[in_003]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Interfaces_003/readme.md
[in_004]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Interfaces_004/readme.md
[ob_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Object_und_Wrapper_001/readme.md
[ob_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Object_und_Wrapper_002/readme.md
[ob_003]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Object_und_Wrapper_003/readme.md
[ob_004]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Object_und_Wrapper_004/readme.md
[ob_005]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Object_und_Wrapper_005/readme.md
[ob_006]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Object_und_Wrapper_006/readme.md
[ob_007]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Object_und_Wrapper_007/readme.md
[en_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Enumerationen_001/readme.md
[en_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Enumerationen_002/readme.md
[en_003]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Enumerationen_003/readme.md
[en_004]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Enumerationen_004/readme.md
[as_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Ausnahmen_001/readme.md
[as_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Ausnahmen_002/readme.md
[as_003]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Ausnahmen_003/readme.md
[as_004]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Ausnahmen_004/readme.md
[as_005]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Ausnahmen_005/readme.md
[io_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_001/readme.md
[io_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_002/readme.md
[io_003]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_003/readme.md
[io_004]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_004/readme.md
[io_005]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_005/readme.md
[io_006]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_006/readme.md
[io_007]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_007/readme.md
[io_008]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_008/readme.md
[io_009]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_009/readme.md
[io_010]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_010/readme.md
[io_011]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_011/readme.md
[io_012]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_012/readme.md
[io_013]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_013/readme.md
[io_014]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_014/readme.md
[io_015]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_015/readme.md
[io_016]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Input_und_Output_016/readme.md
[ge_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Generische_Typen_001/readme.md
[ge_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Generische_Typen_002/readme.md
[ge_003]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Generische_Typen_003/readme.md
[ge_004]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Generische_Typen_004/readme.md
[ge_005]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Generische_Typen_005/readme.md
[ge_006]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Generische_Typen_006/readme.md
[ge_007]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Generische_Typen_007/readme.md
[ge_008]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Generische_Typen_008/readme.md
[ge_009]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Generische_Typen_009/readme.md
[gk_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Geschachtelte_Klassen_001/readme.md
[gk_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Geschachtelte_Klassen_002/readme.md
[gk_003]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Geschachtelte_Klassen_003/readme.md
[la_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Lambdas_001/readme.md
[la_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Lambdas_002/readme.md
[co_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Collections_001/readme.md
[co_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Collections_002/readme.md
[co_003]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Collections_003/readme.md
[co_004]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Collections_004/readme.md
[co_005]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Collections_005/readme.md
[co_006]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Collections_006/readme.md
[co_007]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Collections_007/readme.md
[co_008]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Collections_008/readme.md
[co_009]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Collections_009/readme.md
[co_010]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Collections_010/readme.md
[co_011]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Collections_011/readme.md
[st_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Streams_001/readme.md
[st_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Streams_002/readme.md
[st_003]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Streams_003/readme.md
[st_004]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Streams_004/readme.md
[st_005]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Streams_005/readme.md
[st_006]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Streams_006/readme.md
[st_007]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Streams_007/readme.md
[st_008]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Streams_008/readme.md
[st_009]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Streams_009/readme.md
[st_010]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Streams_010/readme.md
[th_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Threads_001/readme.md
[th_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Threads_002/readme.md
[th_003]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Threads_003/readme.md
[th_004]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Threads_004/readme.md
[th_005]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Threads_005/readme.md
[th_006]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Threads_006/readme.md
[th_007]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Threads_007/readme.md
[th_008]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Threads_008/readme.md
[re_001]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Reflection_001/readme.md
[re_002]: https://gitty.informatik.hs-mannheim.de/pr2-lecture/uebungen/src/branch/master/Reflection_002/readme.md
## 😀 Freiwillige Übungen
Die freiwilligen Übungen zur Vertiefung der Vorlesungsinhalte finden Sie in einem getrennten Repository: [Freiwillige Übungen](/pr2-lecture/uebungen/src/branch/master/readme.md).
## 📆 Assignments (Pflichtübungen)
Hier finden Sie die Assignments (Aufgaben) für die Vorlesung Programmieren 2 (PR2). Die Assignments sind unten, zusammen mit dem Ausgabe- und Fälligkeitsdatum aufgelistet.
Die Bearbeitung der Aufgaben und das Erreichen einer hinreichend großen Zahl von Punkten sind die Voraussetzung für die Teilnahme an der Klausur.
Hinweise zur nötigen Softwareausstattung finden Sie [hier](help/softwareausstattung.md).
Wichtige Einstellungen für Eclipse sind [hier](help/eclipse.md) beschrieben.
| # | Ausgabe | Thema | Fällig am 📆 |
|-----|------------|-------------------------------------------------|----------------|
| 1. | 23.09.2025 | [Umgebung aufsetzen](Assignment_001/readme.md) | **01.10.2025** |
| 2. | 23.09.2025 | [Erster Commit](Assignment_002/readme.md) | **01.10.2025** |
## 📚 Material
* [Moodle-Kurs](https://moodle.hs-mannheim.de/course/view.php?id=5022)

View File

@ -0,0 +1,203 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.2//EN"
"http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
<!--
Checkstyle configuration that checks the sun coding conventions from:
- the Java Language Specification at
http://java.sun.com/docs/books/jls/second_edition/html/index.html
- the Sun Code Conventions at http://java.sun.com/docs/codeconv/
- the Javadoc guidelines at
http://java.sun.com/j2se/javadoc/writingdoccomments/index.html
- the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html
- some best practices
Checkstyle is very configurable. Be sure to read the documentation at
http://checkstyle.sf.net (or in your downloaded distribution).
Most Checks are configurable, be sure to consult the documentation.
To completely disable a check, just comment it out or delete it from the file.
Finally, it is worth reading the documentation.
-->
<module name="Checker">
<!--
If you set the basedir property below, then all reported file
names will be relative to the specified directory. See
http://checkstyle.sourceforge.net/5.x/config.html#Checker
<property name="basedir" value="${basedir}"/>
-->
<!-- Checks whether files end with a new line. -->
<!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
<!-- <module name="NewlineAtEndOfFile"/> -->
<!-- Checks that property files contain the same keys. -->
<!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
<module name="Translation"/>
<!-- Checks for Size Violations. -->
<!-- See http://checkstyle.sf.net/config_sizes.html -->
<module name="FileLength"/>
<!-- Checks for whitespace -->
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
<module name="FileTabCharacter"/>
<!-- Miscellaneous other checks. -->
<!-- See http://checkstyle.sf.net/config_misc.html -->
<!--
<module name="RegexpSingleline">
<property name="format" value="\s+$"/>
<property name="minimum" value="0"/>
<property name="maximum" value="0"/>
<property name="message" value="Line has trailing spaces."/>
</module>
-->
<module name="LineLength">
<property name="ignorePattern" value="^.*//#.*|^.* \* @see .*|^import .*"/>
</module>
<module name="TreeWalker">
<!-- Checks for Javadoc comments. -->
<!-- See http://checkstyle.sf.net/config_javadoc.html -->
<module name="JavadocMethod"/>
<module name="JavadocType"/>
<module name="JavadocVariable">
<property name="scope" value="public"/>
</module>
<module name="JavadocStyle"/>
<!-- Checks for Naming Conventions. -->
<!-- See http://checkstyle.sf.net/config_naming.html -->
<module name="ConstantName"/>
<module name="LocalFinalVariableName"/>
<module name="LocalVariableName"/>
<module name="MemberName"/>
<module name="MethodName"/>
<module name="PackageName">
<property name="format" value="^[a-z][a-z0-9_]+(\.[a-z][a-z0-9_]*)*$"/>
</module>
<module name="ParameterName"/>
<module name="StaticVariableName"/>
<module name="TypeName"/>
<!-- Checks for Headers -->
<!-- See http://checkstyle.sf.net/config_header.html -->
<!-- <module name="Header"> -->
<!-- The follow property value demonstrates the ability -->
<!-- to have access to ANT properties. In this case it uses -->
<!-- the ${basedir} property to allow Checkstyle to be run -->
<!-- from any directory within a project. See property -->
<!-- expansion, -->
<!-- http://checkstyle.sf.net/config.html#properties -->
<!-- <property -->
<!-- name="headerFile" -->
<!-- value="${basedir}/java.header"/> -->
<!-- </module> -->
<!-- Following interprets the header file as regular expressions. -->
<!-- <module name="RegexpHeader"/> -->
<!-- Checks for imports -->
<!-- See http://checkstyle.sf.net/config_import.html -->
<module name="AvoidStarImport"/>
<module name="IllegalImport"/> <!-- defaults to sun.* packages -->
<module name="RedundantImport"/>
<module name="UnusedImports"/>
<!-- Checks for Size Violations. -->
<!-- See http://checkstyle.sf.net/config_sizes.html -->
<module name="MethodLength">
<property name="countEmpty" value="false"/>
</module>
<module name="ParameterNumber"/>
<!-- Checks for whitespace -->
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
<module name="EmptyForIteratorPad"/>
<module name="GenericWhitespace"/>
<module name="MethodParamPad"/>
<module name="NoWhitespaceAfter">
<property name="tokens" value="AT, INC, DEC, UNARY_MINUS, UNARY_PLUS, BNOT, LNOT, DOT, ARRAY_DECLARATOR, INDEX_OP"/>
</module>
<module name="NoWhitespaceBefore">
<property name="tokens" value="COMMA, SEMI, POST_INC, POST_DEC, ELLIPSIS, LABELED_STAT"/>
</module>
<module name="OperatorWrap"/>
<module name="ParenPad"/>
<module name="TypecastParenPad"/>
<module name="WhitespaceAfter"/>
<module name="WhitespaceAround"/>
<!-- Modifier Checks -->
<!-- See http://checkstyle.sf.net/config_modifiers.html -->
<module name="ModifierOrder"/>
<!-- <module name="RedundantModifier"/> -->
<!-- Checks for blocks. You know, those {}'s -->
<!-- See http://checkstyle.sf.net/config_blocks.html -->
<module name="AvoidNestedBlocks"/>
<module name="EmptyBlock"/>
<module name="LeftCurly"/>
<module name="NeedBraces"/>
<!-- <module name="RightCurly"/> -->
<!-- Checks for common coding problems -->
<!-- See http://checkstyle.sf.net/config_coding.html -->
<!-- <module name="AvoidInlineConditionals"/> -->
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<module name="HiddenField">
<property name="ignoreConstructorParameter" value="true"/>
<property name="ignoreSetter" value="true"/>
</module>
<module name="IllegalInstantiation"/>
<module name="InnerAssignment"/>
<module name="MissingSwitchDefault"/>
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>
<!-- Checks for class design -->
<!-- See http://checkstyle.sf.net/config_design.html -->
<!-- <module name="DesignForExtension"/> -->
<module name="FinalClass"/>
<!-- <module name="HideUtilityClassConstructor"/> -->
<module name="InterfaceIsType"/>
<module name="VisibilityModifier">
<property name="protectedAllowed" value="true"/>
<property name="packageAllowed" value="true"/>
</module>
<!-- Miscellaneous other checks. -->
<!-- See http://checkstyle.sf.net/config_misc.html -->
<module name="ArrayTypeStyle"/>
<!-- <module name="FinalParameters"/> -->
<module name="TodoComment"/>
<module name="UpperEll"/>
</module>
</module>

60
solutions/pmd.xml 100644
View File

@ -0,0 +1,60 @@
<?xml version="1.0"?>
<ruleset name="Custom Rules"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
<description>
My custom rules
</description>
<rule ref="category/java/bestpractices.xml/AccessorClassGeneration"/>
<!-- <rule ref="category/java/bestpractices.xml/AvoidMessageDigestField"/> -->
<rule ref="category/java/bestpractices.xml/AvoidReassigningCatchVariables"/>
<rule ref="category/java/bestpractices.xml/AvoidReassigningLoopVariables"/>
<rule ref="category/java/bestpractices.xml/AvoidReassigningParameters"/>
<rule ref="category/java/bestpractices.xml/AvoidStringBufferField"/>
<rule ref="category/java/bestpractices.xml/AvoidUsingHardCodedIP"/>
<rule ref="category/java/bestpractices.xml/CheckResultSet"/>
<rule ref="category/java/bestpractices.xml/ConstantsInInterface"/>
<rule ref="category/java/bestpractices.xml/DefaultLabelNotLastInSwitch"/>
<rule ref="category/java/bestpractices.xml/DoubleBraceInitialization"/>
<rule ref="category/java/bestpractices.xml/ForLoopCanBeForeach"/>
<rule ref="category/java/bestpractices.xml/ForLoopVariableCount"/>
<rule ref="category/java/bestpractices.xml/GuardLogStatement"/>
<rule ref="category/java/bestpractices.xml/JUnit4SuitesShouldUseSuiteAnnotation"/>
<rule ref="category/java/bestpractices.xml/UnitTestShouldUseAfterAnnotation"/>
<rule ref="category/java/bestpractices.xml/UnitTestShouldUseBeforeAnnotation"/>
<rule ref="category/java/bestpractices.xml/UnitTestShouldUseTestAnnotation"/>
<rule ref="category/java/bestpractices.xml/JUnit5TestShouldBePackagePrivate"/>
<!-- <rule ref="category/java/bestpractices.xml/UnitTestAssertionsShouldIncludeMessage"/> -->
<!-- <rule ref="category/java/bestpractices.xml/UnitTestContainsTooManyAsserts"/> -->
<!-- <rule ref="category/java/bestpractices.xml/UnitTestShouldIncludeAssert"/> -->
<rule ref="category/java/bestpractices.xml/JUnitUseExpected"/>
<rule ref="category/java/bestpractices.xml/LiteralsFirstInComparisons"/>
<rule ref="category/java/bestpractices.xml/LooseCoupling"/>
<rule ref="category/java/bestpractices.xml/MethodReturnsInternalArray"/>
<rule ref="category/java/bestpractices.xml/MissingOverride"/>
<rule ref="category/java/bestpractices.xml/OneDeclarationPerLine"/>
<rule ref="category/java/bestpractices.xml/PreserveStackTrace"/>
<rule ref="category/java/bestpractices.xml/PrimitiveWrapperInstantiation"/>
<rule ref="category/java/bestpractices.xml/ReplaceEnumerationWithIterator"/>
<rule ref="category/java/bestpractices.xml/ReplaceHashtableWithMap"/>
<rule ref="category/java/bestpractices.xml/ReplaceVectorWithList"/>
<rule ref="category/java/bestpractices.xml/SimplifiableTestAssertion"/>
<rule ref="category/java/bestpractices.xml/NonExhaustiveSwitch"/>
<rule ref="category/java/bestpractices.xml/UnusedAssignment"/>
<rule ref="category/java/bestpractices.xml/UnusedFormalParameter"/>
<rule ref="category/java/bestpractices.xml/UnusedLocalVariable"/>
<rule ref="category/java/bestpractices.xml/UnusedPrivateField"/>
<rule ref="category/java/bestpractices.xml/UnusedPrivateMethod"/>
<rule ref="category/java/bestpractices.xml/UseCollectionIsEmpty"/>
<rule ref="category/java/bestpractices.xml/UseStandardCharsets"/>
<rule ref="category/java/bestpractices.xml/WhileLoopWithLiteralBoolean"/>
</ruleset>

159
solutions/pom.xml 100644
View File

@ -0,0 +1,159 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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>
<groupId>de.hs_mannheim.pr2</groupId>
<artifactId>solutions</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>PR2 Excercises</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<junit.jupiter.version>5.12.2</junit.jupiter.version>
<junit.platform.version>1.12.2</junit.platform.version>
<pmdVersion>7.13.0</pmdVersion>
</properties>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<defaultGoal>install</defaultGoal>
<directory>${basedir}/target</directory>
<finalName>${project.artifactId}-${project.version}</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.5.2</version>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.5.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.6.0</version>
<dependencies>
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>10.4</version>
</dependency>
</dependencies>
<configuration>
<configLocation>checkstyle.xml</configLocation>
<consoleOutput>true</consoleOutput>
<failsOnError>true</failsOnError>
<linkXRef>false</linkXRef>
</configuration>
<executions>
<execution>
<id>validate</id>
<phase>validate</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.26.0</version>
<dependencies>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-core</artifactId>
<version>${pmdVersion}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-java</artifactId>
<version>${pmdVersion}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-javascript</artifactId>
<version>${pmdVersion}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-jsp</artifactId>
<version>${pmdVersion}</version>
</dependency>
</dependencies>
<configuration>
<rulesets>
<ruleset>./pmd.xml</ruleset>
</rulesets>
<failOnViolation>true</failOnViolation>
<printFailingErrors>true</printFailingErrors>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<!--
<dependency>
<groupId>de.smits_net.games</groupId>
<artifactId>game-framework</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
-->
<dependency>
<groupId>com.github.thomsmits</groupId>
<artifactId> game-framework</artifactId>
<version>v1.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>${junit.platform.version}</version>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.5.3</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,203 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.2//EN"
"http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
<!--
Checkstyle configuration that checks the sun coding conventions from:
- the Java Language Specification at
http://java.sun.com/docs/books/jls/second_edition/html/index.html
- the Sun Code Conventions at http://java.sun.com/docs/codeconv/
- the Javadoc guidelines at
http://java.sun.com/j2se/javadoc/writingdoccomments/index.html
- the JDK Api documentation http://java.sun.com/j2se/docs/api/index.html
- some best practices
Checkstyle is very configurable. Be sure to read the documentation at
http://checkstyle.sf.net (or in your downloaded distribution).
Most Checks are configurable, be sure to consult the documentation.
To completely disable a check, just comment it out or delete it from the file.
Finally, it is worth reading the documentation.
-->
<module name="Checker">
<!--
If you set the basedir property below, then all reported file
names will be relative to the specified directory. See
http://checkstyle.sourceforge.net/5.x/config.html#Checker
<property name="basedir" value="${basedir}"/>
-->
<!-- Checks whether files end with a new line. -->
<!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
<!-- <module name="NewlineAtEndOfFile"/> -->
<!-- Checks that property files contain the same keys. -->
<!-- See http://checkstyle.sf.net/config_misc.html#Translation -->
<module name="Translation"/>
<!-- Checks for Size Violations. -->
<!-- See http://checkstyle.sf.net/config_sizes.html -->
<module name="FileLength"/>
<!-- Checks for whitespace -->
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
<module name="FileTabCharacter"/>
<!-- Miscellaneous other checks. -->
<!-- See http://checkstyle.sf.net/config_misc.html -->
<!--
<module name="RegexpSingleline">
<property name="format" value="\s+$"/>
<property name="minimum" value="0"/>
<property name="maximum" value="0"/>
<property name="message" value="Line has trailing spaces."/>
</module>
-->
<module name="LineLength">
<property name="ignorePattern" value="^.*//#.*|^.* \* @see .*|^import .*"/>
</module>
<module name="TreeWalker">
<!-- Checks for Javadoc comments. -->
<!-- See http://checkstyle.sf.net/config_javadoc.html -->
<module name="JavadocMethod"/>
<module name="JavadocType"/>
<module name="JavadocVariable">
<property name="scope" value="public"/>
</module>
<module name="JavadocStyle"/>
<!-- Checks for Naming Conventions. -->
<!-- See http://checkstyle.sf.net/config_naming.html -->
<module name="ConstantName"/>
<module name="LocalFinalVariableName"/>
<module name="LocalVariableName"/>
<module name="MemberName"/>
<module name="MethodName"/>
<module name="PackageName">
<property name="format" value="^[a-z][a-z0-9_]+(\.[a-z][a-z0-9_]*)*$"/>
</module>
<module name="ParameterName"/>
<module name="StaticVariableName"/>
<module name="TypeName"/>
<!-- Checks for Headers -->
<!-- See http://checkstyle.sf.net/config_header.html -->
<!-- <module name="Header"> -->
<!-- The follow property value demonstrates the ability -->
<!-- to have access to ANT properties. In this case it uses -->
<!-- the ${basedir} property to allow Checkstyle to be run -->
<!-- from any directory within a project. See property -->
<!-- expansion, -->
<!-- http://checkstyle.sf.net/config.html#properties -->
<!-- <property -->
<!-- name="headerFile" -->
<!-- value="${basedir}/java.header"/> -->
<!-- </module> -->
<!-- Following interprets the header file as regular expressions. -->
<!-- <module name="RegexpHeader"/> -->
<!-- Checks for imports -->
<!-- See http://checkstyle.sf.net/config_import.html -->
<module name="AvoidStarImport"/>
<module name="IllegalImport"/> <!-- defaults to sun.* packages -->
<module name="RedundantImport"/>
<module name="UnusedImports"/>
<!-- Checks for Size Violations. -->
<!-- See http://checkstyle.sf.net/config_sizes.html -->
<module name="MethodLength">
<property name="countEmpty" value="false"/>
</module>
<module name="ParameterNumber"/>
<!-- Checks for whitespace -->
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
<module name="EmptyForIteratorPad"/>
<module name="GenericWhitespace"/>
<module name="MethodParamPad"/>
<module name="NoWhitespaceAfter">
<property name="tokens" value="AT, INC, DEC, UNARY_MINUS, UNARY_PLUS, BNOT, LNOT, DOT, ARRAY_DECLARATOR, INDEX_OP"/>
</module>
<module name="NoWhitespaceBefore">
<property name="tokens" value="COMMA, SEMI, POST_INC, POST_DEC, ELLIPSIS, LABELED_STAT"/>
</module>
<module name="OperatorWrap"/>
<module name="ParenPad"/>
<module name="TypecastParenPad"/>
<module name="WhitespaceAfter"/>
<module name="WhitespaceAround"/>
<!-- Modifier Checks -->
<!-- See http://checkstyle.sf.net/config_modifiers.html -->
<module name="ModifierOrder"/>
<!-- <module name="RedundantModifier"/> -->
<!-- Checks for blocks. You know, those {}'s -->
<!-- See http://checkstyle.sf.net/config_blocks.html -->
<module name="AvoidNestedBlocks"/>
<module name="EmptyBlock"/>
<module name="LeftCurly"/>
<module name="NeedBraces"/>
<!-- <module name="RightCurly"/> -->
<!-- Checks for common coding problems -->
<!-- See http://checkstyle.sf.net/config_coding.html -->
<!-- <module name="AvoidInlineConditionals"/> -->
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<module name="HiddenField">
<property name="ignoreConstructorParameter" value="true"/>
<property name="ignoreSetter" value="true"/>
</module>
<module name="IllegalInstantiation"/>
<module name="InnerAssignment"/>
<module name="MissingSwitchDefault"/>
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>
<!-- Checks for class design -->
<!-- See http://checkstyle.sf.net/config_design.html -->
<!-- <module name="DesignForExtension"/> -->
<module name="FinalClass"/>
<!-- <module name="HideUtilityClassConstructor"/> -->
<module name="InterfaceIsType"/>
<module name="VisibilityModifier">
<property name="protectedAllowed" value="true"/>
<property name="packageAllowed" value="true"/>
</module>
<!-- Miscellaneous other checks. -->
<!-- See http://checkstyle.sf.net/config_misc.html -->
<module name="ArrayTypeStyle"/>
<!-- <module name="FinalParameters"/> -->
<module name="TodoComment"/>
<module name="UpperEll"/>
</module>
</module>

60
sources/pmd.xml 100644
View File

@ -0,0 +1,60 @@
<?xml version="1.0"?>
<ruleset name="Custom Rules"
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd">
<description>
My custom rules
</description>
<rule ref="category/java/bestpractices.xml/AccessorClassGeneration"/>
<!-- <rule ref="category/java/bestpractices.xml/AvoidMessageDigestField"/> -->
<rule ref="category/java/bestpractices.xml/AvoidReassigningCatchVariables"/>
<rule ref="category/java/bestpractices.xml/AvoidReassigningLoopVariables"/>
<rule ref="category/java/bestpractices.xml/AvoidReassigningParameters"/>
<rule ref="category/java/bestpractices.xml/AvoidStringBufferField"/>
<rule ref="category/java/bestpractices.xml/AvoidUsingHardCodedIP"/>
<rule ref="category/java/bestpractices.xml/CheckResultSet"/>
<rule ref="category/java/bestpractices.xml/ConstantsInInterface"/>
<rule ref="category/java/bestpractices.xml/DefaultLabelNotLastInSwitch"/>
<rule ref="category/java/bestpractices.xml/DoubleBraceInitialization"/>
<rule ref="category/java/bestpractices.xml/ForLoopCanBeForeach"/>
<rule ref="category/java/bestpractices.xml/ForLoopVariableCount"/>
<rule ref="category/java/bestpractices.xml/GuardLogStatement"/>
<rule ref="category/java/bestpractices.xml/JUnit4SuitesShouldUseSuiteAnnotation"/>
<rule ref="category/java/bestpractices.xml/UnitTestShouldUseAfterAnnotation"/>
<rule ref="category/java/bestpractices.xml/UnitTestShouldUseBeforeAnnotation"/>
<rule ref="category/java/bestpractices.xml/UnitTestShouldUseTestAnnotation"/>
<rule ref="category/java/bestpractices.xml/JUnit5TestShouldBePackagePrivate"/>
<!-- <rule ref="category/java/bestpractices.xml/UnitTestAssertionsShouldIncludeMessage"/> -->
<!-- <rule ref="category/java/bestpractices.xml/UnitTestContainsTooManyAsserts"/> -->
<!-- <rule ref="category/java/bestpractices.xml/UnitTestShouldIncludeAssert"/> -->
<rule ref="category/java/bestpractices.xml/JUnitUseExpected"/>
<rule ref="category/java/bestpractices.xml/LiteralsFirstInComparisons"/>
<rule ref="category/java/bestpractices.xml/LooseCoupling"/>
<rule ref="category/java/bestpractices.xml/MethodReturnsInternalArray"/>
<rule ref="category/java/bestpractices.xml/MissingOverride"/>
<rule ref="category/java/bestpractices.xml/OneDeclarationPerLine"/>
<rule ref="category/java/bestpractices.xml/PreserveStackTrace"/>
<rule ref="category/java/bestpractices.xml/PrimitiveWrapperInstantiation"/>
<rule ref="category/java/bestpractices.xml/ReplaceEnumerationWithIterator"/>
<rule ref="category/java/bestpractices.xml/ReplaceHashtableWithMap"/>
<rule ref="category/java/bestpractices.xml/ReplaceVectorWithList"/>
<rule ref="category/java/bestpractices.xml/SimplifiableTestAssertion"/>
<rule ref="category/java/bestpractices.xml/NonExhaustiveSwitch"/>
<rule ref="category/java/bestpractices.xml/UnusedAssignment"/>
<rule ref="category/java/bestpractices.xml/UnusedFormalParameter"/>
<rule ref="category/java/bestpractices.xml/UnusedLocalVariable"/>
<rule ref="category/java/bestpractices.xml/UnusedPrivateField"/>
<rule ref="category/java/bestpractices.xml/UnusedPrivateMethod"/>
<rule ref="category/java/bestpractices.xml/UseCollectionIsEmpty"/>
<rule ref="category/java/bestpractices.xml/UseStandardCharsets"/>
<rule ref="category/java/bestpractices.xml/WhileLoopWithLiteralBoolean"/>
</ruleset>

159
sources/pom.xml 100644
View File

@ -0,0 +1,159 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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>
<groupId>de.hs_mannheim.pr2</groupId>
<artifactId>solutions</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>PR2 Excercises</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<junit.jupiter.version>5.12.2</junit.jupiter.version>
<junit.platform.version>1.12.2</junit.platform.version>
<pmdVersion>7.13.0</pmdVersion>
</properties>
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<build>
<defaultGoal>install</defaultGoal>
<directory>${basedir}/target</directory>
<finalName>${project.artifactId}-${project.version}</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.5.2</version>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.5.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.6.0</version>
<dependencies>
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>10.4</version>
</dependency>
</dependencies>
<configuration>
<configLocation>checkstyle.xml</configLocation>
<consoleOutput>true</consoleOutput>
<failsOnError>true</failsOnError>
<linkXRef>false</linkXRef>
</configuration>
<executions>
<execution>
<id>validate</id>
<phase>validate</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.26.0</version>
<dependencies>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-core</artifactId>
<version>${pmdVersion}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-java</artifactId>
<version>${pmdVersion}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-javascript</artifactId>
<version>${pmdVersion}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.pmd</groupId>
<artifactId>pmd-jsp</artifactId>
<version>${pmdVersion}</version>
</dependency>
</dependencies>
<configuration>
<rulesets>
<ruleset>./pmd.xml</ruleset>
</rulesets>
<failOnViolation>true</failOnViolation>
<printFailingErrors>true</printFailingErrors>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<!--
<dependency>
<groupId>de.smits_net.games</groupId>
<artifactId>game-framework</artifactId>
<version>1.0</version>
<scope>compile</scope>
</dependency>
-->
<dependency>
<groupId>com.github.thomsmits</groupId>
<artifactId> game-framework</artifactId>
<version>v1.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-suite</artifactId>
<version>${junit.platform.version}</version>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>${junit.jupiter.version}</version>
</dependency>
<dependency>
<groupId>org.jfree</groupId>
<artifactId>jfreechart</artifactId>
<version>1.5.3</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,16 @@
package pr2.bootstrap.hello;
/**
* Eine freundliche Klasse, die gerne Menschen begrüßt.
*/
public class Greeter {
/**
* Begrüßt die Person.
*
* @param name Name der Person, die begrüßt wird.
*/
public void greet(String name) {
System.out.printf("Hallo %s\n", name);
}
}

View File

@ -0,0 +1,22 @@
package pr2.bootstrap.hello;
/**
* Hello World Programm.
*/
public class HelloWorld {
/**
* Einstieg ins Programm. Der Name wird aus dem ersten
* Kommandozeilenargument genommen.
*
* @param args Argumente.
*/
public static void main(String[] args) {
Greeter g = new Greeter();
// TODO: Wenn kein Argument auf der Kommandozeile gegeben wurde,
// TODO: nehmen Sie als Namen "<Unbekannter>", andernfalls den
// TODO: Namen aus dem ersten Argument.
// TODO: greet Methode auf g rufen
}
}

View File

@ -0,0 +1,44 @@
package pr2.bootstrap.hello;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import static org.junit.jupiter.api.Assertions.assertEquals;
class HelloWorldTest {
private static PrintStream out;
@BeforeAll
static void setup() {
out = System.out;
}
@AfterAll
static void tearDown() {
System.setOut(out);
}
@Test
void testHelloWorld() throws IOException {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(bos);
System.setOut(ps);
HelloWorld.main(new String[] {});
assertEquals("Hallo <Unbekannter>", bos.toString().trim());
bos.reset();
HelloWorld.main(new String[] { "Peter Testmann" });
assertEquals("Hallo Peter Testmann", bos.toString().trim());
bos.reset();
bos.close();
// Don't close ps!
}
}