2. 2024-09-19
2.1. Persistenz
-
Wenn Daten den Prozess, der sie erzeugt, überleben, dann spricht man von persistenzten Daten.
Beispiele:
-
Dateien, die serialisiert wurden
-
Datenbanken
-
…
-
2.2. Was ist Serialisierung?
-
In einem (Java-)Programm sind die Instanzen die Repräsentationen von Klassen
-
Beispiel: Die Klasse ´Person´ hat die Instanzen: Karl, Susi, Herbert
-
In den Instanzen (Objekten) sind den Feldern der Klasse Werte zugeordnet.
-
-
Diese Instanzen können nun zur Laufzeit als Files gespeichert werden
-
Voraussetzung: Interface Serializable
-
Mit der statischen Konstante ´serialVersionUID´ wird die Version der Klasse bestimmt. Es können nur gespeicherte Objekte eingelesen werden, deren serialVersionUID mit der der aktuellen Klasse übereinstimmt.

2.3. Was ist Quarkus?
-
Eine Quarkus Application entspricht dem mircoprofile Standard.
-
In einer Quarkus Applikation (zB jar-File) befinden sich zusätzlich zum App-Code die JakartaEE- oder microprofile-Libraries sowie ein Web-Server, der gestartet wird, um zB mittels REST auf die Quarkus App zuzugreifen.
2.4. XML
-
extensible Markup Language
-
extensible … erweiterbar, dh es können beliebige Tags verwendet werden (zB
person
)-
markup language … Auszeichnungssprache (selbstbeschreibende Sprache)
-
Beispiel
<person> <name>Susi</name> <wohnort>Leonding</wohnort> </person>
-
Die Daten beschreiben sich selbst. Eine
person
hat einenname
und einenwohnort
.
-
-
XML ist eine Baumstruktur.
-
Einsatzgebiete
-
zur Datenübertragung (zB im Web)
-
als Konfigurationsdatei (zB pom.xml)
-
-
Alternativen:
-
JSON
-
YAML
-
TOML
-
…
-
5. 2024-10-10
-
Wiederholung REST-API Präsentation

