/* * Copyright 2022 Anton Tananaev (anton@traccar.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.traccar.storage.query; import org.traccar.storage.QueryIgnore; import java.beans.Introspector; 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, String type); protected List getAllColumns(Class clazz, String type) { List columns = new LinkedList<>(); Method[] methods = clazz.getMethods(); for (Method method : methods) { int parameterCount = type.equals("set") ? 1 : 0; if (method.getName().startsWith(type) && method.getParameterTypes().length == parameterCount && !method.isAnnotationPresent(QueryIgnore.class) && !method.getName().equals("getClass")) { columns.add(Introspector.decapitalize(method.getName().substring(3))); } } return columns; } public static class All extends Columns { @Override public List getColumns(Class clazz, String type) { return getAllColumns(clazz, type); } } 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, String type) { 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, String type) { return getAllColumns(clazz, type).stream() .filter(column -> !columns.contains(column)) .collect(Collectors.toList()); } } }