‏ ‏ ‎ ‏ ‏ ‎

1. 2021-09-28

  • Quarkus Grundlagen (Foliensätze)

2. 2021-09-30 - entfallen

3. 2021-10-05 - entfallen wegen AHS-Vortrag

4. 2021-10-07, Do.

request response
  • REST-Clients

  • Testen in Quarkus (@QuarkusTest)

5. 2021-10-12, Di.

v modell

vehicle cld 1
vehicle cld 2

5.1. Einteilung Mikroprojekte

  • Abazović Edina

  • Ablinger Raphael

  • Aichinger Niklas

  • Baumgartner Lukas

  • Bogdan Sebastijan

  • Handel Christoph

  • Hartl Anna

  • Hautzmayer Sheila

  • Hirsch Nico

  • Keintzel Florian

  • Kerschbaum Philipp

  • König Julia

  • Melcher Tamara

  • Neudorfer Niklas

  • Pavelescu Darius-Cristian

  • Pelzeder Joachim

  • Plakolb Marcel

  • Rathberger Jakob

  • Remplbauer Markus

  • Sugic Oliver

  • Tran Michael

  • Tunc Johannes

6. 2021-10-14

6.1. REST Context

6.2. REST WebApplication Exception

6.4. REST Parameter

  • QueryParam

  • PathParam

  • FormParam

7. 2021-10-18 (Einschub)

jsonb formparam
hash
mapping
cors

7.1. Rest-Endpoints erstellt

  • FormParam

  • POST mit Location-Rückgabe

7.2. Mit JPA begonnen

8. 2021-11-04

ide database overview

8.1. 3 Strategien zur Erstellung der Schlüsselwerte

  • Table

  • IDENTITY

  • Sequence

8.2. Transactions

8.3. Verwendung von Test zum Ausprobieren von DB-Zugriffen

Begriffe:

  • ORM

  • JDBC

  • JAX-RS

    • resteasy

  • JPA

    • Hibernate

9. 2021-11-08

9.1. Mögliche Fragen:

  • Welche Möglichkeiten gibt es, ein Quarkus Projekt zu erstellen?

    • Assistent auf quarkus.io

    • Assistent in IDE (zB IntelliJ)

    • Aufruf mit mvn

  • Strategien zum Erzeugen von Primärschlüsselwerten?

    • TABLE

    • SEQUENCE

    • IDENTITY

  • Wie kann man eine Testklasse für eine beliebige Klasse erstellen?

    • Cursor auf Klassenbezeichnung

    • Rechte Maustaste

    • Create Test

  • Was bewirkt die Annotation @QuarkusTest?

9.2. Repositories für JPA

microsoft repository pattern

9.3. Startup

  • Die Methode init() wird sofort nach Start der Applikation ausgeführt (vglbar mit main()-Methode)

  • Die init()-Methode kann beliebig benannt werden

package at.htl.carrental.control;

import at.htl.carrental.entity.Person;
import io.quarkus.runtime.StartupEvent;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.inject.Inject;

@ApplicationScoped
public class InitBean {

    @Inject
    PersonRepository personRepository;

    void init(@Observes StartupEvent event) {
        Person p = new Person("Susi");
        personRepository.save(p);
    }

}

9.4. Automatisches Befüllen der Tabelle mit IMPORT.sql

  • in Ordner src/main/resources/ eine Datei import.sql erstellen: src/main/resources/import.sql

  • INSERTs einfügen

  • beim nächsten Start der App werden die INSERTs ausgeführt

  • https://quarkus.io/guides/hibernate-orm

9.5. NamedQueries

  • 2 Varianten

    • JP-QL

    • Criteria API (verwenden wir NICHT)

JP-QL (Java Persistence Query Language)
@Entity
@NamedQueries({
        @NamedQuery(
                name = "Person.findAll",
                query = "select p from Person p"
        )
})
public class Person {
    //...
}
  • JP-QL ist vergleichbar mit SQL

  • jedoch werden i.N. keine SPalten angegeben, da nur ganze Objekte zurückgegeben werden.

  • die Rückgabe von Spalten ist sehr wohl möglich

  • Joins und Aggregationen sind ebenfalls möglich

  • https://www.objectdb.com/java/jpa/query/jpql/structure

10. 2021-11-09

10.1. Ausführen einer NamedQuery

@Test
void getAllPersons() {
    TypedQuery<Person> query = em
            .createNamedQuery("Person.findAll",Person.class);
    List<Person> persons = query.getResultList();
    assertThat(persons.size()).isEqualTo(8);
    logger.info(persons);
}

10.2. Ausführen einer Query

