Skip to content

Commit

Permalink
Backup and restore value for enum
Browse files Browse the repository at this point in the history
  • Loading branch information
joutvhu committed Mar 20, 2023
1 parent 7c4779a commit 7c7cef4
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 11 deletions.
26 changes: 25 additions & 1 deletion src/main/java/com/joutvhu/model/tester/EqualsTester.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

class EqualsTester<T> implements Tester {
Expand Down Expand Up @@ -61,9 +63,19 @@ private void deepTest(T model, T newModel) {
}

private void deepTest(T model, T newModel, Field[] fields, Set<Field> tested) {
boolean restore = modelClass.isEnum();
Map<Field, Object> backup = new HashMap<>();
for (Field field : fields) {
try {
if (!tested.contains(field) && !Modifier.isFinal(field.getModifiers())) {
if (restore) {
field.setAccessible(true);
backup.put(field, field.get(model));
}
} catch (Throwable e) {
// Do nothing
}
try {
if (!tested.contains(field) && !Modifier.isFinal(field.getModifiers()) && !Modifier.isStatic(field.getModifiers())) {
tested.add(field);
field.setAccessible(true);
Class<?> fieldType = field.getType();
Expand All @@ -89,6 +101,18 @@ else if (fieldType == short.class)
field.set(newModel, field.get(model));
}
} catch (Throwable e) {
// Do nothing
}
}
if (restore && !backup.isEmpty()) {
for (Map.Entry<Field, Object> entry : backup.entrySet()) {
try {
Field field = entry.getKey();
Object value = entry.getValue();
field.set(model, value);
} catch (Throwable e) {
// Do nothing
}
}
}
}
Expand Down
64 changes: 54 additions & 10 deletions src/main/java/com/joutvhu/model/tester/GetterSetterTester.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.joutvhu.model.tester;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
Expand Down Expand Up @@ -46,33 +48,49 @@ private boolean testMethods(T model, Method[] methods, Set<Method> tested) {
if (isGetter(method)) {
Field field = getField(method);
if (checkName(method, field)) {
boolean result = field != null ?
testGetter(model, method, field) :
testGetter(model, method);
if (success) success = result;
if (field != null && method.getReturnType().equals(field.getType()) &&
!Modifier.isFinal(field.getModifiers()) &&
!Modifier.isStatic(field.getModifiers())) {
success = testGetter(model, method, field) && success;
} else {
success = testGetter(model, method) && success;
}
}
} else if (isSetter(method)) {
Field field = getField(method);
if (checkName(method, field)) {
boolean result = field != null ?
testSetter(model, method, field) :
testSetter(model, method);
if (success) success = result;
if (field != null && method.getParameterTypes()[0].equals(field.getType()) &&
!Modifier.isFinal(field.getModifiers()) &&
!Modifier.isStatic(field.getModifiers())) {
success = testSetter(model, method, field) && success;
} else {
success = testSetter(model, method) && success;
}
}
}
}
return success;
}

private Object createTestValue(Class<?> fieldClass) {
private Object createTestValue(Class<?> fieldClass) throws InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
try {
return Creator.anyOf(fieldClass).create();
} catch (Throwable e) {
return null;
if (Creator.isNullable(fieldClass))
return null;
throw e;
}
}

private boolean testGetter(T model, Method method, Field field) {
boolean restore = modelClass.isEnum();
Object backup = null;
try {
field.setAccessible(true);
backup = field.get(model);
} catch (Throwable e) {
restore = false;
}
try {
Object value = createTestValue(field.getType());
field.setAccessible(true);
Expand All @@ -88,6 +106,15 @@ private boolean testGetter(T model, Method method, Field field) {
} catch (Throwable e) {
System.err.println("Error: " + modelClass.getName() + "." + method.getName() + "()");
e.printStackTrace();
} finally {
if (restore) {
try {
field.setAccessible(true);
field.set(model, backup);
} catch (Throwable e) {
// Do nothing
}
}
}
return false;
}
Expand All @@ -106,6 +133,14 @@ private boolean testGetter(T model, Method method) {
}

private boolean testSetter(T model, Method method, Field field) {
boolean restore = modelClass.isEnum();
Object backup = null;
try {
field.setAccessible(true);
backup = field.get(model);
} catch (Throwable e) {
restore = false;
}
try {
Object value = createTestValue(method.getParameterTypes()[0]);
method.setAccessible(true);
Expand All @@ -121,6 +156,15 @@ private boolean testSetter(T model, Method method, Field field) {
} catch (Throwable e) {
System.err.println("Error: " + modelClass.getName() + "." + method.getName() + "(" + method.getParameterTypes()[0].getName() + ")");
e.printStackTrace();
} finally {
if (restore) {
try {
field.setAccessible(true);
field.set(model, backup);
} catch (Throwable e) {
// Do nothing
}
}
}
return false;
}
Expand Down

0 comments on commit 7c7cef4

Please sign in to comment.