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.addTaglibSupport(
094 template, PortalUtil.getHttpServletRequest(portletRequest),
095 PortalUtil.getHttpServletResponse(portletResponse));
096
097 template.put("portletContext", getPortletContext());
098 template.put(
099 "userInfo",
100 portletRequest.getAttribute(PortletRequest.USER_INFO));
101
102 Writer writer = null;
103
104 if (portletResponse instanceof MimeResponse) {
105 MimeResponse mimeResponse = (MimeResponse)portletResponse;
106
107 writer = UnsyncPrintWriterPool.borrow(
108 mimeResponse.getWriter());
109 }
110 else {
111 writer = new UnsyncStringWriter();
112 }
113
114 template.processTemplate(writer);
115 }
116 catch (Exception e) {
117 throw new PortletException(e);
118 }
119 }
120
121 if (clearRequestParameters) {
122 if (lifecycle.equals(PortletRequest.RENDER_PHASE)) {
123 portletResponse.setProperty("clear-request-parameters", "true");
124 }
125 }
126 }
127
128 private static final Log _log = LogFactoryUtil.getLog(
129 FreeMarkerPortlet.class);
130
131 }