From d761e17a68a3b23b16ecba79c0499c491889770b Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Wed, 21 Feb 2018 20:52:31 -0500 Subject: [PATCH] GH-1062 Polished BindingsEndpoint --- .../BindingsEndpointAutoConfiguration.java | 2 +- .../stream/endpoint/BindingsEndpoint.java | 53 ++++++++++--------- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingsEndpointAutoConfiguration.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingsEndpointAutoConfiguration.java index 57fabf691..b33d46b50 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingsEndpointAutoConfiguration.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/config/BindingsEndpointAutoConfiguration.java @@ -34,7 +34,7 @@ import org.springframework.context.annotation.Configuration; * @since 2.0 */ @Configuration -@ConditionalOnClass(name = "org.springframework.boot.actuate.endpoint.annotation.Endpoint") +@ConditionalOnClass(name = {"org.springframework.boot.actuate.endpoint.annotation.Endpoint"}) @ConditionalOnBean(BindingService.class) @AutoConfigureAfter(EndpointAutoConfiguration.class) public class BindingsEndpointAutoConfiguration { diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/endpoint/BindingsEndpoint.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/endpoint/BindingsEndpoint.java index 2433610f5..2bce02571 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/endpoint/BindingsEndpoint.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/endpoint/BindingsEndpoint.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.DirectFieldAccessor; @@ -32,6 +31,8 @@ import org.springframework.cloud.stream.binding.InputBindingLifecycle; import org.springframework.util.Assert; /** + * + * Actuator endpoint for binding control * * @author Oleg Zhurakousky * @@ -43,20 +44,23 @@ public class BindingsEndpoint { static final String BASE_ENPOINT_ID = "bindings"; - static final String START_ENPOINT_ID = BASE_ENPOINT_ID + "/" + "start/{name}"; + static final String START_ENPOINT_ID = BASE_ENPOINT_ID + "/start/{name}"; - static final String STOP_ENPOINT_ID = BASE_ENPOINT_ID + "/" + "stop/{name}"; + static final String STOP_ENPOINT_ID = BASE_ENPOINT_ID + "/stop/{name}"; private final List inputBindingLifecycles; + private final ObjectMapper objectMapper; + public BindingsEndpoint(List inputBindingLifecycles) { Assert.notEmpty(inputBindingLifecycles, "'inputBindingLifecycles' must not be null or empty"); this.inputBindingLifecycles = inputBindingLifecycles; + this.objectMapper = new ObjectMapper(); } @ReadOperation - public List bindings() { - return new ObjectMapper().convertValue(this.gatherInputBindings(), new TypeReference>() {}); + public List bindings() { + return this.objectMapper.convertValue(this.gatherInputBindings(), List.class); } public StopEndpoint getStopEndpoint() { @@ -68,28 +72,32 @@ public class BindingsEndpoint { } @SuppressWarnings("unchecked") - private List> gatherInputBindings() { - List> inputBindings = new ArrayList<>(); - for (InputBindingLifecycle inputBindingLifecycle : inputBindingLifecycles) { - Collection> lifecycleInputBindings = - (Collection>) new DirectFieldAccessor(inputBindingLifecycle).getPropertyValue("inputBindings"); + private List> gatherInputBindings() { + List> inputBindings = new ArrayList<>(); + for (InputBindingLifecycle inputBindingLifecycle : this.inputBindingLifecycles) { + Collection> lifecycleInputBindings = + (Collection>) new DirectFieldAccessor(inputBindingLifecycle).getPropertyValue("inputBindings"); inputBindings.addAll(lifecycleInputBindings); } return inputBindings; } + private Binding locateBinding(String name) { + return BindingsEndpoint.this.gatherInputBindings().stream() + .filter(binding -> name.equals(binding.getName())) + .findFirst() + .orElse(null); + } + @Endpoint(id = BindingsEndpoint.STOP_ENPOINT_ID) public class StopEndpoint { @WriteOperation public boolean stop(String name) { - List> inputBindings = BindingsEndpoint.this.gatherInputBindings(); - for (Binding binding : inputBindings) { - if (name.equals(binding.getName())) { - binding.stop(); - return true; - } + Binding binding = BindingsEndpoint.this.locateBinding(name); + if (binding != null) { + binding.stop(); } - return false; + return binding != null; } } @@ -97,14 +105,11 @@ public class BindingsEndpoint { public class StartEndpoint { @WriteOperation public boolean start(String name) { - List> inputBindings = BindingsEndpoint.this.gatherInputBindings(); - for (Binding binding : inputBindings) { - if (name.equals(binding.getName())) { - binding.start(); - return true; - } + Binding binding = BindingsEndpoint.this.locateBinding(name); + if (binding != null) { + binding.start(); } - return false; + return binding != null; } }