package xapi.ui.autoui.api; import static xapi.collect.X_Collect.newStringMap; import java.util.ArrayList; import java.util.List; import javax.inject.Provider; import xapi.collect.api.StringTo; import xapi.source.write.MappedTemplate; import xapi.util.impl.ImmutableProvider; public class UiRenderingContext { private static final MappedTemplate DEFAULT_TEMPLATE = new MappedTemplate(""); @SuppressWarnings("rawtypes") private static final Validator[] DEFAULT_VALIDATORS = new Validator[0]; private static final Object[] EMPTY_MESSAGES = new Object[0]; private boolean head = false; private final Provider<UiRenderer<?>> renderProvider; private UiRendererSelector selector = UiRendererSelector.ALWAYS_TRUE; private boolean tail = false; private MappedTemplate template = DEFAULT_TEMPLATE; @SuppressWarnings("rawtypes") private Validator[] validators = DEFAULT_VALIDATORS; private boolean wrapper = false; private BeanValueProvider valueProvider; private String name = ""; public UiRenderingContext(Provider<UiRenderer<?>> renderProvider) { this.renderProvider = renderProvider; } public UiRenderingContext(UiRenderer<?> renderer) { this(new ImmutableProvider<UiRenderer<?>>(renderer)); } public String getName() { return name; } @SuppressWarnings("rawtypes") public final UiRenderer getRenderer() { return renderProvider.get(); } public UiRendererSelector getSelector() { return selector; } public MappedTemplate getTemplate() { return template; } public String applyTemplate(String name, Object val) { StringTo<Object> map = newStringMap(Object.class); BeanValueProvider bean = getBeanValueProvider(); MappedTemplate template = getTemplate(); bean.fillMap(name, template, map, val); return template.applyMap(map.entries()); } @SuppressWarnings("rawtypes") public Validator[] getValidators() { return validators; } public boolean isHead() { return head; } public boolean isTail() { return tail; } public boolean isTemplateSet() { return template != DEFAULT_TEMPLATE; } public boolean isValid(Object o) { if (validators.length == 0) return true; for (Validator<?> validator : validators) { Object error = validator.isValid(o); if (!(Boolean.TRUE.equals(error) || error == null)) return false; } return true; } public boolean isWrapper() { return wrapper; } public UiRenderingContext setHead(boolean head) { this.head = head; return this; } public UiRenderingContext setName(String name) { this.name = name; return this; } public UiRenderingContext setSelector(UiRendererSelector selector) { assert selector != null : "You must supply a valid UiRendererSelector; " + "Use UiRendererSelector.AlwaysTrue instead of null"; this.selector = selector; return this; } public UiRenderingContext setTail(boolean tail) { this.tail = tail; return this; } public UiRenderingContext setTemplate(MappedTemplate template) { this.template = template; return this; } @SuppressWarnings("rawtypes") public UiRenderingContext setValidators(Validator[] validators) { this.validators = validators; return this; } public UiRenderingContext setWrapper(boolean wrapper) { this.wrapper = wrapper; return this; } public Object[] validate(Object o) { if (validators.length == 0) return EMPTY_MESSAGES; List<Object> errors = new ArrayList<Object>(); for (Validator<?> validator : validators) { Object error = validator.isValid(o); if (!(Boolean.TRUE.equals(error) || error == null)) { errors.add(error); } } return errors.toArray(new Object[errors.size()]); } public void setBeanProvider(BeanValueProvider bean) { this.valueProvider = bean; } public BeanValueProvider getBeanValueProvider() { return valueProvider; } }