xapi.ui.autoui.impl.UserInterfaceFactoryDefault Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of xapi-core-ui-autoui Show documentation
Show all versions of xapi-core-ui-autoui Show documentation
The core API for generating user interfaces from data models.
package xapi.ui.autoui.impl;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import xapi.annotation.inject.InstanceDefault;
import xapi.log.X_Log;
import xapi.log.api.LogLevel;
import xapi.ui.autoui.api.BeanValueProvider;
import xapi.ui.autoui.api.DoNotIndex;
import xapi.ui.autoui.api.UiOptions;
import xapi.ui.autoui.api.UiRendererOptions;
import xapi.ui.autoui.api.UiRenderingContext;
import xapi.ui.autoui.api.UserInterfaceFactory;
import xapi.util.X_Debug;
import xapi.util.api.ConvertsValue;
@InstanceDefault(implFor=UserInterfaceFactory.class)
public class UserInterfaceFactoryDefault extends AbstractUserInterfaceFactory{
private static final int MAX_DEPTH = 10;
@Override
protected UiRenderingContext[] getOptions(Class> type) {
List options = new ArrayList();
BeanValueProvider values = getBeanProvider(type);
// Check the package for options
if (type.getPackage().isAnnotationPresent(UiOptions.class)) {
options.addAll(extractRenderingContext(type.getPackage().getAnnotation(UiOptions.class), values));
}
if (type.isAnnotationPresent(UiOptions.class)) {
UiOptions opts = type.getAnnotation(UiOptions.class);
if (opts.fields().length > 0) {
values.setChildKeys(opts.fields());
}
}
// check for enclosing types/methods?
Class> check = type;
while (check != null) {
// Check the type for options
addAllRendererContexts(options, check, values);
// Enclosing method not supported by GWT; given it adds excess complexity anyway,
// it will not be supported in the forseeable future
// Method enclosing = check.getEnclosingMethod();
// if (enclosing != null){
// addAllRendererContexts(options, enclosing, values);
// }
check = check.getEnclosingClass();
}
for (Method m : type.getMethods()) {
addAllRendererContexts(options, m, values);
}
return options.toArray(new UiRenderingContext[options.size()]);
}
protected void addAllRendererContexts(List options, AnnotatedElement element, BeanValueProvider values) {
if (element.isAnnotationPresent(UiOptions.class)) {
options.addAll(extractRenderingContext(element.getAnnotation(UiOptions.class), values));
}
if (element.isAnnotationPresent(UiRendererOptions.class)) {
options.addAll(extractRenderingContext(element.getAnnotation(UiRendererOptions.class), values,
element instanceof Method ? getNameFromMethod((Method)element) : null ));
}
}
@Override
protected void recursiveAddBeanValues(BeanValueProvider bean, Class> cls,
final ConvertsValue