Skip to content

Commit

Permalink
Merge pull request #65 from nikanique/develop
Browse files Browse the repository at this point in the history
New Features in v2.3.0
  • Loading branch information
birddevelper authored Jan 12, 2025
2 parents 9822d06 + 883fc30 commit 0901133
Show file tree
Hide file tree
Showing 20 changed files with 206 additions and 70 deletions.
28 changes: 1 addition & 27 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
</parent>
<groupId>io.github.nikanique</groupId>
<artifactId>spring-rest-framework</artifactId>
<version>2.1.0</version>
<version>2.3.0</version>
<packaging>jar</packaging>
<name>spring-rest-framework</name>
<description>
Expand Down Expand Up @@ -103,32 +103,6 @@
<javadocExecutable>${java.home}/bin/javadoc</javadocExecutable>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,8 @@
String methodName() default "not-provided";

String source() default "not-provided";

String defaultValue() default "not-provided";

boolean isRequired() default false;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import io.github.nikanique.springrestframework.annotation.FieldValidation;
import io.github.nikanique.springrestframework.exceptions.ValidationException;
import jakarta.persistence.EntityManager;

import java.lang.invoke.MethodHandle;
import java.text.ParseException;
Expand Down Expand Up @@ -104,4 +105,7 @@ private void validateDateField(java.util.Date value, String fieldName, FieldVali
}
}