@Test
void getAllPersonsWithQuery() {
    TypedQuery<Person> query = em
            .createQuery("select p from Person p",Person.class);
    List<Person> persons = query.getResultList();
    assertThat(persons.size()).isEqualTo(8);
    logger.info(persons);
}

10.3. Ausführen einer NativeQuery

  • Es gibt auch hier

    • NativeQuery

    • NativeNamedQuery

@Test
void getAllPersonsWithNativeQuery() {
    Query query = em
            .createNativeQuery("select p.id, p.name from person p");
    List<Object[]> persons = query.getResultList();
    for (Object[] elem : persons) {
        System.out.println(elem[0] + " " + elem[1]);
    }
    assertThat(persons.size()).isEqualTo(9);
}

10.4. Mikroprojekte-Themen

Name Thema

Abazović Edina

Stadtrundfahrten

Ablinger Raphael

Linienbusunternehmen inkl. Fahrplan

Aichinger Niklas

Supermarkkt

Baumgartner Lukas

Teehändler

Bogdan Sebastijan

Friedhofsverwaltung

Handel Christoph

Schuhplattln

Hartl Anna

Gärtnerei

Hautzmayer Sheila

Tanzverein

Hirsch Nico

Rezeptseite

Keintzel Florian

Hotel

Kerschbaum Philipp

Fussballverein

König Julia

Tennisverein

Melcher Tamara

Kletterverein mit Kletterrouten

Neudorfer Niklas

Gebäudeverwaltung (wo sind welche Geräte installiert zB Chromecasts)

Pavelescu Darius-Cristian

Musikdatenbank

Pelzeder Joachim

Personaleinteilung in Produktonsbetrieb mit Schichten (es wird durchgehend produziert)

Plakolb Marcel

Luftfahrtlinie (Wo fliegen die Flugzeuge, Linien)

Rathberger Jakob

Doodle

Remplbauer Markus

Modellagentur

Sugic Oliver

Schwimmverein

Tran Michael

Restaurant (Tischreservierung)

Tunc Johannes

Reisebüro

10.5. Übung

  • Erstellen eines Datenmodell in plantuml (3-5 Entitäten)

  • Publishen zu gh-pages

  • Zusätzlich eine kurze Erklärung für die Anwendung

  • Termin: 11.11.2021

  • Ordner im Root-Folder: asciidocs, backend, frontend

  • Erstellen eines Quarkus-Projekts mit einer Tabelle, persisitert in eine postgre-db und einem Endpoint

10.6. Erstellen einer aggregierten Abfrage

10.6.1. Schritt 1: Sql-Query

  select substr(name,1,1), count(*)
    from person
group by substr(name,1,1)
order by 1;

10.6.2. Schritt 2: Übertragen nach Java

@Test
void countLetters() {

    Query query = em.createQuery("select substring(p.name,1,1), count(p) from Person p group by substring(p.name,1,1)");
    List<Object[]> list = query.getResultList();

    for (Object[] elem : list) {
        logger.info(elem[0] + " - " + elem[1]);
    }

    assertThat(list.size()).isEqualTo(8);
}

10.7. Beziehungen zwischen Entitäten - Vererbung

assoziative Beziehung

11. 2021-11-16

11.1. NamedQueries mit Parameter

11.2. Aggregated Queries

NamedQuery in Entity
package at.htl.carrental.entity;

import javax.persistence.*;

@Entity
@NamedQueries({
        @NamedQuery(
                name = "Person.countByInital",
                query = "select substring(p.name,1, 1), count(p) from Person p group by substring(p.name,1, 1)"
        )
})
public class Person {

    // ...
}
Use NamedQuery in Repository
@ApplicationScoped
public class PersonRepository {

    @Inject
    EntityManager em;

    // ...

    public Map<Character, Integer> countByInitial() {
        Map<Character, Integer> result = new HashMap<>();
        Query query = em
                .createNamedQuery("Person.countByInital");
        List<Object[]> initials = query.getResultList();
        for (Object[] initial : initials) {
            result.put(
                    initial[0].toString().charAt(0),
                    Integer.parseInt(initial[1].toString())
            );
        }
        return result;
    }
}
Test repository method
@QuarkusTest
class PersonTest {

    // ...

    @Test
    void countLetters() {

        Query query = em.createQuery("select substring(p.name,1,1), count(p) from Person p group by substring(p.name,1,1)");
        List<Object[]> list = query.getResultList();

        for (Object[] elem : list) {
            logger.info(elem[0] + " - " + elem[1]);
        }

        assertThat(list.size()).isEqualTo(8);
    }
}

12. 2021-11-29 Vorbereitung für Test-W

  • Cascadierende Assoziationen

13. 2021-12-07 Panache

14. 2021-12-13 Panache - Persistence Context

