Add new methods to FunctionInspector
This commit is contained in:
@@ -139,6 +139,31 @@ public class ContextFunctionCatalogAutoConfiguration {
|
||||
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
|
||||
public String getName(Object function) {
|
||||
return processor.registrations.get(function);
|
||||
@@ -158,13 +183,15 @@ public class ContextFunctionCatalogAutoConfiguration {
|
||||
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) {
|
||||
this.registry = registry;
|
||||
}
|
||||
|
||||
public Object convert(String name, String value) {
|
||||
private Object convert(Object function, String value) {
|
||||
if (conversionService == null) {
|
||||
if (registry instanceof ConfigurableListableBeanFactory) {
|
||||
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)
|
||||
? conversionService.convert(value, type)
|
||||
: 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,
|
||||
@@ -250,8 +281,10 @@ 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());
|
||||
}
|
||||
if (target instanceof Supplier) {
|
||||
registration.target(target((Supplier<?>) target, key));
|
||||
@@ -263,7 +296,7 @@ public class ContextFunctionCatalogAutoConfiguration {
|
||||
registration.target(target((Function<?, ?>) target, key));
|
||||
}
|
||||
for (String name : registration.getNames()) {
|
||||
beans.put(name, key);
|
||||
this.reverse.put(name, registration.getTarget());
|
||||
}
|
||||
this.registrations.put(registration.getTarget(), key);
|
||||
}
|
||||
@@ -552,10 +585,8 @@ public class ContextFunctionCatalogAutoConfiguration {
|
||||
|
||||
}
|
||||
|
||||
private Class<?> findInputWrapper(String name) {
|
||||
if (name != null) {
|
||||
name = beans.get(name);
|
||||
}
|
||||
private Class<?> findInputWrapper(Object function) {
|
||||
String name = registrations.get(function);
|
||||
if (name == null || !registry.containsBeanDefinition(name)) {
|
||||
return Object.class;
|
||||
}
|
||||
@@ -564,10 +595,16 @@ public class ContextFunctionCatalogAutoConfiguration {
|
||||
ParamType.INPUT_WRAPPER);
|
||||
}
|
||||
|
||||
private Class<?> findOutputWrapper(String name) {
|
||||
if (name != null) {
|
||||
name = beans.get(name);
|
||||
}
|
||||
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)) {
|
||||
return Object.class;
|
||||
}
|
||||
@@ -576,10 +613,12 @@ public class ContextFunctionCatalogAutoConfiguration {
|
||||
ParamType.OUTPUT_WRAPPER);
|
||||
}
|
||||
|
||||
private Class<?> findInputType(String name) {
|
||||
if (name != null) {
|
||||
name = beans.get(name);
|
||||
}
|
||||
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)) {
|
||||
return Object.class;
|
||||
}
|
||||
@@ -588,15 +627,22 @@ public class ContextFunctionCatalogAutoConfiguration {
|
||||
ParamType.INPUT);
|
||||
}
|
||||
|
||||
private Class<?> findOutputType(String name) {
|
||||
if (name != null) {
|
||||
name = beans.get(name);
|
||||
}
|
||||
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)) {
|
||||
return Object.class;
|
||||
}
|
||||
BeanDefinition definition = registry.getBeanDefinition(name);
|
||||
return findType(name, (AbstractBeanDefinition) definition, ParamType.OUTPUT);
|
||||
return findType(name,
|
||||
(AbstractBeanDefinition) registry.getBeanDefinition(name),
|
||||
ParamType.OUTPUT);
|
||||
}
|
||||
|
||||
private Class<?> findOutputType(String name) {
|
||||
return findOutputType(reverse.get(name));
|
||||
}
|
||||
|
||||
static enum ParamType {
|
||||
|
||||
@@ -30,16 +30,31 @@ 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);
|
||||
|
||||
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(Object function, String value);
|
||||
|
||||
String getName(Object function);
|
||||
|
||||
// Maybe make this a default method?
|
||||
|
||||
@@ -113,6 +113,31 @@ public class FunctionExtractingFunctionCatalog
|
||||
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
|
||||
public Class<?> getInputType(String name) {
|
||||
return (Class<?>) inspect(name, "getInputType");
|
||||
|
||||
Reference in New Issue
Block a user