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

de.svws_nrw.data.schueler.DBUtilsSchueler Maven / Gradle / Ivy

Go to download

Diese Bibliothek unterstützt bei dem Zugriff auf Datenbanken für die Schulverwaltungssoftware in NRW

There is a newer version: 1.0.1
Show newest version
package de.svws_nrw.data.schueler;

import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import de.svws_nrw.base.crypto.AES;
import de.svws_nrw.base.crypto.AESAlgo;
import de.svws_nrw.core.data.schueler.Sprachbelegung;
import de.svws_nrw.core.data.schueler.Sprachendaten;
import de.svws_nrw.core.data.schueler.Sprachpruefung;
import de.svws_nrw.data.crypto.DBUtilsCrypto;
import de.svws_nrw.db.DBEntityManager;
import de.svws_nrw.db.dto.current.schild.schueler.DTOSchuelerSprachenfolge;
import de.svws_nrw.db.dto.current.schild.schueler.DTOSchuelerSprachpruefungen;
import de.svws_nrw.db.dto.current.svws.auth.DTOCredentials;
import de.svws_nrw.db.utils.ApiOperationException;


/**
 * Diese Klasse stellt Hilfsmethoden für den Zugriff auf Informationen
 * von Schülern zur Verfügung.
 */
public final class DBUtilsSchueler {

	private DBUtilsSchueler() {
		throw new IllegalStateException("Instantiation of " + DBUtilsSchueler.class.getName() + " not allowed");
	}


	/**
	 * Liest den AES-Schlüssel des Schülers aus der Datenbank ein und gibt das zugehörige AES-Crypto-Objekt zurück.
	 * Sollte noch kein AES-Schlüssel in der Datenbank vorhanden sein, so wird ein neuer Schlüssel angelegt.
	 *
	 * Für die Kommunikation mit der Datenbank wird die angegebene Verbindung genutzt, welche eine aktive Transaktion
	 * haben muss.
	 *
	 * @param conn   die Datenbank-Verbindung
	 * @param id     die ID des Schülers
	 *
	 * @return das AES-Crypto-Objekt zum Ver- und Entschlüsseln von Daten
	 *
	 * @throws ApiOperationException falls ein Fehler auftritt
	 */
	public static AES getOrCreateSchuelerAES(final DBEntityManager conn, final long id) throws ApiOperationException {
		final DTOCredentials cred = DBUtilsCrypto.getOrCreateSchuelerCredentials(conn, id);
		if (cred.AES == null)
			DBUtilsCrypto.addAESKey(conn, cred);
		return new AES(AESAlgo.CBC_PKCS5PADDING, AES.getKeyFromByteArray(Base64.getDecoder().decode(cred.AES)));
	}


	private static Sprachbelegung dtoMapperSprachenfolge(final DTOSchuelerSprachenfolge dtoSprachbelegung) {
		final Sprachbelegung belegung = new Sprachbelegung();
		belegung.sprache = dtoSprachbelegung.Sprache;
		belegung.reihenfolge = dtoSprachbelegung.ReihenfolgeNr;
		belegung.belegungVonJahrgang = dtoSprachbelegung.ASDJahrgangVon;
		belegung.belegungVonAbschnitt = dtoSprachbelegung.AbschnittVon;
		belegung.belegungBisJahrgang = dtoSprachbelegung.ASDJahrgangBis;
		belegung.belegungBisAbschnitt = dtoSprachbelegung.AbschnittBis;
		if (dtoSprachbelegung.Referenzniveau != null) {
			belegung.referenzniveau = dtoSprachbelegung.Referenzniveau.daten.kuerzel;
		} else {
			belegung.referenzniveau = null;
		}
		return belegung;
	}


	private static Sprachpruefung dtoMapperSprachenpruefung(final DTOSchuelerSprachpruefungen dtoSprachpruefung) {
		final Sprachpruefung pruefung = new Sprachpruefung();
		pruefung.sprache = dtoSprachpruefung.Sprache;
		pruefung.anspruchsniveauId = dtoSprachpruefung.Anspruchsniveau.daten.id;
		pruefung.jahrgang = dtoSprachpruefung.ASDJahrgang;
		pruefung.istHSUPruefung = dtoSprachpruefung.IstHSUPruefung;
		pruefung.istFeststellungspruefung = dtoSprachpruefung.IstFeststellungspruefung;
		pruefung.kannErstePflichtfremdspracheErsetzen = dtoSprachpruefung.KannErstePflichtfremdspracheErsetzen;
		pruefung.kannZweitePflichtfremdspracheErsetzen = dtoSprachpruefung.KannZweitePflichtfremdspracheErsetzen;
		pruefung.kannWahlpflichtfremdspracheErsetzen = dtoSprachpruefung.KannWahlpflichtfremdspracheErsetzen;
		pruefung.kannBelegungAlsFortgefuehrteSpracheErlauben = dtoSprachpruefung.KannBelegungAlsFortgefuehrteSpracheErlauben;
		pruefung.note = (dtoSprachpruefung.NotePruefung == null) ? null : dtoSprachpruefung.NotePruefung.getNoteSekI();
		if (dtoSprachpruefung.Referenzniveau != null) {
			pruefung.referenzniveau = dtoSprachpruefung.Referenzniveau.daten.kuerzel;
		} else {
			pruefung.referenzniveau = null;
		}
		return pruefung;
	}


