/** * Copyright (c) 2011-2012, James Zhan 詹波 (jfinal@126.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jfinal.render; import java.io.File; import java.util.Locale; import javax.servlet.ServletContext; import com.jfinal.config.Constants; import com.jfinal.util.PathUtil; import static com.jfinal.core.Const.DEFAULT_FILE_RENDER_BASE_PATH; /** * RenderFactory. */ public class RenderFactory { private Constants constants; private static IMainRenderFactory mainRenderFactory; private static ServletContext servletContext; static ServletContext getServletContext() { return servletContext; } // singleton private static final RenderFactory me = new RenderFactory(); private RenderFactory() { } public static RenderFactory me() { return me; } public static void setMainRenderFactory(IMainRenderFactory mainRenderFactory) { if (mainRenderFactory != null) RenderFactory.mainRenderFactory = mainRenderFactory; } public void init(Constants constants, ServletContext servletContext) { this.constants = constants; RenderFactory.servletContext = servletContext; // init Render Render.init(constants.getEncoding(), constants.getDevMode()); initFreeMarkerRender(servletContext); initVelocityRender(servletContext); initFileRender(servletContext); // create mainRenderFactory if (mainRenderFactory == null) { ViewType defaultViewType = constants.getViewType(); if (defaultViewType == ViewType.FREE_MARKER) mainRenderFactory = new FreeMarkerRenderFactory(); else if (defaultViewType == ViewType.JSP) mainRenderFactory = new JspRenderFactory(); else if (defaultViewType == ViewType.VELOCITY) mainRenderFactory = new VelocityRenderFactory(); else throw new RuntimeException("View Type can not be null."); } } private void initFreeMarkerRender(ServletContext servletContext) { try { Class.forName("freemarker.template.Template"); // detect freemarker.jar FreeMarkerRender.init(servletContext, Locale.getDefault(), constants.getFreeMarkerTemplateUpdateDelay()); } catch (ClassNotFoundException e) { // System.out.println("freemarker can not be supported!"); } } private void initVelocityRender(ServletContext servletContext) { try { Class.forName("org.apache.velocity.VelocityContext"); VelocityRender.init(servletContext); } catch (ClassNotFoundException e) { // System.out.println("Velocity can not be supported!"); } } private void initFileRender(ServletContext servletContext) { FileRender.init(getFileRenderPath(), servletContext); } private String getFileRenderPath() { String result = constants.getFileRenderPath(); if (result == null) { result = PathUtil.getWebRootPath() + DEFAULT_FILE_RENDER_BASE_PATH; } if (!result.endsWith(File.separator) && !result.endsWith("/")) { result = result + File.separator; } return result; } /** * Return Render by default ViewType which config in JFinalConfig */ public Render getRender(String view) { return mainRenderFactory.getRender(view); } public Render getFreeMarkerRender(String view) { return new FreeMarkerRender(view); } public Render getJspRender(String view) { return new JspRender(view); } public Render getVelocityRender(String view) { return new VelocityRender(view); } public Render getJsonRender() { return new JsonRender(); } public Render getJsonRender(String key, Object value) { return new JsonRender(key, value); } public Render getJsonRender(String[] attrs) { return new JsonRender(attrs); } public Render getTextRender(String text) { return new TextRender(text); } public Render getTextRender(String text, String contentType) { return new TextRender(text, contentType); } public Render getDefaultRender(String view) { ViewType viewType = constants.getViewType(); if (viewType == ViewType.FREE_MARKER) { return new FreeMarkerRender(view + constants.getFreeMarkerViewExtension()); } else if (viewType == ViewType.JSP) { return new JspRender(view + constants.getJspViewExtension()); } else if (viewType == ViewType.VELOCITY) { return new VelocityRender(view + constants.getVelocityViewExtension()); } else { return mainRenderFactory.getRender(view + mainRenderFactory.getViewExtension()); } } public Render getError404Render() { String error404View = constants.getError404View(); return error404View != null ? new Error404Render(error404View) : new Error404Render(); } public Render getError404Render(String view) { return new Error404Render(view); } public Render getError500Render() { String error500View = constants.getError500View(); return error500View != null ? new Error500Render(error500View) : new Error500Render(); } public Render getError500Render(String view) { return new Error500Render(view); } public Render getFileRender(String fileName) { return new FileRender(fileName); } public Render getFileRender(File file) { return new FileRender(file); } public Render getRedirectRender(String url) { return new RedirectRender(url); } public Render getRedirectRender(String url, boolean withOutQueryString) { return new RedirectRender(url, withOutQueryString); } public Render getRedirect301Render(String url) { return new Redirect301Render(url); } public Render getRedirect301Render(String url, boolean withOutQueryString) { return new Redirect301Render(url, withOutQueryString); } public Render getNullRender() { return NullRender.me(); } public Render getJavascriptRender(String jsText) { return new JavascriptRender(jsText); } public Render getHtmlRender(String htmlText) { return new HtmlRender(htmlText); } // -------- private static final class FreeMarkerRenderFactory implements IMainRenderFactory { public Render getRender(String view) { return new FreeMarkerRender(view); } public String getViewExtension() { return ".html"; } } private static final class JspRenderFactory implements IMainRenderFactory { public Render getRender(String view) { return new JspRender(view); } public String getViewExtension() { return ".jsp"; } } private static final class VelocityRenderFactory implements IMainRenderFactory { public Render getRender(String view) { return new VelocityRender(view); } public String getViewExtension() { return ".html"; } } }