public void postDeserialization(EntityManager entityManager) {
// Default implementation
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,15 @@ public static Map<String, FieldMetadata> getDtoByClassName(Class<?> clazz) {
return Stream.of(cls.getDeclaredFields())
.map(field -> {
MethodHandle getterMethodHandle = null;
MethodHandle setterMethodHandle = null;
try {
String getterName = "get" + Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1);
MethodType methodType = MethodType.methodType(field.getType());
getterMethodHandle = lookup.findVirtual(cls, getterName, methodType);
String setterName = "set" + Character.toUpperCase(field.getName().charAt(0)) + field.getName().substring(1);
MethodType getterMethodType = MethodType.methodType(field.getType());
MethodType setterMethodType = MethodType.methodType(void.class, field.getType());
getterMethodHandle = lookup.findVirtual(cls, getterName, getterMethodType);
setterMethodHandle = lookup.findVirtual(cls, setterName, setterMethodType);

} catch (NoSuchMethodException | IllegalAccessException e) {
// Log the exception or handle it as per your requirement
}
Expand All @@ -35,7 +40,8 @@ public static Map<String, FieldMetadata> getDtoByClassName(Class<?> clazz) {
field.getAnnotation(ReadOnly.class),
field.getAnnotation(WriteOnly.class),
field.getAnnotation(ReferencedModel.class),
getterMethodHandle);
getterMethodHandle,
setterMethodHandle);
})
.collect(Collectors.toMap(fieldMetadata -> fieldMetadata.getField().getName(), fieldMetadata -> fieldMetadata));
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,9 @@ public class FieldMetadata {
private final WriteOnly writeOnly;
private final ReferencedModel referencedModel;
private final MethodHandle getterMethodHandle;
private final MethodHandle setterMethodHandle;

public FieldMetadata(Field field, Class<?> fieldType, FieldValidation validation, Expose expose, ReadOnly readOnly, WriteOnly writeOnly, ReferencedModel referencedModel, MethodHandle getterMethodHandle) {
public FieldMetadata(Field field, Class<?> fieldType, FieldValidation validation, Expose expose, ReadOnly readOnly, WriteOnly writeOnly, ReferencedModel referencedModel, MethodHandle getterMethodHandle, MethodHandle setterMethodHandle) {
this.field = field;
this.fieldType = fieldType;
this.validation = validation;
Expand All @@ -27,5 +28,6 @@ public FieldMetadata(Field field, Class<?> fieldType, FieldValidation validation
this.writeOnly = writeOnly;
this.referencedModel = referencedModel;
this.getterMethodHandle = getterMethodHandle;
this.setterMethodHandle = setterMethodHandle;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,32 +12,53 @@
@Builder
public class Filter implements Comparable<Filter> {
private String name;

private String modelFieldName;
private FilterOperation operation;
private FieldType fieldType;

private String helpText;
private boolean required = false;

public Filter(String name, FilterOperation filterOperation, FieldType fieldType) {
this.name = name;
this.operation = filterOperation;
this.fieldType = fieldType;
}

public Filter(String name, FilterOperation filterOperation, FieldType fieldType, boolean required) {
this.name = name;
this.operation = filterOperation;
this.fieldType = fieldType;
this.required = required;
}

public Filter(String name, FilterOperation filterOperation, FieldType fieldType, String helpText) {
this.name = name;
this.operation = filterOperation;
this.fieldType = fieldType;
this.helpText = helpText;
}

public Filter(String name, FilterOperation filterOperation, FieldType fieldType, String helpText, boolean required) {
this.name = name;
this.operation = filterOperation;
this.fieldType = fieldType;
this.helpText = helpText;
this.required = required;
}

public Filter(String name, String modelFieldName, FilterOperation filterOperation, FieldType fieldType) {
this.name = name;
this.operation = filterOperation;
this.fieldType = fieldType;
this.modelFieldName = modelFieldName;
}

public Filter(String name, String modelFieldName, FilterOperation filterOperation, FieldType fieldType, boolean required) {
this.name = name;
this.operation = filterOperation;
this.fieldType = fieldType;
this.modelFieldName = modelFieldName;
this.required = required;
}

public Filter(String name, String modelFieldName, FilterOperation filterOperation, FieldType fieldType, String helpText) {
Expand All @@ -46,7 +67,15 @@ public Filter(String name, String modelFieldName, FilterOperation filterOperatio
this.fieldType = fieldType;
this.modelFieldName = modelFieldName;
this.helpText = helpText;
}

public Filter(String name, String modelFieldName, FilterOperation filterOperation, FieldType fieldType, String helpText, boolean required) {
this.name = name;
this.operation = filterOperation;
this.fieldType = fieldType;
this.modelFieldName = modelFieldName;
this.helpText = helpText;
this.required = required;
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,24 +45,53 @@ public FilterSetBuilder addFilter(String name, FilterOperation operation, FieldT
return this;
}

public FilterSetBuilder addFilter(String name, FilterOperation operation, FieldType fieldType, boolean required) {
Filter filter = new Filter(name, operation, fieldType, required);
filterSet.add(filter);
return this;
}

public FilterSetBuilder addFilter(String name, FilterOperation operation, FieldType fieldType, String helpText) {
Filter filter = new Filter(name, operation, fieldType, helpText);
filterSet.add(filter);
return this;
}

public FilterSetBuilder addFilter(String name, FilterOperation operation, FieldType fieldType, String helpText, boolean required) {
Filter filter = new Filter(name, operation, fieldType, helpText, required);
filterSet.add(filter);
return this;
}

public FilterSetBuilder addFilter(String name, String modelFieldName, FilterOperation operation, FieldType fieldType) {
Filter filter = new Filter(name, modelFieldName, operation, fieldType);
filterSet.add(filter);
return this;
}

public FilterSetBuilder addFilter(String name, String modelFieldName, FilterOperation operation, FieldType fieldType, boolean required) {
Filter filter = new Filter(name, modelFieldName, operation, fieldType, required);
filterSet.add(filter);
return this;
}

public FilterSetBuilder addFilter(String name, String modelFieldName, FilterOperation operation, FieldType fieldType, String helpText) {
Filter filter = new Filter(name, modelFieldName, operation, fieldType, helpText);
filterSet.add(filter);
return this;
}

public FilterSetBuilder addFilter(String name, String modelFieldName, FilterOperation operation, FieldType fieldType, String helpText, boolean required) {
Filter filter = new Filter(name, modelFieldName, operation, fieldType, helpText, required);
filterSet.add(filter);
return this;
}

public FilterSetBuilder addFilter(Filter filter) {
filterSet.add(filter);
return this;
}

public FilterSet build() {
return filterSet;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,14 @@ public Model fromDto(Object dto, Class<?> dtoClass) {


// Create an instance of the main entity class
Model entity = this.entityClass.newInstance();
Model entity = this.entityClass.getDeclaredConstructor().newInstance();
BeanWrapper entityWrapper = new BeanWrapperImpl(entity);

List<String> ignoreProperties = new ArrayList<>();
for (String fieldName : fieldMetadata.keySet()) {
Object fieldValue = fieldMetadata.get(fieldName).getGetterMethodHandle().invoke(dto);
ReadOnly readOnlyAnnotation = fieldMetadata.get(fieldName).getReadOnly();
if (readOnlyAnnotation != null) {
if (readOnlyAnnotation != null && fieldValue == null) {
ignoreProperties.add(fieldName);
continue;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,13 @@ public static List<SearchCriteria> fromUrlQuery(HttpServletRequest request, Filt
String toParameterName = name + "To";
String fromValue = ServletRequestUtils.getStringParameter(request, fromParameterName, null);
String toValue = ServletRequestUtils.getStringParameter(request, toParameterName, null);

if (filter.isRequired() && (fromValue == null || toValue == null)) {
throw new ValidationException(
fromValue == null ? fromParameterName : toParameterName,
"Both " + fromParameterName + " and " + toParameterName + " must be present.");
}

if (fromValue == null ^ toValue == null) {
throw new ValidationException(
fromValue == null ? fromParameterName : toParameterName,
Expand All @@ -162,6 +169,9 @@ public static List<SearchCriteria> fromUrlQuery(HttpServletRequest request, Filt

} else {
value = ServletRequestUtils.getStringParameter(request, name, null);
if (filter.isRequired() && value == null) {
throw new ValidationException(name, name + " is required");
}
if (value != null) {
Object parsedValue = extractAndValidateValue(name, filter, value);
SearchCriteria searchCriteria = new SearchCriteria(modelFieldName, filter.getOperation(), parsedValue, filter.getFieldType());
Expand Down
Loading

0 comments on commit 0901133

Please sign in to comment.