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.portlet.myplaces.action;
016    
017    import com.liferay.portal.NoSuchLayoutSetException;
018    import com.liferay.portal.kernel.servlet.SessionErrors;
019    import com.liferay.portal.kernel.util.GetterUtil;
020    import com.liferay.portal.kernel.util.ParamUtil;
021    import com.liferay.portal.kernel.util.Validator;
022    import com.liferay.portal.model.Layout;
023    import com.liferay.portal.model.LayoutConstants;
024    import com.liferay.portal.security.permission.ActionKeys;
025    import com.liferay.portal.security.permission.PermissionChecker;
026    import com.liferay.portal.service.LayoutLocalServiceUtil;
027    import com.liferay.portal.service.LayoutSetLocalServiceUtil;
028    import com.liferay.portal.service.permission.LayoutPermissionUtil;
029    import com.liferay.portal.struts.PortletAction;
030    import com.liferay.portal.theme.ThemeDisplay;
031    import com.liferay.portal.util.PortalUtil;
032    import com.liferay.portal.util.WebKeys;
033    
034    import java.util.List;
035    
036    import javax.portlet.ActionRequest;
037    import javax.portlet.ActionResponse;
038    import javax.portlet.PortletConfig;
039    import javax.portlet.RenderRequest;
040    import javax.portlet.RenderResponse;
041    
042    import javax.servlet.http.HttpServletRequest;
043    import javax.servlet.http.HttpServletResponse;
044    
045    import org.apache.struts.action.ActionForm;
046    import org.apache.struts.action.ActionForward;
047    import org.apache.struts.action.ActionMapping;
048    
049    /**
050     * @author Brian Wing Shun Chan
051     * @author Hugo Huijser
052     */
053    public class ViewAction extends PortletAction {
054    
055            @Override
056            public void processAction(
057                            ActionMapping actionMapping, ActionForm actionForm,
058                            PortletConfig portletConfig, ActionRequest actionRequest,
059                            ActionResponse actionResponse)
060                    throws Exception {
061    
062                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
063                            WebKeys.THEME_DISPLAY);
064    
065                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
066                    String privateLayoutParam = actionRequest.getParameter("privateLayout");
067    
068                    List<Layout> layouts = getLayouts(groupId, privateLayoutParam);
069    
070                    if (layouts.isEmpty()) {
071                            SessionErrors.add(
072                                    actionRequest, NoSuchLayoutSetException.class.getName(),
073                                    new NoSuchLayoutSetException(
074                                            "{groupId=" + groupId + ",privateLayout=" +
075                                                    privateLayoutParam + "}"));
076                    }
077    
078                    String redirect = getRedirect(
079                            themeDisplay, layouts, groupId, privateLayoutParam);
080    
081                    if (Validator.isNull(redirect)) {
082                            redirect = PortalUtil.escapeRedirect(
083                                    ParamUtil.getString(actionRequest, "redirect"));
084                    }
085    
086                    if (Validator.isNotNull(redirect)) {
087                            actionResponse.sendRedirect(redirect);
088                    }
089            }
090    
091            @Override
092            public ActionForward render(
093                            ActionMapping actionMapping, ActionForm actionForm,
094                            PortletConfig portletConfig, RenderRequest renderRequest,
095                            RenderResponse renderResponse)
096                    throws Exception {
097    
098                    return actionMapping.findForward("portlet.my_sites.view");
099            }
100    
101            @Override
102            public ActionForward strutsExecute(
103                            ActionMapping actionMapping, ActionForm actionForm,
104                            HttpServletRequest request, HttpServletResponse response)
105                    throws Exception {
106    
107                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
108                            WebKeys.THEME_DISPLAY);
109    
110                    long groupId = ParamUtil.getLong(request, "groupId");
111                    String privateLayoutParam = request.getParameter("privateLayout");
112    
113                    List<Layout> layouts = getLayouts(groupId, privateLayoutParam);
114    
115                    if (layouts.isEmpty()) {
116                            SessionErrors.add(
117                                    request, NoSuchLayoutSetException.class.getName(),
118                                    new NoSuchLayoutSetException(
119                                            "{groupId=" + groupId + ",privateLayout=" +
120                                                    privateLayoutParam + "}"));
121                    }
122    
123                    String redirect = getRedirect(
124                            themeDisplay, layouts, groupId, privateLayoutParam);
125    
126                    if (Validator.isNull(redirect)) {
127                            redirect = ParamUtil.getString(request, "redirect");
128                    }
129    
130                    response.sendRedirect(redirect);
131    
132                    return null;
133            }
134    
135            protected List<Layout> getLayouts(long groupId, boolean privateLayout)
136                    throws Exception {
137    
138                    return LayoutLocalServiceUtil.getLayouts(
139                            groupId, privateLayout, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
140            }
141    
142            protected List<Layout> getLayouts(long groupId, String privateLayoutParam)
143                    throws Exception {
144    
145                    List<Layout> layouts = null;
146    
147                    boolean privateLayout = false;
148    
149                    if (Validator.isNull(privateLayoutParam)) {
150                            layouts = getLayouts(groupId, false);
151    
152                            if (layouts.isEmpty()) {
153                                    layouts = getLayouts(groupId, true);
154                            }
155                    }
156                    else {
157                            privateLayout = GetterUtil.getBoolean(privateLayoutParam);
158    
159                            layouts = getLayouts(groupId, privateLayout);
160                    }
161    
162                    return layouts;
163            }
164    
165            protected String getRedirect(
166                            ThemeDisplay themeDisplay, List<Layout> layouts, long groupId,
167                            String privateLayoutParam)
168                    throws Exception {
169    
170                    PermissionChecker permissionChecker =
171                            themeDisplay.getPermissionChecker();
172    
173                    for (Layout layout : layouts) {
174                            if (!layout.isHidden() &&
175                                    LayoutPermissionUtil.contains(
176                                            permissionChecker, layout, ActionKeys.VIEW)) {
177    
178                                    String canonicalURL = PortalUtil.getCanonicalURL(
179                                            null, themeDisplay, layout, true);
180    
181                                    return PortalUtil.addPreservedParameters(
182                                            themeDisplay, layout, canonicalURL, true);
183                            }
184                    }
185    
186                    String groupFriendlyURL = PortalUtil.getGroupFriendlyURL(
187                            LayoutSetLocalServiceUtil.getLayoutSet(
188                                    groupId, GetterUtil.getBoolean(privateLayoutParam)),
189                            themeDisplay);
190    
191                    return PortalUtil.addPreservedParameters(
192                            themeDisplay, groupFriendlyURL);
193            }
194    
195            @Override
196            protected boolean isCheckMethodOnProcessAction() {
197                    return _CHECK_METHOD_ON_PROCESS_ACTION;
198            }
199    
200            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
201    
202    }