From e3aaa3adeda87e80667771ec146c214a97c3f84a Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sun, 18 Apr 2021 13:09:27 +0200 Subject: [PATCH] Add LinkedInstance --- .../bausystem/features/bau/BauCommand.java | 14 +++--- .../features/tpslimit/TPSLimitCommand.java | 6 --- .../bausystem/linkage/LinkageUtils.java | 43 ++++++++++++++++++- .../bausystem/linkage/LinkedInstance.java | 31 +++++++++++++ 4 files changed, 81 insertions(+), 13 deletions(-) create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/linkage/LinkedInstance.java diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/bau/BauCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/bau/BauCommand.java index 6b054d5c..83af51c6 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/bau/BauCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/bau/BauCommand.java @@ -24,6 +24,7 @@ import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.config.BauServer; import de.steamwar.bausystem.linkage.LinkageType; import de.steamwar.bausystem.linkage.Linked; +import de.steamwar.bausystem.linkage.LinkedInstance; import de.steamwar.command.SWCommand; import de.steamwar.command.SWCommandUtils; import de.steamwar.command.TypeMapper; @@ -36,6 +37,9 @@ import java.util.stream.Collectors; @Linked(LinkageType.COMMAND) public class BauCommand extends SWCommand { + @LinkedInstance(BauServer.class) + private BauServer bauServer; + public BauCommand() { super("bau", "b", "gs"); } @@ -83,7 +87,7 @@ public class BauCommand extends SWCommand { return; } - BauweltMember target = BauweltMember.getBauMember(BauServer.getInstance().getOwnerID(), id.getId()); + BauweltMember target = BauweltMember.getBauMember(bauServer.getOwnerID(), id.getId()); Permission.WORLDEDIT.toggle(p, target); } @@ -92,7 +96,7 @@ public class BauCommand extends SWCommand { return; } - BauweltMember target = BauweltMember.getBauMember(BauServer.getInstance().getOwnerID(), id.getId()); + BauweltMember target = BauweltMember.getBauMember(bauServer.getOwnerID(), id.getId()); Permission.WORLD.toggle(p, target); } @@ -102,7 +106,7 @@ public class BauCommand extends SWCommand { return true; } - BauweltMember target = BauweltMember.getBauMember(BauServer.getInstance().getOwnerID(), id.getId()); + BauweltMember target = BauweltMember.getBauMember(bauServer.getOwnerID(), id.getId()); if (target == null) { p.sendMessage(BauSystem.PREFIX + "§cDer Spieler ist kein Mitglied deiner Welt!"); return true; @@ -112,7 +116,7 @@ public class BauCommand extends SWCommand { private boolean permissionCheck(Player p) { - if (!BauServer.getInstance().getOwner().equals(p.getUniqueId())) { + if (!bauServer.getOwner().equals(p.getUniqueId())) { p.sendMessage(BauSystem.PREFIX + "§cDies ist nicht deine Welt!"); return false; } else { @@ -123,7 +127,7 @@ public class BauCommand extends SWCommand { @ClassMapper(value = SteamwarUser.class, local = true) private TypeMapper steamwarUserTypeMapper() { - return SWCommandUtils.createMapper(s -> BauweltMember.getMembers(BauServer.getInstance().getOwnerID()) + return SWCommandUtils.createMapper(s -> BauweltMember.getMembers(bauServer.getOwnerID()) .stream() .map(m -> SteamwarUser.get(m.getMemberID())) .filter(u -> u.getUserName().equals(s)) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSLimitCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSLimitCommand.java index 61429e55..fcf9ed74 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSLimitCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSLimitCommand.java @@ -28,8 +28,6 @@ import de.steamwar.bausystem.linkage.Linked; import de.steamwar.command.SWCommand; import de.steamwar.command.SWCommandUtils; import de.steamwar.command.TypeMapper; -import lombok.AccessLevel; -import lombok.Getter; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; @@ -43,14 +41,10 @@ import java.util.List; @Linked(LinkageType.ENABLE_LINK) public class TPSLimitCommand extends SWCommand implements Enable { - @Getter(AccessLevel.PACKAGE) - private static TPSLimitCommand instance = null; - private final List tabCompletions = new ArrayList<>(Arrays.asList("0,5", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20")); public TPSLimitCommand() { super("tpslimit"); - instance = this; if (TPSWarpUtils.isWarpAllowed()) { for (int i = 20; i <= 60; i += 5) { tabCompletions.add(i + ""); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/linkage/LinkageUtils.java b/BauSystem_Main/src/de/steamwar/bausystem/linkage/LinkageUtils.java index dd806a31..922850a1 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/linkage/LinkageUtils.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/linkage/LinkageUtils.java @@ -27,6 +27,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.Constructor; +import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.logging.Level; @@ -35,10 +36,12 @@ import java.util.logging.Level; public class LinkageUtils { private Map, Object> objectMap = new HashMap<>(); + private Set fieldsToLink = new HashSet<>(); public void link() { internalLinkOrUnlink(false, Linked.class); internalLinkOrUnlink(false, Linked.Linkages.class); + internalLinkFields(); } public void unlink() { @@ -64,6 +67,23 @@ public class LinkageUtils { } } + private void internalLinkFields() { + for (Field field : fieldsToLink) { + LinkedInstance linkedInstance = field.getDeclaredAnnotation(LinkedInstance.class); + if (linkedInstance == null) { + continue; + } + Object object = objectMap.getOrDefault(linkedInstance.value(), null); + Object source = objectMap.getOrDefault(field.getDeclaringClass(), null); + try { + field.setAccessible(true); + field.set(source, object); + } catch (IllegalAccessException e) { + // Ignored + } + } + } + private void linkOrUnlink(Class clazz, boolean unlink) { Linked[] linkages = clazz.getDeclaredAnnotationsByType(Linked.class); if (linkages.length == 0) { @@ -87,8 +107,27 @@ public class LinkageUtils { } linkageTypeList.sort(Comparator.comparingInt(LinkageType::getOrder)); - Object object = objectMap.computeIfAbsent(clazz, LinkageUtils::constructInstance); - linkageTypeList.forEach(linkageType -> linkageType.getLinkageConsumer().accept(object)); + if (unlink) { + Object object = objectMap.remove(clazz); + if (object == null) { + return; + } + linkageTypeList.forEach(linkageType -> linkageType.getLinkageConsumer().accept(object)); + } else { + Object object = objectMap.computeIfAbsent(clazz, LinkageUtils::constructInstance); + linkageTypeList.forEach(linkageType -> linkageType.getLinkageConsumer().accept(object)); + + for (Field field : clazz.getDeclaredFields()) { + LinkedInstance linkedInstance = field.getDeclaredAnnotation(LinkedInstance.class); + if (linkedInstance == null) { + continue; + } + if (!field.getType().isAssignableFrom(linkedInstance.value())) { + continue; + } + fieldsToLink.add(field); + } + } } private Object constructInstance(Class clazz) { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/linkage/LinkedInstance.java b/BauSystem_Main/src/de/steamwar/bausystem/linkage/LinkedInstance.java new file mode 100644 index 00000000..7cfa2857 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/linkage/LinkedInstance.java @@ -0,0 +1,31 @@ +/* + * 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 java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.FIELD}) +public @interface LinkedInstance { + Class value(); +}