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.servlet.BrowserSnifferUtil;
021    import com.liferay.portal.kernel.servlet.DirectRequestDispatcherFactoryUtil;
022    import com.liferay.portal.kernel.util.GetterUtil;
023    import com.liferay.portal.kernel.util.ParamUtil;
024    import com.liferay.portal.kernel.util.PropsKeys;
025    import com.liferay.portal.kernel.util.StringUtil;
026    import com.liferay.portal.kernel.util.Validator;
027    import com.liferay.portal.kernel.util.WebKeys;
028    import com.liferay.portal.model.Layout;
029    import com.liferay.portal.model.LayoutConstants;
030    import com.liferay.portal.model.LayoutTypeController;
031    import com.liferay.portal.struts.StrutsUtil;
032    import com.liferay.portal.util.PropsUtil;
033    import com.liferay.taglib.servlet.PipingServletResponse;
034    
035    import java.util.Collection;
036    import java.util.Locale;
037    import java.util.Map;
038    
039    import javax.servlet.RequestDispatcher;
040    import javax.servlet.ServletContext;
041    import javax.servlet.http.HttpServletRequest;
042    import javax.servlet.http.HttpServletResponse;
043    
044    /**
045     * @author Raymond Aug??
046     */
047    public class LayoutTypeControllerImpl implements LayoutTypeController {
048    
049            public LayoutTypeControllerImpl(String type) {
050                    _type = type;
051    
052                    Filter filter = new Filter(type);
053    
054                    _browsable = GetterUtil.getBoolean(
055                            PropsUtil.get(PropsKeys.LAYOUT_BROWSABLE, filter), true);
056                    _configurationActionDelete = StringUtil.split(
057                            GetterUtil.getString(
058                                    PropsUtil.get(
059                                            PropsKeys.LAYOUT_CONFIGURATION_ACTION_DELETE, filter)));
060                    _configurationActionUpdate = StringUtil.split(
061                            GetterUtil.getString(
062                                    PropsUtil.get(
063                                            PropsKeys.LAYOUT_CONFIGURATION_ACTION_UPDATE, filter)));
064                    _editPage = GetterUtil.getString(
065                            PropsUtil.get(PropsKeys.LAYOUT_EDIT_PAGE, filter));
066                    _firstPageable = GetterUtil.getBoolean(
067                            PropsUtil.get(PropsKeys.LAYOUT_FIRST_PAGEABLE, filter));
068                    _fullPageDisplayable = GetterUtil.getBoolean(
069                            PropsUtil.get(PropsKeys.FULL_PAGE_DISPLAYABLE, filter));
070                    _parentable = GetterUtil.getBoolean(
071                            PropsUtil.get(PropsKeys.LAYOUT_PARENTABLE, filter), true);
072                    _sitemapable = GetterUtil.getBoolean(
073                            PropsUtil.get(PropsKeys.LAYOUT_SITEMAPABLE, filter), true);
074                    _url = GetterUtil.getString(
075                            PropsUtil.get(PropsKeys.LAYOUT_URL, filter));
076                    _urlFriendliable = GetterUtil.getBoolean(
077                            PropsUtil.get(PropsKeys.LAYOUT_URL_FRIENDLIABLE, filter), true);
078                    _viewPage = GetterUtil.getString(
079                            PropsUtil.get(PropsKeys.LAYOUT_VIEW_PAGE, filter));
080            }
081    
082            @Override
083            public String[] getConfigurationActionDelete() {
084                    return _configurationActionDelete;
085            }
086    
087            @Override
088            public String[] getConfigurationActionUpdate() {
089                    return _configurationActionUpdate;
090            }
091    
092            @Override
093            public String getType() {
094                    return _type;
095            }
096    
097            @Override
098            public String getURL() {
099                    return _url;
100            }
101    
102            public String getViewPath(String portletId, boolean wap) {
103                    String path = StrutsUtil.TEXT_HTML_DIR;
104    
105                    if (wap) {
106                            path = StrutsUtil.TEXT_WAP_DIR;
107                    }
108    
109                    // Manually check the p_p_id. See LEP-1724.
110    
111                    if (Validator.isNotNull(portletId)) {
112                            if (_type.equals(LayoutConstants.TYPE_PANEL)) {
113                                    path += "/portal/layout/view/panel.jsp";
114                            }
115                            else {
116                                    path += "/portal/layout/view/portlet.jsp";
117                            }
118                    }
119                    else {
120                            path = StrutsUtil.TEXT_HTML_DIR + _viewPage;
121                    }
122    
123                    return path;
124            }
125    
126            @Override
127            public String includeEditContent(
128                            HttpServletRequest request, HttpServletResponse response,
129                            Layout layout)
130                    throws Exception {
131    
132                    ServletContext servletContext = (ServletContext)request.getAttribute(
133                            WebKeys.CTX);
134    
135                    RequestDispatcher requestDispatcher =
136                            DirectRequestDispatcherFactoryUtil.getRequestDispatcher(
137                                    servletContext, getEditPage());
138    
139                    UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
140    
141                    PipingServletResponse pipingServletResponse = new PipingServletResponse(
142                            response, unsyncStringWriter);
143    
144                    requestDispatcher.include(request, pipingServletResponse);
145    
146                    return unsyncStringWriter.toString();
147            }
148    
149            @Override
150            public boolean includeLayoutContent(
151                            HttpServletRequest request, HttpServletResponse response,
152                            Layout layout)
153                    throws Exception {
154    
155                    ServletContext servletContext = (ServletContext)request.getAttribute(
156                            WebKeys.CTX);
157    
158                    String portletId = ParamUtil.getString(request, "p_p_id");
159    
160                    String path = getViewPath(portletId, BrowserSnifferUtil.isWap(request));
161    
162                    RequestDispatcher requestDispatcher =
163                            DirectRequestDispatcherFactoryUtil.getRequestDispatcher(
164                                    servletContext, path);
165    
166                    UnsyncStringWriter unsyncStringWriter = new UnsyncStringWriter();
167    
168                    PipingServletResponse pipingServletResponse = new PipingServletResponse(
169                            response, unsyncStringWriter);
170    
171                    String contentType = pipingServletResponse.getContentType();
172    
173                    requestDispatcher.include(request, pipingServletResponse);
174    
175                    if (contentType != null) {
176                            response.setContentType(contentType);
177                    }
178    
179                    request.setAttribute(
180                            WebKeys.LAYOUT_CONTENT, unsyncStringWriter.getStringBundler());
181    
182                    return false;
183            }
184    
185            @Override
186            public boolean isBrowsable() {
187                    return _browsable;
188            }
189    
190            @Override
191            public boolean isCheckLayoutViewPermission() {
192                    return true;
193            }
194    
195            @Override
196            public boolean isFirstPageable() {
197                    return _firstPageable;
198            }
199    
200            @Override
201            public boolean isFullPageDisplayable() {
202                    return _fullPageDisplayable;
203            }
204    
205            @Override
206            public boolean isInstanceable() {
207                    return true;
208            }
209    
210            @Override
211            public boolean isParentable() {
212                    return _parentable;
213            }
214    
215            @Override
216            public boolean isSitemapable() {
217                    return _sitemapable;
218            }
219    
220            @Override
221            public boolean isURLFriendliable() {
222                    return _urlFriendliable;
223            }
224    
225            @Override
226            public boolean matches(
227                    HttpServletRequest request, String friendlyURL, Layout layout) {
228    
229                    try {
230                            Map<Locale, String> friendlyURLMap = layout.getFriendlyURLMap();
231    
232                            Collection<String> values = friendlyURLMap.values();
233    
234                            return values.contains(friendlyURL);
235                    }
236                    catch (SystemException e) {
237                            throw new RuntimeException(e);
238                    }
239            }
240    
241            protected String getEditPage() {
242                    return StrutsUtil.TEXT_HTML_DIR + _editPage;
243            }
244    
245            private final boolean _browsable;
246            private final String[] _configurationActionDelete;
247            private final String[] _configurationActionUpdate;
248            private final String _editPage;
249            private final boolean _firstPageable;
250            private final boolean _fullPageDisplayable;
251            private final boolean _parentable;
252            private final boolean _sitemapable;
253            private final String _type;
254            private final String _url;
255            private final boolean _urlFriendliable;
256            private final String _viewPage;
257    
258    }