package xapi.ui.html.impl; import javax.inject.Provider; import xapi.collect.X_Collect; import xapi.collect.api.StringTo; import xapi.ui.api.StyleService; import xapi.ui.html.X_Html; import xapi.ui.html.api.HtmlSnippet; import xapi.util.api.ConvertsValue; import xapi.util.impl.LazyProvider; public class HtmlRenderer { @SuppressWarnings("unchecked") private StringTo<ConvertsValue<?, String>> map = X_Collect.newStringMap( Class.class.cast(ConvertsValue.class) ); @SuppressWarnings("unchecked") public <T> ConvertsValue<T, String> getRenderer(Class<T> type, StyleService<?> context) { ConvertsValue<T, String> converter = (ConvertsValue<T, String>) map.get(type.getName()); if (converter == null) { converter = buildConverter(type, context); map.put(type.getName(), converter); } return converter; } protected <T> ConvertsValue<T, String> buildConverter(final Class<T> type, final StyleService<?> context) { final Provider<HtmlSnippet<T>> snippet = new LazyProvider<>(new Provider<HtmlSnippet<T>>() { @Override public HtmlSnippet<T> get() { return X_Html.toSnippet(type, context); } }); return new ConvertsValue<T, String>(){ @Override public String convert(T from) { return snippet.get().convert(from); } }; } }