/* * This file is a part of the SteamWar software. * * Copyright (C) 2021 SteamWar.de-Serverteam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ package de.steamwar.bausystem.linkage; import de.steamwar.bausystem.BauSystem; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.HashSet; import java.util.Set; @UtilityClass public class LinkageUtils { public void link() { try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(BauSystem.class.getResourceAsStream("/de.steamwar.bausystem/" + Linked.class.getTypeName())))) { bufferedReader.lines().forEach(s -> { try { link(Class.forName(s)); } catch (ClassNotFoundException e) { // ignored } }); } catch (IOException e) { Bukkit.shutdown(); } catch (NullPointerException e) { // Ignored } } private void link(Class clazz) { Linked[] linkages = clazz.getDeclaredAnnotationsByType(Linked.class); if (linkages.length == 0) { return; } Set linkageTypeSet = new HashSet<>(); for (Linked linked : linkages) { if (linked == null) { return; } LinkageType linkageType = linked.value(); if (linkageType.getLinkagePredicate().test(clazz)) { linkageTypeSet.add(linked.value()); } } if (linkageTypeSet.isEmpty()) { return; } Object object = constructInstance(clazz); linkageTypeSet.forEach(linkageType -> linkageType.getLinkageConsumer().accept(object)); } private Object constructInstance(Class clazz) { try { Constructor constructor = clazz.getDeclaredConstructor(); constructor.setAccessible(true); return constructor.newInstance(); } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) { throw new SecurityException(e.getMessage(), e.getCause()); } } }