Strangle old inspector methods

Fixes gh-81
This commit is contained in:
Dave Syer
2017-07-12 14:29:44 +01:00
parent d7d49858f6
commit c8646d64d8
12 changed files with 123 additions and 186 deletions

View File

@@ -110,33 +110,8 @@ public class ContextFunctionCatalogAutoConfiguration {
}
@Override
public boolean isMessage(String name) {
return processor.isMessage(name);
}
@Override
public Class<?> getInputWrapper(String name) {
return processor.findInputWrapper(name);
}
@Override
public Class<?> getOutputWrapper(String name) {
return processor.findOutputWrapper(name);
}
@Override
public Class<?> getInputType(String name) {
return processor.findInputType(name);
}
@Override
public Class<?> getOutputType(String name) {
return processor.findOutputType(name);
}
@Override
public Object convert(String name, String value) {
return processor.convert(name, value);
public boolean isMessage(Object function) {
return processor.isMessage(function);
}
@Override
@@ -178,13 +153,10 @@ public class ContextFunctionCatalogAutoConfiguration {
private Set<String> suppliers = new HashSet<>();
private Set<String> functions = new HashSet<>();
private Set<String> consumers = new HashSet<>();
private Map<String, String> beans = new HashMap<>();
private BeanDefinitionRegistry registry;
private ConversionService conversionService;
private Map<Object, String> registrations = new HashMap<>();
// TODO: keys are not unique
private Map<String, Object> reverse = new HashMap<>();
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
@@ -210,10 +182,6 @@ public class ContextFunctionCatalogAutoConfiguration {
: value;
}
public Object convert(String name, String value) {
return convert(reverse.get(name), value);
}
public Set<FunctionRegistration<?>> merge(
Map<String, FunctionRegistration<?>> initial,
Map<String, Consumer<?>> consumers, Map<String, Supplier<?>> suppliers,
@@ -281,11 +249,7 @@ public class ContextFunctionCatalogAutoConfiguration {
private void wrap(FunctionRegistration<Object> registration, String key) {
Object target = registration.getTarget();
this.registrations.put(registration.getTarget(), key);
for (String name : registration.getNames()) {
beans.put(name, key);
this.reverse.put(name, registration.getTarget());
}
this.registrations.put(target, key);
if (target instanceof Supplier) {
registration.target(target((Supplier<?>) target, key));
}
@@ -295,9 +259,7 @@ public class ContextFunctionCatalogAutoConfiguration {
else if (target instanceof Function) {
registration.target(target((Function<?, ?>) target, key));
}
for (String name : registration.getNames()) {
this.reverse.put(name, registration.getTarget());
}
registrations.remove(target);
this.registrations.put(registration.getTarget(), key);
}
@@ -384,23 +346,23 @@ public class ContextFunctionCatalogAutoConfiguration {
}
private boolean isFluxFunction(String name, Function<?, ?> function) {
boolean fluxTypes = this.hasFluxTypes(name);
boolean fluxTypes = this.hasFluxTypes(function);
return fluxTypes || FunctionUtils.isFluxFunction(function);
}
private boolean isFluxConsumer(String name, Consumer<?> consumer) {
boolean fluxTypes = this.hasFluxTypes(name);
boolean fluxTypes = this.hasFluxTypes(consumer);
return fluxTypes || FunctionUtils.isFluxConsumer(consumer);
}
private boolean isFluxSupplier(String name, Supplier<?> supplier) {
boolean fluxTypes = this.hasFluxTypes(name);
boolean fluxTypes = this.hasFluxTypes(supplier);
return fluxTypes || FunctionUtils.isFluxSupplier(supplier);
}
private boolean hasFluxTypes(String name) {
return FunctionInspector.isWrapper(findInputWrapper(name))
|| FunctionInspector.isWrapper(findOutputWrapper(name));
private boolean hasFluxTypes(Object function) {
return FunctionInspector.isWrapper(findInputWrapper(function))
|| FunctionInspector.isWrapper(findOutputWrapper(function));
}
private boolean isGenericSupplier(ConfigurableListableBeanFactory factory,
@@ -569,10 +531,8 @@ public class ContextFunctionCatalogAutoConfiguration {
return ReflectionUtils.getField(field, target);
}
private boolean isMessage(String name) {
if (name != null) {
name = beans.get(name);
}
private boolean isMessage(Object function) {
String name = registrations.get(function);
if (name == null || !registry.containsBeanDefinition(name)) {
return false;
}
@@ -582,7 +542,6 @@ public class ContextFunctionCatalogAutoConfiguration {
|| Message.class.isAssignableFrom(findType(name,
(AbstractBeanDefinition) registry.getBeanDefinition(name),
ParamType.OUTPUT_INNER_WRAPPER));
}
private Class<?> findInputWrapper(Object function) {
@@ -595,14 +554,6 @@ public class ContextFunctionCatalogAutoConfiguration {
ParamType.INPUT_WRAPPER);
}
private Class<?> findInputWrapper(String name) {
return findInputWrapper(function(name));
}
private Object function(String name) {
return reverse.containsKey(name) ? reverse.get(name) : null;
}
private Class<?> findOutputWrapper(Object function) {
String name = registrations.get(function);
if (name == null || !registry.containsBeanDefinition(name)) {
@@ -613,10 +564,6 @@ public class ContextFunctionCatalogAutoConfiguration {
ParamType.OUTPUT_WRAPPER);
}
private Class<?> findOutputWrapper(String name) {
return findOutputWrapper(reverse.get(name));
}
private Class<?> findInputType(Object function) {
String name = registrations.get(function);
if (name == null || !registry.containsBeanDefinition(name)) {
@@ -627,10 +574,6 @@ public class ContextFunctionCatalogAutoConfiguration {
ParamType.INPUT);
}
private Class<?> findInputType(String name) {
return findInputType(reverse.get(name));
}
private Class<?> findOutputType(Object function) {
String name = registrations.get(function);
if (name == null || !registry.containsBeanDefinition(name)) {
@@ -641,10 +584,6 @@ public class ContextFunctionCatalogAutoConfiguration {
ParamType.OUTPUT);
}
private Class<?> findOutputType(String name) {
return findOutputType(reverse.get(name));
}
static enum ParamType {
INPUT, OUTPUT, INPUT_WRAPPER, OUTPUT_WRAPPER, INPUT_INNER_WRAPPER, OUTPUT_INNER_WRAPPER;

View File

@@ -28,19 +28,7 @@ import reactor.core.publisher.Mono;
*/
public interface FunctionInspector {
boolean isMessage(String name);
@Deprecated
Class<?> getInputType(String name);
@Deprecated
Class<?> getOutputType(String name);
@Deprecated
Class<?> getInputWrapper(String name);
@Deprecated
Class<?> getOutputWrapper(String name);
boolean isMessage(Object function);
Class<?> getInputType(Object function);
@@ -50,9 +38,6 @@ public interface FunctionInspector {
Class<?> getOutputWrapper(Object function);
@Deprecated
Object convert(String name, String value);
Object convert(Object function, String value);
String getName(Object function);

View File

@@ -27,7 +27,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.springframework.beans.factory.annotation.Qualifier;
@@ -81,14 +80,15 @@ public class ContextFunctionCatalogAutoConfigurationTests {
}
@Test
@Ignore("see https://github.com/spring-cloud/spring-cloud-function/issues/81")
public void ambiguousFunction() {
create(AmbiguousConfiguration.class);
assertThat(context.getBean("foos")).isInstanceOf(Function.class);
assertThat(catalog.lookupFunction("foos")).isInstanceOf(Function.class);
assertThat(catalog.lookupConsumer("foos")).isInstanceOf(Consumer.class);
// Could be String or Foo
assertThat(inspector.getInputType("foos")).isEqualTo(Foo.class);
assertThat(inspector.getInputType(catalog.lookupFunction("foos")))
.isEqualTo(String.class);
assertThat(inspector.getInputType(catalog.lookupConsumer("foos")))
.isEqualTo(Foo.class);
}
@@ -97,8 +97,10 @@ public class ContextFunctionCatalogAutoConfigurationTests {
create(GenericConfiguration.class);
assertThat(context.getBean("function")).isInstanceOf(Function.class);
assertThat(catalog.lookupFunction("function")).isInstanceOf(Function.class);
assertThat(inspector.getInputType("function")).isAssignableFrom(Map.class);
assertThat(inspector.getInputWrapper("function")).isAssignableFrom(Map.class);
assertThat(inspector.getInputType(catalog.lookupFunction("function")))
.isAssignableFrom(Map.class);
assertThat(inspector.getInputWrapper(catalog.lookupFunction("function")))
.isAssignableFrom(Map.class);
}
@Test
@@ -106,9 +108,11 @@ public class ContextFunctionCatalogAutoConfigurationTests {
create(FluxMessageConfiguration.class);
assertThat(context.getBean("function")).isInstanceOf(Function.class);
assertThat(catalog.lookupFunction("function")).isInstanceOf(Function.class);
assertThat(inspector.isMessage("function")).isTrue();
assertThat(inspector.getInputType("function")).isAssignableFrom(String.class);
assertThat(inspector.getInputWrapper("function")).isAssignableFrom(Flux.class);
assertThat(inspector.isMessage(catalog.lookupFunction("function"))).isTrue();
assertThat(inspector.getInputType(catalog.lookupFunction("function")))
.isAssignableFrom(String.class);
assertThat(inspector.getInputWrapper(catalog.lookupFunction("function")))
.isAssignableFrom(Flux.class);
}
@Test
@@ -116,9 +120,11 @@ public class ContextFunctionCatalogAutoConfigurationTests {
create(MessageConfiguration.class);
assertThat(context.getBean("function")).isInstanceOf(Function.class);
assertThat(catalog.lookupFunction("function")).isInstanceOf(Function.class);
assertThat(inspector.isMessage("function")).isTrue();
assertThat(inspector.getInputType("function")).isAssignableFrom(String.class);
assertThat(inspector.getInputWrapper("function")).isAssignableFrom(String.class);
assertThat(inspector.isMessage(catalog.lookupFunction("function"))).isTrue();
assertThat(inspector.getInputType(catalog.lookupFunction("function")))
.isAssignableFrom(String.class);
assertThat(inspector.getInputWrapper(catalog.lookupFunction("function")))
.isAssignableFrom(String.class);
}
@Test
@@ -126,8 +132,10 @@ public class ContextFunctionCatalogAutoConfigurationTests {
create(GenericFluxConfiguration.class);
assertThat(context.getBean("function")).isInstanceOf(Function.class);
assertThat(catalog.lookupFunction("function")).isInstanceOf(Function.class);
assertThat(inspector.getInputType("function")).isAssignableFrom(Map.class);
assertThat(inspector.getInputWrapper("function")).isAssignableFrom(Flux.class);
assertThat(inspector.getInputType(catalog.lookupFunction("function")))
.isAssignableFrom(Map.class);
assertThat(inspector.getInputWrapper(catalog.lookupFunction("function")))
.isAssignableFrom(Flux.class);
}
@Test
@@ -135,8 +143,10 @@ public class ContextFunctionCatalogAutoConfigurationTests {
create(ExternalConfiguration.class);
assertThat(context.getBean("function")).isInstanceOf(Function.class);
assertThat(catalog.lookupFunction("function")).isInstanceOf(Function.class);
assertThat(inspector.getInputType("function")).isAssignableFrom(Map.class);
assertThat(inspector.getInputWrapper("function")).isAssignableFrom(Map.class);
assertThat(inspector.getInputType(catalog.lookupFunction("function")))
.isAssignableFrom(Map.class);
assertThat(inspector.getInputWrapper(catalog.lookupFunction("function")))
.isAssignableFrom(Map.class);
}
@Test
@@ -144,8 +154,10 @@ public class ContextFunctionCatalogAutoConfigurationTests {
create(ComponentScanBeanConfiguration.class);
assertThat(context.getBean("function")).isInstanceOf(Function.class);
assertThat(catalog.lookupFunction("function")).isInstanceOf(Function.class);
assertThat(inspector.getInputType("function")).isAssignableFrom(Map.class);
assertThat(inspector.getInputWrapper("function")).isAssignableFrom(Map.class);
assertThat(inspector.getInputType(catalog.lookupFunction("function")))
.isAssignableFrom(Map.class);
assertThat(inspector.getInputWrapper(catalog.lookupFunction("function")))
.isAssignableFrom(Map.class);
}
@Test
@@ -153,8 +165,10 @@ public class ContextFunctionCatalogAutoConfigurationTests {
create(ComponentScanConfiguration.class);
assertThat(context.getBean("function")).isInstanceOf(Function.class);
assertThat(catalog.lookupFunction("function")).isInstanceOf(Function.class);
assertThat(inspector.getInputType("function")).isAssignableFrom(Map.class);
assertThat(inspector.getInputWrapper("function")).isAssignableFrom(Map.class);
assertThat(inspector.getInputType(catalog.lookupFunction("function")))
.isAssignableFrom(Map.class);
assertThat(inspector.getInputWrapper(catalog.lookupFunction("function")))
.isAssignableFrom(Map.class);
}
@Test
@@ -163,8 +177,9 @@ public class ContextFunctionCatalogAutoConfigurationTests {
create("greeter.jar", ComponentScanJarConfiguration.class);
assertThat(context.getBean("greeter")).isInstanceOf(Function.class);
assertThat(catalog.lookupFunction("greeter")).isInstanceOf(Function.class);
assertThat(inspector.getInputType("greeter")).isAssignableFrom(String.class);
assertThat(inspector.getInputWrapper("greeter"))
assertThat(inspector.getInputType(catalog.lookupFunction("greeter")))
.isAssignableFrom(String.class);
assertThat(inspector.getInputWrapper(catalog.lookupFunction("greeter")))
.isAssignableFrom(String.class);
}
finally {
@@ -207,7 +222,8 @@ public class ContextFunctionCatalogAutoConfigurationTests {
assertThat(context.getBean("function")).isInstanceOf(Function.class);
assertThat(catalog.lookupFunction("function")).isNull();
assertThat(catalog.lookupFunction("other")).isInstanceOf(Function.class);
assertThat(inspector.getInputType("other")).isEqualTo(String.class);
assertThat(inspector.getInputType(catalog.lookupFunction("other")))
.isEqualTo(String.class);
}
@Test
@@ -235,7 +251,8 @@ public class ContextFunctionCatalogAutoConfigurationTests {
"spring.cloud.function.compile.foos.outputType=String");
assertThat(context.getBean("foos")).isInstanceOf(Function.class);
assertThat(catalog.lookupFunction("foos")).isInstanceOf(Function.class);
assertThat(inspector.getInputWrapper("foos")).isEqualTo(String.class);
assertThat(inspector.getInputWrapper(catalog.lookupFunction("foos")))
.isEqualTo(String.class);
}
@Test
@@ -249,7 +266,8 @@ public class ContextFunctionCatalogAutoConfigurationTests {
"spring.cloud.function.import.foos.location=file:./target/foos.fun");
assertThat(context.getBean("foos")).isInstanceOf(Function.class);
assertThat(catalog.lookupFunction("foos")).isInstanceOf(Function.class);
assertThat(inspector.getInputWrapper("foos")).isEqualTo(String.class);
assertThat(inspector.getInputWrapper(catalog.lookupFunction("foos")))
.isEqualTo(String.class);
}
@Test
@@ -260,7 +278,8 @@ public class ContextFunctionCatalogAutoConfigurationTests {
"spring.cloud.function.compile.foos.type=consumer",
"spring.cloud.function.compile.foos.inputType=String");
assertThat(catalog.lookupConsumer("foos")).isInstanceOf(Consumer.class);
assertThat(inspector.getInputWrapper("foos")).isEqualTo(String.class);
assertThat(inspector.getInputWrapper(catalog.lookupConsumer("foos")))
.isEqualTo(String.class);
@SuppressWarnings("unchecked")
Consumer<String> consumer = (Consumer<String>) context.getBean("foos");
consumer.accept("hello");
@@ -274,7 +293,8 @@ public class ContextFunctionCatalogAutoConfigurationTests {
+ getClass().getName() + "::set)",
"spring.cloud.function.compile.foos.type=consumer");
assertThat(catalog.lookupConsumer("foos")).isInstanceOf(Consumer.class);
assertThat(inspector.getInputWrapper("foos")).isEqualTo(Flux.class);
assertThat(inspector.getInputWrapper(catalog.lookupConsumer("foos")))
.isEqualTo(Flux.class);
@SuppressWarnings("unchecked")
Consumer<Flux<String>> consumer = (Consumer<Flux<String>>) context
.getBean("foos");