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