Ensure function types and names are registered in memory

This commit is contained in:
Dave Syer
2019-02-21 17:39:24 +00:00
parent aaf268ea40
commit 155d76b1a5
3 changed files with 31 additions and 2 deletions

View File

@@ -281,7 +281,7 @@ public abstract class AbstractComposableFunctionRegistry implements FunctionRegi
this.types.computeIfAbsent(name, str -> functionType);
}
private void addName(Object function, String name) {
protected void addName(Object function, String name) {
this.names.put(function, name);
}

View File

@@ -82,6 +82,7 @@ public class InMemoryFunctionCatalog extends AbstractComposableFunctionRegistry
for (String name : functionRegistration.getNames()) {
addType(name, functionRegistration.getType());
addName(functionRegistration.getTarget(), name);
if (functionRegistration.getTarget() instanceof Function) {
this.addFunction(name, (Function<?, ?>) functionRegistration.getTarget());
}

View File

@@ -18,6 +18,7 @@ package org.springframework.cloud.function.context.catalog;
import java.util.function.Function;
import org.junit.Ignore;
import org.junit.Test;
import reactor.core.publisher.Flux;
@@ -59,6 +60,9 @@ public class InMemoryFunctionCatalogTests {
lookedUpFunction = catalog.lookup("foo");
assertThat(lookedUpFunction).isNotNull();
assertThat(catalog.lookupFunctionName(lookedUpFunction)).isEqualTo("foo");
assertThat(catalog.getFunctionType("foo").getOutputType())
.isEqualTo(String.class);
assertThat(lookedUpFunction instanceof FluxFunction).isTrue();
}
@@ -87,7 +91,6 @@ public class InMemoryFunctionCatalogTests {
FunctionRegistration<UpperCaseMessage> upperCaseRegistration = new FunctionRegistration<>(
new UpperCaseMessage(), "uppercase")
.type(FunctionType.of(UpperCaseMessage.class).getType());
// TODO: make this work with plain Reverse (not message)
FunctionRegistration<ReverseMessage> reverseRegistration = new FunctionRegistration<>(
new ReverseMessage(), "reverse")
.type(FunctionType.of(ReverseMessage.class).getType());
@@ -95,6 +98,31 @@ public class InMemoryFunctionCatalogTests {
catalog.register(upperCaseRegistration);
catalog.register(reverseRegistration);
Function<Flux<Message<String>>, Flux<Message<String>>> lookedUpFunction = catalog
.lookup("uppercase|reverse");
assertThat(catalog.getFunctionType("uppercase|reverse").isMessage()).isTrue();
assertThat(catalog.lookupFunctionName(lookedUpFunction))
.isEqualTo("uppercase|reverse");
assertThat(lookedUpFunction).isNotNull();
assertThat(lookedUpFunction
.apply(Flux.just(MessageBuilder.withPayload("star").build())).blockFirst()
.getPayload()).isEqualTo("RATS");
}
@Test
@Ignore
public void testFunctionCompositionMixedMessages() {
FunctionRegistration<UpperCaseMessage> upperCaseRegistration = new FunctionRegistration<>(
new UpperCaseMessage(), "uppercase")
.type(FunctionType.of(UpperCaseMessage.class).getType());
// TODO: make this work with plain Reverse (not message)
FunctionRegistration<Reverse> reverseRegistration = new FunctionRegistration<>(
new Reverse(), "reverse").type(FunctionType.of(Reverse.class).getType());
InMemoryFunctionCatalog catalog = new InMemoryFunctionCatalog();
catalog.register(upperCaseRegistration);
catalog.register(reverseRegistration);
Function<Flux<Message<String>>, Flux<Message<String>>> lookedUpFunction = catalog
.lookup("uppercase|reverse");
assertThat(catalog.getFunctionType("uppercase|reverse").isMessage()).isTrue();