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.template.Template;
021 import com.liferay.portal.kernel.template.TemplateContextType;
022 import com.liferay.portal.kernel.template.TemplateException;
023 import com.liferay.portal.kernel.template.TemplateManager;
024 import com.liferay.portal.kernel.template.TemplateManagerUtil;
025 import com.liferay.portal.kernel.template.TemplateResource;
026 import com.liferay.portal.kernel.template.TemplateResourceLoaderUtil;
027 import com.liferay.portal.kernel.template.TemplateTaglibSupportProvider;
028 import com.liferay.portal.kernel.util.ServiceLoader;
029 import com.liferay.portal.kernel.util.UnsyncPrintWriterPool;
030 import com.liferay.util.bridges.mvc.MVCPortlet;
031
032 import java.io.IOException;
033 import java.io.Writer;
034
035 import java.util.List;
036
037 import javax.portlet.MimeResponse;
038 import javax.portlet.PortletContext;
039 import javax.portlet.PortletException;
040 import javax.portlet.PortletRequest;
041 import javax.portlet.PortletResponse;
042
043
046 public class FreeMarkerPortlet extends MVCPortlet {
047
048 @Override
049 public void destroy() {
050 super.destroy();
051
052 Class<?> clazz = getClass();
053
054 TemplateManagerUtil.destroy(clazz.getClassLoader());
055 }
056
057 protected TemplateTaglibSupportProvider getTaglibSupportProvider()
058 throws Exception {
059
060 if (_templateTaglibSupportProvider != null) {
061 return _templateTaglibSupportProvider;
062 }
063
064 List<TemplateTaglibSupportProvider> templateTaglibSupportProviders =
065 ServiceLoader.load(TemplateTaglibSupportProvider.class);
066
067 if (!templateTaglibSupportProviders.isEmpty()) {
068 _templateTaglibSupportProvider = templateTaglibSupportProviders.get(
069 0);
070 }
071
072 return _templateTaglibSupportProvider;
073 }
074
075 @Override
076 protected void include(
077 String path, PortletRequest portletRequest,
078 PortletResponse portletResponse, String lifecycle)
079 throws IOException, PortletException {
080
081 PortletContext portletContext = getPortletContext();
082
083 String servletContextName = portletContext.getPortletContextName();
084
085 String resourcePath = servletContextName.concat(
086 TemplateResource.SERVLET_SEPARATOR).concat(path);
087
088 boolean resourceExists = false;
089
090 try {
091 resourceExists = TemplateResourceLoaderUtil.hasTemplateResource(
092 TemplateManager.FREEMARKER, resourcePath);
093 }
094 catch (TemplateException te) {
095 throw new IOException(te.getMessage());
096 }
097
098 if (!resourceExists) {
099 _log.error(path + " is not a valid include");
100 }
101 else {
102 try {
103 TemplateResource templateResource =
104 TemplateResourceLoaderUtil.getTemplateResource(
105 TemplateManager.FREEMARKER, resourcePath);
106
107 Template template = TemplateManagerUtil.getTemplate(
108 TemplateManager.FREEMARKER, templateResource,
109 TemplateContextType.CLASS_LOADER);
110
111 TemplateTaglibSupportProvider templateTaglibSupportProvider =
112 getTaglibSupportProvider();
113
114 if (templateTaglibSupportProvider != null) {
115 templateTaglibSupportProvider.addTaglibSupport(
116 template, servletContextName, portletRequest,
117 portletResponse);
118 }
119
120 template.put("portletContext", getPortletContext());
121 template.put(
122 "userInfo",
123 portletRequest.getAttribute(PortletRequest.USER_INFO));
124
125 Writer writer = null;
126
127 if (portletResponse instanceof MimeResponse) {
128 MimeResponse mimeResponse = (MimeResponse)portletResponse;
129
130 writer = UnsyncPrintWriterPool.borrow(
131 mimeResponse.getWriter());
132 }
133 else {
134 writer = new UnsyncStringWriter();
135 }
136
137 template.processTemplate(writer);
138 }
139 catch (Exception e) {
140 throw new PortletException(e);
141 }
142 }
143
144 if (clearRequestParameters) {
145 if (lifecycle.equals(PortletRequest.RENDER_PHASE)) {
146 portletResponse.setProperty("clear-request-parameters", "true");
147 }
148 }
149 }
150
151 private static Log _log = LogFactoryUtil.getLog(FreeMarkerPortlet.class);
152
153 private TemplateTaglibSupportProvider _templateTaglibSupportProvider;
154
155 }