From bea9c5484129e59206520d4198508394c0548faa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Wed, 30 Sep 2020 10:38:45 +0200 Subject: [PATCH] :bug: Fix issue with TypeToken in the service pipeline --- .../services/ServicePipeline.java | 15 +++++---- .../services/ServicesTest.java | 32 ++++++++++++++++--- 2 files changed, 35 insertions(+), 12 deletions(-) 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 e4b18b4c..02254d9d 100644 --- a/cloud-services/src/main/java/cloud/commandframework/services/ServicePipeline.java +++ b/cloud-services/src/main/java/cloud/commandframework/services/ServicePipeline.java @@ -23,10 +23,11 @@ // package cloud.commandframework.services; -import io.leangen.geantyref.TypeToken; import cloud.commandframework.services.types.Service; +import io.leangen.geantyref.TypeToken; import org.checkerframework.checker.nullness.qual.NonNull; +import java.lang.reflect.Type; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -42,7 +43,7 @@ import java.util.function.Predicate; public final class ServicePipeline { private final Object lock = new Object(); - private final Map>, ServiceRepository> repositories; + private final Map> repositories; private final Executor executor; ServicePipeline(@NonNull final Executor executor) { @@ -74,13 +75,13 @@ public final class ServicePipeline { @NonNull final TypeToken> type, @NonNull final Service<@NonNull Context, @NonNull Result> defaultImplementation) { synchronized (this.lock) { - if (repositories.containsKey(type)) { + if (repositories.containsKey(type.getType())) { throw new IllegalArgumentException(String .format("Service of type '%s' has already been registered", type.toString())); } final ServiceRepository repository = new ServiceRepository<>(type); repository.registerImplementation(defaultImplementation, Collections.emptyList()); - this.repositories.put(type, repository); + this.repositories.put(type.getType(), repository); return this; } } @@ -112,7 +113,7 @@ public final class ServicePipeline { for (final Map.Entry, TypeToken>> serviceEntry : services .entrySet()) { final TypeToken> type = serviceEntry.getValue(); - final ServiceRepository repository = this.repositories.get(type); + final ServiceRepository repository = this.repositories.get(type.getType()); if (repository == null) { throw new IllegalArgumentException( String.format("No service registered for type '%s'", type.toString())); @@ -186,7 +187,7 @@ public final class ServicePipeline { ServiceRepository getRepository( @NonNull final TypeToken> type) { final ServiceRepository repository = - (ServiceRepository) this.repositories.get(type); + (ServiceRepository) this.repositories.get(type.getType()); if (repository == null) { throw new IllegalArgumentException( String.format("No service registered for type '%s'", type.toString())); @@ -200,7 +201,7 @@ public final class ServicePipeline { * @return Returns an Immutable collection of the service types registered. */ @NonNull - public Collection>> getRecognizedTypes() { + public Collection getRecognizedTypes() { return Collections.unmodifiableCollection(this.repositories.keySet()); } 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 920b19fe..24c87bec 100644 --- a/cloud-services/src/test/java/cloud/commandframework/services/ServicesTest.java +++ b/cloud-services/src/test/java/cloud/commandframework/services/ServicesTest.java @@ -23,14 +23,36 @@ // package cloud.commandframework.services; +import cloud.commandframework.services.mock.AnnotatedMethodTest; +import cloud.commandframework.services.mock.CompletingPartialResultService; +import cloud.commandframework.services.mock.DefaultMockService; +import cloud.commandframework.services.mock.DefaultPartialRequestService; +import cloud.commandframework.services.mock.DefaultSideEffectService; +import cloud.commandframework.services.mock.InterruptingMockConsumer; +import cloud.commandframework.services.mock.MockChunkedRequest; +import cloud.commandframework.services.mock.MockConsumerService; +import cloud.commandframework.services.mock.MockOrderedFirst; +import cloud.commandframework.services.mock.MockOrderedLast; +import cloud.commandframework.services.mock.MockPartialResultService; +import cloud.commandframework.services.mock.MockResultConsumer; +import cloud.commandframework.services.mock.MockService; +import cloud.commandframework.services.mock.MockSideEffectService; +import cloud.commandframework.services.mock.SecondaryMockService; +import cloud.commandframework.services.mock.SecondaryMockSideEffectService; +import cloud.commandframework.services.mock.StateSettingConsumerService; +import cloud.commandframework.services.types.Service; 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; import org.junit.jupiter.api.Test; -import java.util.*; +import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.Map; +import java.util.UUID; public class ServicesTest { @@ -133,8 +155,8 @@ public class ServicesTest { 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); + for (Type typeToken : servicePipeline.getRecognizedTypes()) { + Assertions.assertEquals(mockServiceType.getType(), typeToken); } final Collection>> impls = servicePipeline.getImplementations(mockServiceType);