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