Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
package de.svws_nrw.data;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.function.ObjLongConsumer;
import java.util.stream.Collectors;
import de.svws_nrw.db.DBEntityManager;
import de.svws_nrw.db.utils.ApiOperationException;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.Response.Status;
/**
* Diese abstrakte Klasse ist die Grundlage für das einheitliche Aggregieren von
* Informationen für die OpenAPI und das einheitliche Bereitstellen von
* Funktionen, welche Daten für GET oder PATCH-Zugriff zur Verfügung stellen.
*
* @param die Typ, welcher als ID für die Informationen verwendet wird.
*/
public abstract class DataManager {
/**
* Die Datenbank-Verbindung zum Aggregieren der Informationen aus der DB und zum
* Schreiben der Informationen bzw. Teilinformationen
*/
protected final DBEntityManager conn;
/**
* Erstellt einen neuen Datenmanager mit der angegebenen Verbindung
*
* @param conn die Datenbank-Verbindung, welche vom Daten-Manager benutzt werden
* soll
*/
protected DataManager(final DBEntityManager conn) {
this.conn = conn;
}
/**
* Ermittelt eine Liste mit allen Informationen in der DB. Wird üblicherweise
* durch GET-Methoden für Listen verwendet. Meist ist die Methode getList zu
* bevorzugen.
*
* @return eine Liste mit den Informationen
*
* @throws ApiOperationException im Fehlerfall
*/
public abstract Response getAll() throws ApiOperationException;
/**
* Ermittelt eine Liste mit Informationen. Wird üblicherweise durch GET-Methoden
* für Listen verwendet. Bei dieser Liste werden ggf. Filter verwendet (z.B. nur
* als sichtbar markierte Einträge)
*
* @return eine Liste mit den Informationen
*
* @throws ApiOperationException im Fehlerfall
*/
public abstract Response getList() throws ApiOperationException;
/**
* Ermittelt die Informationen anhand der angegebenen ID. Wird üblicherweise
* durch GET-Methoden verwendet.
*
* @param id die ID der gesuchten Informationen
*
* @return die Information mit der angebenen ID
*
* @throws ApiOperationException im Fehlerfall
*/
public abstract Response get(ID id) throws ApiOperationException;
/**
* Ermittelt die Informationen ohne eine gültige ID (null). Wird üblicherweise
* durch GET-Methoden verwendet.
*
* @return die Information mit der angebenen ID
*
* @throws ApiOperationException im Fehlerfall
*/
public Response get() throws ApiOperationException {
return this.get(null);
}
/**
* Passt die Informationen mithilfe des JSON-Patches aus dem übergebenen
* {@link InputStream} an.
*
* @param id die ID der anzupassenden Informationen
* @param is der {@link InputStream} mit dem JSON-Patch
*
* @return Die HTTP-Response der Patch-Operation
*
* @throws ApiOperationException im Fehlerfall
*/
public abstract Response patch(ID id, InputStream is) throws ApiOperationException;
/**
* Passt die Informationen mithilfe des JSON-Patches aus dem übergebenen
* {@link InputStream} an. Eine ID wird in diesem Fall nicht verwendet und als
* null angenommen.
*
* @param is der {@link InputStream} mit dem JSON-Patch
*
* @return Die HTTP-Response der Patch-Operation
*
* @throws ApiOperationException im Fehlerfall
*/
public Response patch(final InputStream is) throws ApiOperationException {
return this.patch(null, is);
}
/**
* Wendet die angegebenen Mappings für die Attribute des Core-DTOs (übergebene
* Map) auf das übergebene DatenbankDTO an.
*
* @param Der Typ des Datenbank-DTOs
*
* @param conn die Datenbankverbindung
* @param dto das Datenbank-DTO
* @param map eine Map mit den Attributen und den Attributwerten des
* Core-DTOs
* @param attributeMapper eine Map mit den Mappingfunktionen zum mappen von
* Core-DTO-Attributen auf Datenbank-DTO-Attributen
* @param attributesSkip eine Menge von Attributen, die ausgelassen wird
* @param attributesForbidden eine Menge von Attributen, die nicht im JSON-Inputstream enthalten sein dürfen, null falls nicht gefiltert werden soll
*
* @throws ApiOperationException im Fehlerfall
*/
protected static void applyPatchMappings(final DBEntityManager conn, final DTO dto, final Map map,
final Map> attributeMapper, final Set attributesSkip, final Set attributesForbidden)
throws ApiOperationException {
for (final Entry entry : map.entrySet()) {
final String key = entry.getKey();
final Object value = entry.getValue();
if (attributesSkip.contains(key))
continue;
if ((attributesForbidden != null) && attributesForbidden.contains(key))
throw new ApiOperationException(Status.FORBIDDEN, "Attribut %s darf nicht im Patch enthalten sein.".formatted(key));
final DataBasicMapper mapper = attributeMapper.get(key);
if (mapper == null)
throw new ApiOperationException(Status.BAD_REQUEST);
mapper.map(conn, dto, value, map);
}
}
/**
* Passt die Informationen des Datenbank-DTO mit der angegebenen ID mithilfe des
* JSON-Patches aus dem übergebenen {@link InputStream} an. Dabei werden nur die
* übergebenen Mappings zugelassen.
*
* @param der Typ des DTOs
* @param id die ID des zu patchenden DTOs
* @param map die Map mit dem Mapping der Attributnamen auf die Werte der Attribute im Patch
* @param dtoClass die Klasse des DTOs
* @param attributeMapper die Mapper für das Anpassen des DTOs
* @param attributesForbidden eine Menge von Attributen, die nicht im JSON-Inputstream enthalten sein dürfen, null falls nicht gefiltert werden soll
*
* @throws ApiOperationException im Fehlerfall
*/
private void patchBasicInternal(final ID id, final Map map, final Class dtoClass,
final Map> attributeMapper, final Set attributesForbidden) throws ApiOperationException {
if (id == null)
throw new ApiOperationException(Status.BAD_REQUEST, "Ein Patch mit der ID null ist nicht möglich.");
if (map.isEmpty())
throw new ApiOperationException(Status.NOT_FOUND, "In dem Patch sind keine Daten enthalten.");
final DTO dto = conn.queryByKey(dtoClass, id);
if (dto == null)
throw new ApiOperationException(Status.NOT_FOUND);
applyPatchMappings(conn, dto, map, attributeMapper, Collections.emptySet(), attributesForbidden);
conn.transactionPersist(dto);
conn.transactionFlush();
}
/**
* Passt die Informationen des Datenbank-DTO mit der angegebenen ID mithilfe des
* JSON-Patches aus dem übergebenen {@link InputStream} an. Dabei werden nur die
* übergebenen Mappings zugelassen.
*
* @param der Typ des DTOs
* @param id die ID des zu patchenden DTOs
* @param is der Input-Stream
* @param dtoClass die Klasse des DTOs
* @param attributeMapper die Mapper für das Anpassen des DTOs
* @param attributesForbidden eine Menge von Attributen, die nicht im JSON-Inputstream enthalten sein dürfen, null falls nicht gefiltert werden soll
*
* @return die Response
*
* @throws ApiOperationException im Fehlerfall
*/
protected Response patchBasicFiltered(final ID id, final InputStream is, final Class dtoClass,
final Map> attributeMapper, final Set attributesForbidden) throws ApiOperationException {
patchBasicInternal(id, JSONMapper.toMap(is), dtoClass, attributeMapper, attributesForbidden);
return Response.status(Status.NO_CONTENT).build();
}
/**
* Passt die Informationen des Datenbank-DTO mit der angegebenen ID mithilfe des
* JSON-Patches aus dem übergebenen {@link InputStream} an. Dabei werden nur die
* übergebenen Mappings zugelassen.
*
* @param der Typ des DTOs
* @param id die ID des zu patchenden DTOs
* @param is der Input-Stream
* @param dtoClass die Klasse des DTOs
* @param attributeMapper die Mapper für das Anpassen des DTOs
*
* @return die Response
*
* @throws ApiOperationException im Fehlerfall
*/
protected Response patchBasic(final ID id, final InputStream is, final Class dtoClass, final Map> attributeMapper)
throws ApiOperationException {
patchBasicInternal(id, JSONMapper.toMap(is), dtoClass, attributeMapper, null);
return Response.status(Status.NO_CONTENT).build();
}
/**
* Passt die Informationen der Datenbank-DTOs mithilfe des
* JSON-Patches aus dem übergebenen {@link InputStream} an. Dabei werden nur die
* übergebenen Mappings zugelassen.
*
* @param der Typ der DTOs
* @param idAttr der Name des ID-Attributes der DTOs
* @param is der Input-Stream
* @param dtoClass die Klasse der DTOs
* @param attributeMapper die Mapper für das Anpassen des DTOs
*
* @return die Response
*
* @throws ApiOperationException im Fehlerfall
*/
@SuppressWarnings("unchecked")
protected Response patchBasicMultiple(final String idAttr, final InputStream is, final Class dtoClass,
final Map> attributeMapper) throws ApiOperationException {
final List