001    package com.khubla.pragmatach.plugin.freemarker;
002    
003    import java.io.InputStream;
004    import java.io.InputStreamReader;
005    
006    import com.khubla.pragmatach.framework.api.PragmatachException;
007    import com.khubla.pragmatach.framework.api.Request;
008    import com.khubla.pragmatach.framework.api.Response;
009    import com.khubla.pragmatach.framework.controller.impl.AbstractController;
010    import com.khubla.pragmatach.framework.controller.impl.FormPostBeanBoundController;
011    
012    import freemarker.template.Configuration;
013    import freemarker.template.Template;
014    
015    /**
016     * @author tome
017     */
018    public class FreemarkerController extends FormPostBeanBoundController {
019            /**
020             * ctor
021             */
022            public FreemarkerController() {
023            }
024    
025            /**
026             * freemarker config
027             */
028            private Configuration getConfiguration() {
029                    final Configuration configuration = new Configuration();
030                    configuration.setLocalizedLookup(false);
031                    configuration
032                                    .setTemplateExceptionHandler(new TemplateExceptionHandlerImpl());
033                    final Request request = getRequest();
034                    if (null != request) {
035                            final PragmatachTemplateLoader pragmatachTemplateLoader = new PragmatachTemplateLoader(
036                                            getRequest().getServletContext());
037                            configuration.setTemplateLoader(pragmatachTemplateLoader);
038                    } else {
039                            throw new RuntimeException();
040                    }
041                    return configuration;
042            }
043    
044            /**
045             * get the Freemarker Template
046             */
047            private Template getFreemarkerTemplate() throws PragmatachException {
048                    try {
049                            final String templateName = getTemplateName();
050                            if (null != templateName) {
051                                    final InputStream templateInputStream = getResource(templateName);
052                                    if (null != templateInputStream) {
053                                            return new Template(templateName, new InputStreamReader(
054                                                            templateInputStream, "UTF-8"), getConfiguration());
055                                    } else {
056                                            throw new Exception("Unable to load template '"
057                                                            + templateName + "'");
058                                    }
059                            } else {
060                                    throw new PragmatachException(
061                                                    "Unable to get template name for controller '"
062                                                                    + AbstractController.getControllerName(this)
063                                                                    + "'. Does it have an @View annotation?");
064                            }
065                    } catch (final Exception e) {
066                            throw new PragmatachException("Exception in getTemplate", e);
067                    }
068            }
069    
070            /**
071             * render
072             */
073            public Response render() throws PragmatachException {
074                    try {
075                            final Template template = getFreemarkerTemplate();
076                            return new FreemarkerResponse(getCacheHeaders(), template,
077                                            getTemplateContext());
078                    } catch (final Exception e) {
079                            throw new PragmatachException("Exception in render", e);
080                    }
081            }
082    
083            /**
084             * render
085             */
086            public Response renderTemplate(String templateString)
087                            throws PragmatachException {
088                    try {
089                            final Template template = new Template("/", templateString,
090                                            getConfiguration());
091                            return new FreemarkerResponse(getCacheHeaders(), template,
092                                            getTemplateContext());
093                    } catch (final Exception e) {
094                            throw new PragmatachException("Exception in render", e);
095                    }
096            }
097    }