package xapi.elemental.impl; import javax.inject.Provider; import xapi.ui.api.StyleService; import xapi.util.api.ConvertsValue; import xapi.util.api.MergesValues; import elemental.dom.Element; public class LazyHtmlConverter <T, S extends StyleService<S>, E extends Element> implements MergesValues<T, S, E> { protected final LazyHtmlClone<E> cloner; private final MergesValues<T, S, E> converter; public LazyHtmlConverter(ConvertsValue<T, String> serializer) { class Merger implements MergesValues<T, S, E> { private T item; private final LazyHtmlClone<E> cloner = new LazyHtmlClone<E>( new Provider<String>() { @Override public String get() { return serializer.convert(item); } } ); @Override public E merge(T from, S service) { item = from; try { return cloner.get(); } finally { item = null; } } }; Merger merger = new Merger(); converter = merger; cloner = merger.cloner; } public LazyHtmlConverter(final MergesValues<T, S, String> serializer) { class Merger implements MergesValues<T, S, E> { private T item; private S service; private final LazyHtmlClone<E> cloner = new LazyHtmlClone<E>( new Provider<String>() { @Override public String get() { return serializer.merge(item, service); } } ); @Override public E merge(T from, S service) { this.service = service; item = from; try { return cloner.get(); } finally { item = null; service = null; } } }; Merger merger = new Merger(); converter = merger; cloner = merger.cloner; } public LazyHtmlConverter(final MergesValues<T, S, String> serializer, final S service) { class Merger implements MergesValues<T, S, E> { private T item; private final LazyHtmlClone<E> cloner = new LazyHtmlClone<E>( new Provider<String>() { @Override public String get() { return serializer.merge(item, service); } } ); @Override public E merge(T from, S service) { item = from; try { return cloner.get(); } finally { item = null; } } }; Merger merger = new Merger(); converter = merger; cloner = merger.cloner; } @Override public E merge(T from, S service) { return converter.merge(from, service); } public LazyHtmlConverter<T, S, E> setInitializer(ConvertsValue<E, E> initializer) { cloner.setInitializer(initializer); return this; } }