	private static Sprachendaten dtoMapperSprachendaten(final long idSchueler, final List dtoSprachbelegungen,
			final List dtoSprachpruefungen) {
		final Sprachendaten sprachendaten = new Sprachendaten();
		sprachendaten.schuelerID = idSchueler;
		for (final DTOSchuelerSprachenfolge dtoSprachbelegung : dtoSprachbelegungen) {
			if (dtoSprachbelegung.ASDJahrgangVon == null)
				continue;
			sprachendaten.belegungen.add(dtoMapperSprachenfolge(dtoSprachbelegung));
		}
		for (final DTOSchuelerSprachpruefungen dtoSprachpruefung : dtoSprachpruefungen) {
			if ((dtoSprachpruefung.Sprache == null) || (dtoSprachpruefung.Anspruchsniveau == null)
					|| (!dtoSprachpruefung.IstHSUPruefung && !dtoSprachpruefung.IstFeststellungspruefung))
				continue;
			sprachendaten.pruefungen.add(dtoMapperSprachenpruefung(dtoSprachpruefung));
		}
		return sprachendaten;
	}


	/**
	 * Bestimmt die Sprachbelegungen (Sprachenfolge) und die Sprachprüfungen für den Schüler mit der angegebenen ID aus
	 * den entsprechenden Tabellen in der Datenbank.
	 *
	 * @param conn   die Datenbank-Verbindung
	 * @param id     die ID des Schülers
	 *
	 * @return die Sprachendaten
	 */
	public static Sprachendaten getSchuelerSprachendaten(final DBEntityManager conn, final long id) {
		// Lese die Sprachbelegungen (Sprachenfolge) und die Sprachprüfungen aus der Datenbank ein
		final List dtoSprachenfolge =
				conn.queryList(DTOSchuelerSprachenfolge.QUERY_BY_SCHUELER_ID, DTOSchuelerSprachenfolge.class, id);
		final List dtoSprachpruefungen =
				conn.queryList(DTOSchuelerSprachpruefungen.QUERY_BY_SCHUELER_ID, DTOSchuelerSprachpruefungen.class, id);
		// ... und gibt sie als Sprachendaten-Objekt zurück.
		return dtoMapperSprachendaten(id, dtoSprachenfolge, dtoSprachpruefungen);
	}


	/**
	 * Bestimmt die Sprachbelegungen (Sprachenfolge) und die Sprachprüfungen für die Schüler mit der angegebenen IDs aus
	 * den entsprechenden Tabellen in der Datenbank.
	 *
	 * @param conn   die Datenbank-Verbindung
	 * @param ids    die IDs der Schüler
	 *
	 * @return die Sprachendaten der Schüler
	 */
	public static List getSchuelerSprachendaten(final DBEntityManager conn, final List ids) {
		// Lese die Sprachbelegungen (Sprachenfolge) und die Sprachprüfungen aus der Datenbank ein
		final Map> mapSprachenfolgen =
				conn.queryList(DTOSchuelerSprachenfolge.QUERY_LIST_BY_SCHUELER_ID, DTOSchuelerSprachenfolge.class, ids)
						.stream().collect(Collectors.groupingBy(f -> f.Schueler_ID, Collectors.toList()));
		final Map> mapSprachpruefungen =
				conn.queryList(DTOSchuelerSprachpruefungen.QUERY_LIST_BY_SCHUELER_ID, DTOSchuelerSprachpruefungen.class, ids)
						.stream().collect(Collectors.groupingBy(f -> f.Schueler_ID, Collectors.toList()));
		// ... und gibt sie als Sprachendaten-Objekte zurück.
		return ids.stream().map(id -> dtoMapperSprachendaten(id, mapSprachenfolgen.computeIfAbsent(id, k -> new ArrayList<>()),
				mapSprachpruefungen.computeIfAbsent(id, k -> new ArrayList<>()))).toList();
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy