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.layoutsadmin.context;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
019    import com.liferay.portal.kernel.util.JavaConstants;
020    import com.liferay.portal.kernel.util.ParamUtil;
021    import com.liferay.portal.kernel.util.StringPool;
022    import com.liferay.portal.kernel.util.UnicodeProperties;
023    import com.liferay.portal.kernel.util.WebKeys;
024    import com.liferay.portal.model.Group;
025    import com.liferay.portal.model.Layout;
026    import com.liferay.portal.model.LayoutConstants;
027    import com.liferay.portal.model.LayoutSet;
028    import com.liferay.portal.model.Organization;
029    import com.liferay.portal.model.RoleConstants;
030    import com.liferay.portal.model.User;
031    import com.liferay.portal.model.UserGroup;
032    import com.liferay.portal.service.LayoutLocalServiceUtil;
033    import com.liferay.portal.service.LayoutSetLocalServiceUtil;
034    import com.liferay.portal.service.OrganizationLocalServiceUtil;
035    import com.liferay.portal.service.RoleLocalServiceUtil;
036    import com.liferay.portal.service.UserGroupLocalServiceUtil;
037    import com.liferay.portal.service.UserLocalServiceUtil;
038    import com.liferay.portal.theme.PortletDisplay;
039    import com.liferay.portal.theme.ThemeDisplay;
040    import com.liferay.portal.util.LayoutDescription;
041    import com.liferay.portal.util.LayoutListUtil;
042    import com.liferay.portal.util.PortletKeys;
043    import com.liferay.portal.util.PropsValues;
044    
045    import java.util.List;
046    
047    import javax.portlet.PortletConfig;
048    import javax.portlet.PortletURL;
049    
050    import javax.servlet.http.HttpServletRequest;
051    
052    /**
053     * @author Eudaldo Alonso
054     */
055    public class LayoutsAdminDisplayContext {
056    
057            public LayoutsAdminDisplayContext(
058                    HttpServletRequest request,
059                    LiferayPortletResponse liferayPortletResponse) {
060    
061                    _request = request;
062                    _liferayPortletResponse = liferayPortletResponse;
063    
064                    _groupDisplayContextHelper = new GroupDisplayContextHelper(request);
065    
066                    boolean privateLayout = false;
067                    String tabs1 = ParamUtil.getString(request, "tabs1", "public-pages");
068    
069                    if (tabs1.equals("my-dashboard") || tabs1.equals("private-pages")) {
070                            privateLayout = true;
071                    }
072    
073                    Layout selLayout = getSelLayout();
074    
075                    if (selLayout != null) {
076                            privateLayout = selLayout.isPrivateLayout();
077                    }
078    
079                    Group liveGroup = getLiveGroup();
080    
081                    if (liveGroup.isUser() && !isPublicLayoutsModifiable() &&
082                            isPrivateLayoutsModifiable() && !privateLayout) {
083    
084                            privateLayout = true;
085                            tabs1 = "my-dashboard";
086                    }
087    
088                    Group selGroup = getSelGroup();
089    
090                    if (selGroup.isLayoutSetPrototype()) {
091                            privateLayout = true;
092                    }
093    
094                    _privateLayout = privateLayout;
095                    _tabs1 = tabs1;
096    
097                    String portletName = getPortletName();
098    
099                    if (portletName.equals(PortletKeys.LAYOUTS_ADMIN) ||
100                            portletName.equals(PortletKeys.MY_ACCOUNT)) {
101    
102                            ThemeDisplay themeDisplay = (ThemeDisplay) _request.getAttribute(
103                                    WebKeys.THEME_DISPLAY);
104    
105                            PortletDisplay portletDisplay = themeDisplay.getPortletDisplay();
106    
107                            portletDisplay.setURLBack(getBackURL());
108                    }
109    
110                    _request.setAttribute(
111                            com.liferay.portal.util.WebKeys.LAYOUT_DESCRIPTIONS,
112                            getLayoutDescriptions());
113            }
114    
115            public String getBackURL() {
116                    if (_backURL != null) {
117                            return _backURL;
118                    }
119    
120                    _backURL = ParamUtil.getString(_request, "backURL", getRedirect());
121    
122                    return _backURL;
123            }
124    
125            public PortletURL getEditLayoutURL() {
126                    String closeRedirect = ParamUtil.getString(_request, "closeRedirect");
127    
128                    PortletURL editLayoutURL = _liferayPortletResponse.createRenderURL();
129    
130                    editLayoutURL.setParameter(
131                            "struts_action", "/layouts_admin/edit_layouts");
132                    editLayoutURL.setParameter("tabs1", getTabs1());
133                    editLayoutURL.setParameter("redirect", getRedirect());
134                    editLayoutURL.setParameter("closeRedirect", closeRedirect);
135    
136                    String portletName = getPortletName();
137    
138                    if (portletName.equals(PortletKeys.LAYOUTS_ADMIN) ||
139                            portletName.equals(PortletKeys.MY_ACCOUNT) ||
140                            portletName.equals(PortletKeys.USERS_ADMIN)) {
141    
142                            editLayoutURL.setParameter("backURL", getBackURL());
143                    }
144    
145                    editLayoutURL.setParameter("groupId", String.valueOf(getLiveGroupId()));
146                    editLayoutURL.setParameter("viewLayout", Boolean.TRUE.toString());
147    
148                    return editLayoutURL;
149            }
150    
151            public Group getGroup() {
152                    return _groupDisplayContextHelper.getGroup();
153            }
154    
155            public Long getGroupId() {
156                    return _groupDisplayContextHelper.getGroupId();
157            }
158    
159            public UnicodeProperties getGroupTypeSettings() {
160                    return _groupDisplayContextHelper.getGroupTypeSettings();
161            }
162    
163            public List<LayoutDescription> getLayoutDescriptions() {
164                    if (_layoutDescriptions != null) {
165                            return _layoutDescriptions;
166                    }
167    
168                    ThemeDisplay themeDisplay = (ThemeDisplay) _request.getAttribute(
169                            WebKeys.THEME_DISPLAY);
170    
171                    _layoutDescriptions = LayoutListUtil.getLayoutDescriptions(
172                            getGroupId(), isPrivateLayout(), getRootNodeName(),
173                            themeDisplay.getLocale());
174    
175                    return _layoutDescriptions;
176            }
177    
178            public Long getLayoutId() {
179                    if (_layoutId != null) {
180                            return _layoutId;
181                    }
182    
183                    _layoutId = LayoutConstants.DEFAULT_PARENT_LAYOUT_ID;
184    
185                    Layout selLayout = getSelLayout();
186    
187                    if (selLayout != null) {
188                            _layoutId = selLayout.getLayoutId();
189                    }
190    
191                    return _layoutId;
192            }
193    
194            public Group getLiveGroup() {
195                    return _groupDisplayContextHelper.getLiveGroup();
196            }
197    
198            public Long getLiveGroupId() {
199                    return _groupDisplayContextHelper.getLiveGroupId();
200            }
201    
202            public Organization getOrganization() {
203                    if (_organization != null) {
204                            return _organization;
205                    }
206    
207                    Group liveGroup = getLiveGroup();
208    
209                    if (liveGroup.isOrganization()) {
210                            _organization = OrganizationLocalServiceUtil.fetchOrganization(
211                                    liveGroup.getOrganizationId());
212                    }
213    
214                    return _organization;
215            }
216    
217            public String getPagesName() {
218                    if (_pagesName != null) {
219                            return _pagesName;
220                    }
221    
222                    Group liveGroup = getLiveGroup();
223    
224                    if (liveGroup.isLayoutPrototype() || liveGroup.isLayoutSetPrototype() ||
225                            liveGroup.isUserGroup()) {
226    
227                            _pagesName = "pages";
228                    }
229                    else if (isPrivateLayout()) {
230                            if (liveGroup.isUser()) {
231                                    _pagesName = "my-dashboard";
232                            }
233                            else {
234                                    _pagesName = "private-pages";
235                            }
236                    }
237                    else {
238                            if (liveGroup.isUser()) {
239                                    _pagesName = "my-profile";
240                            }
241                            else {
242                                    _pagesName = "public-pages";
243                            }
244                    }
245    
246                    return _pagesName;
247            }
248    
249            public String getRedirect() {
250                    if (_redirect != null) {
251                            return _redirect;
252                    }
253    
254                    _redirect = ParamUtil.getString(_request, "redirect");
255    
256                    return _redirect;
257            }
258    
259            public PortletURL getRedirectURL() {
260                    PortletURL portletURL = _liferayPortletResponse.createRenderURL();
261    
262                    portletURL.setParameter("struts_action", "/layouts_admin/edit_layouts");
263                    portletURL.setParameter("tabs1", getTabs1());
264                    portletURL.setParameter("redirect", getRedirect());
265    
266                    String portletName = getPortletName();
267    
268                    if (portletName.equals(PortletKeys.LAYOUTS_ADMIN) ||
269                            portletName.equals(PortletKeys.MY_ACCOUNT) ||
270                            portletName.equals(PortletKeys.USERS_ADMIN)) {
271    
272                            portletURL.setParameter("backURL", getBackURL());
273                    }
274    
275                    portletURL.setParameter("groupId", String.valueOf(getLiveGroupId()));
276    
277                    return portletURL;
278            }
279    
280            public String getRootNodeName() {
281                    if (_rootNodeName != null) {
282                            return _rootNodeName;
283                    }
284    
285                    ThemeDisplay themeDisplay = (ThemeDisplay) _request.getAttribute(
286                            WebKeys.THEME_DISPLAY);
287    
288                    Group liveGroup = getLiveGroup();
289    
290                    _rootNodeName = liveGroup.getLayoutRootNodeName(
291                            isPrivateLayout(), themeDisplay.getLocale());
292    
293                    return _rootNodeName;
294            }
295    
296            public Group getSelGroup() {
297                    return _groupDisplayContextHelper.getSelGroup();
298            }
299    
300            public Layout getSelLayout() {
301                    if (_selLayout != null) {
302                            return _selLayout;
303                    }
304    
305                    if (getSelPlid() != LayoutConstants.DEFAULT_PLID) {
306                            _selLayout = LayoutLocalServiceUtil.fetchLayout(getSelPlid());
307                    }
308    
309                    return _selLayout;
310            }
311    
312            public LayoutSet getSelLayoutSet() throws PortalException {
313                    if (_selLayoutSet != null) {
314                            return _selLayoutSet;
315                    }
316    
317                    _selLayoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
318                            getGroupId(), isPrivateLayout());
319    
320                    return _selLayoutSet;
321            }
322    
323            public Long getSelPlid() {
324                    if (_selPlid != null) {
325                            return _selPlid;
326                    }
327    
328                    _selPlid = ParamUtil.getLong(
329                            _request, "selPlid", LayoutConstants.DEFAULT_PLID);
330    
331                    return _selPlid;
332            }
333    
334            public User getSelUser() {
335                    if (_selUser != null) {
336                            return _selUser;
337                    }
338    
339                    Group liveGroup = getLiveGroup();
340    
341                    if (liveGroup.isUser()) {
342                            _selUser = UserLocalServiceUtil.fetchUser(liveGroup.getClassPK());
343                    }
344    
345                    return _selUser;
346            }
347    
348            public Group getStagingGroup() {
349                    return _groupDisplayContextHelper.getStagingGroup();
350            }
351    
352            public Long getStagingGroupId() {
353                    return _groupDisplayContextHelper.getStagingGroupId();
354            }
355    
356            public String getTabs1() {
357                    return _tabs1;
358            }
359    
360            public String getTabs1Names() {
361                    if (_tabs1Names != null) {
362                            return _tabs1Names;
363                    }
364    
365                    _tabs1Names = "public-pages,private-pages";
366    
367                    Group liveGroup = getLiveGroup();
368    
369                    if (liveGroup.isUser()) {
370                            if (isPrivateLayoutsModifiable() && isPublicLayoutsModifiable()) {
371                                    _tabs1Names = "my-profile,my-dashboard";
372                            }
373                            else if (isPrivateLayoutsModifiable()) {
374                                    _tabs1Names = "my-dashboard";
375                            }
376                            else if (isPublicLayoutsModifiable()) {
377                                    _tabs1Names = "my-profile";
378                            }
379                    }
380    
381                    return _tabs1Names;
382            }
383    
384            public UserGroup getUserGroup() {
385                    if (_userGroup != null) {
386                            return _userGroup;
387                    }
388    
389                    Group liveGroup = getLiveGroup();
390    
391                    if (liveGroup.isUserGroup()) {
392                            _userGroup = UserGroupLocalServiceUtil.fetchUserGroup(
393                                    liveGroup.getClassPK());
394                    }
395    
396                    return _userGroup;
397            }
398    
399            public boolean isPrivateLayout() {
400                    return _privateLayout;
401            }
402    
403            protected String getPortletName() {
404                    PortletConfig portletConfig = (PortletConfig)_request.getAttribute(
405                            JavaConstants.JAVAX_PORTLET_CONFIG);
406    
407                    if (portletConfig == null) {
408                            return StringPool.BLANK;
409                    }
410    
411                    return portletConfig.getPortletName();
412            }
413    
414            protected boolean hasPowerUserRole() {
415                    ThemeDisplay themeDisplay = (ThemeDisplay)_request.getAttribute(
416                            WebKeys.THEME_DISPLAY);
417    
418                    try {
419                            User selUser = getSelUser();
420    
421                            return RoleLocalServiceUtil.hasUserRole(
422                                    selUser.getUserId(), themeDisplay.getCompanyId(),
423                                    RoleConstants.POWER_USER, true);
424                    }
425                    catch (Exception e) {
426                    }
427    
428                    return false;
429            }
430    
431            protected boolean isPrivateLayoutsModifiable() {
432                    if ((!PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_POWER_USER_REQUIRED ||
433                             hasPowerUserRole()) &&
434                            PropsValues.LAYOUT_USER_PRIVATE_LAYOUTS_ENABLED) {
435    
436                            return true;
437                    }
438    
439                    return false;
440            }
441    
442            protected boolean isPublicLayoutsModifiable() {
443                    if ((!PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_POWER_USER_REQUIRED ||
444                             hasPowerUserRole()) &&
445                            PropsValues.LAYOUT_USER_PUBLIC_LAYOUTS_ENABLED) {
446    
447                            return true;
448                    }
449    
450                    return false;
451            }
452    
453            private String _backURL;
454            private final GroupDisplayContextHelper _groupDisplayContextHelper;
455            private List<LayoutDescription> _layoutDescriptions;
456            private Long _layoutId;
457            private final LiferayPortletResponse _liferayPortletResponse;
458            private Organization _organization;
459            private String _pagesName;
460            private final boolean _privateLayout;
461            private String _redirect;
462            private final HttpServletRequest _request;
463            private String _rootNodeName;
464            private Layout _selLayout;
465            private LayoutSet _selLayoutSet;
466            private Long _selPlid;
467            private User _selUser;
468            private final String _tabs1;
469            private String _tabs1Names;
470            private UserGroup _userGroup;
471    
472    }