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.
The newest version!
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.InstanceOverride;
import xapi.log.X_Log;
import xapi.log.api.LogLevel;
import xapi.platform.GwtDevPlatform;
import xapi.platform.JrePlatform;
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;
@JrePlatform
@GwtDevPlatform
@InstanceOverride(implFor=UserInterfaceFactory.class, priority=1)
public class UserInterfaceFactoryDefault extends AbstractUserInterfaceFactory{
private static final int MAX_DEPTH = 10;
@Override
protected UiRenderingContext[] getOptions(final Class> type) {
final List options = new ArrayList();
final BeanValueProvider values = getBeanProvider(type);
// Check the package for options
final Package pkg = type.getPackage();
if (pkg != null && pkg.isAnnotationPresent(UiOptions.class)) {
options.addAll(extractRenderingContext(pkg.getAnnotation(UiOptions.class), values));
}
if (type.isAnnotationPresent(UiOptions.class)) {
final 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 (final Method m : type.getMethods()) {
addAllRendererContexts(options, m, values);
}
return options.toArray(new UiRenderingContext[options.size()]);
}
protected void addAllRendererContexts(final List options, final AnnotatedElement element, final 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(final BeanValueProvider bean, final Class> cls,
final ConvertsValue