package org.phms.sling.handlebars.context.presenter;
import com.github.jknack.handlebars.Context;
import org.apache.sling.api.scripting.SlingBindings;
import org.apache.sling.api.scripting.SlingScriptHelper;
import org.phms.sling.mvp.api.ContextGenerator;
import org.phms.sling.mvp.impl.presenter.PresenterModelGenerator;
import javax.script.Bindings;
import javax.script.ScriptContext;
import java.util.HashMap;
import java.util.Map;
public class HandlebarsPresenterContextGenerator implements ContextGenerator<Context> {
public static final String REQUEST_KEY = "_request";
public static final String RESPONSE_KEY = "_response";
public static final String RESOLVER_KEY = "_resolver";
private PresenterModelGenerator modelGenerator;
public HandlebarsPresenterContextGenerator(PresenterModelGenerator modelGenerator) {
this.modelGenerator = modelGenerator;
}
private Map<String, Object> getBaseContext(SlingScriptHelper scriptHelper) {
Map<String, Object> baseContextMap = new HashMap<String, Object>();
baseContextMap.put(REQUEST_KEY, scriptHelper.getRequest());
baseContextMap.put(RESPONSE_KEY, scriptHelper.getResponse());
baseContextMap.put(RESOLVER_KEY, scriptHelper.getRequest().getResourceResolver());
return baseContextMap;
}
private SlingScriptHelper getSlingScriptHelper(ScriptContext context) {
final Bindings props = context.getBindings(ScriptContext.ENGINE_SCOPE);
return (SlingScriptHelper) props.get(SlingBindings.SLING);
}
@Override
public Context createContext(ScriptContext scriptContext) {
Map<String, Object> presentationModel = modelGenerator.createModel(scriptContext);
if (presentationModel != null) {
Map<String, Object> baseContextMap = getBaseContext(getSlingScriptHelper(scriptContext));
presentationModel.putAll(baseContextMap);
return Context.newBuilder(presentationModel).build();
} else {
return null;
}
}
}