5.2. Microprojekte
Name | Thema |
---|---|
Kreuzer Andreas |
Büchererei |
Mayr Tim |
Friedhofsverwaltung |
Restaurant (Tische reservieren) |
|
Wizany Linus |
Reisebüro |
Stützner Michael |
Gärtnerei |
Klaffenböck Jakob |
Tierarztpraxis |
Huch Tobias |
Eisenbahn (Fahrplan) |
Mayer Samuel |
Fluggesellschaft |
Hayer Florian |
Spedition |
Michel Jakob |
Facility-Manager (Hausmeister) |
Brandstätter Elias |
Autovermietung |
Simsek Atilla |
Fussballspiele Informationsportal |
Kaltenberger Elisa |
Bank |
Schönbauer Linnea |
Radfahrverleih |
Catic Vanesa |
Flughafen |
Hussein Silin |
Nachhilfeverwaltung |
Öllinger Zoe |
Fahrschule |
Anderson Marvin |
Immobilienverwaltung |
Öller Konstantin |
Tennisverein |
Zinhobel Luca |
Hotel |
-
HÜ:
-
Klassendiagramm in plantuml (3-5 Tabellen)
-
Endpoint ohne Entitäten
-
6. 2024-10-17
6.1. Commits
-
Mehrere Commits durchführen: nach jedem thematisch abgeschlossenen Bereich (zB nach einer Methode)
-
Commit-Messages müssen aussagekräftig sein
6.2. Rest-Params
-
microproject
-
QueryParam
-
PathParam
-
FormParam
-
Übergabe eines Datums und ev. Uhrzeit
-
Welche Propbleme treten auf?
-
Wie kann man diese lösen?
-
Datumsformate?
-
-
6.3. REST-Responses
-
json - Libraries
-
jackson (https://github.com/FasterXML/jackson)
-
xml als Response Format
8. 2024-11-14
8.1. Quarkus Launch Modes
-
Launch Modes
-
NORMAL
-
DEVELOPMENT
-
TEST
-
package at.htl.taxes.control;
import io.quarkus.runtime.LaunchMode;
import io.quarkus.runtime.StartupEvent;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject;
@ApplicationScoped
public class InitBean {
void init(@Observes StartupEvent event) {
if (LaunchMode.current() == LaunchMode.DEVELOPMENT) {
// ...
}
}
}
8.2. Nachtrag: QueryParams bei REST-Service
public Response foo(
@QueryParam("county") @DefaultValue("Austria") String country,
@QueryParam("size") @DefaultValue("12") int size
) { ... }
8.3. Data-Transfer-Objects (DTO)
stream of Person -> filter by country -> sorted by dob, zip, name -> map to PersonDto -> store in list
8.4. File einlesen
BRAND,MODEL,REGISTRATION_DATE,NO_OF_SEATS,OWNER_NAME Opel,Blitz,2024-11-08,3,Pepi
public void insertVehiclesFromFile(String fileName) {
try (InputStream is = Thread.currentThread()
.getContextClassLoader()
.getResourceAsStream(fileName);
BufferedReader reader = new BufferedReader(
new InputStreamReader(is)
)
) {
reader.lines()
.skip(1)
.peek(arr -> Log.infof("Read line: %s", arr))
.map(line -> line.split(","))
.map(arr -> new Vehicle(
arr[0],
arr[1],
LocalDate.parse(arr[2], DateTimeFormatter.ISO_DATE),
Double.parseDouble(arr[3]),
new Person(arr[4])))
//.forEach(this::persist);
.forEach(vehicle -> this.persist(vehicle)
);
} catch (IOException e) {
Log.error("Error reading file " + fileName + ": " + e.getMessage());
}
}
8.5. JPA


9. 2024-12-12

9.1. JPA - Projekt vorbereiten
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-orm</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-h2</artifactId>
</dependency>
9.4. JPA - Bsp Vehicle - Rental

Übung:
-
Der Test
VehicleResourceTest
ist so zu ändern, dass anstelle des hamcrest matchers ein junit-core matcher verwendet wird.
10. 2025-01-09
10.1. Repository per Aggregate

-
Übung: Im Mikroprojekt Queries erstellen und mittels REST-Service abfragen können
-
mind. eine Query mit Aggregation
-
mind. eine Query auf eine Tabelle mit Detail-Ds
-
mind eine Query mit Join über 3 Tabellen
-
einen REST-Endpoint mit CREATE
-
einen REST-Endpoint mit UPDATE
-
einen REST-Endpoint mit DELETE
-
11. 2025-01-16
11.1. SQL
-
DML: Data Manipulation Language INSERT, UPDATE, DELETE
-
DDL: Data Definition Language CREATE, ALTER, DROP
-
TCL: Transaction Control Language COMMIT, ROLLBACK, SET SAVEPOINT
-
DQL: Data Query Language SELECT
-
DCL: Data Control Language GRANT REVOKE
11.2. Informationswürfel
-
Nicht nur das Erstellen von Datenbank-Schemata ist wichtig und das Einfügen von Daten, sondern auch das Lesen und Auswerten von Daten

11.3. Quarkus Panache
-
Simplified Hibernate ORM with Panache
-
Active Record Pattern vs Repository Pattern
-
Transactions
-
Queries
-
Paging
-
12. 2025-01-30
-
Jedes ts-file ist auch als js-file gültig
12.1. Custom Elements
-
-
muss im Elementnamen enthalten sein. Der Standard garantiert, dass künftige HTML-Elemente keine-
enthalten werden. -
Custom Elements:
-
Tag-Namen registrieren + JavaScript-Klasse definieren
-
-
https://developer.mozilla.org/en-US/docs/Web/API/Document/DOMContentLoaded_event
-
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Modules
13. 2025-02-06
13.1. Kommunikation zwischen (heterogenen) Systemen
-
REST
-
Kommunikation für Prozesse und System
-
Es stehen fix definierte Endpoints zur Verfügung (Struktur der json-Objekte ist vordefiniert)
-
Man mus einen Request absetzen um einen Response zu erhalten (Der REST-Server kann von sich aus den Client nicht erreichen)
-
Bsp: Die Ergebnisse eines Fussballspiels werden an einen RPi übertragen, damit dieser die Ergebnisse auf einem Display anzeigen kann.
Verwendet man dazu REST, muss der RPi regelmäßig den Server abfragen, ob es neue Ergebnisse gibt. Man spricht hierbei von Polling.
-
-
-
Websockets
-
Websockets addressieren die Problematik des Pollings. Der Server kann den Client erreichen und ihm Daten senden.
-
Websockets sind bidirektional
-
Server-Sent Events SSE
-
SSE sind vergleichbar mit Websockets, jedoch nur in eine Richtung. Der Server kann Daten an den Client senden, der Client kann jedoch nicht antworten.
-
-
graphql
-
Bei REST sind die json-Dokumente fix strukturiert. Dies kann bei umfangreichen REST-Schnittstellen (zB GitHub) zu Problemen führen.
-
Bei graphql kann der Client die Struktur des json-Dokuments definieren, das er erhalten möchte.
-
gRPC
-
gRPC ist ein Protokoll, das auf HTTP/2 basiert (HTTP/2 ist ein binäres Protokoll). Es ist schneller als REST und kann auch bidirektional kommunizieren.
13.2. Zusammengesetzter Schlüssel
Failed to generate image: PlantUML preprocessing failed: [From <input> (line 12) ] @startuml class Vehicle{} class Customer{} class Rental{ - RentalId: Long - VehicleId: Long - CustomerId: Long } () ^^^^^ Syntax Error? @startuml class Vehicle{} class Customer{} class Rental{ - RentalId: Long - VehicleId: Long - CustomerId: Long } () @enduml
Im nächsten Test Aufgabe zu Asciidoctor und plantuml |
13.3. Asciidoctor
13.3.1. Admonitions
-
Voraussetzung
:icons: font
in Präambel
Das ist wichtig |
ifdef::env-github[]
:tip-caption: :bulb:
:note-caption: :information_source:
:important-caption: :heavy_exclamation_mark:
:caution-caption: :fire:
:warning-caption: :warning:
endif::[]
-
Admonition mit Block
Feeding the Werewolves
While werewolves are hardy community members, keep in mind the following dietary concerns:
|
13.3.2. Callouts
public class MyStack {
boolean isEmpty() { (1)
return true; (2)
}
}
1 | Kommentar 1 |
2 | Kommentar 2 |
Unresolved directive in index.adoc - include::../../labs/vehicle/src/main/java/at/htl/vehicle/entity/Vehicle.java[tags=constructor]
1 | Auch das ist ein Kommentar |
Header 1 | Header 2 |
---|---|
|
Column 2, row 1 |
Column 1, row 2 |
Column 2, row 2 |
Column 1, row 3 |
Column 2, row 3 |
14. 2025-02-13

14.2. MQTT
-
Telemetrie („Fernmessung“; von altgriechisch τῆλε (tēle, „fern“) und μέτρον (métron, „Maß“ oder „Maßstab“)) ist die Übertragung von Messwerten eines am Messort befindlichen Messfühlers (Sensor) zu einer räumlich getrennten Stelle. [wikipedia]
-
MQTT stands for Message Queuing Telemetry Transport. It is a lightweight messaging protocol for use in cases where clients need a small code footprint and are connected to unreliable networks or networks with limited bandwidth resources. [https://www.paessler.com/it-explained/mqtt^]

-
Server-Produkte:
-
mosquitto
-
rabbitMQ
-
hiveMQ
-
Apache Kafka
-
-
Client-Produkte
-
MQTT-Explorer
-
14.2.1. MQTT
-
Arbeiten Sie obige Videos durch
-
Erstellen Sie in Ihren Mikroprojekten einen MQTT-Client in Java um auf den im Moodle angegeben MQTT-Server der Schule zugreifen zu können
-
Das Topic soll lauten: 4bhitm/nachname/xxx
-
Erstellen Sie einen zeitlich gesteuerten Service, der beliebige (Zufalls-)Werte periodisch an den MQTT-Server sendet
-
Überlegen Sie sich einen Use Case um dynamische Topics zu verwenden
-
zB könnte eine eigene Quarkus Applikation einen REST-Service anbieten, bei dem für einen bestimmten Raum die Temperatur abgefragt werden kann.
-
-
-
Erläutern Sie im README.adoc die grunddätzliche Vorgehensweise um Daten vom und zum mqtt-server zu senden.
|
= Übung Lego-Programmier-Bausteine Thomas Stütz 1.0.0, {docdate} :icons: font :sectnums: // Nummerierung der Überschriften / section numbering // :toc: // :toclevels: 1 :experimental: //https://gist.github.com/dcode/0cfbf2699a1fe9b46ff04c41721dda74?permalink_comment_id=3948218
-
Termin: 6. März 2025