Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(configuration): extract Configuration class #270

Merged
merged 1 commit into from
Aug 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
package io.florianlopes.spring.test.web.servlet.request;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Objects;
import java.util.function.Predicate;

/**
* Configuration class that allows the exclusion of specific fields.
*/
public class Configuration {

public static final Configuration DEFAULT = new Builder()
.includeFinal(true)
.includeTransient(false)
.includeStatic(false)
.build();
public static final Configuration EXCLUDE_FINAL = new Builder()
.includeFinal(false)
.includeTransient(true)
.build();
public static final Configuration INCLUDE_TRANSIENT = new Builder()
.includeFinal(false)
.includeTransient(true)
.build();
public static final Configuration INCLUDE_STATIC = new Builder()
.includeFinal(false)
.includeStatic(true)
.build();

private final Predicate<Field> fieldPredicate;

private Configuration(Predicate<Field> fieldPredicate) {
this.fieldPredicate = fieldPredicate;
}

/**
* Creates a new builder that excludes transient and static fields by default.
*/
public static Builder builder() {
return new Builder();
}

public Predicate<Field> fieldPredicate() {
return fieldPredicate;
}

public static class Builder {

private static final Predicate<Field> BASE_PREDICATE = Builder::isNotSynthetic;

private Predicate<Field> fieldPredicate;
private boolean includeFinal = true;
private boolean includeTransient = false;
private boolean includeStatic = false;

private Builder() {
}

private static boolean isNotFinal(Field field) {
return !Modifier.isFinal(field.getModifiers());
}

private static boolean isNotTransient(Field field) {
return !Modifier.isTransient(field.getModifiers());
}

private static boolean isNotStatic(Field field) {
return !Modifier.isStatic(field.getModifiers());
}

private static boolean isNotSynthetic(Field field) {
return !field.isSynthetic();
}

public Builder fieldPredicate(Predicate<Field> fieldPredicate) {
this.fieldPredicate = Objects.requireNonNull(fieldPredicate, "fieldPredicate cannot be null");
return this;
}

public Builder includeTransient(boolean includeTransient) {
this.includeTransient = includeTransient;
return this;
}

public Builder includeFinal(boolean includeFinal) {
this.includeFinal = includeFinal;
return this;
}

public Builder includeStatic(boolean includeStatic) {
this.includeStatic = includeStatic;
return this;
}

public Configuration build() {
Predicate<Field> fieldPredicate = this.fieldPredicate != null ? BASE_PREDICATE.and(this.fieldPredicate) : BASE_PREDICATE;

if (!this.includeFinal) {
fieldPredicate = fieldPredicate.and(Builder::isNotFinal);
}

if (!this.includeTransient) {
fieldPredicate = fieldPredicate.and(Builder::isNotTransient);
}

if (!this.includeStatic) {
fieldPredicate = fieldPredicate.and(Builder::isNotStatic);
}

return new Configuration(fieldPredicate);
}

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,10 @@

import java.beans.PropertyEditor;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.time.temporal.Temporal;
import java.util.*;
import java.util.function.Predicate;
import java.util.stream.Collectors;

/**
Expand All @@ -35,11 +33,7 @@
public class MockMvcRequestBuilderUtils {

private static final PropertyEditorRegistrySupport PROPERTY_EDITOR_REGISTRY = new SimpleTypeConverter();
private static final Configuration DEFAULT_CONFIG = Configuration.builder()
.includeFinal(true)
.includeTransient(false)
.includeStatic(false)
.build();
private static final Configuration DEFAULT_CONFIG = Configuration.DEFAULT;

private static final Logger LOGGER = LoggerFactory.getLogger(MockMvcRequestBuilderUtils.class);

Expand Down Expand Up @@ -171,7 +165,7 @@ private static Map<String, String> getFormFields(Object form, Map<String, String
private static List<Field> getFormFields(Object form, Configuration config) {
return FieldUtils.getAllFieldsList(form.getClass())
.stream()
.filter(config.fieldPredicate)
.filter(config.fieldPredicate())
.collect(Collectors.toList());
}

Expand Down Expand Up @@ -291,90 +285,4 @@ public MockHttpServletRequest postProcessRequest(MockHttpServletRequest request)
return request;
}
}

/**
* Configuration class that allows the exclusion of specific fields.
*/
public static class Configuration {

private final Predicate<Field> fieldPredicate;

private Configuration(Predicate<Field> fieldPredicate) {
this.fieldPredicate = fieldPredicate;
}

/**
* Creates a new builder that excludes transient and static fields by default.
*/
public static Builder builder() {
return new Builder();
}

public static class Builder {

private static final Predicate<Field> BASE_PREDICATE = Builder::isNotSynthetic;

private Predicate<Field> fieldPredicate;
private boolean includeFinal = true;
private boolean includeTransient = false;
private boolean includeStatic = false;

public Builder fieldPredicate(Predicate<Field> fieldPredicate) {
this.fieldPredicate = Objects.requireNonNull(fieldPredicate, "fieldPredicate cannot be null");
return this;
}

public Builder includeTransient(boolean includeTransient) {
this.includeTransient = includeTransient;
return this;
}

public Builder includeFinal(boolean includeFinal) {
this.includeFinal = includeFinal;
return this;
}

public Builder includeStatic(boolean includeStatic) {
this.includeStatic = includeStatic;
return this;
}

public Configuration build() {
Predicate<Field> fieldPredicate = this.fieldPredicate != null ? BASE_PREDICATE.and(this.fieldPredicate) : BASE_PREDICATE;

if (!this.includeFinal) {
fieldPredicate = fieldPredicate.and(Builder::isNotFinal);
}

if (!this.includeTransient) {
fieldPredicate = fieldPredicate.and(Builder::isNotTransient);
}

if (!this.includeStatic) {
fieldPredicate = fieldPredicate.and(Builder::isNotStatic);
}

return new Configuration(fieldPredicate);
}

private static boolean isNotFinal(Field field) {
return !Modifier.isFinal(field.getModifiers());
}

private static boolean isNotTransient(Field field) {
return !Modifier.isTransient(field.getModifiers());
}

private static boolean isNotStatic(Field field) {
return !Modifier.isStatic(field.getModifiers());
}

private static boolean isNotSynthetic(Field field) {
return !field.isSynthetic();
}

}

}

}
Loading