/* * This file is part of Player Analytics (Plan). * * Plan is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License v3 as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Plan is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Plan. If not, see . */ package com.djrapitops.plan.extension.implementation.providers; import com.djrapitops.plan.extension.implementation.MethodType; import java.util.*; import java.util.stream.Collectors; /** * Group class for handling multiple different types of {@link DataProvider}s. * * @author Rsl1122 */ public class DataProviders { private final Map>> byMethodType; public DataProviders() { byMethodType = new EnumMap<>(MethodType.class); } public void put(DataProvider provider) { MethodWrapper method = provider.getMethod(); MethodType methodType = method.getMethodType(); Class resultType = method.getResultType(); Map> byParameterType = byMethodType.getOrDefault(methodType, new HashMap<>()); List dataProviders = byParameterType.getOrDefault(resultType, new ArrayList<>()); dataProviders.add(provider); byParameterType.put(resultType, dataProviders); byMethodType.put(methodType, byParameterType); } public List> getPlayerMethodsByType(Class returnType) { Map> providersAcceptingUUID = byMethodType.getOrDefault(MethodType.PLAYER_UUID, new HashMap<>()); Map> providersAcceptingName = byMethodType.getOrDefault(MethodType.PLAYER_NAME, new HashMap<>()); List> byReturnType = new ArrayList<>(); for (DataProvider dataProvider : providersAcceptingUUID.getOrDefault(returnType, Collections.emptyList())) { byReturnType.add((DataProvider) dataProvider); } for (DataProvider dataProvider : providersAcceptingName.getOrDefault(returnType, Collections.emptyList())) { byReturnType.add((DataProvider) dataProvider); } return byReturnType; } public List> getServerMethodsByType(Class returnType) { List> byReturnType = new ArrayList<>(); for (DataProvider dataProvider : byMethodType.getOrDefault(MethodType.SERVER, new HashMap<>()).getOrDefault(returnType, Collections.emptyList())) { byReturnType.add((DataProvider) dataProvider); } return byReturnType; } public List> getGroupMethodsByType(Class returnType) { List> byReturnType = new ArrayList<>(); for (DataProvider dataProvider : byMethodType.getOrDefault(MethodType.GROUP, new HashMap<>()).getOrDefault(returnType, Collections.emptyList())) { byReturnType.add((DataProvider) dataProvider); } return byReturnType; } public void removeProviderWithMethod(MethodWrapper toRemove) { MethodType methodType = toRemove.getMethodType(); Map> byResultType = byMethodType.getOrDefault(methodType, Collections.emptyMap()); if (byResultType.isEmpty()) { return; } Class resultType = toRemove.getResultType(); List providers = byResultType.getOrDefault(resultType, Collections.emptyList()); if (providers.isEmpty()) { return; } byResultType.put(resultType, providers.stream() .filter(provider -> !provider.getMethod().equals(toRemove)) .collect(Collectors.toList()) ); byMethodType.put(methodType, byResultType); } }