Add new methods to FunctionInspector
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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?
|
||||||
|
|||||||
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user