From 6a16a44aa05205a51158b43107676269b6f8debf Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Fri, 30 Nov 2018 18:47:36 +0100 Subject: [PATCH] GH-235 Moved Kotlin support to a separate module Resolves #235 --- pom.xml | 1 + spring-cloud-function-context/pom.xml | 5 - .../main/resources/META-INF/spring.factories | 3 +- ...FunctionCatalogAutoConfigurationTests.java | 55 +-------- spring-cloud-function-kotlin/.jdk8 | 0 spring-cloud-function-kotlin/pom.xml | 98 ++++++++++++++++ ...tlinLambdaToFunctionAutoConfiguration.java | 0 .../main/resources/META-INF/spring.factories | 2 + ...onCatalogAutoConfigurationKotlinTests.java | 110 ++++++++++++++++++ .../kotlin/KotlinLambdasConfiguration.kt | 0 10 files changed, 214 insertions(+), 60 deletions(-) create mode 100644 spring-cloud-function-kotlin/.jdk8 create mode 100644 spring-cloud-function-kotlin/pom.xml rename {spring-cloud-function-context => spring-cloud-function-kotlin}/src/main/java/org/springframework/cloud/function/context/config/KotlinLambdaToFunctionAutoConfiguration.java (100%) create mode 100644 spring-cloud-function-kotlin/src/main/resources/META-INF/spring.factories create mode 100644 spring-cloud-function-kotlin/src/test/java/org/springframework/cloud/function/kotlin/ContextFunctionCatalogAutoConfigurationKotlinTests.java rename {spring-cloud-function-context => spring-cloud-function-kotlin}/src/test/kotlin/org/springframework/cloud/function/kotlin/KotlinLambdasConfiguration.kt (100%) diff --git a/pom.xml b/pom.xml index 635bb0a01..6369d8f8a 100644 --- a/pom.xml +++ b/pom.xml @@ -52,6 +52,7 @@ spring-cloud-function-samples spring-cloud-function-deployer spring-cloud-function-adapters + spring-cloud-function-kotlin docs diff --git a/spring-cloud-function-context/pom.xml b/spring-cloud-function-context/pom.xml index 3e83dbb6a..81c30f971 100644 --- a/spring-cloud-function-context/pom.xml +++ b/spring-cloud-function-context/pom.xml @@ -42,11 +42,6 @@ jackson-databind true - - org.jetbrains.kotlin - kotlin-stdlib-jdk8 - true - org.springframework.boot spring-boot-starter-test diff --git a/spring-cloud-function-context/src/main/resources/META-INF/spring.factories b/spring-cloud-function-context/src/main/resources/META-INF/spring.factories index 4629fb31e..aa9a9c745 100644 --- a/spring-cloud-function-context/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-function-context/src/main/resources/META-INF/spring.factories @@ -1,6 +1,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.springframework.cloud.function.context.config.ContextFunctionCatalogAutoConfiguration,\ -org.springframework.cloud.function.context.config.KotlinLambdaToFunctionAutoConfiguration +org.springframework.cloud.function.context.config.ContextFunctionCatalogAutoConfiguration org.springframework.cloud.function.context.WrapperDetector=\ org.springframework.cloud.function.context.config.FluxWrapperDetector diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfigurationTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfigurationTests.java index 50a0e7b8f..f8ded7f41 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfigurationTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2017 the original author or authors. + * Copyright 2017-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,6 @@ import java.util.function.Supplier; import java.util.stream.Collectors; import org.junit.After; -import org.junit.Ignore; import org.junit.Test; import org.reactivestreams.Publisher; @@ -67,15 +66,13 @@ import org.springframework.util.StreamUtils; import static org.assertj.core.api.Assertions.assertThat; -import kotlin.jvm.functions.Function0; -import kotlin.jvm.functions.Function1; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; /** * @author Dave Syer * @author Artem Bilan - * + * @author Oleg Zhurakousky */ public class ContextFunctionCatalogAutoConfigurationTests { @@ -376,47 +373,6 @@ public class ContextFunctionCatalogAutoConfigurationTests { } } - @Test - @Ignore("Cannot make this work in Eclipse (since the tools upgraded to 0.8.9)") - public void kotlinLambdas() { - create("org.springframework.cloud.function.context.config.KotlinLambdasConfiguration", - new Class[] { SimpleConfiguration.class }); - - assertThat(context.getBean("kotlinFunction")).isInstanceOf(Function.class); - assertThat(context.getBean("kotlinFunction")).isInstanceOf(Function1.class); - assertThat((Function) catalog.lookup(Function.class, "kotlinFunction")) - .isInstanceOf(Function.class); - assertThat( - inspector.getInputType(catalog.lookup(Function.class, "kotlinFunction"))) - .isAssignableFrom(String.class); - assertThat( - inspector.getOutputType(catalog.lookup(Function.class, "kotlinFunction"))) - .isAssignableFrom(String.class); - - assertThat(context.getBean("kotlinConsumer")).isInstanceOf(Consumer.class); - assertThat(context.getBean("kotlinConsumer")).isInstanceOf(Function1.class); - assertThat((Function) catalog.lookup(Function.class, "kotlinConsumer")) - .isInstanceOf(Function.class); - assertThat( - inspector.getInputType(catalog.lookup(Function.class, "kotlinConsumer"))) - .isAssignableFrom(String.class); - - assertThat(context.getBean("kotlinSupplier")).isInstanceOf(Supplier.class); - assertThat(context.getBean("kotlinSupplier")).isInstanceOf(Function0.class); - Supplier> supplier = catalog.lookup(Supplier.class, - "kotlinSupplier"); - assertThat(supplier.get().blockFirst()).isEqualTo("Hello"); - assertThat((Supplier) catalog.lookup(Supplier.class, "kotlinSupplier")) - .isInstanceOf(Supplier.class); - assertThat( - inspector.getOutputType(catalog.lookup(Supplier.class, "kotlinSupplier"))) - .isAssignableFrom(String.class); - - Function, Flux> function = catalog.lookup(Function.class, - "kotlinFunction|function2"); - assertThat(function.apply(Flux.just("Hello")).blockFirst()) - .isEqualTo("HELLOfunction2"); - } private void create(String jarfile, Class config, String... props) { try { @@ -572,13 +528,6 @@ public class ContextFunctionCatalogAutoConfigurationTests { create(new Class[] { type }, props); } - private void create(String typeName, Class[] types, String... props) { - Class[] typesToUse = new Class[types.length + 1]; - typesToUse[0] = ClassUtils.resolveClassName(typeName, null); - System.arraycopy(types, 0, typesToUse, 1, types.length); - create(typesToUse, props); - } - private void create(Class[] types, String... props) { context = new SpringApplicationBuilder(types).properties(props).run(); catalog = context.getBean(FunctionCatalog.class); diff --git a/spring-cloud-function-kotlin/.jdk8 b/spring-cloud-function-kotlin/.jdk8 new file mode 100644 index 000000000..e69de29bb diff --git a/spring-cloud-function-kotlin/pom.xml b/spring-cloud-function-kotlin/pom.xml new file mode 100644 index 000000000..33ce70101 --- /dev/null +++ b/spring-cloud-function-kotlin/pom.xml @@ -0,0 +1,98 @@ + + + 4.0.0 + + spring-cloud-function-kotlin + jar + Spring Cloud Function Kotlin Support + Spring Cloud Function Kotlin Support + + + org.springframework.cloud + spring-cloud-function-parent + 2.0.0.BUILD-SNAPSHOT + + + + + org.springframework.cloud + spring-cloud-function-context + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.jetbrains.kotlin + kotlin-stdlib-jdk8 + true + + + + + + + kotlin-maven-plugin + org.jetbrains.kotlin + 1.2.71 + + + compile + compile + + + ${project.basedir}/src/main/kotlin + ${project.basedir}/src/main/java + + + + + test-compile + test-compile + + + ${project.basedir}/src/test/kotlin + ${project.basedir}/src/test/java + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + + + default-compile + none + + + + default-testCompile + none + + + java-compile + compile + compile + + + java-test-compile + test-compile + testCompile + + + + + + + diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/KotlinLambdaToFunctionAutoConfiguration.java b/spring-cloud-function-kotlin/src/main/java/org/springframework/cloud/function/context/config/KotlinLambdaToFunctionAutoConfiguration.java similarity index 100% rename from spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/KotlinLambdaToFunctionAutoConfiguration.java rename to spring-cloud-function-kotlin/src/main/java/org/springframework/cloud/function/context/config/KotlinLambdaToFunctionAutoConfiguration.java diff --git a/spring-cloud-function-kotlin/src/main/resources/META-INF/spring.factories b/spring-cloud-function-kotlin/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..3ca9bed74 --- /dev/null +++ b/spring-cloud-function-kotlin/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +org.springframework.cloud.function.context.config.KotlinLambdaToFunctionAutoConfiguration \ No newline at end of file diff --git a/spring-cloud-function-kotlin/src/test/java/org/springframework/cloud/function/kotlin/ContextFunctionCatalogAutoConfigurationKotlinTests.java b/spring-cloud-function-kotlin/src/test/java/org/springframework/cloud/function/kotlin/ContextFunctionCatalogAutoConfigurationKotlinTests.java new file mode 100644 index 000000000..11402667c --- /dev/null +++ b/spring-cloud-function-kotlin/src/test/java/org/springframework/cloud/function/kotlin/ContextFunctionCatalogAutoConfigurationKotlinTests.java @@ -0,0 +1,110 @@ +/* + * Copyright 2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.function.kotlin; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + +import org.junit.After; +import org.junit.Test; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.cloud.function.context.FunctionCatalog; +import org.springframework.cloud.function.context.catalog.FunctionInspector; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import kotlin.jvm.functions.Function0; +import kotlin.jvm.functions.Function1; +import reactor.core.publisher.Flux; + +/** + * @author Oleg Zhurakousky + */ +public class ContextFunctionCatalogAutoConfigurationKotlinTests { + + private ConfigurableApplicationContext context; + private FunctionCatalog catalog; + private FunctionInspector inspector; + + @After + public void close() { + if (context != null) { + context.close(); + } + } + + @Test + public void kotlinLambdas() { + create(new Class[] {KotlinLambdasConfiguration.class, SimpleConfiguration.class}); + + assertThat(context.getBean("kotlinFunction")).isInstanceOf(Function.class); + assertThat(context.getBean("kotlinFunction")).isInstanceOf(Function1.class); + assertThat((Function) catalog.lookup(Function.class, "kotlinFunction")) + .isInstanceOf(Function.class); + assertThat( + inspector.getInputType(catalog.lookup(Function.class, "kotlinFunction"))) + .isAssignableFrom(String.class); + assertThat( + inspector.getOutputType(catalog.lookup(Function.class, "kotlinFunction"))) + .isAssignableFrom(String.class); + + assertThat(context.getBean("kotlinConsumer")).isInstanceOf(Consumer.class); + assertThat(context.getBean("kotlinConsumer")).isInstanceOf(Function1.class); + assertThat((Function) catalog.lookup(Function.class, "kotlinConsumer")) + .isInstanceOf(Function.class); + assertThat( + inspector.getInputType(catalog.lookup(Function.class, "kotlinConsumer"))) + .isAssignableFrom(String.class); + + assertThat(context.getBean("kotlinSupplier")).isInstanceOf(Supplier.class); + assertThat(context.getBean("kotlinSupplier")).isInstanceOf(Function0.class); + Supplier> supplier = catalog.lookup(Supplier.class, + "kotlinSupplier"); + assertThat(supplier.get().blockFirst()).isEqualTo("Hello"); + assertThat((Supplier) catalog.lookup(Supplier.class, "kotlinSupplier")) + .isInstanceOf(Supplier.class); + assertThat( + inspector.getOutputType(catalog.lookup(Supplier.class, "kotlinSupplier"))) + .isAssignableFrom(String.class); + + Function, Flux> function = catalog.lookup(Function.class, + "kotlinFunction|function2"); + assertThat(function.apply(Flux.just("Hello")).blockFirst()) + .isEqualTo("HELLOfunction2"); + } + + private void create(Class[] types, String... props) { + context = new SpringApplicationBuilder(types).properties(props).run(); + catalog = context.getBean(FunctionCatalog.class); + inspector = context.getBean(FunctionInspector.class); + } + + @EnableAutoConfiguration + @Configuration + protected static class SimpleConfiguration { + + @Bean + public Function function2() { + return value -> value + "function2"; + } + } +} diff --git a/spring-cloud-function-context/src/test/kotlin/org/springframework/cloud/function/kotlin/KotlinLambdasConfiguration.kt b/spring-cloud-function-kotlin/src/test/kotlin/org/springframework/cloud/function/kotlin/KotlinLambdasConfiguration.kt similarity index 100% rename from spring-cloud-function-context/src/test/kotlin/org/springframework/cloud/function/kotlin/KotlinLambdasConfiguration.kt rename to spring-cloud-function-kotlin/src/test/kotlin/org/springframework/cloud/function/kotlin/KotlinLambdasConfiguration.kt