package pl.matisoft.soy; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.template.soy.tofu.SoyTofu; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.BeanNameAware; import org.springframework.web.servlet.View; import pl.matisoft.soy.bundle.EmptySoyMsgBundleResolver; import pl.matisoft.soy.bundle.SoyMsgBundleResolver; import pl.matisoft.soy.config.SoyViewConfigDefaults; import pl.matisoft.soy.data.adjust.EmptyModelAdjuster; import pl.matisoft.soy.data.adjust.ModelAdjuster; import pl.matisoft.soy.global.runtime.EmptyGlobalRuntimeModelResolver; import pl.matisoft.soy.global.runtime.GlobalRuntimeModelResolver; import pl.matisoft.soy.locale.EmptyLocaleProvider; import pl.matisoft.soy.locale.LocaleProvider; import pl.matisoft.soy.render.DefaultTemplateRenderer; import pl.matisoft.soy.render.RenderRequest; import pl.matisoft.soy.render.TemplateRenderer; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Map; /** * Created with IntelliJ IDEA. * User: mati * Date: 19/06/2013 * Time: 23:32 */ public class SoyView implements View, BeanNameAware { private static final Logger logger = LoggerFactory.getLogger(SoyView.class); /** Compiled soy binary objects */ protected Optional<SoyTofu> compiledTemplates = Optional.absent(); /** name of the template with namespace, .e.g. ajax_macros.show_customer_data */ protected String templateName; protected TemplateRenderer templateRenderer = new DefaultTemplateRenderer(); protected ModelAdjuster modelAdjuster = new EmptyModelAdjuster(); protected GlobalRuntimeModelResolver globalRuntimeModelResolver = new EmptyGlobalRuntimeModelResolver(); protected LocaleProvider localeProvider = new EmptyLocaleProvider(); protected SoyMsgBundleResolver soyMsgBundleResolver = new EmptySoyMsgBundleResolver(); private String contentType = "text/html; charset=" + SoyViewConfigDefaults.DEFAULT_ENCODING; private String beanName = ""; public SoyView() { } @Override public void render(Map<String, ? extends Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception { Preconditions.checkNotNull(templateName, "templateName cannot be null"); Preconditions.checkNotNull(templateRenderer, "templateRenderer cannot be null"); Preconditions.checkNotNull(modelAdjuster, "modelAdjuster cannot be null"); Preconditions.checkNotNull(globalRuntimeModelResolver, "globalModelResolver cannot be null"); Preconditions.checkNotNull(localeProvider, "localeProvider cannot be null"); Preconditions.checkNotNull(soyMsgBundleResolver, "soyMsgBundleResolver cannot be null"); logger.debug("SoyView rendering with beanName:{} and model:{}", beanName, model); if (!compiledTemplates.isPresent()) { throw new IOException("Unable to render - compiled templates are empty!"); } final Object adjustedModel = modelAdjuster.adjust(model); final RenderRequest renderRequest = new RenderRequest.Builder() .compiledTemplates(compiledTemplates) .templateName(templateName) .model(adjustedModel) .request(request) .response(response) .globalRuntimeModel(globalRuntimeModelResolver.resolveData(request, response, model)) .soyMsgBundle(soyMsgBundleResolver.resolve(localeProvider.resolveLocale(request))) .soyView(this) .build(); templateRenderer.render(renderRequest); } @Override public String getContentType() { return contentType; } public void setContentType(String contentType) { this.contentType = contentType; } @Override public void setBeanName(String beanName) { this.beanName = beanName; } public String getBeanName() { return beanName; } public void setTemplateName(String templateName) { this.templateName = templateName; } public void setCompiledTemplates(Optional<SoyTofu> compiledTemplates) { this.compiledTemplates = compiledTemplates; } public void setTemplateRenderer(TemplateRenderer templateRenderer) { this.templateRenderer = templateRenderer; } public void setModelAdjuster(ModelAdjuster modelAdjuster) { this.modelAdjuster = modelAdjuster; } public void setGlobalRuntimeModelResolver(GlobalRuntimeModelResolver globalRuntimeModelResolver) { this.globalRuntimeModelResolver = globalRuntimeModelResolver; } public void setLocaleProvider(LocaleProvider localeProvider) { this.localeProvider = localeProvider; } public void setSoyMsgBundleResolver(SoyMsgBundleResolver soyMsgBundleResolver) { this.soyMsgBundleResolver = soyMsgBundleResolver; } }