001
014
015 package com.liferay.util.bridges.freemarker;
016
017 import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter;
018 import com.liferay.portal.kernel.log.Log;
019 import com.liferay.portal.kernel.log.LogFactoryUtil;
020 import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet;
021 import com.liferay.portal.kernel.template.Template;
022 import com.liferay.portal.kernel.template.TemplateConstants;
023 import com.liferay.portal.kernel.template.TemplateException;
024 import com.liferay.portal.kernel.template.TemplateManager;
025 import com.liferay.portal.kernel.template.TemplateManagerUtil;
026 import com.liferay.portal.kernel.template.TemplateResource;
027 import com.liferay.portal.kernel.template.TemplateResourceLoaderUtil;
028 import com.liferay.portal.kernel.util.UnsyncPrintWriterPool;
029 import com.liferay.portal.util.PortalUtil;
030
031 import java.io.IOException;
032 import java.io.Writer;
033
034 import javax.portlet.MimeResponse;
035 import javax.portlet.PortletContext;
036 import javax.portlet.PortletException;
037 import javax.portlet.PortletRequest;
038 import javax.portlet.PortletResponse;
039
040
043 public class FreeMarkerPortlet extends MVCPortlet {
044
045 @Override
046 public void destroy() {
047 super.destroy();
048
049 Class<?> clazz = getClass();
050
051 TemplateManagerUtil.destroy(clazz.getClassLoader());
052 }
053
054 @Override
055 protected void include(
056 String path, PortletRequest portletRequest,
057 PortletResponse portletResponse, String lifecycle)
058 throws IOException, PortletException {
059
060 PortletContext portletContext = getPortletContext();
061
062 String servletContextName = portletContext.getPortletContextName();
063
064 String resourcePath = servletContextName.concat(
065 TemplateConstants.SERVLET_SEPARATOR).concat(path);
066
067 boolean resourceExists = false;
068
069 try {
070 resourceExists = TemplateResourceLoaderUtil.hasTemplateResource(
071 TemplateConstants.LANG_TYPE_FTL, resourcePath);
072 }
073 catch (TemplateException te) {
074 throw new IOException(te);
075 }
076
077 if (!resourceExists) {
078 _log.error(path + " is not a valid include");
079 }
080 else {
081 try {
082 TemplateResource templateResource =
083 TemplateResourceLoaderUtil.getTemplateResource(
084 TemplateConstants.LANG_TYPE_FTL, resourcePath);
085
086 TemplateManager templateManager =
087 TemplateManagerUtil.getTemplateManager(
088 TemplateConstants.LANG_TYPE_FTL);
089
090 Template template = TemplateManagerUtil.getTemplate(
091 TemplateConstants.LANG_TYPE_FTL, templateResource, false);
092
093 templateManager.addTaglibApplication(
094 template, "Application", getServletContext());
095 templateManager.addTaglibFactory(
096 template, "PortletJspTagLibs", getServletContext());
097 templateManager.addTaglibRequest(
098 template, "Request",
099 PortalUtil.getHttpServletRequest(portletRequest),
100 PortalUtil.getHttpServletResponse(portletResponse));
101
102 template.put("portletContext", getPortletContext());
103 template.put(
104 "userInfo",
105 portletRequest.getAttribute(PortletRequest.USER_INFO));
106
107 Writer writer = null;
108
109 if (portletResponse instanceof MimeResponse) {
110 MimeResponse mimeResponse = (MimeResponse)portletResponse;
111
112 writer = UnsyncPrintWriterPool.borrow(
113 mimeResponse.getWriter());
114 }
115 else {
116 writer = new UnsyncStringWriter();
117 }
118
119 template.processTemplate(writer);
120 }
121 catch (Exception e) {
122 throw new PortletException(e);
123 }
124 }
125
126 if (clearRequestParameters) {
127 if (lifecycle.equals(PortletRequest.RENDER_PHASE)) {
128 portletResponse.setProperty("clear-request-parameters", "true");
129 }
130 }
131 }
132
133 private static final Log _log = LogFactoryUtil.getLog(
134 FreeMarkerPortlet.class);
135
136 }