Add new methods to FunctionInspector

This commit is contained in:
Dave Syer
2017-07-12 13:35:03 +01:00
parent 7e966c73ca
commit d7d49858f6
3 changed files with 107 additions and 21 deletions

View File

@@ -139,6 +139,31 @@ public class ContextFunctionCatalogAutoConfiguration {
return processor.convert(name, value); return processor.convert(name, value);
} }
@Override
public Class<?> getInputWrapper(Object function) {
return processor.findInputWrapper(function);
}
@Override
public Class<?> getOutputWrapper(Object function) {
return processor.findOutputWrapper(function);
}
@Override
public Class<?> getInputType(Object function) {
return processor.findInputType(function);
}
@Override
public Class<?> getOutputType(Object function) {
return processor.findOutputType(function);
}
@Override
public Object convert(Object function, String value) {
return processor.convert(function, value);
}
@Override @Override
public String getName(Object function) { public String getName(Object function) {
return processor.registrations.get(function); return processor.registrations.get(function);
@@ -158,13 +183,15 @@ public class ContextFunctionCatalogAutoConfiguration {
private BeanDefinitionRegistry registry; private BeanDefinitionRegistry registry;
private ConversionService conversionService; private ConversionService conversionService;
private Map<Object, String> registrations = new HashMap<>(); private Map<Object, String> registrations = new HashMap<>();
// TODO: keys are not unique
private Map<String, Object> reverse = new HashMap<>();
@Override @Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
this.registry = registry; this.registry = registry;
} }
public Object convert(String name, String value) { private Object convert(Object function, String value) {
if (conversionService == null) { if (conversionService == null) {
if (registry instanceof ConfigurableListableBeanFactory) { if (registry instanceof ConfigurableListableBeanFactory) {
ConversionService conversionService = ((ConfigurableBeanFactory) this.registry) ConversionService conversionService = ((ConfigurableBeanFactory) this.registry)
@@ -177,12 +204,16 @@ public class ContextFunctionCatalogAutoConfiguration {
} }
} }
} }
Class<?> type = findInputType(name); Class<?> type = findInputType(function);
return conversionService.canConvert(String.class, type) return conversionService.canConvert(String.class, type)
? conversionService.convert(value, type) ? conversionService.convert(value, type)
: value; : value;
} }
public Object convert(String name, String value) {
return convert(reverse.get(name), value);
}
public Set<FunctionRegistration<?>> merge( public Set<FunctionRegistration<?>> merge(
Map<String, FunctionRegistration<?>> initial, Map<String, FunctionRegistration<?>> initial,
Map<String, Consumer<?>> consumers, Map<String, Supplier<?>> suppliers, Map<String, Consumer<?>> consumers, Map<String, Supplier<?>> suppliers,
@@ -250,8 +281,10 @@ public class ContextFunctionCatalogAutoConfiguration {
private void wrap(FunctionRegistration<Object> registration, String key) { private void wrap(FunctionRegistration<Object> registration, String key) {
Object target = registration.getTarget(); Object target = registration.getTarget();
this.registrations.put(registration.getTarget(), key);
for (String name : registration.getNames()) { for (String name : registration.getNames()) {
beans.put(name, key); beans.put(name, key);
this.reverse.put(name, registration.getTarget());
} }
if (target instanceof Supplier) { if (target instanceof Supplier) {
registration.target(target((Supplier<?>) target, key)); registration.target(target((Supplier<?>) target, key));
@@ -263,7 +296,7 @@ public class ContextFunctionCatalogAutoConfiguration {
registration.target(target((Function<?, ?>) target, key)); registration.target(target((Function<?, ?>) target, key));
} }
for (String name : registration.getNames()) { for (String name : registration.getNames()) {
beans.put(name, key); this.reverse.put(name, registration.getTarget());
} }
this.registrations.put(registration.getTarget(), key); this.registrations.put(registration.getTarget(), key);
} }
@@ -552,10 +585,8 @@ public class ContextFunctionCatalogAutoConfiguration {
} }
private Class<?> findInputWrapper(String name) { private Class<?> findInputWrapper(Object function) {
if (name != null) { String name = registrations.get(function);
name = beans.get(name);
}
if (name == null || !registry.containsBeanDefinition(name)) { if (name == null || !registry.containsBeanDefinition(name)) {
return Object.class; return Object.class;
} }
@@ -564,10 +595,16 @@ public class ContextFunctionCatalogAutoConfiguration {
ParamType.INPUT_WRAPPER); ParamType.INPUT_WRAPPER);
} }
private Class<?> findOutputWrapper(String name) { private Class<?> findInputWrapper(String name) {
if (name != null) { return findInputWrapper(function(name));
name = beans.get(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)) { if (name == null || !registry.containsBeanDefinition(name)) {
return Object.class; return Object.class;
} }
@@ -576,10 +613,12 @@ public class ContextFunctionCatalogAutoConfiguration {
ParamType.OUTPUT_WRAPPER); ParamType.OUTPUT_WRAPPER);
} }
private Class<?> findInputType(String name) { private Class<?> findOutputWrapper(String name) {
if (name != null) { return findOutputWrapper(reverse.get(name));
name = beans.get(name); }
}
private Class<?> findInputType(Object function) {
String name = registrations.get(function);
if (name == null || !registry.containsBeanDefinition(name)) { if (name == null || !registry.containsBeanDefinition(name)) {
return Object.class; return Object.class;
} }
@@ -588,15 +627,22 @@ public class ContextFunctionCatalogAutoConfiguration {
ParamType.INPUT); ParamType.INPUT);
} }
private Class<?> findOutputType(String name) { private Class<?> findInputType(String name) {
if (name != null) { return findInputType(reverse.get(name));
name = beans.get(name); }
}
private Class<?> findOutputType(Object function) {
String name = registrations.get(function);
if (name == null || !registry.containsBeanDefinition(name)) { if (name == null || !registry.containsBeanDefinition(name)) {
return Object.class; return Object.class;
} }
BeanDefinition definition = registry.getBeanDefinition(name); return findType(name,
return findType(name, (AbstractBeanDefinition) definition, ParamType.OUTPUT); (AbstractBeanDefinition) registry.getBeanDefinition(name),
ParamType.OUTPUT);
}
private Class<?> findOutputType(String name) {
return findOutputType(reverse.get(name));
} }
static enum ParamType { static enum ParamType {

View File

@@ -30,16 +30,31 @@ public interface FunctionInspector {
boolean isMessage(String name); boolean isMessage(String name);
@Deprecated
Class<?> getInputType(String name); Class<?> getInputType(String name);
@Deprecated
Class<?> getOutputType(String name); Class<?> getOutputType(String name);
@Deprecated
Class<?> getInputWrapper(String name); Class<?> getInputWrapper(String name);
@Deprecated
Class<?> getOutputWrapper(String name); Class<?> getOutputWrapper(String name);
Class<?> getInputType(Object function);
Class<?> getOutputType(Object function);
Class<?> getInputWrapper(Object function);
Class<?> getOutputWrapper(Object function);
@Deprecated
Object convert(String name, String value); Object convert(String name, String value);
Object convert(Object function, String value);
String getName(Object function); String getName(Object function);
// Maybe make this a default method? // Maybe make this a default method?

View File

@@ -113,6 +113,31 @@ public class FunctionExtractingFunctionCatalog
return (Boolean) inspect(name, "isMessage"); return (Boolean) inspect(name, "isMessage");
} }
@Override
public Class<?> getInputType(Object function) {
return (Class<?>) inspect(function, "getInputType");
}
@Override
public Class<?> getOutputType(Object function) {
return (Class<?>) inspect(function, "getOutputType");
}
@Override
public Class<?> getInputWrapper(Object function) {
return (Class<?>) inspect(function, "getInputWrapper");
}
@Override
public Class<?> getOutputWrapper(Object function) {
return (Class<?>) inspect(function, "getOutputWrapper");
}
@Override
public Object convert(Object function, String value) {
return inspect(function, "convert");
}
@Override @Override
public Class<?> getInputType(String name) { public Class<?> getInputType(String name) {
return (Class<?>) inspect(name, "getInputType"); return (Class<?>) inspect(name, "getInputType");