From e914d0445014f38cb2dfcef7337fb57ddb72602b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Mon, 28 Sep 2020 16:05:14 +0200 Subject: [PATCH] :zap: Fix dependency graph and replace Guava --- build.gradle | 9 +-- cloud-annotations/build.gradle | 1 - .../annotations/AnnotationParser.java | 12 ++-- cloud-core/build.gradle | 1 - .../commandframework/CommandManager.java | 9 ++- .../arguments/CommandArgument.java | 4 +- .../arguments/parser/ParserParameter.java | 2 +- .../arguments/parser/ParserParameters.java | 5 +- .../arguments/parser/ParserRegistry.java | 4 +- .../arguments/parser/StandardParameters.java | 14 ++--- .../parser/StandardParserRegistry.java | 63 ++++++++++--------- .../context/CommandContext.java | 7 ++- .../CommandConfirmationManager.java | 28 +++++++-- .../commandframework/types/tuples/Pair.java | 9 ++- .../types/tuples/Quartet.java | 13 ++-- .../types/tuples/Quintet.java | 15 +++-- .../commandframework/types/tuples/Sextet.java | 17 +++-- .../types/tuples/Triplet.java | 11 ++-- .../commandframework/ParserRegistryTest.java | 12 +++- cloud-minecraft/cloud-brigadier/build.gradle | 2 +- .../brigadier/CloudBrigadierManager.java | 15 ++--- .../cloud-bukkit-test/build.gradle | 24 +------ cloud-minecraft/cloud-bukkit/build.gradle | 14 ++--- .../bukkit/BukkitCommandManager.java | 6 +- cloud-minecraft/cloud-paper/build.gradle | 5 +- cloud-services/README.md | 2 +- cloud-services/build.gradle | 3 +- .../services/AnnotatedMethodService.java | 6 +- .../AnnotatedMethodServiceFactory.java | 4 +- .../services/ServicePipeline.java | 6 +- .../services/ServicePipelineBuilder.java | 5 +- .../services/ServicePump.java | 4 +- .../services/ServiceRepository.java | 4 +- .../services/ServiceSpigot.java | 2 +- .../services/ServicesTest.java | 37 +++++------ 35 files changed, 184 insertions(+), 191 deletions(-) diff --git a/build.gradle b/build.gradle index ef832bba..071e3ec6 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,6 @@ buildscript { jcenter() } dependencies { - classpath("com.github.jengelman.gradle.plugins:shadow:5.0.0") classpath 'com.bmuschko:gradle-nexus-plugin:2.3.1' } } @@ -51,11 +50,13 @@ subprojects { apply plugin: 'java-library' apply plugin: 'maven-publish' + test { + useJUnitPlatform() + } + repositories { mavenLocal() - maven { - url = 'https://repo1.maven.org/maven2' - } + mavenCentral() maven { url = 'https://oss.sonatype.org/content/repositories/snapshots' diff --git a/cloud-annotations/build.gradle b/cloud-annotations/build.gradle index 3ea71922..73ea157f 100644 --- a/cloud-annotations/build.gradle +++ b/cloud-annotations/build.gradle @@ -1,4 +1,3 @@ dependencies { implementation project(':cloud-core') - implementation 'com.google.guava:guava:29.0-jre' } diff --git a/cloud-annotations/src/main/java/cloud/commandframework/annotations/AnnotationParser.java b/cloud-annotations/src/main/java/cloud/commandframework/annotations/AnnotationParser.java index f1b56365..c3ed02e3 100644 --- a/cloud-annotations/src/main/java/cloud/commandframework/annotations/AnnotationParser.java +++ b/cloud-annotations/src/main/java/cloud/commandframework/annotations/AnnotationParser.java @@ -34,8 +34,7 @@ import cloud.commandframework.execution.CommandExecutionHandler; import cloud.commandframework.extra.confirmation.CommandConfirmationManager; import cloud.commandframework.meta.CommandMeta; import cloud.commandframework.meta.SimpleCommandMeta; -import com.google.common.collect.Maps; -import com.google.common.reflect.TypeToken; +import io.leangen.geantyref.TypeToken; import cloud.commandframework.arguments.parser.ParserParameters; import javax.annotation.Nonnull; @@ -46,6 +45,7 @@ import java.lang.reflect.Parameter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.function.Function; @@ -81,7 +81,7 @@ public final class AnnotationParser { this.commandSenderClass = commandSenderClass; this.manager = manager; this.metaFactory = new MetaFactory(this, metaMapper); - this.annotationMappers = Maps.newHashMap(); + this.annotationMappers = new HashMap<>(); this.registerAnnotationMapper(CommandDescription.class, d -> ParserParameters.single(StandardParameters.DESCRIPTION, d.value())); } @@ -156,8 +156,8 @@ public final class AnnotationParser { tokens.get(commandToken).getMinor(), metaBuilder.build()); final Collection arguments = this.argumentExtractor.apply(method); - final Map> commandArguments = Maps.newHashMap(); - final Map, String> argumentDescriptions = Maps.newHashMap(); + final Map> commandArguments = new HashMap<>(); + final Map, String> argumentDescriptions = new HashMap<>(); /* Go through all annotated parameters and build up the argument tree */ for (final ArgumentParameterPair argumentPair : arguments) { final CommandArgument argument = this.buildArgument(method, @@ -246,7 +246,7 @@ public final class AnnotationParser { @Nonnull final ArgumentParameterPair argumentPair) { final Parameter parameter = argumentPair.getParameter(); final Collection annotations = Arrays.asList(parameter.getAnnotations()); - final TypeToken token = TypeToken.of(parameter.getParameterizedType()); + final TypeToken token = TypeToken.get(parameter.getParameterizedType()); final ParserParameters parameters = this.manager.getParserRegistry() .parseAnnotations(token, annotations); diff --git a/cloud-core/build.gradle b/cloud-core/build.gradle index eac53841..ce39a8f1 100644 --- a/cloud-core/build.gradle +++ b/cloud-core/build.gradle @@ -1,6 +1,5 @@ dependencies { api project(':cloud-services') - api 'com.google.guava:guava:29.0-jre' testImplementation 'org.openjdk.jmh:jmh-core:1.25.2' testImplementation 'org.openjdk.jmh:jmh-generator-annprocess:1.25.2' } diff --git a/cloud-core/src/main/java/cloud/commandframework/CommandManager.java b/cloud-core/src/main/java/cloud/commandframework/CommandManager.java index 1ae3d216..0ec5b9c4 100644 --- a/cloud-core/src/main/java/cloud/commandframework/CommandManager.java +++ b/cloud-core/src/main/java/cloud/commandframework/CommandManager.java @@ -44,9 +44,7 @@ import cloud.commandframework.execution.preprocessor.AcceptingCommandPreprocesso import cloud.commandframework.execution.preprocessor.CommandPreprocessingContext; import cloud.commandframework.execution.preprocessor.CommandPreprocessor; import cloud.commandframework.internal.CommandRegistrationHandler; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.reflect.TypeToken; +import io.leangen.geantyref.TypeToken; import cloud.commandframework.meta.CommandMeta; import cloud.commandframework.permission.CommandPermission; import cloud.commandframework.permission.OrPermission; @@ -59,6 +57,7 @@ import javax.annotation.Nullable; import java.util.Collection; import java.util.Collections; import java.util.EnumSet; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -76,13 +75,13 @@ import java.util.function.Function; @SuppressWarnings("unused") public abstract class CommandManager { - private final Map, BiConsumer> exceptionHandlers = Maps.newHashMap(); + private final Map, BiConsumer> exceptionHandlers = new HashMap<>(); private final EnumSet managerSettings = EnumSet.of(ManagerSettings.ENFORCE_INTERMEDIARY_PERMISSIONS); private final CommandContextFactory commandContextFactory = new StandardCommandContextFactory<>(); private final ServicePipeline servicePipeline = ServicePipeline.builder().build(); private final ParserRegistry parserRegistry = new StandardParserRegistry<>(); - private final Collection> commands = Lists.newLinkedList(); + private final Collection> commands = new LinkedList<>(); private final CommandExecutionCoordinator commandExecutionCoordinator; private final CommandTree commandTree; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/CommandArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/CommandArgument.java index a1a627ad..c5532d7e 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/CommandArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/CommandArgument.java @@ -24,7 +24,7 @@ package cloud.commandframework.arguments; import cloud.commandframework.arguments.parser.ArgumentParser; -import com.google.common.reflect.TypeToken; +import io.leangen.geantyref.TypeToken; import cloud.commandframework.Command; import cloud.commandframework.CommandManager; import cloud.commandframework.arguments.parser.ArgumentParseResult; @@ -180,7 +180,7 @@ public class CommandArgument implements Comparable> @Nonnull public static CommandArgument.Builder ofType(@Nonnull final Class clazz, @Nonnull final String name) { - return new Builder<>(TypeToken.of(clazz), name); + return new Builder<>(TypeToken.get(clazz), name); } /** diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameter.java b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameter.java index 9f944a50..cd251638 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameter.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameter.java @@ -23,7 +23,7 @@ // package cloud.commandframework.arguments.parser; -import com.google.common.reflect.TypeToken; +import io.leangen.geantyref.TypeToken; import javax.annotation.Nonnull; import java.util.Objects; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameters.java b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameters.java index 124954bf..309a20c5 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameters.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameters.java @@ -23,10 +23,9 @@ // package cloud.commandframework.arguments.parser; -import com.google.common.collect.Maps; - import javax.annotation.Nonnull; import java.util.Collections; +import java.util.HashMap; import java.util.Map; /** @@ -34,7 +33,7 @@ import java.util.Map; */ public final class ParserParameters { - private final Map, Object> internalMap = Maps.newHashMap(); + private final Map, Object> internalMap = new HashMap<>(); /** * Get an empty {@link ParserParameters} instance diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserRegistry.java b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserRegistry.java index 800fa522..dc350828 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserRegistry.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserRegistry.java @@ -23,7 +23,7 @@ // package cloud.commandframework.arguments.parser; -import com.google.common.reflect.TypeToken; +import io.leangen.geantyref.TypeToken; import javax.annotation.Nonnull; import java.lang.annotation.Annotation; @@ -34,7 +34,7 @@ import java.util.function.Function; /** * Registry of {@link ArgumentParser} that allows these arguments to be - * referenced by a {@link Class} (or really, a {@link com.google.common.reflect.TypeToken}) + * referenced by a {@link Class} (or really, a {@link TypeToken}) * or a {@link String} key * * @param Command sender type diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParameters.java b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParameters.java index 08606700..a91ae275 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParameters.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParameters.java @@ -23,7 +23,7 @@ // package cloud.commandframework.arguments.parser; -import com.google.common.reflect.TypeToken; +import io.leangen.geantyref.TypeToken; import javax.annotation.Nonnull; @@ -35,27 +35,27 @@ public final class StandardParameters { /** * Minimum value accepted by a numerical parser */ - public static final ParserParameter RANGE_MIN = create("min", TypeToken.of(Number.class)); + public static final ParserParameter RANGE_MIN = create("min", TypeToken.get(Number.class)); /** * Maximum value accepted by a numerical parser */ - public static final ParserParameter RANGE_MAX = create("max", TypeToken.of(Number.class)); + public static final ParserParameter RANGE_MAX = create("max", TypeToken.get(Number.class)); /** * Command description */ - public static final ParserParameter DESCRIPTION = create("description", TypeToken.of(String.class)); + public static final ParserParameter DESCRIPTION = create("description", TypeToken.get(String.class)); /** * Command confirmation */ - public static final ParserParameter CONFIRMATION = create("confirmation", TypeToken.of(Boolean.class)); + public static final ParserParameter CONFIRMATION = create("confirmation", TypeToken.get(Boolean.class)); /** * Command completions */ - public static final ParserParameter COMPLETIONS = create("completions", TypeToken.of(String[].class)); + public static final ParserParameter COMPLETIONS = create("completions", TypeToken.get(String[].class)); /** * The command should be hidden from help menus, etc */ - public static final ParserParameter HIDDEN = create("hidden", TypeToken.of(Boolean.class)); + public static final ParserParameter HIDDEN = create("hidden", TypeToken.get(Boolean.class)); private StandardParameters() { } diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParserRegistry.java b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParserRegistry.java index d8308ee4..4e1eebe7 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParserRegistry.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParserRegistry.java @@ -23,8 +23,6 @@ // package cloud.commandframework.arguments.parser; -import com.google.common.collect.ImmutableMap; -import com.google.common.reflect.TypeToken; import cloud.commandframework.annotations.specifier.Completions; import cloud.commandframework.annotations.specifier.Range; import cloud.commandframework.arguments.standard.BooleanArgument; @@ -36,6 +34,8 @@ import cloud.commandframework.arguments.standard.FloatArgument; import cloud.commandframework.arguments.standard.IntegerArgument; import cloud.commandframework.arguments.standard.ShortArgument; import cloud.commandframework.arguments.standard.StringArgument; +import io.leangen.geantyref.GenericTypeReflector; +import io.leangen.geantyref.TypeToken; import javax.annotation.Nonnull; import java.lang.annotation.Annotation; @@ -54,16 +54,18 @@ import java.util.function.Function; */ public final class StandardParserRegistry implements ParserRegistry { - private static final Map, Class> PRIMITIVE_MAPPINGS = ImmutableMap., Class>builder() - .put(char.class, Character.class) - .put(int.class, Integer.class) - .put(short.class, Short.class) - .put(byte.class, Byte.class) - .put(float.class, Float.class) - .put(double.class, Double.class) - .put(long.class, Long.class) - .put(boolean.class, Boolean.class) - .build(); + private static final Map, Class> PRIMITIVE_MAPPINGS = new HashMap, Class>() { + { + put(char.class, Character .class); + put(int.class, Integer .class); + put(short.class, Short .class); + put(byte.class, Byte .class); + put(float.class, Float .class); + put(double.class, Double .class); + put(long.class, Long .class); + put(boolean.class, Boolean .class); + } + }; private final Map>> namedParsers = new HashMap<>(); private final Map, Function>> parserSuppliers = new HashMap<>(); @@ -80,28 +82,28 @@ public final class StandardParserRegistry implements ParserRegistry { this.registerAnnotationMapper(Completions.class, new CompletionsMapper()); /* Register standard types */ - this.registerParserSupplier(TypeToken.of(Byte.class), options -> + this.registerParserSupplier(TypeToken.get(Byte.class), options -> new ByteArgument.ByteParser((byte) options.get(StandardParameters.RANGE_MIN, Byte.MIN_VALUE), (byte) options.get(StandardParameters.RANGE_MAX, Byte.MAX_VALUE))); - this.registerParserSupplier(TypeToken.of(Short.class), options -> + this.registerParserSupplier(TypeToken.get(Short.class), options -> new ShortArgument.ShortParser((short) options.get(StandardParameters.RANGE_MIN, Short.MIN_VALUE), (short) options.get(StandardParameters.RANGE_MAX, Short.MAX_VALUE))); - this.registerParserSupplier(TypeToken.of(Integer.class), options -> + this.registerParserSupplier(TypeToken.get(Integer.class), options -> new IntegerArgument.IntegerParser((int) options.get(StandardParameters.RANGE_MIN, Integer.MIN_VALUE), (int) options.get(StandardParameters.RANGE_MAX, Integer.MAX_VALUE))); - this.registerParserSupplier(TypeToken.of(Float.class), options -> + this.registerParserSupplier(TypeToken.get(Float.class), options -> new FloatArgument.FloatParser((float) options.get(StandardParameters.RANGE_MIN, Float.MIN_VALUE), (float) options.get(StandardParameters.RANGE_MAX, Float.MAX_VALUE))); - this.registerParserSupplier(TypeToken.of(Double.class), options -> + this.registerParserSupplier(TypeToken.get(Double.class), options -> new DoubleArgument.DoubleParser((double) options.get(StandardParameters.RANGE_MIN, Double.MIN_VALUE), (double) options.get(StandardParameters.RANGE_MAX, Double.MAX_VALUE))); - this.registerParserSupplier(TypeToken.of(Character.class), options -> new CharArgument.CharacterParser()); + this.registerParserSupplier(TypeToken.get(Character.class), options -> new CharArgument.CharacterParser()); /* Make this one less awful */ - this.registerParserSupplier(TypeToken.of(String.class), options -> new StringArgument.StringParser( + this.registerParserSupplier(TypeToken.get(String.class), options -> new StringArgument.StringParser( StringArgument.StringMode.SINGLE, (context, s) -> Arrays.asList(options.get(StandardParameters.COMPLETIONS, new String[0])))); /* Add options to this */ - this.registerParserSupplier(TypeToken.of(Boolean.class), options -> new BooleanArgument.BooleanParser<>(false)); + this.registerParserSupplier(TypeToken.get(Boolean.class), options -> new BooleanArgument.BooleanParser<>(false)); } @Override @@ -146,17 +148,17 @@ public final class StandardParserRegistry implements ParserRegistry { public Optional> createParser(@Nonnull final TypeToken type, @Nonnull final ParserParameters parserParameters) { final TypeToken actualType; - if (type.isPrimitive()) { - actualType = TypeToken.of(PRIMITIVE_MAPPINGS.get(type.getRawType())); + if (GenericTypeReflector.erase(type.getType()).isPrimitive()) { + actualType = TypeToken.get(PRIMITIVE_MAPPINGS.get(GenericTypeReflector.erase(type.getType()))); } else { actualType = type; } final Function> producer = this.parserSuppliers.get(actualType); if (producer == null) { /* Give enums special treatment */ - if (actualType.isSubtypeOf(Enum.class)) { + if (GenericTypeReflector.isSuperType(Enum.class, actualType.getType())) { @SuppressWarnings("all") final EnumArgument.EnumParser enumArgument - = new EnumArgument.EnumParser((Class) actualType.getRawType()); + = new EnumArgument.EnumParser((Class) GenericTypeReflector.erase(actualType.getType())); // noinspection all return Optional.of(enumArgument); } @@ -181,15 +183,20 @@ public final class StandardParserRegistry implements ParserRegistry { } + private static boolean isPrimitive(@Nonnull final TypeToken type) { + return GenericTypeReflector.erase(type.getType()).isPrimitive(); + } + + private static final class RangeMapper implements BiFunction, ParserParameters> { @Override public ParserParameters apply(final Range range, final TypeToken type) { final Class clazz; - if (type.isPrimitive()) { - clazz = PRIMITIVE_MAPPINGS.get(type.getRawType()); + if (isPrimitive(type)) { + clazz = PRIMITIVE_MAPPINGS.get(GenericTypeReflector.erase(type.getType())); } else { - clazz = type.getRawType(); + clazz = GenericTypeReflector.erase(type.getType()); } if (!Number.class.isAssignableFrom(clazz)) { return ParserParameters.empty(); @@ -256,7 +263,7 @@ public final class StandardParserRegistry implements ParserRegistry { @Override public ParserParameters apply(final Completions completions, final TypeToken token) { - if (token.getRawType().equals(String.class)) { + if (GenericTypeReflector.erase(token.getType()).equals(String.class)) { final String[] splitCompletions = completions.value().replace(" ", "").split(","); return ParserParameters.single(StandardParameters.COMPLETIONS, splitCompletions); } diff --git a/cloud-core/src/main/java/cloud/commandframework/context/CommandContext.java b/cloud-core/src/main/java/cloud/commandframework/context/CommandContext.java index 17252e2a..a29daa7b 100644 --- a/cloud-core/src/main/java/cloud/commandframework/context/CommandContext.java +++ b/cloud-core/src/main/java/cloud/commandframework/context/CommandContext.java @@ -24,10 +24,10 @@ package cloud.commandframework.context; import cloud.commandframework.arguments.CommandArgument; -import com.google.common.collect.Maps; import javax.annotation.Nonnull; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -38,8 +38,8 @@ import java.util.Optional; */ public final class CommandContext { - private final Map, ArgumentTiming> argumentTimings = Maps.newHashMap(); - private final Map internalStorage = Maps.newHashMap(); + private final Map, ArgumentTiming> argumentTimings = new HashMap<>(); + private final Map internalStorage = new HashMap<>(); private final C commandSender; private final boolean suggestions; @@ -197,6 +197,7 @@ public final class CommandContext { * * @param start Start time (in nanoseconds) */ + @SuppressWarnings("unused") public ArgumentTiming(final long start) { this(start, -1, false); } diff --git a/cloud-core/src/main/java/cloud/commandframework/extra/confirmation/CommandConfirmationManager.java b/cloud-core/src/main/java/cloud/commandframework/extra/confirmation/CommandConfirmationManager.java index 76689922..ecf1bc26 100644 --- a/cloud-core/src/main/java/cloud/commandframework/extra/confirmation/CommandConfirmationManager.java +++ b/cloud-core/src/main/java/cloud/commandframework/extra/confirmation/CommandConfirmationManager.java @@ -23,16 +23,17 @@ // package cloud.commandframework.extra.confirmation; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import cloud.commandframework.CommandManager; import cloud.commandframework.execution.CommandExecutionHandler; import cloud.commandframework.execution.postprocessor.CommandPostprocessingContext; import cloud.commandframework.execution.postprocessor.CommandPostprocessor; import cloud.commandframework.meta.SimpleCommandMeta; import cloud.commandframework.services.types.ConsumerService; +import cloud.commandframework.types.tuples.Pair; import javax.annotation.Nonnull; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; @@ -55,10 +56,13 @@ public class CommandConfirmationManager { * Meta data stored for commands that require confirmation */ public static final String CONFIRMATION_REQUIRED_META = "__REQUIRE_CONFIRMATION__"; + private static final int MAXIMUM_PENDING_SIZE = 100; private final Consumer> notifier; private final Consumer errorNotifier; - private final Cache> pendingCommands; + private final Map, Long>> pendingCommands; + + private final long timeoutMillis; /** * Create a new confirmation manager instance @@ -74,7 +78,13 @@ public class CommandConfirmationManager { @Nonnull final Consumer errorNotifier) { this.notifier = notifier; this.errorNotifier = errorNotifier; - this.pendingCommands = CacheBuilder.newBuilder().expireAfterWrite(timeout, timeoutTimeUnit).concurrencyLevel(1).build(); + this.pendingCommands = new LinkedHashMap, Long>>() { + @Override + protected boolean removeEldestEntry(final Map.Entry, Long>> eldest) { + return this.size() > MAXIMUM_PENDING_SIZE; + } + }; + this.timeoutMillis = timeoutTimeUnit.toMillis(timeout); } private void notifyConsumer(@Nonnull final CommandPostprocessingContext context) { @@ -82,7 +92,7 @@ public class CommandConfirmationManager { } private void addPending(@Nonnull final CommandPostprocessingContext context) { - this.pendingCommands.put(context.getCommandContext().getSender(), context); + this.pendingCommands.put(context.getCommandContext().getSender(), Pair.of(context, System.currentTimeMillis())); } /** @@ -93,7 +103,13 @@ public class CommandConfirmationManager { */ @Nonnull public Optional> getPending(@Nonnull final C sender) { - return Optional.ofNullable(this.pendingCommands.getIfPresent(sender)); + final Pair, Long> pair = this.pendingCommands.remove(sender); + if (pair != null) { + if (System.currentTimeMillis() < pair.getSecond() + this.timeoutMillis) { + return Optional.of(pair.getFirst()); + } + } + return Optional.empty(); } /** diff --git a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Pair.java b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Pair.java index 80d37096..f222e108 100644 --- a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Pair.java +++ b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Pair.java @@ -23,9 +23,8 @@ // package cloud.commandframework.types.tuples; -import com.google.common.base.Objects; - import javax.annotation.Nonnull; +import java.util.Objects; /** * Immutable generic 2-tuple @@ -90,13 +89,13 @@ public class Pair implements Tuple { return false; } final Pair pair = (Pair) o; - return Objects.equal(getFirst(), pair.getFirst()) - && Objects.equal(getSecond(), pair.getSecond()); + return Objects.equals(getFirst(), pair.getFirst()) + && Objects.equals(getSecond(), pair.getSecond()); } @Override public final int hashCode() { - return Objects.hashCode(getFirst(), getSecond()); + return Objects.hash(getFirst(), getSecond()); } @Override diff --git a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quartet.java b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quartet.java index 31a8be07..bacc604c 100644 --- a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quartet.java +++ b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quartet.java @@ -23,9 +23,8 @@ // package cloud.commandframework.types.tuples; -import com.google.common.base.Objects; - import javax.annotation.Nonnull; +import java.util.Objects; /** * Immutable generic 5-tuple @@ -126,15 +125,15 @@ public class Quartet implements Tuple { return false; } final Quartet quartet = (Quartet) o; - return Objects.equal(getFirst(), quartet.getFirst()) - && Objects.equal(getSecond(), quartet.getSecond()) - && Objects.equal(getThird(), quartet.getThird()) - && Objects.equal(getFourth(), quartet.getFourth()); + return Objects.equals(getFirst(), quartet.getFirst()) + && Objects.equals(getSecond(), quartet.getSecond()) + && Objects.equals(getThird(), quartet.getThird()) + && Objects.equals(getFourth(), quartet.getFourth()); } @Override public final int hashCode() { - return Objects.hashCode(getFirst(), getSecond(), getThird(), getFourth()); + return Objects.hash(getFirst(), getSecond(), getThird(), getFourth()); } @Override diff --git a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quintet.java b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quintet.java index 59c751e2..c007e11d 100644 --- a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quintet.java +++ b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quintet.java @@ -23,9 +23,8 @@ // package cloud.commandframework.types.tuples; -import com.google.common.base.Objects; - import javax.annotation.Nonnull; +import java.util.Objects; /** * Immutable generic 5-tuple @@ -144,16 +143,16 @@ public class Quintet implements Tuple { return false; } final Quintet quintet = (Quintet) o; - return Objects.equal(getFirst(), quintet.getFirst()) - && Objects.equal(getSecond(), quintet.getSecond()) - && Objects.equal(getThird(), quintet.getThird()) - && Objects.equal(getFourth(), quintet.getFourth()) - && Objects.equal(getFifth(), quintet.getFifth()); + return Objects.equals(getFirst(), quintet.getFirst()) + && Objects.equals(getSecond(), quintet.getSecond()) + && Objects.equals(getThird(), quintet.getThird()) + && Objects.equals(getFourth(), quintet.getFourth()) + && Objects.equals(getFifth(), quintet.getFifth()); } @Override public final int hashCode() { - return Objects.hashCode(getFirst(), getSecond(), getThird(), getFourth(), getFifth()); + return Objects.hash(getFirst(), getSecond(), getThird(), getFourth(), getFifth()); } @Override diff --git a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Sextet.java b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Sextet.java index 24d4150d..fb2cb554 100644 --- a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Sextet.java +++ b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Sextet.java @@ -23,9 +23,8 @@ // package cloud.commandframework.types.tuples; -import com.google.common.base.Objects; - import javax.annotation.Nonnull; +import java.util.Objects; /** * Immutable generic 6-tuple @@ -162,17 +161,17 @@ public class Sextet implements Tuple { return false; } final Sextet sextet = (Sextet) o; - return Objects.equal(getFirst(), sextet.getFirst()) - && Objects.equal(getSecond(), sextet.getSecond()) - && Objects.equal(getThird(), sextet.getThird()) - && Objects.equal(getFourth(), sextet.getFourth()) - && Objects.equal(getFifth(), sextet.getFifth()) - && Objects.equal(getSixth(), sextet.getSixth()); + return Objects.equals(getFirst(), sextet.getFirst()) + && Objects.equals(getSecond(), sextet.getSecond()) + && Objects.equals(getThird(), sextet.getThird()) + && Objects.equals(getFourth(), sextet.getFourth()) + && Objects.equals(getFifth(), sextet.getFifth()) + && Objects.equals(getSixth(), sextet.getSixth()); } @Override public final int hashCode() { - return Objects.hashCode(getFirst(), getSecond(), getThird(), getFourth(), getFifth(), getSixth()); + return Objects.hash(getFirst(), getSecond(), getThird(), getFourth(), getFifth(), getSixth()); } @Override diff --git a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Triplet.java b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Triplet.java index 7d0f6e23..02afeee1 100644 --- a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Triplet.java +++ b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Triplet.java @@ -23,9 +23,8 @@ // package cloud.commandframework.types.tuples; -import com.google.common.base.Objects; - import javax.annotation.Nonnull; +import java.util.Objects; /** * Immutable generic 3-tuple @@ -108,14 +107,14 @@ public class Triplet implements Tuple { return false; } final Triplet triplet = (Triplet) o; - return Objects.equal(getFirst(), triplet.getFirst()) - && Objects.equal(getSecond(), triplet.getSecond()) - && Objects.equal(getThird(), triplet.getThird()); + return Objects.equals(getFirst(), triplet.getFirst()) + && Objects.equals(getSecond(), triplet.getSecond()) + && Objects.equals(getThird(), triplet.getThird()); } @Override public final int hashCode() { - return Objects.hashCode(getFirst(), getSecond(), getThird()); + return Objects.hash(getFirst(), getSecond(), getThird()); } @Override diff --git a/cloud-core/src/test/java/cloud/commandframework/ParserRegistryTest.java b/cloud-core/src/test/java/cloud/commandframework/ParserRegistryTest.java index 68f1ade6..0b8b2009 100644 --- a/cloud-core/src/test/java/cloud/commandframework/ParserRegistryTest.java +++ b/cloud-core/src/test/java/cloud/commandframework/ParserRegistryTest.java @@ -25,7 +25,7 @@ package cloud.commandframework; import cloud.commandframework.annotations.specifier.Range; import cloud.commandframework.arguments.standard.IntegerArgument; -import com.google.common.reflect.TypeToken; +import io.leangen.geantyref.TypeToken; import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.arguments.parser.ParserParameters; import cloud.commandframework.arguments.parser.ParserRegistry; @@ -67,7 +67,7 @@ public class ParserRegistryTest { }; - final TypeToken parsedType = TypeToken.of(int.class); + final TypeToken parsedType = TypeToken.get(int.class); final ParserParameters parserParameters = parserRegistry.parseAnnotations(parsedType, Collections.singleton(range)); Assertions.assertTrue(parserParameters.has(StandardParameters.RANGE_MIN)); Assertions.assertTrue(parserParameters.has(StandardParameters.RANGE_MAX)); @@ -81,6 +81,14 @@ public class ParserRegistryTest { (IntegerArgument.IntegerParser) parser; Assertions.assertEquals(RANGE_MIN, integerParser.getMin()); Assertions.assertEquals(RANGE_MAX, integerParser.getMax()); + + /* Test integer */ + parserRegistry.createParser(TypeToken.get(int.class), ParserParameters.empty()) + .orElseThrow(() -> new IllegalArgumentException("No parser found for int.class")); + + /* Test Enum */ + parserRegistry.createParser(TypeToken.get(CommandManager.ManagerSettings.class), ParserParameters.empty()) + .orElseThrow(() -> new IllegalArgumentException("No parser found for enum")); } } diff --git a/cloud-minecraft/cloud-brigadier/build.gradle b/cloud-minecraft/cloud-brigadier/build.gradle index d93297a2..22601cc1 100644 --- a/cloud-minecraft/cloud-brigadier/build.gradle +++ b/cloud-minecraft/cloud-brigadier/build.gradle @@ -1,5 +1,5 @@ dependencies { implementation project(':cloud-core') /* Needs to be provided by the platform */ - implementation 'com.mojang:brigadier:1.0.17' + compileOnly 'com.mojang:brigadier:1.0.17' } diff --git a/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java b/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java index ec2f5bd9..3cc628ac 100644 --- a/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java +++ b/cloud-minecraft/cloud-brigadier/src/main/java/cloud/commandframework/brigadier/CloudBrigadierManager.java @@ -23,6 +23,8 @@ // package cloud.commandframework.brigadier; +import io.leangen.geantyref.GenericTypeReflector; +import io.leangen.geantyref.TypeToken; import cloud.commandframework.Command; import cloud.commandframework.CommandManager; import cloud.commandframework.CommandTree; @@ -41,8 +43,6 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.execution.preprocessor.CommandPreprocessingContext; import cloud.commandframework.permission.CommandPermission; import cloud.commandframework.permission.Permission; -import com.google.common.collect.Maps; -import com.google.common.reflect.TypeToken; import com.mojang.brigadier.LiteralMessage; import com.mojang.brigadier.arguments.ArgumentType; import com.mojang.brigadier.arguments.BoolArgumentType; @@ -61,6 +61,7 @@ import com.mojang.brigadier.tree.LiteralCommandNode; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.Collections; +import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -96,8 +97,8 @@ public final class CloudBrigadierManager { public CloudBrigadierManager(@Nonnull final CommandManager commandManager, @Nonnull final Supplier> dummyContextProvider) { - this.mappers = Maps.newHashMap(); - this.defaultArgumentTypeSuppliers = Maps.newHashMap(); + this.mappers = new HashMap<>(); + this.defaultArgumentTypeSuppliers = new HashMap<>(); this.commandManager = commandManager; this.dummyContextProvider = dummyContextProvider; this.registerInternalMappings(); @@ -196,7 +197,7 @@ public final class CloudBrigadierManager { public , O> void registerMapping(@Nonnull final TypeToken argumentType, @Nonnull final Function> mapper) { - this.mappers.put(argumentType.getRawType(), mapper); + this.mappers.put(GenericTypeReflector.erase(argumentType.getType()), mapper); } /** @@ -217,7 +218,7 @@ public final class CloudBrigadierManager { @Nonnull final TypeToken argumentType, @Nonnull final K argument) { final ArgumentParser commandArgument = (ArgumentParser) argument; - Function function = this.mappers.get(argumentType.getRawType()); + Function function = this.mappers.get(GenericTypeReflector.erase(argumentType.getType())); if (function == null) { return this.createDefaultMapper(valueType, commandArgument); } @@ -350,7 +351,7 @@ public final class CloudBrigadierManager { .executes(executor); } else { final Pair, Boolean> pair = this.getArgument(root.getValue().getValueType(), - TypeToken.of(root.getValue().getParser().getClass()), + TypeToken.get(root.getValue().getParser().getClass()), root.getValue().getParser()); final SuggestionProvider provider = pair.getRight() ? null : suggestionProvider; argumentBuilder = RequiredArgumentBuilder diff --git a/cloud-minecraft/cloud-bukkit-test/build.gradle b/cloud-minecraft/cloud-bukkit-test/build.gradle index 462e64af..027c7787 100644 --- a/cloud-minecraft/cloud-bukkit-test/build.gradle +++ b/cloud-minecraft/cloud-bukkit-test/build.gradle @@ -4,29 +4,7 @@ def adventureVersion = '4.0.0-SNAPSHOT' shadowJar { dependencies { - include(project(':cloud-paper')) - include(project(':cloud-annotations')) - include(project(':cloud-minecraft-extras')) - include(project(':cloud-core')) - include(project(':cloud-services')) - include(project(':cloud-brigadier')) - include(project(':cloud-bukkit')) - /* Commodore */ - include(dependency('me.lucko:commodore:1.9')) - /* Adventure */ - include(dependency("net.kyori:adventure-platform-bukkit:${adventureVersion}")) - include(dependency("net.kyori:adventure-text-minimessage:${adventureVersion}")) - include(dependency("net.kyori:adventure-text-serializer-bungeecord:${adventureVersion}")) - include(dependency("net.kyori:adventure-text-serializer-legacy:${adventureVersion}")) - include(dependency("net.kyori:adventure-text-serializer-gson:${adventureVersion}")) - include(dependency("net.kyori:adventure-api:${adventureVersion}")) - include(dependency("net.kyori:adventure-platform-api:${adventureVersion}")) - include(dependency("net.kyori:adventure-platform-common:${adventureVersion}")) - include(dependency("net.kyori:adventure-platform-viaversion:${adventureVersion}")) - include(dependency("net.kyori:adventure-nbt:${adventureVersion}")) - /* Examination */ - include(dependency("net.kyori:examination-api:1.0.0")) - include(dependency("net.kyori:examination-string:1.0.0")) + exclude(dependency('org.bukkit:bukkit:1.8.8-R0.1-SNAPSHOT')) } } diff --git a/cloud-minecraft/cloud-bukkit/build.gradle b/cloud-minecraft/cloud-bukkit/build.gradle index d0164139..75b66264 100644 --- a/cloud-minecraft/cloud-bukkit/build.gradle +++ b/cloud-minecraft/cloud-bukkit/build.gradle @@ -1,12 +1,6 @@ dependencies { - api (project(':cloud-core')) { - /* Exposed by Bukkit */ - exclude group: 'com.google.guava', module: 'guava' - } - api (project(':cloud-brigadier')) { - /* Once again exposed by Bukkit */ - exclude group: 'com.google.guava', module: 'guava' - } - implementation 'org.bukkit:bukkit:1.8.8-R0.1-SNAPSHOT' - implementation 'me.lucko:commodore:1.9' + api project(':cloud-core') + api project(':cloud-brigadier') + compileOnly 'org.bukkit:bukkit:1.8.8-R0.1-SNAPSHOT' + compileOnly 'me.lucko:commodore:1.9' } diff --git a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/BukkitCommandManager.java b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/BukkitCommandManager.java index c25fa9ff..a749bbc1 100644 --- a/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/BukkitCommandManager.java +++ b/cloud-minecraft/cloud-bukkit/src/main/java/cloud/commandframework/bukkit/BukkitCommandManager.java @@ -28,7 +28,7 @@ import cloud.commandframework.CommandTree; import cloud.commandframework.bukkit.parsers.MaterialArgument; import cloud.commandframework.bukkit.parsers.WorldArgument; import cloud.commandframework.execution.CommandExecutionCoordinator; -import com.google.common.reflect.TypeToken; +import io.leangen.geantyref.TypeToken; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.World; @@ -84,8 +84,8 @@ public class BukkitCommandManager extends CommandManager { this.backwardsCommandSenderMapper = backwardsCommandSenderMapper; /* Register Bukkit parsers */ - this.getParserRegistry().registerParserSupplier(TypeToken.of(World.class), params -> new WorldArgument.WorldParser<>()); - this.getParserRegistry().registerParserSupplier(TypeToken.of(Material.class), + this.getParserRegistry().registerParserSupplier(TypeToken.get(World.class), params -> new WorldArgument.WorldParser<>()); + this.getParserRegistry().registerParserSupplier(TypeToken.get(Material.class), params -> new MaterialArgument.MaterialParser<>()); /* Try to determine the Minecraft version */ diff --git a/cloud-minecraft/cloud-paper/build.gradle b/cloud-minecraft/cloud-paper/build.gradle index a7ff9f1e..bcb9ecc4 100644 --- a/cloud-minecraft/cloud-paper/build.gradle +++ b/cloud-minecraft/cloud-paper/build.gradle @@ -1,8 +1,5 @@ dependencies { - api (project(':cloud-bukkit')) { - /* Exposed by Bukkit */ - exclude group: 'com.google.guava', module: 'guava' - } + api project(':cloud-bukkit') compileOnly 'com.destroystokyo.paper:paper-api:1.15.2-R0.1-SNAPSHOT' compileOnly 'com.destroystokyo.paper:paper-mojangapi:1.15.2-R0.1-SNAPSHOT' } diff --git a/cloud-services/README.md b/cloud-services/README.md index 83fa75fd..eb96da4f 100644 --- a/cloud-services/README.md +++ b/cloud-services/README.md @@ -111,7 +111,7 @@ public class DefaultMockService implements MockService { Example Registration: ```java -servicePipeline.registerServiceType(TypeToken.of(MockService.class), new DefaultMockService()); +servicePipeline.registerServiceType(TypeToken.get(MockService.class), new DefaultMockService()); ``` Example Usage: diff --git a/cloud-services/build.gradle b/cloud-services/build.gradle index 7e4a8be3..99ac7546 100644 --- a/cloud-services/build.gradle +++ b/cloud-services/build.gradle @@ -1,4 +1,3 @@ dependencies { - /* Exposed by Core later on */ - implementation 'com.google.guava:guava:29.0-jre' + api 'io.leangen.geantyref:geantyref:1.3.4' } diff --git a/cloud-services/src/main/java/cloud/commandframework/services/AnnotatedMethodService.java b/cloud-services/src/main/java/cloud/commandframework/services/AnnotatedMethodService.java index 6d94dbd2..f3d144d7 100644 --- a/cloud-services/src/main/java/cloud/commandframework/services/AnnotatedMethodService.java +++ b/cloud-services/src/main/java/cloud/commandframework/services/AnnotatedMethodService.java @@ -23,7 +23,6 @@ // package cloud.commandframework.services; -import com.google.common.base.Objects; import cloud.commandframework.services.annotations.Order; import cloud.commandframework.services.types.Service; @@ -32,6 +31,7 @@ import javax.annotation.Nullable; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.reflect.Method; +import java.util.Objects; class AnnotatedMethodService implements Service { @@ -87,12 +87,12 @@ class AnnotatedMethodService implements Service that = (AnnotatedMethodService) o; - return Objects.equal(this.methodHandle, that.methodHandle); + return Objects.equals(this.methodHandle, that.methodHandle); } @Override public int hashCode() { - return Objects.hashCode(this.methodHandle); + return Objects.hash(this.methodHandle); } } diff --git a/cloud-services/src/main/java/cloud/commandframework/services/AnnotatedMethodServiceFactory.java b/cloud-services/src/main/java/cloud/commandframework/services/AnnotatedMethodServiceFactory.java index a7bfb281..a5cd27f7 100644 --- a/cloud-services/src/main/java/cloud/commandframework/services/AnnotatedMethodServiceFactory.java +++ b/cloud-services/src/main/java/cloud/commandframework/services/AnnotatedMethodServiceFactory.java @@ -23,7 +23,7 @@ // package cloud.commandframework.services; -import com.google.common.reflect.TypeToken; +import io.leangen.geantyref.TypeToken; import cloud.commandframework.services.annotations.ServiceImplementation; import cloud.commandframework.services.types.Service; @@ -53,7 +53,7 @@ enum AnnotatedMethodServiceFactory { } map.put(new AnnotatedMethodService<>(instance, method), - TypeToken.of(serviceImplementation.value())); + TypeToken.get(serviceImplementation.value())); } return map; } diff --git a/cloud-services/src/main/java/cloud/commandframework/services/ServicePipeline.java b/cloud-services/src/main/java/cloud/commandframework/services/ServicePipeline.java index 33b616aa..36bba794 100644 --- a/cloud-services/src/main/java/cloud/commandframework/services/ServicePipeline.java +++ b/cloud-services/src/main/java/cloud/commandframework/services/ServicePipeline.java @@ -23,7 +23,7 @@ // package cloud.commandframework.services; -import com.google.common.reflect.TypeToken; +import io.leangen.geantyref.TypeToken; import cloud.commandframework.services.types.Service; import javax.annotation.Nonnull; @@ -166,7 +166,7 @@ public final class ServicePipeline { @Nonnull final Class> type, @Nonnull final Service implementation, @Nonnull final Collection> filters) { - return registerServiceImplementation(TypeToken.of(type), implementation, filters); + return registerServiceImplementation(TypeToken.get(type), implementation, filters); } /** @@ -227,7 +227,7 @@ public final class ServicePipeline { Collections.reverse(queue); for (ServiceRepository.ServiceWrapper> wrapper : queue) { collection - .add((TypeToken) TypeToken.of(wrapper.getImplementation().getClass())); + .add((TypeToken) TypeToken.get(wrapper.getImplementation().getClass())); } return Collections.unmodifiableList(collection); } diff --git a/cloud-services/src/main/java/cloud/commandframework/services/ServicePipelineBuilder.java b/cloud-services/src/main/java/cloud/commandframework/services/ServicePipelineBuilder.java index 41dc1c62..dfc58127 100644 --- a/cloud-services/src/main/java/cloud/commandframework/services/ServicePipelineBuilder.java +++ b/cloud-services/src/main/java/cloud/commandframework/services/ServicePipelineBuilder.java @@ -23,9 +23,8 @@ // package cloud.commandframework.services; -import com.google.common.base.Preconditions; - import javax.annotation.Nonnull; +import java.util.Objects; import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -59,7 +58,7 @@ public final class ServicePipelineBuilder { */ @Nonnull public ServicePipelineBuilder withExecutor(@Nonnull final Executor executor) { - this.executor = Preconditions.checkNotNull(executor, "Executor may not be null"); + this.executor = Objects.requireNonNull(executor, "Executor may not be null"); return this; } diff --git a/cloud-services/src/main/java/cloud/commandframework/services/ServicePump.java b/cloud-services/src/main/java/cloud/commandframework/services/ServicePump.java index 2da999a3..278a851a 100644 --- a/cloud-services/src/main/java/cloud/commandframework/services/ServicePump.java +++ b/cloud-services/src/main/java/cloud/commandframework/services/ServicePump.java @@ -23,8 +23,8 @@ // package cloud.commandframework.services; -import com.google.common.reflect.TypeToken; import cloud.commandframework.services.types.Service; +import io.leangen.geantyref.TypeToken; import javax.annotation.Nonnull; @@ -66,7 +66,7 @@ public final class ServicePump { @Nonnull public ServiceSpigot through( @Nonnull final Class> clazz) { - return this.through(TypeToken.of(clazz)); + return this.through(TypeToken.get(clazz)); } } diff --git a/cloud-services/src/main/java/cloud/commandframework/services/ServiceRepository.java b/cloud-services/src/main/java/cloud/commandframework/services/ServiceRepository.java index 014704d7..239b3aee 100644 --- a/cloud-services/src/main/java/cloud/commandframework/services/ServiceRepository.java +++ b/cloud-services/src/main/java/cloud/commandframework/services/ServiceRepository.java @@ -23,7 +23,7 @@ // package cloud.commandframework.services; -import com.google.common.reflect.TypeToken; +import io.leangen.geantyref.TypeToken; import cloud.commandframework.services.annotations.Order; import cloud.commandframework.services.types.Service; @@ -136,7 +136,7 @@ public final class ServiceRepository { public String toString() { return String .format("ServiceWrapper{type=%s,implementation=%s}", serviceType.toString(), - TypeToken.of(implementation.getClass()).toString()); + TypeToken.get(implementation.getClass()).toString()); } @Override diff --git a/cloud-services/src/main/java/cloud/commandframework/services/ServiceSpigot.java b/cloud-services/src/main/java/cloud/commandframework/services/ServiceSpigot.java index e20843f3..488d2b53 100644 --- a/cloud-services/src/main/java/cloud/commandframework/services/ServiceSpigot.java +++ b/cloud-services/src/main/java/cloud/commandframework/services/ServiceSpigot.java @@ -23,7 +23,7 @@ // package cloud.commandframework.services; -import com.google.common.reflect.TypeToken; +import io.leangen.geantyref.TypeToken; import cloud.commandframework.services.types.ConsumerService; import cloud.commandframework.services.types.Service; import cloud.commandframework.services.types.SideEffectService; diff --git a/cloud-services/src/test/java/cloud/commandframework/services/ServicesTest.java b/cloud-services/src/test/java/cloud/commandframework/services/ServicesTest.java index fed4b46b..920b19fe 100644 --- a/cloud-services/src/test/java/cloud/commandframework/services/ServicesTest.java +++ b/cloud-services/src/test/java/cloud/commandframework/services/ServicesTest.java @@ -23,7 +23,8 @@ // package cloud.commandframework.services; -import com.google.common.reflect.TypeToken; +import io.leangen.geantyref.GenericTypeReflector; +import io.leangen.geantyref.TypeToken; import cloud.commandframework.services.mock.*; import cloud.commandframework.services.types.Service; import org.junit.jupiter.api.Assertions; @@ -38,12 +39,12 @@ public class ServicesTest { final ServicePipeline servicePipeline = ServicePipeline.builder().build(); Assertions.assertNotNull(servicePipeline); servicePipeline - .registerServiceType(TypeToken.of(MockService.class), new DefaultMockService()); + .registerServiceType(TypeToken.get(MockService.class), new DefaultMockService()); Assertions.assertThrows(IllegalArgumentException.class, () -> servicePipeline - .registerServiceType(TypeToken.of(MockService.class), new DefaultMockService())); + .registerServiceType(TypeToken.get(MockService.class), new DefaultMockService())); final SecondaryMockService secondaryMockService = new SecondaryMockService(); servicePipeline - .registerServiceImplementation(TypeToken.of(MockService.class), secondaryMockService, + .registerServiceImplementation(TypeToken.get(MockService.class), secondaryMockService, Collections.singleton(secondaryMockService)); servicePipeline.registerServiceImplementation(MockService.class, mockContext -> new MockService.MockResult(-91), @@ -69,7 +70,7 @@ public class ServicesTest { @Test public void testSideEffectServices() { final ServicePipeline servicePipeline = ServicePipeline.builder().build(); - servicePipeline.registerServiceType(TypeToken.of(MockSideEffectService.class), + servicePipeline.registerServiceType(TypeToken.get(MockSideEffectService.class), new DefaultSideEffectService()); final MockSideEffectService.MockPlayer mockPlayer = new MockSideEffectService.MockPlayer(20); @@ -88,8 +89,8 @@ public class ServicesTest { @Test public void testForwarding() throws Exception { final ServicePipeline servicePipeline = ServicePipeline.builder().build() - .registerServiceType(TypeToken.of(MockService.class), new DefaultMockService()) - .registerServiceType(TypeToken.of(MockResultConsumer.class), new MockResultConsumer()); + .registerServiceType(TypeToken.get(MockService.class), new DefaultMockService()) + .registerServiceType(TypeToken.get(MockResultConsumer.class), new MockResultConsumer()); Assertions.assertEquals(State.ACCEPTED, servicePipeline.pump(new MockService.MockContext("huh")).through(MockService.class) .forward().through(MockResultConsumer.class).getResult()); @@ -103,7 +104,7 @@ public class ServicesTest { @Test public void testSorting() { final ServicePipeline servicePipeline = ServicePipeline.builder().build() - .registerServiceType(TypeToken.of(MockService.class), new DefaultMockService()); + .registerServiceType(TypeToken.get(MockService.class), new DefaultMockService()); servicePipeline.registerServiceImplementation(MockService.class, new MockOrderedFirst(), Collections.emptyList()); servicePipeline.registerServiceImplementation(MockService.class, new MockOrderedLast(), @@ -117,21 +118,21 @@ public class ServicesTest { @Test public void testRecognisedTypes() { final ServicePipeline servicePipeline = ServicePipeline.builder().build() - .registerServiceType(TypeToken.of(MockService.class), new DefaultMockService()); + .registerServiceType(TypeToken.get(MockService.class), new DefaultMockService()); Assertions.assertEquals(1, servicePipeline.getRecognizedTypes().size()); } @Test public void testImplementationGetters() { final ServicePipeline servicePipeline = ServicePipeline.builder().build() - .registerServiceType(TypeToken.of(MockService.class), new DefaultMockService()); + .registerServiceType(TypeToken.get(MockService.class), new DefaultMockService()); servicePipeline.registerServiceImplementation(MockService.class, new MockOrderedFirst(), Collections.emptyList()); servicePipeline.registerServiceImplementation(MockService.class, new MockOrderedLast(), Collections.emptyList()); - final TypeToken> first = TypeToken.of(MockOrderedFirst.class), - last = TypeToken.of(MockOrderedLast.class); - final TypeToken mockServiceType = TypeToken.of(MockService.class); + final TypeToken> first = TypeToken.get(MockOrderedFirst.class), + last = TypeToken.get(MockOrderedLast.class); + final TypeToken mockServiceType = TypeToken.get(MockService.class); for (TypeToken typeToken : servicePipeline.getRecognizedTypes()) { Assertions.assertEquals(mockServiceType, typeToken); } @@ -142,13 +143,13 @@ public class ServicesTest { iterator = impls.iterator(); Assertions.assertEquals(first, iterator.next()); Assertions.assertEquals(last, iterator.next()); - Assertions.assertEquals(DefaultMockService.class, iterator.next().getRawType()); + Assertions.assertEquals(DefaultMockService.class, GenericTypeReflector.erase(iterator.next().getType())); } @Test public void testAnnotatedMethods() throws Exception { final ServicePipeline servicePipeline = ServicePipeline.builder().build() - .registerServiceType(TypeToken.of(MockService.class), new DefaultMockService()) + .registerServiceType(TypeToken.get(MockService.class), new DefaultMockService()) .registerMethods(new AnnotatedMethodTest()); final String testString = UUID.randomUUID().toString(); Assertions.assertEquals(testString.length(), @@ -159,7 +160,7 @@ public class ServicesTest { @Test public void testConsumerServices() { final ServicePipeline servicePipeline = ServicePipeline.builder().build() - .registerServiceType(TypeToken.of(MockConsumerService.class), + .registerServiceType(TypeToken.get(MockConsumerService.class), new StateSettingConsumerService()) .registerServiceImplementation(MockConsumerService.class, new InterruptingMockConsumer(), Collections.emptyList()); @@ -171,7 +172,7 @@ public class ServicesTest { @Test public void testPartialResultServices() { final ServicePipeline servicePipeline = ServicePipeline.builder().build() - .registerServiceType(TypeToken.of(MockPartialResultService.class), + .registerServiceType(TypeToken.get(MockPartialResultService.class), new DefaultPartialRequestService()) .registerServiceImplementation(MockPartialResultService.class, new CompletingPartialResultService(), Collections.emptyList()); @@ -191,7 +192,7 @@ public class ServicesTest { final ServicePipeline servicePipeline = ServicePipeline.builder().build(); Assertions.assertNotNull(servicePipeline); servicePipeline - .registerServiceType(TypeToken.of(MockService.class), new DefaultMockService()); + .registerServiceType(TypeToken.get(MockService.class), new DefaultMockService()); final PipelineException pipelineException = Assertions.assertThrows(PipelineException.class, () -> servicePipeline.pump(new MockService.MockContext("pls throw exception")) .through(MockService.class).getResult());