package org.traccar.storage.query; import org.traccar.storage.QueryIgnore; import java.lang.reflect.Method; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public abstract class Columns { public abstract List getColumns(Class clazz); protected List getAllColumns(Class clazz) { List columns = new LinkedList<>(); Method[] methods = clazz.getMethods(); for (Method method : methods) { if (method.getName().startsWith("set") && method.getParameterTypes().length == 1 && !method.isAnnotationPresent(QueryIgnore.class)) { columns.add(method.getName().substring(3).toLowerCase()); } } return columns; } public static class All extends Columns { @Override public List getColumns(Class clazz) { return getAllColumns(clazz); } } public static class Include extends Columns { private final List columns; public Include(String... columns) { this.columns = Arrays.stream(columns).collect(Collectors.toList()); } @Override public List getColumns(Class clazz) { return columns; } } public static class Exclude extends Columns { private final Set columns; public Exclude(String... columns) { this.columns = Arrays.stream(columns).collect(Collectors.toSet()); } @Override public List getColumns(Class clazz) { return getAllColumns(clazz).stream() .filter(column -> !columns.contains(column)) .collect(Collectors.toList()); } } }