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

de.svws_nrw.api.ResourceFileManager Maven / Gradle / Ivy

Go to download

Diese Bibliothek enthält die Java-Server-Definition der OpenApi-Schnittstelle für die Schulverwaltungssoftware in NRW

There is a newer version: 1.0.3
Show newest version
package de.svws_nrw.api;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;

import de.svws_nrw.config.SVWSKonfiguration;
import de.svws_nrw.core.logger.Logger;
import de.svws_nrw.db.utils.ApiOperationException;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.ws.rs.core.Response.Status;

/**
 * Diese Klasse dient als Cache für Datei-Ressourcen, wie dem SVWS-Client, die über
 * die OpenAPI-Schnisstelle zur Verfügung gestellt werden.
 */
public final class ResourceFileManager {

	/** Eine HashMap mit den {@link ResourceFile}-Objekten zugeordnet zu den Dateinamen,
	 * unter dem auf die Ressource zugegriffen wird. */
	private final HashMap files = new HashMap<>();


	/** Verwaltet die Ressourcen des Web-Clients */
	private static ResourceFileManager _client = null;

	/** Verwaltet die Ressourcen des Admin-Web-Clients */
	private static ResourceFileManager _admin = null;


	/**
	 * Erstellt einen neuen Manager für alle Datei-Ressourcen in dem angebenen Pfad.
	 * Bei der Registierung werden nur die relativen Pfade darunter verwendet.
	 *
	 * @param path   der Pfad, aus welchem die Datei-Ressourcen hinzuzufügen sind.
	 */
	private ResourceFileManager(final String path) {
		addDirectory(path, new File(path));
	}


	/**
	 * Gibt die Ressourcen des Web-Clients zurück.
	 *
	 * @return die Ressourcen des Web-Clients
	 */
	public static ResourceFileManager client() {
		if (_client == null) {
			Logger.global().logLn("Füge die Datei-Ressourcen für den SVWS-Client hinzu:");
			final SVWSKonfiguration config = SVWSKonfiguration.get();
			final String path = config.getClientPath();
			_client = new ResourceFileManager(path);
		}
		return _client;
	}


	/**
	 * Gibt die Ressourcen des Admin-Web-Clients zurück.
	 *
	 * @return die Ressourcen des Admin-Web-Clients
	 */
	public static ResourceFileManager admin() {
		if (_admin == null) {
			Logger.global().logLn("Füge die Datei-Ressourcen für den SVWS-Admin-Client hinzu:");
			final SVWSKonfiguration config = SVWSKonfiguration.get();
			final String path = config.getAdminClientPath();
			if ((path == null) || (path.isBlank()))
				return null;
			_admin = new ResourceFileManager(path);
		}
		return _admin;
	}


	/**
	 * Fügt alle Ressourcen in dem angegebenen Verzeichnis zu den Ressourcen hinzu. Dabei wird das
	 * angegbene Präfix bei dem Pfadnamen der Dateien nicht für die Registierung als Resource
	 * verwendet und aus dem Pfad für die Registrierung entfernt.
	 *
	 * @param prefix   das bei der Registrierung zu ignorierende Präfix des Dateipfades
	 * @param dir      das Verzeichnis, in dem die hinzuzufügenden Datei-Ressourcen gesucht werden
	 */
	private void addDirectory(final String prefix, final File dir) {
		if (!dir.isDirectory())
			return;
		final File[] dir_content = dir.listFiles();
		if (dir_content == null)
			return;
		for (final File f : dir_content) {
			if (f.isFile()) {
				final ResourceFile file = new ResourceFile(prefix, f);
				Logger.global().logLn(2, file.getPath());
				files.put(file.getPath(), file);
			} else if (f.isDirectory()) {
				addDirectory(prefix, f);
			}
		}
	}


	/**
	 * Entfernt alle registrierten Datei-Ressourcen.
	 */
	public void clearAll() {
		files.clear();
	}


	/**
	 * Prüft zunächst, ob eine Datei-Ressource unter dem angegebenen Pfad registriert ist.
	 * Ist dies der Fall, so wird das {@link HttpServletResponse}-Objekt mit den Daten der
	 * Datei-Ressource beschrieben und es wird true zurückgegeben. Tritt beim ein Fehler
	 * auf oder ist keine Datei-Ressource unter dem Pfad registriert, so wird false
	 * zurückgegeben.
	 *
	 * @param path       der Pfad der Datei-Ressource
	 * @param response   das {@link HttpServletResponse}-Objekt für die Daten der Ressource
	 *
	 * @return true, falls die Response gültige Daten beinhaltet, ansonsten false
	 *
	 * @throws ApiOperationException   im Fehlerfall
	 */
	public boolean handleResponse(final String path, final HttpServletResponse response) throws ApiOperationException {
		final ResourceFile res = files.get(path);
		if (res == null)
			return false;
		try {
			res.write(response);
		} catch (final IOException e) {
			throw new ApiOperationException(Status.INTERNAL_SERVER_ERROR, e);
		}
		return true;
	}


	/**
	 * Prüft zunächst, ob eine Datei-Ressource unter dem angegebenen Pfad registriert ist.
	 * Ist die nicht der Fall, so wird null zurückgegeben. Ansonsten werden
	 * die Daten der registrierten Datei-Ressource zurückgeben (siehe auch
	 * {@link ResourceFile#getData()}).
	 *
	 * @param path   der Pfad der Datei-Ressource
	 *
	 * @return die Daten der Datei-Ressource oder null im Fehlerfall
	 *
	 * @throws ApiOperationException   im Fehlerfall
	 */
	public byte[] getData(final String path) throws ApiOperationException {
		final ResourceFile res = files.get(path);
		if (res == null)
			return new byte[0];
		return res.getData();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy