001    /**
002     * Copyright (c) 2000-2012 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.Group;
023    import com.liferay.portal.model.Layout;
024    import com.liferay.portal.model.LayoutConstants;
025    import com.liferay.portal.security.permission.ActionKeys;
026    import com.liferay.portal.security.permission.PermissionChecker;
027    import com.liferay.portal.service.GroupLocalServiceUtil;
028    import com.liferay.portal.service.LayoutLocalServiceUtil;
029    import com.liferay.portal.service.permission.LayoutPermissionUtil;
030    import com.liferay.portal.struts.PortletAction;
031    import com.liferay.portal.theme.ThemeDisplay;
032    import com.liferay.portal.util.PortalUtil;
033    import com.liferay.portal.util.WebKeys;
034    
035    import java.util.List;
036    
037    import javax.portlet.ActionRequest;
038    import javax.portlet.ActionResponse;
039    import javax.portlet.PortletConfig;
040    import javax.portlet.RenderRequest;
041    import javax.portlet.RenderResponse;
042    
043    import javax.servlet.http.HttpServletRequest;
044    import javax.servlet.http.HttpServletResponse;
045    
046    import org.apache.struts.action.ActionForm;
047    import org.apache.struts.action.ActionForward;
048    import org.apache.struts.action.ActionMapping;
049    
050    /**
051     * @author Brian Wing Shun Chan
052     * @author Hugo Huijser
053     */
054    public class ViewAction extends PortletAction {
055    
056            @Override
057            public void processAction(
058                            ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
059                            ActionRequest actionRequest, 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 mapping, ActionForm form, PortletConfig portletConfig,
094                            RenderRequest renderRequest, RenderResponse renderResponse)
095                    throws Exception {
096    
097                    return mapping.findForward("portlet.my_sites.view");
098            }
099    
100            @Override
101            public ActionForward strutsExecute(
102                            ActionMapping mapping, ActionForm form, HttpServletRequest request,
103                            HttpServletResponse response)
104                    throws Exception {
105    
106                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
107                            WebKeys.THEME_DISPLAY);
108    
109                    long groupId = ParamUtil.getLong(request, "groupId");
110                    String privateLayoutParam = request.getParameter("privateLayout");
111    
112                    List<Layout> layouts = getLayouts(groupId, privateLayoutParam);
113    
114                    if (layouts.isEmpty()) {
115                            SessionErrors.add(
116                                    request, NoSuchLayoutSetException.class.getName(),
117                                    new NoSuchLayoutSetException(
118                                            "{groupId=" + groupId + ",privateLayout=" +
119                                                    privateLayoutParam + "}"));
120                    }
121    
122                    String redirect = getRedirect(
123                            themeDisplay, layouts, groupId, privateLayoutParam);
124    
125                    if (Validator.isNull(redirect)) {
126                            redirect = ParamUtil.getString(request, "redirect");
127                    }
128    
129                    response.sendRedirect(redirect);
130    
131                    return null;
132            }
133    
134            protected List<Layout> getLayouts(long groupId, boolean privateLayout)
135                    throws Exception {
136    
137                    return LayoutLocalServiceUtil.getLayouts(
138                            groupId, privateLayout, LayoutConstants.DEFAULT_PARENT_LAYOUT_ID);
139            }
140    
141            protected List<Layout> getLayouts(long groupId, String privateLayoutParam)
142                    throws Exception {
143    
144                    List<Layout> layouts = null;
145    
146                    boolean privateLayout = false;
147    
148                    if (Validator.isNull(privateLayoutParam)) {
149                            layouts = getLayouts(groupId, false);
150    
151                            if (layouts.isEmpty()) {
152                                    layouts = getLayouts(groupId, true);
153                            }
154                    }
155                    else {
156                            privateLayout = GetterUtil.getBoolean(privateLayoutParam);
157    
158                            layouts = getLayouts(groupId, privateLayout);
159                    }
160    
161                    return layouts;
162            }
163    
164            protected String getRedirect(
165                            ThemeDisplay themeDisplay, List<Layout> layouts, long groupId,
166                            String privateLayoutParam)
167                    throws Exception {
168    
169                    PermissionChecker permissionChecker =
170                            themeDisplay.getPermissionChecker();
171    
172                    for (Layout layout : layouts) {
173                            if (!layout.isHidden() &&
174                                    LayoutPermissionUtil.contains(
175                                            permissionChecker, layout, ActionKeys.VIEW)) {
176    
177                                    return PortalUtil.getLayoutURL(layout, themeDisplay);
178                            }
179                    }
180    
181                    Group group = GroupLocalServiceUtil.getGroup(groupId);
182    
183                    return PortalUtil.getGroupFriendlyURL(
184                            group, GetterUtil.getBoolean(privateLayoutParam), themeDisplay);
185            }
186    
187            @Override
188            protected boolean isCheckMethodOnProcessAction() {
189                    return _CHECK_METHOD_ON_PROCESS_ACTION;
190            }
191    
192            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
193    
194    }