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

de.svws_nrw.davapi.api.DynamicPropUtil Maven / Gradle / Ivy

Go to download

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

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

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;

import de.svws_nrw.davapi.model.dav.Prop;
import jakarta.validation.constraints.NotNull;

/**
 * Utility-Klasse vereinfacht das Auslesen der angeforderten Properties aus
 * einem Prop-Objekt. Das Prop-Objekt wird als Bestandteil des DAV-Requests
 * gesendet und legt fest, welche Properties einer Ressource angefordert werden.
 * Die im Prop-Objekt enthaltenen Properties sind generisch.
 */
class DynamicPropUtil {

	/** Prop-Objekt aus dem DAV-Request */
	private final Prop propRequested;

	/** Liste von Properties (Reflection), die im Prop-Objekt enthalten sind */
	private final List fieldsRequested;

	/**
	 * Konstruktor
	 *
	 * @param propRequested Prop-Objekt aus dem Request.
	 */
	DynamicPropUtil(final @NotNull Prop propRequested) {
		this.propRequested = propRequested;
		this.fieldsRequested = this.getPropsFieldsNotNull(propRequested);
	}

	/**
	 * Prüft, ob eine bestimmte Property im Prop-Objekt angefordert wurde.
	 *
	 * @param fieldType Typklasse der Property, für die Prüfung erfolgen soll.
	 * @return true, falls die Property zur gegebenen Typklasse im Prop-Objekt
	 *         enthalten ist.
	 */
	protected final boolean getIsFieldRequested(final @NotNull Class fieldType) {
		for (final Field field : fieldsRequested) {
			if (field.getType() == fieldType) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Ermittelt per Reflection die angefragten Properties den Prop-Objekt.
	 *
	 * @param propRequested Prop-Objekt aus dem Request.
	 * @return Liste der angefragten Properties als Field-Objekte (Relection)
	 */
	@SuppressWarnings("static-method")
	private List getPropsFieldsNotNull(final @NotNull Prop propRequested) {
		final Field[] fields = propRequested.getClass().getDeclaredFields();
		final List requestedFields = new ArrayList<>();
		for (final Field field : fields) {
			field.setAccessible(true);
			try {
				if (field.get(propRequested) != null) {
					requestedFields.add(field);
				}
			} catch (final IllegalAccessException e) {
				e.printStackTrace();
			}
		}
		return requestedFields;
	}

	/**
	 * Ermittelt alle Properties aus dem Prop-Objekt des Requests, zu denen keine
	 * Entsprechung im Prop-Ergebnisobjekt enthalten ist - also Properties, die vom
	 * Dispatcher nicht unterstützt werden.
	 *
	 * @param propResponded Prop-Objekt, Ergebnisobjekt des Dispatchers.
	 * @return Prop-Objekt mit allen nicht-unterstützten Properties, bzw. null,
	 *         falls keine nicht-unterstützten Properties gefunden wurden.
	 */
	public Prop getUnsupportedProps(final @NotNull Prop propResponded) {
		final List requestedFields = getPropsFieldsNotNull(propRequested);
		final List respondedFields = getPropsFieldsNotNull(propResponded);
		final List fds = requestedFields.stream().filter(f -> !respondedFields.contains(f)).toList();
		if (!fds.isEmpty()) {
			final Prop prop404 = new Prop();
			for (final Field field : fds) {
				try {
					final Object instance = field.getType().getDeclaredConstructor().newInstance();
					field.set(prop404, instance);

				} catch (InstantiationException | IllegalAccessException | InvocationTargetException
						| NoSuchMethodException e) {
					e.printStackTrace();
				}
			}
			return prop404;
		}
		return null;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy