dnet-hadoop/dhp-workflows/dhp-graph-mapper/src/main/java/eu/dnetlib/dhp/oa/graph/clean/OafCleaner.java

83 lines
2.1 KiB
Java
Raw Normal View History

2020-06-12 10:45:18 +02:00
package eu.dnetlib.dhp.oa.graph.clean;
2020-06-13 13:06:04 +02:00
import java.io.Serializable;
2020-06-12 10:45:18 +02:00
import java.lang.reflect.Field;
2020-06-13 13:06:04 +02:00
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
2020-06-12 12:03:25 +02:00
import eu.dnetlib.dhp.schema.oaf.Oaf;
2020-06-13 13:06:04 +02:00
public class OafCleaner implements Serializable {
2020-06-12 10:45:18 +02:00
2020-06-13 13:06:04 +02:00
public static <E extends Oaf> E apply(E oaf, CleaningRuleMap mapping) {
2020-06-12 18:25:47 +02:00
try {
navigate(oaf, mapping);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
2020-06-12 10:45:18 +02:00
return oaf;
}
2020-06-13 13:06:04 +02:00
private static void navigate(Object o, CleaningRuleMap mapping) throws IllegalAccessException {
2020-06-12 18:25:47 +02:00
if (isPrimitive(o)) {
return;
} else if (isIterable(o.getClass())) {
for (final Object elem : (Iterable<?>) o) {
navigate(elem, mapping);
}
} else if (hasMapping(o, mapping)) {
mapping.get(o.getClass()).accept(o);
} else {
for (final Field f : getAllFields(o.getClass())) {
f.setAccessible(true);
final Object val = f.get(o);
if (!isPrimitive(val) && hasMapping(val, mapping)) {
mapping.get(val.getClass()).accept(val);
} else {
navigate(f.get(o), mapping);
2020-06-12 10:45:18 +02:00
}
}
}
}
2020-06-13 13:06:04 +02:00
private static boolean hasMapping(Object o, CleaningRuleMap mapping) {
2020-06-12 18:25:47 +02:00
return mapping.containsKey(o.getClass());
2020-06-12 10:45:18 +02:00
}
2020-06-12 18:25:47 +02:00
private static boolean isIterable(final Class<?> cl) {
return Iterable.class.isAssignableFrom(cl);
2020-06-12 10:45:18 +02:00
}
private static boolean isPrimitive(Object o) {
2020-06-12 18:25:47 +02:00
return Objects.isNull(o)
|| o.getClass().isPrimitive()
2020-06-12 10:45:18 +02:00
|| o instanceof Class
|| o instanceof Integer
|| o instanceof Double
|| o instanceof Float
|| o instanceof Long
|| o instanceof Boolean
|| o instanceof String
|| o instanceof Byte;
}
private static List<Field> getAllFields(Class<?> clazz) {
return getAllFields(new LinkedList<>(), clazz);
}
private static List<Field> getAllFields(List<Field> fields, Class<?> clazz) {
fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
final Class<?> superclass = clazz.getSuperclass();
if (Objects.nonNull(superclass) && superclass.getPackage().equals(Oaf.class.getPackage())) {
getAllFields(fields, superclass);
}
return fields;
}
}