Merge branch 'master' of ssh://dev.hostsharing.net:29418/hsadmin/hsadmin-ng
This commit is contained in:
commit
40ce312880
@ -156,7 +156,8 @@ def jhipsterGeneratedClassesWithLowCoverage = [
|
|||||||
|
|
||||||
def specialExceptions = [
|
def specialExceptions = [
|
||||||
// lots of unreachable code due to error handling / verifications
|
// lots of unreachable code due to error handling / verifications
|
||||||
'org.hostsharing.hsadminng.service.accessfilter.JSonAccessFilter'
|
'org.hostsharing.hsadminng.service.accessfilter.JSonAccessFilter',
|
||||||
|
'org.hostsharing.hsadminng.service.util.ReflectionUtil'
|
||||||
]
|
]
|
||||||
|
|
||||||
jacocoTestCoverageVerification {
|
jacocoTestCoverageVerification {
|
||||||
@ -188,7 +189,7 @@ jacocoTestCoverageVerification {
|
|||||||
limit {
|
limit {
|
||||||
counter = 'LINE'
|
counter = 'LINE'
|
||||||
value = 'COVEREDRATIO'
|
value = 'COVEREDRATIO'
|
||||||
minimum = 0.90
|
minimum = 0.85
|
||||||
}
|
}
|
||||||
includes = specialExceptions
|
includes = specialExceptions
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
package org.hostsharing.hsadminng.service.accessfilter;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A marker interface for DTO classes which can be used by {@link JsonSerializerWithAccessFilter} and {@link JsonDeserializerWithAccessFilter}.
|
||||||
|
*/
|
||||||
|
public interface AccessMappings extends Serializable {
|
||||||
|
}
|
@ -10,8 +10,6 @@ import org.springframework.context.ApplicationContext;
|
|||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.ParameterizedType;
|
|
||||||
import java.lang.reflect.Type;
|
|
||||||
|
|
||||||
import static com.google.common.base.Verify.verify;
|
import static com.google.common.base.Verify.verify;
|
||||||
|
|
||||||
@ -67,28 +65,16 @@ abstract class JSonAccessFilter<T> {
|
|||||||
|
|
||||||
final ParentId parentIdAnnot = parentIdField.getAnnotation(ParentId.class);
|
final ParentId parentIdAnnot = parentIdField.getAnnotation(ParentId.class);
|
||||||
final Class<? extends IdToDtoResolver> parentDtoLoader = parentIdAnnot.resolver();
|
final Class<? extends IdToDtoResolver> parentDtoLoader = parentIdAnnot.resolver();
|
||||||
final Class<?> parentDtoClass = getGenericClassParameter(parentDtoLoader);
|
final Class<IdToDtoResolver> rawType = IdToDtoResolver.class;
|
||||||
final Long parentId = (Long) ReflectionUtil.getValue(dto, parentIdField);
|
|
||||||
|
final Class<?> parentDtoClass = ReflectionUtil.<T>determineGenericInterfaceParameter(parentDtoLoader, rawType, 0);
|
||||||
|
final Long parentId = ReflectionUtil.getValue(dto, parentIdField);
|
||||||
final Role roleOnParent = SecurityUtils.getLoginUserRoleFor(parentDtoClass, parentId);
|
final Role roleOnParent = SecurityUtils.getLoginUserRoleFor(parentDtoClass, parentId);
|
||||||
|
|
||||||
final Object parentEntity = loadDto(parentDtoLoader, parentId);
|
final Object parentEntity = loadDto(parentDtoLoader, parentId);
|
||||||
return Role.broadest(baseRole, getLoginUserRoleOnAncestorOfDtoClassIfHigher(roleOnParent, parentEntity));
|
return Role.broadest(baseRole, getLoginUserRoleOnAncestorOfDtoClassIfHigher(roleOnParent, parentEntity));
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
private Class<T> getGenericClassParameter(Class<? extends IdToDtoResolver> parentDtoLoader) {
|
|
||||||
for (Type genericInterface : parentDtoLoader.getGenericInterfaces()) {
|
|
||||||
if (genericInterface instanceof ParameterizedType) {
|
|
||||||
final ParameterizedType parameterizedType = (ParameterizedType) genericInterface;
|
|
||||||
if (parameterizedType.getRawType()== IdToDtoResolver.class) {
|
|
||||||
return (Class<T>) parameterizedType.getActualTypeArguments()[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
throw new AssertionError(parentDtoLoader.getSimpleName() + " expected to implement " + IdToDtoResolver.class.getSimpleName() + "<...DTO>");
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
protected Object loadDto(final Class<? extends IdToDtoResolver> resolverClass, final Long id) {
|
protected Object loadDto(final Class<? extends IdToDtoResolver> resolverClass, final Long id) {
|
||||||
verify(id != null, "id must not be null for " + resolverClass.getSimpleName());
|
verify(id != null, "id must not be null for " + resolverClass.getSimpleName());
|
||||||
|
@ -18,12 +18,18 @@ import java.util.Set;
|
|||||||
|
|
||||||
import static org.hostsharing.hsadminng.service.util.ReflectionUtil.unchecked;
|
import static org.hostsharing.hsadminng.service.util.ReflectionUtil.unchecked;
|
||||||
|
|
||||||
public class JSonDeserializerWithAccessFilter<T> extends JSonAccessFilter<T> {
|
/** Actual implementation of JSON deserialization, where {link JSonDeserializerWithAccessFilter}
|
||||||
|
* is a stateless bean, {@link JSonDeserializationWithAccessFilter} exists only during the actual
|
||||||
|
* deserialization and contains a deserialization state.
|
||||||
|
*
|
||||||
|
* @param <T> DTO class to serialize
|
||||||
|
*/
|
||||||
|
public class JSonDeserializationWithAccessFilter<T> extends JSonAccessFilter<T> {
|
||||||
|
|
||||||
private final TreeNode treeNode;
|
private final TreeNode treeNode;
|
||||||
private final Set<Field> writtenFields = new HashSet<>();
|
private final Set<Field> writtenFields = new HashSet<>();
|
||||||
|
|
||||||
public JSonDeserializerWithAccessFilter(final ApplicationContext ctx, final JsonParser jsonParser, final DeserializationContext deserializationContext, Class<T> dtoClass) {
|
public JSonDeserializationWithAccessFilter(final ApplicationContext ctx, final JsonParser jsonParser, final DeserializationContext deserializationContext, Class<T> dtoClass) {
|
||||||
super(ctx, unchecked(dtoClass::newInstance));
|
super(ctx, unchecked(dtoClass::newInstance));
|
||||||
this.treeNode = unchecked(() -> jsonParser.getCodec().readTree(jsonParser));
|
this.treeNode = unchecked(() -> jsonParser.getCodec().readTree(jsonParser));
|
||||||
}
|
}
|
||||||
@ -113,7 +119,7 @@ public class JSonDeserializerWithAccessFilter<T> extends JSonAccessFilter<T> {
|
|||||||
} else if (Boolean.class.isAssignableFrom(field.getType()) || boolean.class.isAssignableFrom(field.getType())) {
|
} else if (Boolean.class.isAssignableFrom(field.getType()) || boolean.class.isAssignableFrom(field.getType())) {
|
||||||
ReflectionUtil.setValue(dto, field, Boolean.valueOf(value.toString()));
|
ReflectionUtil.setValue(dto, field, Boolean.valueOf(value.toString()));
|
||||||
} else if (field.getType().isEnum()) {
|
} else if (field.getType().isEnum()) {
|
||||||
ReflectionUtil.setValue(dto, field, Enum.valueOf((Class<Enum>) field.getType(), value.toString()));
|
ReflectionUtil.setValue(dto, field, ReflectionUtil.asEnumValue(field.getType(), value));
|
||||||
} else if (LocalDate.class.isAssignableFrom(field.getType())) {
|
} else if (LocalDate.class.isAssignableFrom(field.getType())) {
|
||||||
ReflectionUtil.setValue(dto, field, LocalDate.parse(value.toString()));
|
ReflectionUtil.setValue(dto, field, LocalDate.parse(value.toString()));
|
||||||
} else {
|
} else {
|
@ -12,11 +12,17 @@ import java.lang.reflect.Field;
|
|||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
|
||||||
public class JSonSerializerWithAccessFilter<T> extends JSonAccessFilter<T> {
|
/** Actual implementation of JSON serialization, where {link JsonSerializerWithAccessFilter}
|
||||||
|
* is a stateless bean, {@link JSonSerializationWithAccessFilter} exists only during the actual
|
||||||
|
* serialization and contains a serialization state.
|
||||||
|
*
|
||||||
|
* @param <T> DTO class to serialize
|
||||||
|
*/
|
||||||
|
public class JSonSerializationWithAccessFilter<T> extends JSonAccessFilter<T> {
|
||||||
private final JsonGenerator jsonGenerator;
|
private final JsonGenerator jsonGenerator;
|
||||||
private final SerializerProvider serializerProvider;
|
private final SerializerProvider serializerProvider;
|
||||||
|
|
||||||
public JSonSerializerWithAccessFilter(final ApplicationContext ctx,
|
public JSonSerializationWithAccessFilter(final ApplicationContext ctx,
|
||||||
final JsonGenerator jsonGenerator,
|
final JsonGenerator jsonGenerator,
|
||||||
final SerializerProvider serializerProvider,
|
final SerializerProvider serializerProvider,
|
||||||
final T dto) {
|
final T dto) {
|
@ -0,0 +1,24 @@
|
|||||||
|
package org.hostsharing.hsadminng.service.accessfilter;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonParser;
|
||||||
|
import com.fasterxml.jackson.databind.DeserializationContext;
|
||||||
|
import com.fasterxml.jackson.databind.JsonDeserializer;
|
||||||
|
import org.hostsharing.hsadminng.service.util.ReflectionUtil;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
|
||||||
|
public abstract class JsonDeserializerWithAccessFilter<T extends AccessMappings> extends JsonDeserializer<T> {
|
||||||
|
|
||||||
|
private final ApplicationContext ctx;
|
||||||
|
|
||||||
|
public JsonDeserializerWithAccessFilter(final ApplicationContext ctx) {
|
||||||
|
this.ctx = ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public T deserialize(final JsonParser jsonParser,
|
||||||
|
final DeserializationContext deserializationContext) {
|
||||||
|
|
||||||
|
final Class<T> dtoClass = ReflectionUtil.determineGenericClassParameter(this.getClass(), JsonDeserializerWithAccessFilter.class, 0);
|
||||||
|
return new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, deserializationContext, dtoClass).deserialize();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,31 @@
|
|||||||
|
package org.hostsharing.hsadminng.service.accessfilter;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.JsonGenerator;
|
||||||
|
import com.fasterxml.jackson.databind.JsonSerializer;
|
||||||
|
import com.fasterxml.jackson.databind.SerializerProvider;
|
||||||
|
import org.springframework.context.ApplicationContext;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/** A base class for a Spring bean for JSON serialization with field-based access filters.
|
||||||
|
* Where {@link JSonSerializationWithAccessFilter} is the actual stateful implementation and
|
||||||
|
* it's instances only exist during the process of serialization, this class is a stateless just
|
||||||
|
* used for service and context injection.
|
||||||
|
*
|
||||||
|
* @param <T> DTO class to serialize
|
||||||
|
*/
|
||||||
|
public abstract class JsonSerializerWithAccessFilter<T extends AccessMappings> extends JsonSerializer<T> {
|
||||||
|
|
||||||
|
protected final ApplicationContext ctx;
|
||||||
|
|
||||||
|
public JsonSerializerWithAccessFilter(final ApplicationContext ctx) {
|
||||||
|
this.ctx = ctx;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void serialize(final T dto, final JsonGenerator jsonGenerator,
|
||||||
|
final SerializerProvider serializerProvider) throws IOException {
|
||||||
|
|
||||||
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, serializerProvider, dto).serialize();
|
||||||
|
}
|
||||||
|
}
|
@ -1,11 +1,5 @@
|
|||||||
package org.hostsharing.hsadminng.service.dto;
|
package org.hostsharing.hsadminng.service.dto;
|
||||||
|
|
||||||
import com.fasterxml.jackson.core.JsonGenerator;
|
|
||||||
import com.fasterxml.jackson.core.JsonParser;
|
|
||||||
import com.fasterxml.jackson.databind.DeserializationContext;
|
|
||||||
import com.fasterxml.jackson.databind.JsonDeserializer;
|
|
||||||
import com.fasterxml.jackson.databind.JsonSerializer;
|
|
||||||
import com.fasterxml.jackson.databind.SerializerProvider;
|
|
||||||
import org.hostsharing.hsadminng.domain.enumeration.CustomerKind;
|
import org.hostsharing.hsadminng.domain.enumeration.CustomerKind;
|
||||||
import org.hostsharing.hsadminng.domain.enumeration.VatRegion;
|
import org.hostsharing.hsadminng.domain.enumeration.VatRegion;
|
||||||
import org.hostsharing.hsadminng.service.CustomerService;
|
import org.hostsharing.hsadminng.service.CustomerService;
|
||||||
@ -14,15 +8,13 @@ import org.springframework.boot.jackson.JsonComponent;
|
|||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
|
|
||||||
import javax.validation.constraints.*;
|
import javax.validation.constraints.*;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A DTO for the Customer entity.
|
* A DTO for the Customer entity.
|
||||||
*/
|
*/
|
||||||
public class CustomerDTO extends FluentBuilder<CustomerDTO> implements Serializable {
|
public class CustomerDTO extends FluentBuilder<CustomerDTO> implements AccessMappings {
|
||||||
|
|
||||||
@SelfId(resolver = CustomerService.class)
|
@SelfId(resolver = CustomerService.class)
|
||||||
@AccessFor(read = Role.ANY_CUSTOMER_USER)
|
@AccessFor(read = Role.ANY_CUSTOMER_USER)
|
||||||
@ -265,36 +257,18 @@ public class CustomerDTO extends FluentBuilder<CustomerDTO> implements Serializa
|
|||||||
}
|
}
|
||||||
|
|
||||||
@JsonComponent
|
@JsonComponent
|
||||||
public static class CustomerJsonSerializer extends JsonSerializer<CustomerDTO> {
|
public static class CustomerJsonSerializer extends JsonSerializerWithAccessFilter<CustomerDTO> {
|
||||||
|
|
||||||
private final ApplicationContext ctx;
|
|
||||||
|
|
||||||
public CustomerJsonSerializer(final ApplicationContext ctx) {
|
public CustomerJsonSerializer(final ApplicationContext ctx) {
|
||||||
this.ctx = ctx;
|
super(ctx);
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void serialize(final CustomerDTO customerDTO, final JsonGenerator jsonGenerator,
|
|
||||||
final SerializerProvider serializerProvider) throws IOException {
|
|
||||||
|
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, serializerProvider, customerDTO).serialize();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonComponent
|
@JsonComponent
|
||||||
public static class CustomerJsonDeserializer extends JsonDeserializer<CustomerDTO> {
|
public static class CustomerJsonDeserializer extends JsonDeserializerWithAccessFilter<CustomerDTO> {
|
||||||
|
|
||||||
private final ApplicationContext ctx;
|
|
||||||
|
|
||||||
public CustomerJsonDeserializer(final ApplicationContext ctx) {
|
public CustomerJsonDeserializer(final ApplicationContext ctx) {
|
||||||
this.ctx = ctx;
|
super(ctx);
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public CustomerDTO deserialize(final JsonParser jsonParser,
|
|
||||||
final DeserializationContext deserializationContext) {
|
|
||||||
|
|
||||||
return new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, deserializationContext, CustomerDTO.class).deserialize();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,20 @@
|
|||||||
package org.hostsharing.hsadminng.service.util;
|
package org.hostsharing.hsadminng.service.util;
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
|
import java.lang.reflect.ParameterizedType;
|
||||||
|
import java.lang.reflect.Type;
|
||||||
|
|
||||||
|
|
||||||
public class ReflectionUtil {
|
public class ReflectionUtil {
|
||||||
|
|
||||||
public static <T> void setValue(final T dto, final String fieldName, final Object value) {
|
public static Field getField(final Class<?> aClass, final String fieldName) {
|
||||||
try {
|
try {
|
||||||
final Field field = dto.getClass().getDeclaredField(fieldName);
|
return aClass.getDeclaredField(fieldName);
|
||||||
field.setAccessible(true);
|
} catch (final NoSuchFieldException e) {
|
||||||
field.set(dto, value);
|
if (aClass.getSuperclass() != Object.class) {
|
||||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
return getField(aClass.getSuperclass(), fieldName);
|
||||||
throw new RuntimeException(e);
|
}
|
||||||
|
throw new IllegalArgumentException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -18,20 +22,100 @@ public class ReflectionUtil {
|
|||||||
try {
|
try {
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
field.set(dto, value);
|
field.set(dto, value);
|
||||||
} catch (IllegalAccessException e) {
|
} catch (final IllegalAccessException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <T> T getValue(final T dto, final Field field) {
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <T, R> R getValue(final T dto, final Field field) {
|
||||||
try {
|
try {
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
return (T) field.get(dto);
|
return (R) field.get(dto);
|
||||||
} catch (IllegalAccessException e) {
|
} catch (final IllegalAccessException e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches the annotations of 'clazz' for an implemented interface 'rawInterface' and returns the class of the actual generics parameter at the specified index.
|
||||||
|
*
|
||||||
|
* @param clazz a class which implements the generic interface 'rawInterface'
|
||||||
|
* @param rawInterface a generic interface
|
||||||
|
* @param paramIndex the index of the generics parameter within 'rawInterface'
|
||||||
|
* @param <T> the expected class of the generics parameter at position 'index' in 'rawInterface'
|
||||||
|
* @return the actual generics parameter
|
||||||
|
*/
|
||||||
|
public static <T> Class<T> determineGenericInterfaceParameter(final Class<?> clazz, final Class<?> rawInterface, final int paramIndex) {
|
||||||
|
final Class<T> found = determineGenericInterfaceParameterImpl(clazz, rawInterface, paramIndex);
|
||||||
|
if (found == null) {
|
||||||
|
throw new AssertionError(clazz.getSimpleName() + " expected to implement " + rawInterface.getSimpleName() + "<...>");
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private static <T> Class<T> determineGenericInterfaceParameterImpl(final Class<?> clazz, final Class<?> rawInterface, final int paramIndex) {
|
||||||
|
for (Type genericInterface : clazz.getGenericInterfaces()) {
|
||||||
|
if (genericInterface instanceof ParameterizedType) {
|
||||||
|
final ParameterizedType parameterizedType = (ParameterizedType) genericInterface;
|
||||||
|
if (parameterizedType.getRawType() == rawInterface) {
|
||||||
|
return (Class<T>) parameterizedType.getActualTypeArguments()[paramIndex];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (clazz.getSuperclass() != null) {
|
||||||
|
final Class<T> found = determineGenericInterfaceParameterImpl(clazz.getSuperclass(), rawInterface, paramIndex);
|
||||||
|
if (found != null) {
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (Class<?> implementedInterface : clazz.getInterfaces()) {
|
||||||
|
final Class<T> found = determineGenericInterfaceParameterImpl(implementedInterface, rawInterface, paramIndex);
|
||||||
|
if (found != null) {
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Searches the annotations of 'clazz' for an extended class 'rawClass' and returns the class of the actual generics parameter at the specified index.
|
||||||
|
*
|
||||||
|
* @param clazz a class which implements the generic interface 'rawClass'
|
||||||
|
* @param rawClass a generic class
|
||||||
|
* @param paramIndex the index of the generics parameter within 'rawClass'
|
||||||
|
* @param <T> the expected class of the generics parameter at position 'index' in 'rawClass'
|
||||||
|
* @return the actual generics parameter
|
||||||
|
*/
|
||||||
|
public static <T> Class<T> determineGenericClassParameter(final Class<?> clazz, final Class<?> rawClass, final int paramIndex) {
|
||||||
|
final Class<T> found = determineGenericClassParameterImpl(clazz, rawClass, paramIndex);
|
||||||
|
if (found == null) {
|
||||||
|
throw new AssertionError(clazz.getSimpleName() + " expected to extend " + rawClass.getSimpleName() + "<...>");
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private static <T> Class<T> determineGenericClassParameterImpl(final Class<?> clazz, final Class<?> rawClass, final int paramIndex) {
|
||||||
|
final Type genericClass = clazz.getGenericSuperclass();
|
||||||
|
if (genericClass instanceof ParameterizedType) {
|
||||||
|
final ParameterizedType parameterizedType = (ParameterizedType) genericClass;
|
||||||
|
if (parameterizedType.getRawType() == rawClass) {
|
||||||
|
return (Class<T>) parameterizedType.getActualTypeArguments()[paramIndex];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (clazz.getSuperclass() != Object.class) {
|
||||||
|
return determineGenericClassParameter(clazz.getSuperclass(), rawClass, paramIndex);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public static <E extends Enum<E>> Enum<E> asEnumValue(final Class<?> type, final Object value) {
|
||||||
|
return Enum.valueOf((Class<E>) type, value.toString());
|
||||||
|
}
|
||||||
|
|
||||||
@FunctionalInterface
|
@FunctionalInterface
|
||||||
public interface ThrowingSupplier<T> {
|
public interface ThrowingSupplier<T> {
|
||||||
T get() throws Exception;
|
T get() throws Exception;
|
||||||
@ -40,7 +124,7 @@ public class ReflectionUtil {
|
|||||||
public static <T> T unchecked(final ThrowingSupplier<T> supplier) {
|
public static <T> T unchecked(final ThrowingSupplier<T> supplier) {
|
||||||
try {
|
try {
|
||||||
return supplier.get();
|
return supplier.get();
|
||||||
} catch (Exception e) {
|
} catch (final Exception e) {
|
||||||
throw new RuntimeException(e);
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,7 +32,7 @@ import static org.hostsharing.hsadminng.service.accessfilter.MockSecurityContext
|
|||||||
import static org.mockito.BDDMockito.given;
|
import static org.mockito.BDDMockito.given;
|
||||||
|
|
||||||
@SuppressWarnings("ALL")
|
@SuppressWarnings("ALL")
|
||||||
public class JSonDeserializerWithAccessFilterUnitTest {
|
public class JSonDeserializationWithAccessFilterUnitTest {
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public MockitoRule mockitoRule = MockitoJUnit.rule();
|
public MockitoRule mockitoRule = MockitoJUnit.rule();
|
||||||
@ -98,7 +98,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
ImmutablePair.of("openStringField", null)));
|
ImmutablePair.of("openStringField", null)));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
GivenDto actualDto = new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize();
|
GivenDto actualDto = new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(actualDto.openStringField).isNull();
|
assertThat(actualDto.openStringField).isNull();
|
||||||
@ -113,7 +113,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
ImmutablePair.of("openStringField", "String Value")));
|
ImmutablePair.of("openStringField", "String Value")));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
GivenDto actualDto = new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize();
|
GivenDto actualDto = new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(actualDto.openStringField).isEqualTo("String Value");
|
assertThat(actualDto.openStringField).isEqualTo("String Value");
|
||||||
@ -128,7 +128,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
ImmutablePair.of("openIntegerField", 1234)));
|
ImmutablePair.of("openIntegerField", 1234)));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
GivenDto actualDto = new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize();
|
GivenDto actualDto = new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(actualDto.openIntegerField).isEqualTo(1234);
|
assertThat(actualDto.openIntegerField).isEqualTo(1234);
|
||||||
@ -157,7 +157,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
GivenDto actualDto = new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize();
|
GivenDto actualDto = new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(actualDto.openIntegerField).isEqualTo(11);
|
assertThat(actualDto.openIntegerField).isEqualTo(11);
|
||||||
@ -183,7 +183,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
Throwable exception = catchThrowable(() -> new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize());
|
Throwable exception = catchThrowable(() -> new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize());
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(exception).isInstanceOf(NotImplementedException.class);
|
assertThat(exception).isInstanceOf(NotImplementedException.class);
|
||||||
@ -200,7 +200,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
ImmutablePair.of("restrictedField", "update value of restricted field")));
|
ImmutablePair.of("restrictedField", "update value of restricted field")));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
GivenDto actualDto = new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize();
|
GivenDto actualDto = new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(actualDto.restrictedField).isEqualTo("update value of restricted field");
|
assertThat(actualDto.restrictedField).isEqualTo("update value of restricted field");
|
||||||
@ -217,7 +217,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
ImmutablePair.of("restrictedField", "initial value of restricted field")));
|
ImmutablePair.of("restrictedField", "initial value of restricted field")));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
GivenDto actualDto = new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize();
|
GivenDto actualDto = new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(actualDto.restrictedField).isEqualTo("initial value of restricted field");
|
assertThat(actualDto.restrictedField).isEqualTo("initial value of restricted field");
|
||||||
@ -234,7 +234,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
Throwable exception = catchThrowable(() -> new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize());
|
Throwable exception = catchThrowable(() -> new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize());
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(exception).isInstanceOfSatisfying(BadRequestAlertException.class, badRequestAlertException -> {
|
assertThat(exception).isInstanceOfSatisfying(BadRequestAlertException.class, badRequestAlertException -> {
|
||||||
@ -254,7 +254,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
Throwable exception = catchThrowable(() -> new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize());
|
Throwable exception = catchThrowable(() -> new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize());
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(exception).isInstanceOfSatisfying(BadRequestAlertException.class, badRequestAlertException -> {
|
assertThat(exception).isInstanceOfSatisfying(BadRequestAlertException.class, badRequestAlertException -> {
|
||||||
@ -273,7 +273,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
Throwable exception = catchThrowable(() -> new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenChildDto.class).deserialize());
|
Throwable exception = catchThrowable(() -> new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenChildDto.class).deserialize());
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(exception).isInstanceOfSatisfying(BadRequestAlertException.class, badRequestAlertException -> {
|
assertThat(exception).isInstanceOfSatisfying(BadRequestAlertException.class, badRequestAlertException -> {
|
||||||
@ -292,7 +292,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
final GivenChildDto actualDto = new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenChildDto.class).deserialize();
|
final GivenChildDto actualDto = new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenChildDto.class).deserialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(actualDto.parentId).isEqualTo(1234L);
|
assertThat(actualDto.parentId).isEqualTo(1234L);
|
||||||
@ -309,7 +309,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
ImmutablePair.of("restrictedField", "Restricted String Value")));
|
ImmutablePair.of("restrictedField", "Restricted String Value")));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
Throwable exception = catchThrowable(() -> new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize());
|
Throwable exception = catchThrowable(() -> new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenDto.class).deserialize());
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(exception).isInstanceOfSatisfying(BadRequestAlertException.class, badRequestAlertException -> {
|
assertThat(exception).isInstanceOfSatisfying(BadRequestAlertException.class, badRequestAlertException -> {
|
||||||
@ -324,7 +324,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
givenJSonTree(asJSon(ImmutablePair.of("id", 1111L)));
|
givenJSonTree(asJSon(ImmutablePair.of("id", 1111L)));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
Throwable exception = catchThrowable(() -> new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenDtoWithMultipleSelfId.class).deserialize());
|
Throwable exception = catchThrowable(() -> new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenDtoWithMultipleSelfId.class).deserialize());
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(exception).isInstanceOf(AssertionError.class).hasMessage("multiple @SelfId detected in GivenDtoWithMultipleSelfId");
|
assertThat(exception).isInstanceOf(AssertionError.class).hasMessage("multiple @SelfId detected in GivenDtoWithMultipleSelfId");
|
||||||
@ -338,7 +338,7 @@ public class JSonDeserializerWithAccessFilterUnitTest {
|
|||||||
givenJSonTree(asJSon(ImmutablePair.of("unknown", new Arbitrary())));
|
givenJSonTree(asJSon(ImmutablePair.of("unknown", new Arbitrary())));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
Throwable exception = catchThrowable(() -> new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, GivenDtoWithUnknownFieldType.class).deserialize());
|
Throwable exception = catchThrowable(() -> new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, GivenDtoWithUnknownFieldType.class).deserialize());
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(exception).isInstanceOf(NotImplementedException.class)
|
assertThat(exception).isInstanceOf(NotImplementedException.class)
|
@ -21,7 +21,7 @@ import static org.mockito.BDDMockito.given;
|
|||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
public class JSonSerializerWithAccessFilterUnitTest {
|
public class JSonSerializationWithAccessFilterUnitTest {
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public MockitoRule mockitoRule = MockitoJUnit.rule();
|
public MockitoRule mockitoRule = MockitoJUnit.rule();
|
||||||
@ -55,7 +55,7 @@ public class JSonSerializerWithAccessFilterUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void shouldSerializeStringField() throws IOException {
|
public void shouldSerializeStringField() throws IOException {
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator).writeStringField("openStringField", givenDTO.openStringField);
|
verify(jsonGenerator).writeStringField("openStringField", givenDTO.openStringField);
|
||||||
@ -64,7 +64,7 @@ public class JSonSerializerWithAccessFilterUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void shouldSerializeIntegerField() throws IOException {
|
public void shouldSerializeIntegerField() throws IOException {
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator).writeNumberField("openIntegerField", givenDTO.openIntegerField);
|
verify(jsonGenerator).writeNumberField("openIntegerField", givenDTO.openIntegerField);
|
||||||
@ -73,7 +73,7 @@ public class JSonSerializerWithAccessFilterUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void shouldSerializePrimitiveIntField() throws IOException {
|
public void shouldSerializePrimitiveIntField() throws IOException {
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator).writeNumberField("openPrimitiveIntField", givenDTO.openPrimitiveIntField);
|
verify(jsonGenerator).writeNumberField("openPrimitiveIntField", givenDTO.openPrimitiveIntField);
|
||||||
@ -82,7 +82,7 @@ public class JSonSerializerWithAccessFilterUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void shouldSerializeLongField() throws IOException {
|
public void shouldSerializeLongField() throws IOException {
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator).writeNumberField("openLongField", givenDTO.openLongField);
|
verify(jsonGenerator).writeNumberField("openLongField", givenDTO.openLongField);
|
||||||
@ -91,7 +91,7 @@ public class JSonSerializerWithAccessFilterUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void shouldSerializePrimitiveLongField() throws IOException {
|
public void shouldSerializePrimitiveLongField() throws IOException {
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator).writeNumberField("openPrimitiveLongField", givenDTO.openPrimitiveLongField);
|
verify(jsonGenerator).writeNumberField("openPrimitiveLongField", givenDTO.openPrimitiveLongField);
|
||||||
@ -100,7 +100,7 @@ public class JSonSerializerWithAccessFilterUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void shouldSerializeBooleanField() throws IOException {
|
public void shouldSerializeBooleanField() throws IOException {
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator).writeBooleanField("openBooleanField", givenDTO.openBooleanField);
|
verify(jsonGenerator).writeBooleanField("openBooleanField", givenDTO.openBooleanField);
|
||||||
@ -109,7 +109,7 @@ public class JSonSerializerWithAccessFilterUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void shouldSerializePrimitiveBooleanField() throws IOException {
|
public void shouldSerializePrimitiveBooleanField() throws IOException {
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator).writeBooleanField("openPrimitiveBooleanField", givenDTO.openPrimitiveBooleanField);
|
verify(jsonGenerator).writeBooleanField("openPrimitiveBooleanField", givenDTO.openPrimitiveBooleanField);
|
||||||
@ -118,7 +118,7 @@ public class JSonSerializerWithAccessFilterUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void shouldSerializeBigDecimalField() throws IOException {
|
public void shouldSerializeBigDecimalField() throws IOException {
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator).writeNumberField("openBigDecimalField", givenDTO.openBigDecimalField);
|
verify(jsonGenerator).writeNumberField("openBigDecimalField", givenDTO.openBigDecimalField);
|
||||||
@ -127,7 +127,7 @@ public class JSonSerializerWithAccessFilterUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void shouldSerializeLocalDateField() throws IOException {
|
public void shouldSerializeLocalDateField() throws IOException {
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator).writeStringField("openLocalDateField", givenDTO.openLocalDateFieldAsString);
|
verify(jsonGenerator).writeStringField("openLocalDateField", givenDTO.openLocalDateFieldAsString);
|
||||||
@ -136,7 +136,7 @@ public class JSonSerializerWithAccessFilterUnitTest {
|
|||||||
@Test
|
@Test
|
||||||
public void shouldSerializeEnumField() throws IOException {
|
public void shouldSerializeEnumField() throws IOException {
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator).writeStringField("openEnumField", givenDTO.openEnumFieldAsString);
|
verify(jsonGenerator).writeStringField("openEnumField", givenDTO.openEnumFieldAsString);
|
||||||
@ -150,7 +150,7 @@ public class JSonSerializerWithAccessFilterUnitTest {
|
|||||||
MockSecurityContext.givenUserHavingRole(GivenCustomerDto.class, 888L, Role.FINANCIAL_CONTACT);
|
MockSecurityContext.givenUserHavingRole(GivenCustomerDto.class, 888L, Role.FINANCIAL_CONTACT);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator).writeStringField("restrictedField", givenDTO.restrictedField);
|
verify(jsonGenerator).writeStringField("restrictedField", givenDTO.restrictedField);
|
||||||
@ -164,7 +164,7 @@ public class JSonSerializerWithAccessFilterUnitTest {
|
|||||||
MockSecurityContext.givenUserHavingRole(GivenCustomerDto.class, 888L, Role.ANY_CUSTOMER_USER);
|
MockSecurityContext.givenUserHavingRole(GivenCustomerDto.class, 888L, Role.ANY_CUSTOMER_USER);
|
||||||
|
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator, never()).writeStringField("restrictedField", givenDTO.restrictedField);
|
verify(jsonGenerator, never()).writeStringField("restrictedField", givenDTO.restrictedField);
|
||||||
@ -183,7 +183,7 @@ public class JSonSerializerWithAccessFilterUnitTest {
|
|||||||
final GivenDtoWithUnimplementedFieldType givenDtoWithUnimplementedFieldType = new GivenDtoWithUnimplementedFieldType();
|
final GivenDtoWithUnimplementedFieldType givenDtoWithUnimplementedFieldType = new GivenDtoWithUnimplementedFieldType();
|
||||||
|
|
||||||
// when
|
// when
|
||||||
final Throwable actual = catchThrowable(() -> new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDtoWithUnimplementedFieldType).serialize());
|
final Throwable actual = catchThrowable(() -> new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDtoWithUnimplementedFieldType).serialize());
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(actual).isInstanceOf(NotImplementedException.class);
|
assertThat(actual).isInstanceOf(NotImplementedException.class);
|
@ -7,7 +7,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
import org.apache.commons.lang3.tuple.ImmutablePair;
|
import org.apache.commons.lang3.tuple.ImmutablePair;
|
||||||
import org.hostsharing.hsadminng.service.CustomerService;
|
import org.hostsharing.hsadminng.service.CustomerService;
|
||||||
import org.hostsharing.hsadminng.service.MembershipService;
|
import org.hostsharing.hsadminng.service.MembershipService;
|
||||||
import org.hostsharing.hsadminng.service.accessfilter.JSonDeserializerWithAccessFilter;
|
import org.hostsharing.hsadminng.service.accessfilter.JSonDeserializationWithAccessFilter;
|
||||||
import org.hostsharing.hsadminng.service.accessfilter.Role;
|
import org.hostsharing.hsadminng.service.accessfilter.Role;
|
||||||
import org.hostsharing.hsadminng.web.rest.errors.BadRequestAlertException;
|
import org.hostsharing.hsadminng.web.rest.errors.BadRequestAlertException;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
@ -74,7 +74,7 @@ public class MembershipDTOUnitTest {
|
|||||||
givenJSonTree(asJSon(ImmutablePair.of("customerId", 1234L)));
|
givenJSonTree(asJSon(ImmutablePair.of("customerId", 1234L)));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
final MembershipDTO actualDto = new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, MembershipDTO.class).deserialize();
|
final MembershipDTO actualDto = new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, MembershipDTO.class).deserialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(actualDto.getCustomerId()).isEqualTo(1234L);
|
assertThat(actualDto.getCustomerId()).isEqualTo(1234L);
|
||||||
@ -87,7 +87,7 @@ public class MembershipDTOUnitTest {
|
|||||||
givenJSonTree(asJSon(ImmutablePair.of("customerId", 1234L)));
|
givenJSonTree(asJSon(ImmutablePair.of("customerId", 1234L)));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
Throwable exception = catchThrowable(() -> new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, MembershipDTO.class).deserialize());
|
Throwable exception = catchThrowable(() -> new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, MembershipDTO.class).deserialize());
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(exception).isInstanceOfSatisfying(BadRequestAlertException.class, badRequestAlertException -> {
|
assertThat(exception).isInstanceOfSatisfying(BadRequestAlertException.class, badRequestAlertException -> {
|
||||||
|
@ -9,8 +9,8 @@ import org.apache.commons.lang3.tuple.ImmutablePair;
|
|||||||
import org.hostsharing.hsadminng.domain.enumeration.ShareAction;
|
import org.hostsharing.hsadminng.domain.enumeration.ShareAction;
|
||||||
import org.hostsharing.hsadminng.service.CustomerService;
|
import org.hostsharing.hsadminng.service.CustomerService;
|
||||||
import org.hostsharing.hsadminng.service.MembershipService;
|
import org.hostsharing.hsadminng.service.MembershipService;
|
||||||
import org.hostsharing.hsadminng.service.accessfilter.JSonDeserializerWithAccessFilter;
|
import org.hostsharing.hsadminng.service.accessfilter.JSonDeserializationWithAccessFilter;
|
||||||
import org.hostsharing.hsadminng.service.accessfilter.JSonSerializerWithAccessFilter;
|
import org.hostsharing.hsadminng.service.accessfilter.JSonSerializationWithAccessFilter;
|
||||||
import org.hostsharing.hsadminng.service.accessfilter.Role;
|
import org.hostsharing.hsadminng.service.accessfilter.Role;
|
||||||
import org.hostsharing.hsadminng.web.rest.errors.BadRequestAlertException;
|
import org.hostsharing.hsadminng.web.rest.errors.BadRequestAlertException;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
@ -89,7 +89,7 @@ public class ShareDTOUnitTest {
|
|||||||
givenJSonTree(asJSon(ImmutablePair.of("membershipId", SOME_MEMBERSHIP_ID)));
|
givenJSonTree(asJSon(ImmutablePair.of("membershipId", SOME_MEMBERSHIP_ID)));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
final ShareDTO actualDto = new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, ShareDTO.class).deserialize();
|
final ShareDTO actualDto = new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, ShareDTO.class).deserialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(actualDto.getMembershipId()).isEqualTo(SOME_MEMBERSHIP_ID);
|
assertThat(actualDto.getMembershipId()).isEqualTo(SOME_MEMBERSHIP_ID);
|
||||||
@ -102,7 +102,7 @@ public class ShareDTOUnitTest {
|
|||||||
givenJSonTree(asJSon(ImmutablePair.of("membershipId", ShareDTOUnitTest.SOME_MEMBERSHIP_ID)));
|
givenJSonTree(asJSon(ImmutablePair.of("membershipId", ShareDTOUnitTest.SOME_MEMBERSHIP_ID)));
|
||||||
|
|
||||||
// when
|
// when
|
||||||
Throwable exception = catchThrowable(() -> new JSonDeserializerWithAccessFilter<>(ctx, jsonParser, null, ShareDTO.class).deserialize());
|
Throwable exception = catchThrowable(() -> new JSonDeserializationWithAccessFilter<>(ctx, jsonParser, null, ShareDTO.class).deserialize());
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assertThat(exception).isInstanceOfSatisfying(BadRequestAlertException.class, badRequestAlertException -> {
|
assertThat(exception).isInstanceOfSatisfying(BadRequestAlertException.class, badRequestAlertException -> {
|
||||||
@ -118,7 +118,7 @@ public class ShareDTOUnitTest {
|
|||||||
final ShareDTO givenDTO = createShareDto();
|
final ShareDTO givenDTO = createShareDto();
|
||||||
|
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator).writeNumberField("id", givenDTO.getId());
|
verify(jsonGenerator).writeNumberField("id", givenDTO.getId());
|
||||||
@ -133,7 +133,7 @@ public class ShareDTOUnitTest {
|
|||||||
final ShareDTO givenDTO = createShareDto();
|
final ShareDTO givenDTO = createShareDto();
|
||||||
|
|
||||||
// when
|
// when
|
||||||
new JSonSerializerWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
new JSonSerializationWithAccessFilter<>(ctx, jsonGenerator, null, givenDTO).serialize();
|
||||||
|
|
||||||
// then
|
// then
|
||||||
verify(jsonGenerator).writeNumberField("id", givenDTO.getId());
|
verify(jsonGenerator).writeNumberField("id", givenDTO.getId());
|
||||||
|
@ -0,0 +1,139 @@
|
|||||||
|
package org.hostsharing.hsadminng.service.util;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
import static org.assertj.core.api.ThrowableAssert.catchThrowable;
|
||||||
|
import static org.hostsharing.hsadminng.service.util.ReflectionUtil.unchecked;
|
||||||
|
|
||||||
|
|
||||||
|
public class ReflectionUtilUnitTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getUknownFieldThrowsIllegalArgumentException() {
|
||||||
|
final Throwable actual = catchThrowable(() -> ReflectionUtil.getField(SomeClass.class, "unknownField"));
|
||||||
|
assertThat(actual).isInstanceOf(IllegalArgumentException.class).hasMessage("java.lang.NoSuchFieldException: unknownField");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setValue() {
|
||||||
|
final TestDto dto = new TestDto(5);
|
||||||
|
ReflectionUtil.setValue(dto, ReflectionUtil.getField(dto.getClass(), "intVal"), 77);
|
||||||
|
assertThat(dto.intVal).isEqualTo(77);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void setValueViaSuperclass() {
|
||||||
|
final SubTestDto dto = new SubTestDto(5);
|
||||||
|
ReflectionUtil.setValue(dto, ReflectionUtil.getField(dto.getClass(), "intVal"), 77);
|
||||||
|
assertThat(dto.intVal).isEqualTo(77);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getValue() {
|
||||||
|
final TestDto dto = new TestDto(5);
|
||||||
|
final int actual = ReflectionUtil.getValue(dto, ReflectionUtil.getField(dto.getClass(), "intVal"));
|
||||||
|
assertThat(actual).isEqualTo(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getValueViaSuperclass() {
|
||||||
|
final SubTestDto dto = new SubTestDto(5);
|
||||||
|
final int actual = ReflectionUtil.getValue(dto, ReflectionUtil.getField(dto.getClass(), "intVal"));
|
||||||
|
assertThat(actual).isEqualTo(5);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void determineGenericInterfaceParameteDirect() {
|
||||||
|
Class<?> actual = ReflectionUtil.determineGenericInterfaceParameter(SuperClass.class, GenericInterface.class, 1);
|
||||||
|
assertThat(actual).isEqualTo(Long.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void determineGenericInterfaceParameterViaSuperclass() {
|
||||||
|
Class<?> actual = ReflectionUtil.determineGenericInterfaceParameter(SomeClass.class, GenericInterface.class, 1);
|
||||||
|
assertThat(actual).isEqualTo(Long.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void throwsExceptionIfGenericInterfaceNotImplemented() {
|
||||||
|
final Throwable actual = catchThrowable(() -> ReflectionUtil.determineGenericInterfaceParameter(SomeClass.class, UnusedGenericInterface.class, 1));
|
||||||
|
assertThat(actual).isInstanceOf(AssertionError.class).hasMessageContaining("SomeClass expected to implement UnusedGenericInterface<...>");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void determineGenericClassParameterDirect() {
|
||||||
|
Class<?> actual = ReflectionUtil.determineGenericClassParameter(SuperClass.class, GenericClass.class, 1);
|
||||||
|
assertThat(actual).isEqualTo(Boolean.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void determineGenericClassParameterViaSuperclss() {
|
||||||
|
Class<?> actual = ReflectionUtil.determineGenericClassParameter(SomeClass.class, GenericClass.class, 1);
|
||||||
|
assertThat(actual).isEqualTo(Boolean.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void throwsExceptionIfGenericClassNotExended() {
|
||||||
|
final Throwable actual = catchThrowable(() -> ReflectionUtil.determineGenericClassParameter(SomeClass.class, UnusedSuperClass.class, 1));
|
||||||
|
assertThat(actual).isInstanceOf(AssertionError.class).hasMessageContaining("GenericClass expected to extend UnusedSuperClass<...>");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void uncheckedRethrowsCheckedException() {
|
||||||
|
final Exception givenException = new Exception("Checked Test Exception");
|
||||||
|
final Throwable actual = catchThrowable(() -> unchecked(() -> {
|
||||||
|
throw givenException;
|
||||||
|
}));
|
||||||
|
assertThat(actual).isInstanceOfSatisfying(RuntimeException.class, rte ->
|
||||||
|
assertThat(rte.getCause()).isSameAs(givenException)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void asEnumValue() {
|
||||||
|
assertThat(ReflectionUtil.asEnumValue(SomeEnum.class, "GREEN")).isEqualTo(SomeEnum.GREEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- only test fixture below ---
|
||||||
|
|
||||||
|
private static class TestDto {
|
||||||
|
int intVal;
|
||||||
|
|
||||||
|
TestDto(final int intval) {
|
||||||
|
this.intVal = intval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class SubTestDto extends TestDto {
|
||||||
|
|
||||||
|
SubTestDto(final int intval) {
|
||||||
|
super(intval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class SomeClass extends SuperClass {
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class SuperClass extends GenericClass<String, Boolean> implements IntermediateInterfaces<Integer, Long> {
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class UnusedSuperClass extends GenericClass<String, Boolean> implements IntermediateInterfaces<Integer, Long> {
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class GenericClass<T, V> {
|
||||||
|
}
|
||||||
|
|
||||||
|
private interface IntermediateInterfaces<T, V> extends GenericInterface<Integer, Long> {
|
||||||
|
}
|
||||||
|
|
||||||
|
private interface GenericInterface<T, V> {
|
||||||
|
}
|
||||||
|
|
||||||
|
private interface UnusedGenericInterface<T, V> {
|
||||||
|
}
|
||||||
|
|
||||||
|
enum SomeEnum {
|
||||||
|
RED, BLUE, GREEN
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user