persistence context
  • Befindet sich ein Java-Objekt im Persistence Context, so hat es den Status "Managed"

    • Ein Objekt kann den Zustand "managed" durch den Aufruf von persist() erhalten

    • aber auch durch ein Holen des Objekts (Methode find()) aus der DB

    • wichtig ist dabei, dass eine Transaktion aktiv ist

      • Entweder Verwendung einer UserTransaction (mit tx.begin() und tx.commit())

      • oder Verwendung von @Transactional

  • Im Persistence Context kann man automatisch DB-Aktionen an abhängige Objekte weitergeben (zB cascading persist, …​)

15. 2021-12-14

15.1. Datenzugriffs-Pattern

15.1.1. Repository-Pattern

15.1.2. Active-Record-Pattern

15.2. Queries in Panache

16. 2021-12-21

16.3. Übung: Validierung und Qute im Microproject

  • Einbinden von Validation und Qute ins Mikroprojekt

  • zb Bei Validation:

    • nicht alle (Entity-)Klassen müssen validiert werden.

    • es sind allerdings die Konzepte aus dem Tutorial zu verwenden, zB

      • vorgefertigte Validatoren

      • Erstellung eines eigenen Validators

  • Es ist ein asciidoc-File zu erstellen (im Ordner asciidocs), in dem die Arbeiten dokumentiert werden.

tafelbild01 vmodell
tafelbild03 testen
tafelbild02 vmodell scrum
tafelbild04 ucd

17. 2021-12-23

17.1. Übung: gRPC - Termin: 5. Jänner 2022

18. Qute

qute
  • Beispiel

    • In der Klasse StudentResource sind die Qute-Template typisiert deklariert.

    • Wird im Browser die jeweilige Route des Qute-Templates aufgerufen, liefert der Server die das gerenderte Template als html aus

    • Der User kann nun zB ein Formular ausfüllen.

    • Nach dem Klicken auf den Submit Button, werden die Inhalte der Formularfelder an den im Form-Attribut "action" angegeben REST-Endpoint übermittelt.

    • Dieser REST-Endpoint gibt nun die neue Route jener Seite, die als nächstes angezeigt wird, an den Browser zurück

19. 2022-01-11

19.1. Quarkus Security

19.1.1. Hausübung

19.1.2. Besprochen

Wir haben über Security mithilfe von Keycloak gesprochen: https://www.keycloak.org/downloads

  • Kleine mini quarkus Anwendung die geschützt werden (z.B.: nur rest teil)

  • User haben Rollen -→ Rollen geben einen User gewisse Rechte, die er machen darf.

20. 2022-01-17

  • assert: stelle sicher, Zusicherung

projektarchitektur

Bottom-Up (Basis-Ansatz)

Einzelne Programmbestandteile werden definiert, eventuell sogar direkt geschrieben. Aus diesen Teilen werden dann größere Elemente des Programms zusammengesetzt, bis das vollständige System erstellt ist.

Top-Down (Vogelperspektive, Überbau-Ansatz)

Grundlegender Architekturüberblick (Zuerst Landkarte ⇒ z.B.: Wo muss Technologie hin?)

REST-Service

Daten zwischen Komponenten austauschen mit z.B.: Delete, Patch, Put, Get, Post

Metadata

Daten über Daten. Z.B.: Datentyp, Autowert, …​

Daten

Daten sind rohe, unorganisierte, zusammenhangslose Fakten.

Informationen
  • Informationen entstehen aus Daten

  • Daten werden verwendet zur Problemlösung, dann werden diese Daten zu Informationen

  • Wenn man Daten verarbeitet, organisiert, strukturiert oder in bestimmten Kontext stellt

Data Mining

Mit mathematischen Methoden Zusammenhänge zwischen Daten ermitteln. Z.B.: Wenn man Bier kauft, kaufen viel auch Chips ⇒ daher sind meistens Bier und Chips in unmittelbarer Nähe von einander

Testen

Nicht zu viele Tests, aber auch nicht zu wenige Tests.

  • assertj

  • myBatis

  • jdbc

21. 2022-02-03

21.1. Rest-Client

rest client

21.2. Übung Mikroprojekt

22. 2022-02-08

22.1. Unit—​Testing

22.1.1. Test Struktur

Arrange-Act-Assert
  • AAA-Pattern

Given-When-Then

23. 2022-02-15

24. 2022-02-17 (Do.) SYP-Ersatzstunde

24.1. Einrichten der oravm

25. 2022-02-08 - Foliensätze Kotlin

26. 2022-03-10 Erstes Android Project

26.1. CoolDroid (siehe labs folder)

  • ist noch ohne jetpack compose mit xml-files