package org.watertemplate; import java.util.*; import java.util.function.BiConsumer; import java.util.function.BiFunction; import static org.watertemplate.TemplateObject.SubTemplate; public abstract class TemplateMap<T> { final Map<String, T> map = new HashMap<>(); final void add(final String key, final T value) { this.map.put(key, value); } public static class SubTemplates extends TemplateMap<SubTemplate> { List<SubTemplate> list = new ArrayList<>(); SubTemplates() { } public final void add(final String key, final Template subTemplate) { SubTemplate templateObject = new SubTemplate(subTemplate); add(key, templateObject); list.add(templateObject); } } public static final class Arguments extends TemplateMap<TemplateObject> { public Arguments() { } public Arguments(final Arguments arguments) { map.putAll(arguments.map); } public final <T> void addCollection(final String key, final Collection<T> iterable) { add(key, new TemplateObject.Collection<T>(iterable, (a, b) -> { })); } public final <T> void addCollection(final String key, final Collection<T> iterable, final BiConsumer<T, Arguments> mapper) { add(key, new TemplateObject.Collection<T>(iterable, mapper)); } public final <T> void addMappedObject(final String key, final T object, final BiConsumer<T, Arguments> mapper) { add(key, new TemplateObject.Mapped<>(object, mapper)); } public final <T> void addLocaleSensitiveObject(final String key, final T object, final BiFunction<T, Locale, String> function) { add(key, new TemplateObject.LocaleSensitive<>(object, function)); } public final void add(final String key, final String value) { add(key, new TemplateObject.Value(value)); } public final void add(final String key, final Boolean value) { add(key, new TemplateObject.Condition(value)); } public final TemplateObject get(final String key) { return map.get(key); } final void addTemplateWhichWontRenderItsMasterTemplate(final String key, final Template subTemplate) { add(key, new SubTemplate.WithoutMaster(subTemplate)); } } }