package org.jtwig.render.context; import java.util.HashMap; import java.util.Map; import java.util.Stack; public class RenderContext { public static RenderContext create () { return new RenderContext(new HashMap<Class, Stack<Context<?>>>()); } private final Map<Class, Stack<Context<?>>> contexts; public RenderContext(Map<Class, Stack<Context<?>>> contexts) { this.contexts = contexts; } public <T> RenderContext start (Class<T> type, T context) { if (!contexts.containsKey(type)) { contexts.put(type, new Stack<Context<?>>()); } contexts.get(type).push(Context.create(context)); return this; } public <T> T end (Class<T> type) { if (!contexts.containsKey(type)) { throw new IllegalStateException(String.format("There is no context for %s", type)); } Context<?> context = contexts.get(type).pop(); context.end(); return type.cast(context.getItem()); } private <T> Context<T> getCurrentContext (Class<T> type) { if (!contexts.containsKey(type)) { throw new IllegalStateException(String.format("There is no context for %s", type)); } return (Context<T>) contexts.get(type).peek(); } public <T> T getCurrent (Class<T> type) { return getCurrentContext(type).getItem(); } public boolean hasCurrent (Class type) { return contexts.containsKey(type) && !contexts.get(type).isEmpty(); } public void onEndCurrent (Class type, Runnable runnable) { getCurrentContext(type).onEnd(runnable); } public <T> void set(Class<T> type, T item) { getCurrentContext(type).set(item); } }