From 9bf36011433fc6a5e3cda0bf03200dad576ed3cf Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Fri, 26 May 2017 12:42:25 +0100 Subject: [PATCH] Fixed consumer sample to accept bare string --- README.adoc | 2 +- .../function/compiler/ConsumerCompiler.java | 2 +- .../java/CompilationFailedException.java | 1 + .../proxy/AbstractByteCodeLoadingProxy.java | 4 +- .../proxy/AbstractLambdaCompilingProxy.java | 1 + .../proxy/ByteCodeLoadingConsumer.java | 3 +- .../proxy/ByteCodeLoadingFunction.java | 3 +- .../compiler/ConsumerCompilerTests.java | 0 .../compiler/FunctionCompilerTests.java | 0 .../compiler/SupplierCompilerTests.java | 0 .../proxy/ByteCodeLoadingFunctionTests.java | 5 +++ ...FunctionCatalogAutoConfigurationTests.java | 44 +++++++++++++++++++ 12 files changed, 59 insertions(+), 6 deletions(-) rename spring-cloud-function-compiler/{ => src}/test/java/org/springframework/cloud/function/compiler/ConsumerCompilerTests.java (100%) rename spring-cloud-function-compiler/{ => src}/test/java/org/springframework/cloud/function/compiler/FunctionCompilerTests.java (100%) rename spring-cloud-function-compiler/{ => src}/test/java/org/springframework/cloud/function/compiler/SupplierCompilerTests.java (100%) rename spring-cloud-function-compiler/{ => src}/test/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingFunctionTests.java (93%) diff --git a/README.adoc b/README.adoc index 18686ccd1..83e450fc8 100644 --- a/README.adoc +++ b/README.adoc @@ -156,7 +156,7 @@ curl -H "Accept: application/json" localhost:9001/words === Register a Consumer: ---- -./registerConsumer.sh -n print -f "f->f.subscribe(System.out::println)" +./registerConsumer.sh -n print -t String -f "System.out::println" ---- === Run a REST Microservice using that Consumer: diff --git a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/ConsumerCompiler.java b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/ConsumerCompiler.java index 6434f0338..9fa74749d 100644 --- a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/ConsumerCompiler.java +++ b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/ConsumerCompiler.java @@ -26,7 +26,7 @@ public class ConsumerCompiler extends AbstractFunctionCompiler> { private final String inputType; public ConsumerCompiler() { - this("Object"); + this("Flux"); } public ConsumerCompiler(String inputType) { diff --git a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/CompilationFailedException.java b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/CompilationFailedException.java index d5e3f784d..cc7e655ff 100644 --- a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/CompilationFailedException.java +++ b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/java/CompilationFailedException.java @@ -21,6 +21,7 @@ import java.util.List; /** * @author Mark Fisher */ +@SuppressWarnings("serial") public class CompilationFailedException extends RuntimeException { public CompilationFailedException(List messages) { diff --git a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/AbstractByteCodeLoadingProxy.java b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/AbstractByteCodeLoadingProxy.java index 3e9dacae9..980d1268e 100644 --- a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/AbstractByteCodeLoadingProxy.java +++ b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/AbstractByteCodeLoadingProxy.java @@ -23,6 +23,7 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.cloud.function.compiler.CompilationResultFactory; import org.springframework.cloud.function.compiler.FunctionCompiler; import org.springframework.cloud.function.compiler.java.SimpleClassLoader; +import org.springframework.cloud.function.support.FunctionFactoryMetadata; import org.springframework.core.io.Resource; import org.springframework.util.FileCopyUtils; import org.springframework.util.ReflectionUtils; @@ -30,7 +31,7 @@ import org.springframework.util.ReflectionUtils; /** * @author Mark Fisher */ -public abstract class AbstractByteCodeLoadingProxy implements InitializingBean { +public abstract class AbstractByteCodeLoadingProxy implements InitializingBean, FunctionFactoryMetadata { private final Resource resource; @@ -81,6 +82,7 @@ public abstract class AbstractByteCodeLoadingProxy implements InitializingBea return this.factory.getResult(); } + @Override public Method getFactoryMethod() { return this.method; } diff --git a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/AbstractLambdaCompilingProxy.java b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/AbstractLambdaCompilingProxy.java index 469780dd3..2c3192039 100644 --- a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/AbstractLambdaCompilingProxy.java +++ b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/AbstractLambdaCompilingProxy.java @@ -69,6 +69,7 @@ public class AbstractLambdaCompilingProxy implements InitializingBean, BeanNa return this.factory.getResult(); } + @Override public Method getFactoryMethod() { return this.factory.getFactoryMethod(); } diff --git a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingConsumer.java b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingConsumer.java index 729d3ebd8..c2ece1265 100644 --- a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingConsumer.java +++ b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingConsumer.java @@ -18,6 +18,7 @@ package org.springframework.cloud.function.compiler.proxy; import java.util.function.Consumer; +import org.springframework.cloud.function.support.ConsumerProxy; import org.springframework.core.io.Resource; /** @@ -25,7 +26,7 @@ import org.springframework.core.io.Resource; * * @param type */ -public class ByteCodeLoadingConsumer extends AbstractByteCodeLoadingProxy> implements Consumer { +public class ByteCodeLoadingConsumer extends AbstractByteCodeLoadingProxy> implements ConsumerProxy { public ByteCodeLoadingConsumer(Resource resource) { super(resource, Consumer.class); diff --git a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingFunction.java b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingFunction.java index a5770c2bd..5865854b4 100644 --- a/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingFunction.java +++ b/spring-cloud-function-compiler/src/main/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingFunction.java @@ -18,7 +18,6 @@ package org.springframework.cloud.function.compiler.proxy; import java.util.function.Function; -import org.springframework.beans.factory.InitializingBean; import org.springframework.cloud.function.support.FunctionProxy; import org.springframework.core.io.Resource; @@ -28,7 +27,7 @@ import org.springframework.core.io.Resource; * @param Function input type * @param Function result type */ -public class ByteCodeLoadingFunction extends AbstractByteCodeLoadingProxy> implements FunctionProxy, InitializingBean { +public class ByteCodeLoadingFunction extends AbstractByteCodeLoadingProxy> implements FunctionProxy { public ByteCodeLoadingFunction(Resource resource) { super(resource, Function.class); diff --git a/spring-cloud-function-compiler/test/java/org/springframework/cloud/function/compiler/ConsumerCompilerTests.java b/spring-cloud-function-compiler/src/test/java/org/springframework/cloud/function/compiler/ConsumerCompilerTests.java similarity index 100% rename from spring-cloud-function-compiler/test/java/org/springframework/cloud/function/compiler/ConsumerCompilerTests.java rename to spring-cloud-function-compiler/src/test/java/org/springframework/cloud/function/compiler/ConsumerCompilerTests.java diff --git a/spring-cloud-function-compiler/test/java/org/springframework/cloud/function/compiler/FunctionCompilerTests.java b/spring-cloud-function-compiler/src/test/java/org/springframework/cloud/function/compiler/FunctionCompilerTests.java similarity index 100% rename from spring-cloud-function-compiler/test/java/org/springframework/cloud/function/compiler/FunctionCompilerTests.java rename to spring-cloud-function-compiler/src/test/java/org/springframework/cloud/function/compiler/FunctionCompilerTests.java diff --git a/spring-cloud-function-compiler/test/java/org/springframework/cloud/function/compiler/SupplierCompilerTests.java b/spring-cloud-function-compiler/src/test/java/org/springframework/cloud/function/compiler/SupplierCompilerTests.java similarity index 100% rename from spring-cloud-function-compiler/test/java/org/springframework/cloud/function/compiler/SupplierCompilerTests.java rename to spring-cloud-function-compiler/src/test/java/org/springframework/cloud/function/compiler/SupplierCompilerTests.java diff --git a/spring-cloud-function-compiler/test/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingFunctionTests.java b/spring-cloud-function-compiler/src/test/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingFunctionTests.java similarity index 93% rename from spring-cloud-function-compiler/test/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingFunctionTests.java rename to spring-cloud-function-compiler/src/test/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingFunctionTests.java index de01c42da..b790ef000 100644 --- a/spring-cloud-function-compiler/test/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingFunctionTests.java +++ b/spring-cloud-function-compiler/src/test/java/org/springframework/cloud/function/compiler/proxy/ByteCodeLoadingFunctionTests.java @@ -26,6 +26,7 @@ import org.springframework.cloud.function.compiler.CompiledFunctionFactory; import org.springframework.cloud.function.compiler.ConsumerCompiler; import org.springframework.cloud.function.compiler.FunctionCompiler; import org.springframework.cloud.function.compiler.SupplierCompiler; +import org.springframework.cloud.function.support.FunctionFactoryMetadata; import org.springframework.cloud.function.support.FunctionUtils; import org.springframework.core.io.ByteArrayResource; @@ -51,6 +52,7 @@ public class ByteCodeLoadingFunctionTests { }; ByteCodeLoadingConsumer consumer = new ByteCodeLoadingConsumer<>(resource); consumer.afterPropertiesSet(); + assertThat(consumer instanceof FunctionFactoryMetadata); assertThat(FunctionUtils.isFluxConsumer(consumer.getFactoryMethod())).isFalse(); consumer.accept("foo"); } @@ -67,6 +69,7 @@ public class ByteCodeLoadingFunctionTests { }; ByteCodeLoadingSupplier supplier = new ByteCodeLoadingSupplier<>(resource); supplier.afterPropertiesSet(); + assertThat(supplier instanceof FunctionFactoryMetadata); assertThat(FunctionUtils.isFluxSupplier(supplier.getFactoryMethod())).isFalse(); assertThat(supplier.get()).isEqualTo("foo"); } @@ -83,6 +86,7 @@ public class ByteCodeLoadingFunctionTests { }; ByteCodeLoadingFunction function = new ByteCodeLoadingFunction<>(resource); function.afterPropertiesSet(); + assertThat(function instanceof FunctionFactoryMetadata); assertThat(FunctionUtils.isFluxFunction(function.getFactoryMethod())).isFalse(); assertThat(function.apply("foo")).isEqualTo("FOO"); } @@ -99,6 +103,7 @@ public class ByteCodeLoadingFunctionTests { }; ByteCodeLoadingFunction, Flux> function = new ByteCodeLoadingFunction<>(resource); function.afterPropertiesSet(); + assertThat(function instanceof FunctionFactoryMetadata); assertThat(FunctionUtils.isFluxFunction(function.getFactoryMethod())).isTrue(); assertThat(function.apply(Flux.just("foo")).blockFirst()).isEqualTo("FOO"); } diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfigurationTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfigurationTests.java index f796d6844..12f0d1947 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfigurationTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/ContextFunctionCatalogAutoConfigurationTests.java @@ -54,12 +54,14 @@ public class ContextFunctionCatalogAutoConfigurationTests { private ConfigurableApplicationContext context; private InMemoryFunctionCatalog catalog; private FunctionInspector inspector; + private static String value; @After public void close() { if (context != null) { context.close(); } + ContextFunctionCatalogAutoConfigurationTests.value = null; } @Test @@ -149,6 +151,17 @@ public class ContextFunctionCatalogAutoConfigurationTests { @Test public void compiledFunction() throws Exception { + create(EmptyConfiguration.class, + "spring.cloud.function.compile.foos.lambda=v -> v.toUpperCase()", + "spring.cloud.function.compile.foos.inputType=String", + "spring.cloud.function.compile.foos.outputType=String"); + assertThat(context.getBean("foos")).isInstanceOf(Function.class); + assertThat(catalog.lookupFunction("foos")).isInstanceOf(Function.class); + assertThat(inspector.getInputWrapper("foos")).isEqualTo(String.class); + } + + @Test + public void byteCodeFunction() throws Exception { CompiledFunctionFactory> compiled = new FunctionCompiler( String.class.getName()).compile("foos", "v -> v.toUpperCase()", "String", "String"); @@ -161,6 +174,33 @@ public class ContextFunctionCatalogAutoConfigurationTests { assertThat(inspector.getInputWrapper("foos")).isEqualTo(String.class); } + @Test + public void compiledConsumer() throws Exception { + create(EmptyConfiguration.class, + "spring.cloud.function.compile.foos.lambda=" + getClass().getName() + "::set", + "spring.cloud.function.compile.foos.type=consumer", + "spring.cloud.function.compile.foos.inputType=String"); + assertThat(catalog.lookupConsumer("foos")).isInstanceOf(Consumer.class); + assertThat(inspector.getInputWrapper("foos")).isEqualTo(String.class); + @SuppressWarnings("unchecked") + Consumer consumer = (Consumer)context.getBean("foos"); + consumer.accept("hello"); + assertThat(ContextFunctionCatalogAutoConfigurationTests.value).isEqualTo("hello"); + } + + @Test + public void compiledFluxConsumer() throws Exception { + create(EmptyConfiguration.class, + "spring.cloud.function.compile.foos.lambda=f -> f.subscribe(" + getClass().getName() + "::set)", + "spring.cloud.function.compile.foos.type=consumer"); + assertThat(catalog.lookupConsumer("foos")).isInstanceOf(Consumer.class); + assertThat(inspector.getInputWrapper("foos")).isEqualTo(Flux.class); + @SuppressWarnings("unchecked") + Consumer> consumer = (Consumer>)context.getBean("foos"); + consumer.accept(Flux.just("hello")); + assertThat(ContextFunctionCatalogAutoConfigurationTests.value).isEqualTo("hello"); + } + private void create(Class type, String... props) { create(new Class[] { type }, props); } @@ -170,6 +210,10 @@ public class ContextFunctionCatalogAutoConfigurationTests { catalog = context.getBean(InMemoryFunctionCatalog.class); inspector = context.getBean(FunctionInspector.class); } + + public static void set(Object value) { + ContextFunctionCatalogAutoConfigurationTests.value = value.toString(); + } @EnableAutoConfiguration @Configuration