Add overloaded method to avoid extra parentheses

It turns out that we can have a simple
`transform<String, String> { it.toLowerCase() }`
with extra parentheses around lambda and also another variant like
`split<String>({ p -> p }) { it.id("splitterEndpoint") }`.
Everything works with overloaded methods with and without extra
configurer parameter

* Upgrade dependencies, including Gradle
This commit is contained in:
Artem Bilan
2019-12-05 16:30:46 -05:00
parent 5369fb0dfa
commit fc9b174274
9 changed files with 63 additions and 38 deletions

View File

@@ -36,7 +36,7 @@ fun flowLambda() =
integrationFlow {
handle { m -> println(m.payload) }
})
transform<String, String>({ it.toUpperCase() })
transform<String, String> { it.toUpperCase() }
}
----
====

View File

@@ -27,11 +27,11 @@ repositories {
ext {
assertkVersion = '0.20'
jacksonVersion = '2.10.0'
jacksonVersion = '2.10.1'
junitVersion = '5.5.2'
log4jVersion = '2.12.1'
reactorVersion = 'Dysprosium-RC1'
springIntegrationVersion = '5.2.1.RELEASE'
reactorVersion = 'Dysprosium-SR1'
springIntegrationVersion = '5.2.2.RELEASE'
idPrefix = 'kotlin-dsl'
@@ -106,7 +106,6 @@ test {
// suppress all console output during testing unless running `gradle -i`
logging.captureStandardOutput(LogLevel.INFO)
jacoco {
append = false
destinationFile = file("$buildDir/jacoco.exec")
}
useJUnitPlatform()

View File

@@ -1,2 +1,2 @@
version=0.0.3.BUILD-SNAPSHOT
kotlinVersion=1.3.50
kotlinVersion=1.3.61

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@@ -154,19 +154,19 @@ if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
i=`expr $i + 1`
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
@@ -175,14 +175,9 @@ save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=$(save "$@")
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
cd "$(dirname "$0")"
fi
exec "$JAVACMD" "$@"

View File

@@ -49,9 +49,9 @@ fun integrationFlow(@BuilderInference flow: KotlinIntegrationFlowDefinition.() -
*
* @author Artem Bilan
*/
inline fun <reified T> integrationFlow(crossinline gateway: (GatewayProxySpec) -> Unit = {},
@BuilderInference flow: KotlinIntegrationFlowDefinition.() -> Unit):
IntegrationFlow {
inline fun <reified T> integrationFlow(
crossinline gateway: (GatewayProxySpec) -> Unit = {},
@BuilderInference flow: KotlinIntegrationFlowDefinition.() -> Unit): IntegrationFlow {
val flowBuilder = IntegrationFlows.from(T::class.java) { gateway(it) }
flow(KotlinIntegrationFlowDefinition(flowBuilder))

View File

@@ -115,42 +115,71 @@ class KotlinIntegrationFlowDefinition(private val adaptee: IntegrationFlowDefini
KotlinIntegrationFlowDefinition =
convert(T::class.java) { configurer(it) }
/**
* Inline function for [IntegrationFlowDefinition.transform] providing a `transform<MyTypeIn, MyTypeOut>()` variant
* with reified generic type.
*/
inline fun <reified P, T> transform(crossinline function: (P) -> T): KotlinIntegrationFlowDefinition =
transform(P::class.java) { function(it) }
/**
* Inline function for [IntegrationFlowDefinition.transform] providing a `transform<MyTypeIn, MyTypeOut>()` variant
* with reified generic type.
*/
inline fun <reified P, T> transform(
crossinline function: (P) -> T,
crossinline configurer: (GenericEndpointSpec<MessageTransformingHandler>) -> Unit = {}):
crossinline configurer: (GenericEndpointSpec<MessageTransformingHandler>) -> Unit):
KotlinIntegrationFlowDefinition =
transform(P::class.java, { function(it) }) { configurer(it) }
/**
* Inline function for [IntegrationFlowDefinition.split] providing a `split<MyTypeIn>()` variant
* with reified generic type.
*/
inline fun <reified P> split(crossinline function: (P) -> Any): KotlinIntegrationFlowDefinition =
split(P::class.java) { function(it) }
/**
* Inline function for [IntegrationFlowDefinition.split] providing a `split<MyTypeIn>()` variant
* with reified generic type.
*/
inline fun <reified P> split(
crossinline function: (P) -> Any,
crossinline configurer: (SplitterEndpointSpec<MethodInvokingSplitter>) -> Unit = {}):
crossinline configurer: (SplitterEndpointSpec<MethodInvokingSplitter>) -> Unit):
KotlinIntegrationFlowDefinition =
split(P::class.java, { function(it) }) { configurer(it) }
/**
* Inline function for [IntegrationFlowDefinition.filter] providing a `filter<MyTypeIn>()` variant
* with reified generic type.
*/
inline fun <reified P> filter(crossinline function: (P) -> Boolean): KotlinIntegrationFlowDefinition =
filter(P::class.java) { function(it) }
/**
* Inline function for [IntegrationFlowDefinition.filter] providing a `filter<MyTypeIn>()` variant
* with reified generic type.
*/
inline fun <reified P> filter(
crossinline function: (P) -> Boolean,
crossinline configurer: (FilterEndpointSpec) -> Unit = {}): KotlinIntegrationFlowDefinition =
crossinline configurer: (FilterEndpointSpec) -> Unit): KotlinIntegrationFlowDefinition =
filter(P::class.java, { function(it) }) { configurer(it) }
/**
* Inline function for [IntegrationFlowDefinition.filter] providing a `filter<MyTypeIn>()` variant
* with reified generic type.
*/
inline fun <reified P, T> route(crossinline function: (P) -> T): KotlinIntegrationFlowDefinition =
route(P::class.java) { function(it) }
/**
* Inline function for [IntegrationFlowDefinition.filter] providing a `filter<MyTypeIn>()` variant
* with reified generic type.
*/
inline fun <reified P, T> route(
crossinline function: (P) -> T,
crossinline configurer: (RouterSpec<T, MethodInvokingRouter>) -> Unit = {}):
crossinline configurer: (RouterSpec<T, MethodInvokingRouter>) -> Unit):
KotlinIntegrationFlowDefinition =
route(P::class.java, { function(it) }) { configurer(it) }

View File

@@ -206,15 +206,17 @@ class KotlinDslTests {
@Bean
fun functionFlow() =
integrationFlow<Function<String, String>>({ it.beanName("functionGateway") }) {
transform<String, String>({ it.toUpperCase() })
split<String>({ p -> p })
transform<String, String> { it.toUpperCase() }
split<String> { p -> p }
split<String>({ p -> p }) { it.id("splitterEndpoint") }
}
@Bean
fun functionFlow2() =
integrationFlow<Function<*, *>> {
transform<String, String>({ it.toLowerCase() })
route<Message<*>, Any?>({ m -> m.headers.replyChannel }) { it.id("router") }
transform<String, String> { it.toLowerCase() }
route<Message<*>, Any?>({ null }) { it.defaultOutputToParentFlow() }
route<Message<*>, Any?> { m -> m.headers.replyChannel }
}
@Bean
@@ -246,19 +248,19 @@ class KotlinDslTests {
fun flowFromSupplier2() =
integrationFlow({ "testSupplier2" },
{ it.poller { it.trigger(OnlyOnceTrigger()) } }) {
filter<Message<Any>>({ m -> m.payload is String })
filter<Message<Any>> { m -> m.payload is String }
channel { c -> c.queue("testSupplierResult2") }
}
@Bean
fun flowLambda() =
integrationFlow {
filter<String>({ it === "test" })
filter<String>({ it === "test" }) { it.id("filterEndpoint") }
wireTap(
integrationFlow {
channel { c -> c.queue("wireTapChannel") }
})
transform<String, String>({ it.toUpperCase() })
transform<String, String> { it.toUpperCase() }
}
}