GH-208 Added support for composing Supplier and Consumer

This essentially returns a terminal Supplier - Supplier<Flux<Void>> which can no longer be composed with anything else
Resolves #208
This commit is contained in:
Oleg Zhurakousky
2018-10-14 19:29:23 -04:00
parent 666bc100e8
commit ec68f6453c
3 changed files with 52 additions and 13 deletions

View File

@@ -16,23 +16,25 @@
package org.springframework.cloud.function.context.config;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import java.util.concurrent.atomic.AtomicStampedReference;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import org.junit.Test;
import org.reactivestreams.Publisher;
import org.springframework.cloud.function.context.FunctionRegistration;
import org.springframework.cloud.function.context.FunctionType;
import org.springframework.cloud.function.context.config.ContextFunctionCatalogAutoConfiguration.BeanFactoryFunctionCatalog;
import org.springframework.cloud.function.context.config.ContextFunctionCatalogAutoConfiguration.ContextFunctionRegistry;
import static org.assertj.core.api.Assertions.assertThat;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@@ -153,6 +155,30 @@ public class BeanFactoryFunctionCatalogTests {
assertThat(sink.values).contains("2");
}
@Test
public void composeSupplierAndConsumer() {
AtomicReference<String> ref = new AtomicReference<String>();
Supplier<String> s = () -> "hello";
processor.register(new FunctionRegistration<>(s, "supplier"));
Consumer<String> c = x -> ref.set(x.toUpperCase());
processor.register(new FunctionRegistration<>(c, "consumer"));
Supplier<Flux<Void>> f = processor.lookup("supplier|consumer");
f.get().blockFirst();
assertThat(ref.get()).isEqualTo("HELLO");
}
@Test(expected=IllegalStateException.class)
public void failComposeSupplierWithMultipleConsumers() {
AtomicReference<String> ref = new AtomicReference<String>();
Supplier<String> s = () -> "hello";
processor.register(new FunctionRegistration<>(s, "supplier"));
Consumer<String> c = x -> ref.set(x.toUpperCase());
processor.register(new FunctionRegistration<>(c, "consumer"));
Consumer<String> z = x -> ref.set(x.toUpperCase());
processor.register(new FunctionRegistration<>(z, "z"));
processor.lookup("supplier|consumer|z");
}
protected static class Source implements Supplier<Integer> {
@Override

View File

@@ -17,6 +17,7 @@
package org.springframework.cloud.function.context.config;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertNull;
import java.io.File;
import java.net.MalformedURLException;
@@ -115,12 +116,13 @@ public class ContextFunctionPostProcessorTests {
assertThat(processor.getRegistration(supplier).getNames()).containsExactly("supplier|function");
}
//TODO we should support it at some point since this is really a Runnable
@Test(expected=UnsupportedOperationException.class)
@SuppressWarnings("unchecked")
@Test
public void supplierAndConsumer() {
processor.register(new FunctionRegistration<Supplier<String>>(() -> "foo", "supplier"));
processor.register(new FunctionRegistration<Consumer<String>>(System.out::println, "consumer"));
processor.lookupSupplier("supplier|consumer");
Supplier<Flux<Void>> supplier = (Supplier<Flux<Void>>) processor.lookupSupplier("supplier|consumer");
assertNull(supplier.get().blockFirst());
}
@Test