001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portal.model.impl;
016    
017    import com.liferay.portal.kernel.configuration.Filter;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.io.unsync.UnsyncStringWriter;
020    import com.liferay.portal.kernel.model.Layout;
021    import com.liferay.portal.kernel.model.LayoutConstants;
022    import com.liferay.portal.kernel.model.LayoutTypeController;
023    import com.liferay.portal.kernel.servlet.DirectRequestDispatcherFactoryUtil;
024    import com.liferay.portal.kernel.util.GetterUtil;
025    import com.liferay.portal.kernel.util.ParamUtil;
026    import com.liferay.portal.kernel.util.PropsKeys;
027    import com.liferay.portal.kernel.util.StringUtil;
028    import com.liferay.portal.kernel.util.Validator;
029    import com.liferay.portal.kernel.util.WebKeys;
030    import com.liferay.portal.struts.StrutsUtil;
031    import com.liferay.portal.util.PropsUtil;
032    import com.liferay.taglib.servlet.PipingServletResponse;
033    
034    import java.util.Collection;
035    import java.util.Locale;
036    import java.util.Map;
037    
038    import javax.servlet.RequestDispatcher;
039    import javax.servlet.ServletContext;
040    import javax.servlet.http.HttpServletRequest;
041    import javax.servlet.http.HttpServletResponse;
042    
043    /**
044     * @author Raymond Aug??
045     */
046    public class LayoutTypeControllerImpl implements LayoutTypeController {
047    
048            public LayoutTypeControllerImpl(String type) {
049                    _type = type;
050    
051                    Filter filter = new Filter(type);
052    
053                    _browsable = GetterUtil.getBoolean(
054                            PropsUtil.get(PropsKeys.LAYOUT_BROWSABLE, filter), true);
055                    _configurationActionDelete = StringUtil.split(
056                            GetterUtil.getString(
057                                    PropsUtil.get(
058                                            PropsKeys.LAYOUT_CONFIGURATION_ACTION_DELETE, filter)));
059                    _configurationActionUpdate = StringUtil.split(
060                            GetterUtil.getString(
061                                    PropsUtil.get(
062                                            PropsKeys.LAYOUT_CONFIGURATION_ACTION_UPDATE, filter)));
063                    _editPage = GetterUtil.getString(
064                            PropsUtil.get(PropsKeys.LAYOUT_EDIT_PAGE, filter));
065                    _firstPageable = GetterUtil.getBoolean(
066                            PropsUtil.get(PropsKeys.LAYOUT_FIRST_PAGEABLE, filter));
067                    _fullPageDisplayable = GetterUtil.getBoolean(
068                            PropsUtil.get(PropsKeys.FULL_PAGE_DISPLAYABLE, filter));
069                    _parentable = GetterUtil.getBoolean(
070                            PropsUtil.get(PropsKeys.LAYOUT_PARENTABLE, filter), true);
071                    _sitemapable = GetterUtil.getBoolean(
072                            PropsUtil.get(PropsKeys.LAYOUT_SITEMAPABLE, filter), true);
073                    _url = GetterUtil.getString(
074                            PropsUtil.get(PropsKeys.LAYOUT_URL, filter));
075                    _urlFriendliable = GetterUtil.getBoolean(
076                            PropsUtil.get(PropsKeys.LAYOUT_URL_FRIENDLIABLE, filter), true);
077                    _viewPage = GetterUtil.getString(
078                            PropsUtil.get(PropsKeys.LAYOUT_VIEW_PAGE, filter));
079            }
080    
081            @Override
082            public String[] getConfigurationActionDelete() {
083                    return _configurationActionDelete;
084            }
085    
086            @Override
087            public String[] getConfigurationActionUpdate() {
088                    return _configurationActionUpdate;
089            }
090    
091            @Override
092            public String getType() {
093                    return _type;
094            }
095    
096            @Override
097            public String getURL() {
098                    return _url;
099            }
100    
101            public String getViewPath(String portletId) {
102                    String path = StrutsUtil.TEXT_HTML_DIR;
103    
104                    // Manually check the p_p_id. See LEP-1724.
105    
106                    if (Validator.isNotNull(portletId)) {
107                            if (_type.equals(LayoutConstants.TYPE_PANEL)) {
108                                    path += "/portal/layout/view/panel.jsp";
109                            }
110                            else {
111                                    path += "/portal/layout/view/portlet.jsp";
112                            }
113                    }
114                    else {
115                            path = StrutsUtil.TEXT_HTML_DIR + _viewPage;
116                    }
117    
118                    return path;
119            }
120    
121            @Override
122            public String includeEditContent(
123                            HttpServletRequest request, HttpServletResponse response,
124                            Layout layout)
125                    throws Exception {
126    
127                    ServletContext servletContext = (ServletContext)request.getAttribute(
128                            WebKeys.CTX);
129    
130                    RequestDispatcher requestDispatcher =
131                            DirectRequestDispatcherFactoryUtil.getRequestDispatcher(
132                                    servletContext, getEditPage());
133    
134                    UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
135    
136                    PipingServletResponse pipingServletResponse = new PipingServletResponse(
137                            response, unsyncStringWriter);
138    
139                    requestDispatcher.include(request, pipingServletResponse);
140    
141                    return unsyncStringWriter.toString();
142            }
143    
144            @Override
145            public boolean includeLayoutContent(
146                            HttpServletRequest request, HttpServletResponse response,
147                            Layout layout)
148                    throws Exception {
149    
150                    ServletContext servletContext = (ServletContext)request.getAttribute(
151                            WebKeys.CTX);
152    
153                    String portletId = ParamUtil.getString(request, "p_p_id");
154    
155                    String path = getViewPath(portletId);
156    
157                    RequestDispatcher requestDispatcher =
158                            DirectRequestDispatcherFactoryUtil.getRequestDispatcher(
159                                    servletContext, path);
160    
161                    UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
162    
163                    PipingServletResponse pipingServletResponse = new PipingServletResponse(
164                            response, unsyncStringWriter);
165    
166                    String contentType = pipingServletResponse.getContentType();
167    
168                    requestDispatcher.include(request, pipingServletResponse);
169    
170                    if (contentType != null) {
171                            response.setContentType(contentType);
172                    }
173    
174                    request.setAttribute(
175                            WebKeys.LAYOUT_CONTENT, unsyncStringWriter.getStringBundler());
176    
177                    return false;
178            }
179    
180            @Override
181            public boolean isBrowsable() {
182                    return _browsable;
183            }
184    
185            @Override
186            public boolean isCheckLayoutViewPermission() {
187                    return true;
188            }
189    
190            @Override
191            public boolean isFirstPageable() {
192                    return _firstPageable;
193            }
194    
195            @Override
196            public boolean isFullPageDisplayable() {
197                    return _fullPageDisplayable;
198            }
199    
200            @Override
201            public boolean isInstanceable() {
202                    return true;
203            }
204    
205            @Override
206            public boolean isParentable() {
207                    return _parentable;
208            }
209    
210            @Override
211            public boolean isSitemapable() {
212                    return _sitemapable;
213            }
214    
215            @Override
216            public boolean isURLFriendliable() {
217                    return _urlFriendliable;
218            }
219    
220            @Override
221            public boolean matches(
222                    HttpServletRequest request, String friendlyURL, Layout layout) {
223    
224                    try {
225                            Map<Locale, String> friendlyURLMap = layout.getFriendlyURLMap();
226    
227                            Collection<String> values = friendlyURLMap.values();
228    
229                            return values.contains(friendlyURL);
230                    }
231                    catch (SystemException se) {
232                            throw new RuntimeException(se);
233                    }
234            }
235    
236            protected String getEditPage() {
237                    return StrutsUtil.TEXT_HTML_DIR + _editPage;
238            }
239    
240            private final boolean _browsable;
241            private final String[] _configurationActionDelete;
242            private final String[] _configurationActionUpdate;
243            private final String _editPage;
244            private final boolean _firstPageable;
245            private final boolean _fullPageDisplayable;
246            private final boolean _parentable;
247            private final boolean _sitemapable;
248            private final String _type;
249            private final String _url;
250            private final boolean _urlFriendliable;
251            private final String _viewPage;
252    
253    }