Skip to content
Snippets Groups Projects
Commit 719a1822 authored by Tobias Bruns's avatar Tobias Bruns
Browse files

Remove unused code

parent 6e15f059
Branches
Tags
1 merge request!3Ozg 6988 add reporting
Showing
with 0 additions and 1248 deletions
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.deser.ContextualDeserializer;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
import de.ozgcloud.common.datatype.StringBasedValue;
import lombok.Getter;
abstract class AbstractLinkedResourceDeserializer extends StdDeserializer<Object> implements ContextualDeserializer {
private static final long serialVersionUID = 1L;
@Getter
private BeanProperty beanProperty;
@Getter
private final JavaType targetType;
protected AbstractLinkedResourceDeserializer() {
super(Object.class);
targetType = null;
}
protected AbstractLinkedResourceDeserializer(BeanProperty beanProperty) {
super(Object.class);
this.beanProperty = beanProperty;
this.targetType = beanProperty.getType();
}
@Override
public Object deserialize(JsonParser jsonParser, DeserializationContext ctxt) throws IOException {
if (jsonParser.isExpectedStartArrayToken()) {
Collection<Object> idList = targetType.getRawClass().isAssignableFrom(Set.class) ? new HashSet<>() : new ArrayList<>();
while (!jsonParser.nextToken().isStructEnd()) {
idList.add(extractId(jsonParser.getText()));
}
return idList;
} else {
return extractId(jsonParser.getText());
}
}
Object extractId(String url) {
Class<?> type;
if (targetType.isCollectionLikeType()) {
type = targetType.getContentType().getRawClass();
} else {
type = targetType.getRawClass();
}
if (String.class.isAssignableFrom(type)) {
return extractStringId(url);
}
if (Long.class.isAssignableFrom(type) || Long.TYPE.isAssignableFrom(type)) {
return extractLongId(url);
}
if (StringBasedValue.class.isAssignableFrom(type)) {
return extractStringBasedValue(type, url);
}
return buildByBuilder(url);
}
abstract Object buildByBuilder(String url);
public static Long extractLongId(String uri) {
var trimedUri = StringUtils.trimToNull(uri);
if (Objects.isNull(trimedUri)) {
return null;
}
return Long.parseLong(URLDecoder.decode(trimedUri.substring(trimedUri.lastIndexOf('/') + 1), StandardCharsets.UTF_8));
}
private StringBasedValue extractStringBasedValue(Class<?> type, String url) {
String value = extractStringId(url);
Method fromMethod;
try {
fromMethod = type.getMethod("from", String.class);
} catch (NoSuchMethodException e) {
throw new IllegalStateException(
String.format("Cannot generate Id from type '%s'. Missing 'from' Method.", targetType.getRawClass().getSimpleName()));
}
try {
return (StringBasedValue) fromMethod.invoke(null, value);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
throw new IllegalStateException(
String.format("Cannot generate Id from type '%s'. Error calling 'from' Method.", targetType.getRawClass().getSimpleName()),
e);
}
}
public static String extractStringId(String url) {
return URLDecoder.decode(url.substring(url.lastIndexOf('/') + 1), StandardCharsets.UTF_8);
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import java.io.IOException;
import java.util.Collection;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.ContextualSerializer;
import de.ozgcloud.common.errorhandling.TechnicalException;
abstract class AbstractLinkedResourceSerializer extends JsonSerializer<Object> implements ContextualSerializer {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value instanceof Collection) {
gen.writeStartArray();
((Collection<?>) value).forEach(val -> writeObject(gen, buildLink(val)));
gen.writeEndArray();
} else {
writeObject(gen, buildLink(value));
}
}
abstract String buildLink(Object id);
abstract IdExtractor<Object> getExtractor();
void writeObject(JsonGenerator gen, Object value) {
try {
gen.writeObject(value);
} catch (IOException e) {
throw new TechnicalException("Error writing String to json", e);
}
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import com.fasterxml.jackson.databind.BeanProperty;
import lombok.NoArgsConstructor;
@NoArgsConstructor
class IdBuilder implements ObjectBuilder<Object> {
@Override
public Object build(Object id) {
return id;
}
@Override
public ObjectBuilder<Object> constructContextAware(BeanProperty property) {
return new IdBuilder();
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
@FunctionalInterface
public interface IdExtractor<T> {
String extractId(T object);
}
\ No newline at end of file
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.core.annotation.AliasFor;
import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Inherited
@JacksonAnnotationsInside
@JsonSerialize(using = LinkedResourceSerializer.class)
@JsonDeserialize(using = LinkedResourceDeserializer.class)
public @interface LinkedResource {
Class<?> controllerClass();
Class<? extends IdExtractor<Object>> extractor() default ToStringExtractor.class;
@AliasFor(annotation = JsonDeserialize.class, attribute = "builder")
Class<? extends ObjectBuilder<Object>> builder() default IdBuilder.class;
}
\ No newline at end of file
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.lang3.reflect.ConstructorUtils;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import de.ozgcloud.common.errorhandling.TechnicalException;
public class LinkedResourceDeserializer extends AbstractLinkedResourceDeserializer {
private static final long serialVersionUID = 1L;
private LinkedResource annotation;
protected LinkedResourceDeserializer() {
super();
}
protected LinkedResourceDeserializer(BeanProperty beanProperty) {
super(beanProperty);
this.annotation = beanProperty.getAnnotation(LinkedResource.class);
}
@Override
Object buildByBuilder(String url) {
ObjectBuilder<?> builder;
try {
builder = ConstructorUtils.invokeConstructor(annotation.builder()).constructContextAware(getBeanProperty());
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) {
throw new TechnicalException("Error instanciating Builder.", e);
}
return builder.build(extractStringId(url));
}
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) {
return new LinkedResourceDeserializer(property);
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.lang3.reflect.ConstructorUtils;
import com.fasterxml.jackson.databind.BeanProperty;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import de.ozgcloud.common.errorhandling.TechnicalException;
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class LinkedResourceSerializer extends AbstractLinkedResourceSerializer {
private LinkedResource annotation;
private LinkedResourceSerializer(LinkedResource annotation) {
this.annotation = annotation;
}
@Override
public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) {
return new LinkedResourceSerializer(property.getAnnotation(LinkedResource.class));
}
@Override
String buildLink(Object id) {
return linkTo(annotation.controllerClass()).slash(getExtractor().extractId(id)).toString();
}
@Override
IdExtractor<Object> getExtractor() {
try {
return ConstructorUtils.invokeConstructor(annotation.extractor());
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) {
throw new TechnicalException("Error instanciating IdExtractor", e);
}
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BooleanSupplier;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.function.UnaryOperator;
import java.util.stream.Collectors;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.reflect.FieldUtils;
import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
@Log4j2
public class ModelBuilder<T> {
private static final Map<Class<?>, Map<Object, List<Field>>> ANNOTATED_FIELDS_BY_ANNOTATION = new ConcurrentHashMap<>();
private final T entity;
private final EntityModel<T> model;
private final List<Link> links = new LinkedList<>();
private final List<Function<EntityModel<T>, EntityModel<T>>> mapper = new LinkedList<>();
private ModelBuilder(T entity) {
this.entity = entity;
this.model = null;
}
private ModelBuilder(EntityModel<T> model) {
this.entity = null;
this.model = model;
}
public static <T> ModelBuilder<T> fromEntity(T entity) {
return new ModelBuilder<>(entity);
}
public static <T> ModelBuilder<T> fromModel(EntityModel<T> model) {
return new ModelBuilder<>(model);
}
public ModelBuilder<T> addLink(Link link) {
links.add(link);
return this;
}
public ModelBuilder<T> addLink(Optional<Link> link) {
link.ifPresent(links::add);
return this;
}
public ModelBuilder<T> addLinks(Link... links) {
this.links.addAll(Arrays.asList(links));
return this;
}
public ModelBuilder<T> addLinks(Collection<Link> links) {
this.links.addAll(links);
return this;
}
public ConditionalLinkAdder ifMatch(Predicate<T> predicate) {
return new ConditionalLinkAdder(predicate.test(Objects.isNull(entity) ? model.getContent() : entity));
}
public ConditionalLinkAdder ifMatch(BooleanSupplier guard) {
return new ConditionalLinkAdder(guard.getAsBoolean());
}
public ModelBuilder<T> map(UnaryOperator<EntityModel<T>> mapper) {
this.mapper.add(mapper);
return this;
}
public EntityModel<T> buildModel() {
var filteredLinks = links.stream().filter(Objects::nonNull).collect(Collectors.toSet());
EntityModel<T> buildedModel = Objects.isNull(model) ? EntityModel.of(entity) : model;
buildedModel = buildedModel.add(filteredLinks);
addLinkByLinkedResourceAnnotationIfMissing(buildedModel);
return applyMapper(buildedModel);
}
private EntityModel<T> applyMapper(EntityModel<T> resource) {
Iterator<Function<EntityModel<T>, EntityModel<T>>> i = mapper.iterator();
EntityModel<T> result = resource;
while (i.hasNext()) {
result = i.next().apply(result);
}
return result;
}
private void addLinkByLinkedResourceAnnotationIfMissing(EntityModel<T> resource) {
getFields(LinkedResource.class).stream()
.filter(field -> shouldAddLink(resource, field))
.forEach(field -> handleLinkedResourceField(resource, field));
}
private void handleLinkedResourceField(EntityModel<T> resource, Field field) {
getEntityFieldValue(field).map(Object::toString).filter(StringUtils::isNotBlank).ifPresent(val -> resource
.add(WebMvcLinkBuilder.linkTo(field.getAnnotation(LinkedResource.class).controllerClass()).slash(val)
.withRel(sanitizeName(field.getName()))));
}
private boolean shouldAddLink(EntityModel<T> resource, Field field) {
return !(field.getType().isArray() || Collection.class.isAssignableFrom(field.getType()) || resource.hasLink(sanitizeName(field.getName())));
}
private List<Field> getFields(Class<? extends Annotation> annotationClass) {
var fields = Optional.ofNullable(ANNOTATED_FIELDS_BY_ANNOTATION.get(getEntity().getClass()))
.map(fieldsByAnnotation -> fieldsByAnnotation.get(annotationClass))
.orElseGet(Collections::emptyList);
if (CollectionUtils.isEmpty(fields)) {
fields = FieldUtils.getFieldsListWithAnnotation(getEntity().getClass(), annotationClass);
updateFields(annotationClass, fields);
}
return fields;
}
private void updateFields(Class<? extends Annotation> annotationClass, List<Field> fields) {
var annotationMap = Optional.ofNullable(ANNOTATED_FIELDS_BY_ANNOTATION.get(getEntity().getClass())).orElseGet(HashMap::new);
annotationMap.put(annotationClass, fields);
ANNOTATED_FIELDS_BY_ANNOTATION.put(annotationClass, annotationMap);
}
private String sanitizeName(String fieldName) {
if (fieldName.endsWith("Id")) {
return fieldName.substring(0, fieldName.indexOf("Id"));
}
return fieldName;
}
private Optional<Object> getEntityFieldValue(Field field) {
try {
field.setAccessible(true);
Optional<Object> value = Optional.ofNullable(field.get(getEntity()));
field.setAccessible(false);
return value;
} catch (IllegalArgumentException | IllegalAccessException e) {
LOG.warn("Cannot access field value of LinkedResource field.", e);
}
return Optional.empty();
}
private T getEntity() {
return Optional.ofNullable(entity == null ? model.getContent() : entity)
.orElseThrow(() -> new IllegalStateException("Entity must not null for ModelBuilding"));
}
@RequiredArgsConstructor
public class ConditionalLinkAdder {
public final boolean conditionFulfilled;
public ModelBuilder<T> addLink(Supplier<Link> linkSupplier) {
if (conditionFulfilled) {
addLink(linkSupplier.get());
}
return ModelBuilder.this;
}
public ModelBuilder<T> addLinkIfPresent(Supplier<Optional<Link>> linkSupplier) {
if (conditionFulfilled) {
addLink(linkSupplier.get());
}
return ModelBuilder.this;
}
public ModelBuilder<T> addLink(Function<T, Link> linkBuilder) {
if (conditionFulfilled) {
addLink(linkBuilder.apply(getEntity()));
}
return ModelBuilder.this;
}
public ModelBuilder<T> addLink(Link link) {
if (conditionFulfilled) {
links.add(link);
}
return ModelBuilder.this;
}
public ModelBuilder<T> addLink(Optional<Link> link) {
if (conditionFulfilled) {
link.ifPresent(links::add);
}
return ModelBuilder.this;
}
public ModelBuilder<T> addLinks(Link... links) {
if (conditionFulfilled) {
ModelBuilder.this.links.addAll(Arrays.asList(links));
}
return ModelBuilder.this;
}
@SafeVarargs
public final ModelBuilder<T> addLinks(Supplier<Link>... linkSuppliers) {
if (conditionFulfilled) {
for (int i = 0; i < linkSuppliers.length; i++) {
ModelBuilder.this.links.add(linkSuppliers[i].get());
}
}
return ModelBuilder.this;
}
public final ModelBuilder<T> addLinks(Supplier<Collection<Link>> linksSupplier) {
if (conditionFulfilled) {
linksSupplier.get().forEach(ModelBuilder.this.links::add);
}
return ModelBuilder.this;
}
}
}
\ No newline at end of file
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import com.fasterxml.jackson.databind.BeanProperty;
public interface ObjectBuilder<T> {
T build(Object id);
ObjectBuilder<T> constructContextAware(BeanProperty property);
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import lombok.NoArgsConstructor;
@NoArgsConstructor
class ToStringExtractor implements IdExtractor<Object> {
@Override
public String extractId(Object object) {
return object.toString();
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import static org.assertj.core.api.Assertions.*;
import java.util.List;
import java.util.stream.Stream;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.springframework.hateoas.Link;
import de.ozgcloud.admin.organisationseinheit.OrganisationsEinheit;
import de.ozgcloud.admin.organisationseinheit.OrganisationsEinheitTestFactory;
class CollectionModelBuilderTest {
private final String HREF = "http://test";
private final String REL = "rel";
@Nested
class TestBuildModel {
@Test
void shouldBuildModel() {
var vorgang = OrganisationsEinheitTestFactory.create();
var model = CollectionModelBuilder.fromEntities(List.of(vorgang)).buildModel();
assertThat(model.getContent()).hasSize(1).first().usingRecursiveComparison().isEqualTo(vorgang);
}
}
@Nested
class TestAddLink {
@Test
void shouldAddLink() {
var model = CollectionModelBuilder.fromEntities(List.of()).addLink(Link.of(HREF, REL)).buildModel();
assertThat(model.getLinks()).hasSize(1).first().extracting(Link::getHref, link -> link.getRel().value()).containsExactly(HREF, REL);
}
}
@Nested
class TestIfMatch {
@Nested
class TestWithBooleanSupplier {
@Test
void shouldAddLink() {
var model = CollectionModelBuilder.fromEntities(List.of()).ifMatch(() -> true).addLink(Link.of(HREF, REL)).buildModel();
assertThat(model.getLinks()).hasSize(1).first().extracting(Link::getHref, link -> link.getRel().value()).containsExactly(HREF, REL);
}
@Test
void shouldNotAddLink() {
var model = CollectionModelBuilder.fromEntities(List.of()).ifMatch(() -> false).addLink(Link.of(HREF, REL)).buildModel();
assertThat(model.getLinks()).isEmpty();
}
}
@Nested
class TestWithPredicate {
private final Stream<OrganisationsEinheit> wiedervorlageStream = Stream.of(OrganisationsEinheitTestFactory.create());
@Test
void shouldAddLink() {
var model = CollectionModelBuilder.fromEntities(wiedervorlageStream)
.ifMatch(wiedervorlagen -> true)
.addLink(Link.of(HREF, REL))
.buildModel();
assertThat(model.getLinks()).hasSize(1).first().extracting(Link::getHref, link -> link.getRel().value()).containsExactly(HREF, REL);
}
@Test
void shouldNotAddLink() {
var model = CollectionModelBuilder.fromEntities(wiedervorlageStream)
.ifMatch(wiedervorlagen -> false)
.addLink(Link.of(HREF, REL))
.buildModel();
assertThat(model.getLinks()).isEmpty();
}
}
}
}
\ No newline at end of file
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import org.springframework.hateoas.EntityModel;
import de.ozgcloud.admin.organisationseinheit.OrganisationsEinheit;
import lombok.NoArgsConstructor;
public class EntityModelTestFactory {
public static final NullableEntityModel NULLABLE = createNullable();
private static NullableEntityModel createNullable() {
return new NullableEntityModel();
}
@NoArgsConstructor
private static class NullableEntityModel extends EntityModel<OrganisationsEinheit> {
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.databind.BeanProperty;
class IdBuilderTest {
@DisplayName("Test building ID when deserializing linked resources")
@Nested
class TestBuilingId {
private static final String ID = "id";
@Test
void shouldBuildId() {
IdBuilder idBuilder = new IdBuilder();
var idObject = idBuilder.build(ID);
assertThat(idObject).isInstanceOf(Object.class).asString().isEqualTo(ID);
}
@Test
void shouldCreateObjectBuilder() {
BeanProperty property = mock(BeanProperty.class);
ObjectBuilder<Object> idBuilder = new IdBuilder().constructContextAware(property);
assertThat(idBuilder).isNotNull();
}
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import static org.assertj.core.api.Assertions.*;
import java.io.IOException;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.ozgcloud.admin.common.user.TestId;
import de.ozgcloud.admin.organisationseinheit.OrganisationsEinheitTestFactory;
class LinkedResourceDeserializerTest {
private static final String TEST_JSON = "{\"id\":\"/api/vorgangs/" + OrganisationsEinheitTestFactory.ID + "\"}";
@DisplayName("Test the deserilization of linked resource json")
@Nested
class TestDeserialization {
@Test
void shouldDeserialize() throws IOException {
LinkedResourceTestObject res = new ObjectMapper().readValue(TEST_JSON.getBytes(), LinkedResourceTestObject.class);
assertThat(res).hasFieldOrPropertyWithValue("id", TestId.from(OrganisationsEinheitTestFactory.ID));
}
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.ozgcloud.admin.common.user.TestId;
import de.ozgcloud.admin.organisationseinheit.OrganisationsEinheitTestFactory;
class LinkedResourceSerializerTest {
@DisplayName("Test the json serialization of linked resource annotations")
@Nested
class TestSerialization {
@Test
void shouldSerialize() throws JsonProcessingException {
var testObj = new LinkedResourceTestObject(TestId.from(OrganisationsEinheitTestFactory.ID));
String serialized = new ObjectMapper().writeValueAsString(testObj);
assertThat(serialized).isEqualTo("{\"id\":\"/api/organisationseinheits/" + OrganisationsEinheitTestFactory.ID + "\"}");
}
}
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import de.ozgcloud.admin.common.user.TestId;
import de.ozgcloud.admin.organisationseinheit.OrganisationsEinheitController;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
@Getter
@AllArgsConstructor
@NoArgsConstructor
class LinkedResourceTestObject {
@LinkedResource(controllerClass = OrganisationsEinheitController.class)
private TestId id;
}
/*
* Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den
* Ministerpräsidenten des Landes Schleswig-Holstein
* Staatskanzlei
* Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.common;
import static org.assertj.core.api.Assertions.*;
import java.util.UUID;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.NullAndEmptySource;
import org.mockito.Mock;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.RequestMapping;
import lombok.Builder;
class ModelBuilderTest {
@DisplayName("Add link by annotation if missing")
@Nested
class TestAddLinkByAnnotationIfMissing {
private static final String USER_MANAGER_URL = "http://localhost";
private static final String USER_MANAGER_PROFILE_TEMPLATE = "/api/profile/%s";
@Mock
private ApplicationContext context;
private TestEntity entity = TestEntityTestFactory.create();
@Test
void shouldHaveAddLinkByLinkedResource() {
var model = ModelBuilder.fromEntity(entity).buildModel();
assertThat(model.getLink(TestController.FILE_REL).get().getHref()).isEqualTo(TestController.PATH + "/" + TestEntityTestFactory.FILE);
}
@ParameterizedTest
@NullAndEmptySource
void shouldNotAddLinkByLinkedRessourceIfFieldValueIsNotSet(String fileId) {
var model = ModelBuilder.fromEntity(TestEntityTestFactory.createBuilder().file(fileId).build()).buildModel();
assertThat(model.getLink(TestController.FILE_REL)).isEmpty();
}
}
}
@Builder
class TestEntity {
@LinkedResource(controllerClass = TestController.class)
private String file;
}
@RequestMapping(TestController.PATH)
class TestController {
static final String PATH = "/api/test";
static final String USER_REL = "user";
static final String FILE_REL = "file";
}
class TestEntityTestFactory {
static final String USER = UUID.randomUUID().toString();
static final String FILE = UUID.randomUUID().toString();
public static TestEntity create() {
return createBuilder().build();
}
public static TestEntity.TestEntityBuilder createBuilder() {
return TestEntity.builder()
.file(FILE);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment