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.layoutsadmin.util;
016    
017    import com.liferay.portal.kernel.dao.orm.QueryUtil;
018    import com.liferay.portal.kernel.json.JSONArray;
019    import com.liferay.portal.kernel.json.JSONFactoryUtil;
020    import com.liferay.portal.kernel.json.JSONObject;
021    import com.liferay.portal.kernel.staging.LayoutStagingUtil;
022    import com.liferay.portal.kernel.staging.StagingUtil;
023    import com.liferay.portal.kernel.util.ArrayUtil;
024    import com.liferay.portal.kernel.util.ParamUtil;
025    import com.liferay.portal.kernel.util.StringBundler;
026    import com.liferay.portal.kernel.util.StringPool;
027    import com.liferay.portal.kernel.util.WebKeys;
028    import com.liferay.portal.model.Layout;
029    import com.liferay.portal.model.LayoutBranch;
030    import com.liferay.portal.model.LayoutRevision;
031    import com.liferay.portal.model.LayoutSetBranch;
032    import com.liferay.portal.model.User;
033    import com.liferay.portal.model.impl.VirtualLayout;
034    import com.liferay.portal.service.LayoutLocalServiceUtil;
035    import com.liferay.portal.service.LayoutSetBranchLocalServiceUtil;
036    import com.liferay.portal.theme.ThemeDisplay;
037    import com.liferay.portal.util.PropsValues;
038    import com.liferay.portal.util.SessionClicks;
039    import com.liferay.portlet.sites.util.SitesUtil;
040    
041    import java.util.List;
042    
043    import javax.servlet.http.HttpServletRequest;
044    import javax.servlet.http.HttpSession;
045    
046    /**
047     * @author Brian Wing Shun Chan
048     * @author Eduardo Lundgren
049     * @author Bruno Basto
050     */
051    public class LayoutsTreeUtil {
052    
053            public static String getLayoutsJSON(
054                            HttpServletRequest request, long groupId, boolean privateLayout,
055                            long parentLayoutId, boolean incomplete)
056                    throws Exception {
057    
058                    return getLayoutsJSON(
059                            request, groupId, privateLayout, parentLayoutId, null, incomplete);
060            }
061    
062            public static String getLayoutsJSON(
063                            HttpServletRequest request, long groupId, boolean privateLayout,
064                            long parentLayoutId, long[] expandedLayoutIds, boolean incomplete)
065                    throws Exception {
066    
067                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
068                            WebKeys.THEME_DISPLAY);
069    
070                    JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
071    
072                    List<Layout> layoutAncestors = null;
073    
074                    List<Layout> layouts = LayoutLocalServiceUtil.getLayouts(
075                            groupId, privateLayout, parentLayoutId, incomplete,
076                            QueryUtil.ALL_POS, QueryUtil.ALL_POS);
077    
078                    long selPlid = ParamUtil.getLong(request, "selPlid");
079    
080                    if (selPlid != 0) {
081                            Layout selLayout = LayoutLocalServiceUtil.getLayout(selPlid);
082    
083                            layoutAncestors = selLayout.getAncestors();
084    
085                            layoutAncestors.add(selLayout);
086                    }
087    
088                    int start = 0;
089                    int end = layouts.size();
090    
091                    if (PropsValues.LAYOUT_MANAGE_PAGES_INITIAL_CHILDREN > -1) {
092                            start = ParamUtil.getInteger(request, "start");
093                            start = Math.max(0, Math.min(start, layouts.size()));
094    
095                            end = ParamUtil.getInteger(
096                                    request, "end",
097                                    start + PropsValues.LAYOUT_MANAGE_PAGES_INITIAL_CHILDREN);
098    
099                            int loadedLayoutsCount = _getLoadedLayoutsCount(
100                                    request, parentLayoutId);
101    
102                            if (loadedLayoutsCount > end) {
103                                    end = loadedLayoutsCount;
104                            }
105    
106                            end = Math.max(start, Math.min(end, layouts.size()));
107                    }
108    
109                    for (Layout layout : layouts.subList(start, end)) {
110                            JSONObject jsonObject = JSONFactoryUtil.createJSONObject();
111    
112                            if ((layoutAncestors != null) && layoutAncestors.contains(layout) ||
113                                    ArrayUtil.contains(expandedLayoutIds, layout.getLayoutId())) {
114    
115                                    String childrenJSON = StringPool.BLANK;
116    
117                                    if (layout instanceof VirtualLayout) {
118                                            VirtualLayout virtualLayout = (VirtualLayout)layout;
119    
120                                            childrenJSON = getLayoutsJSON(
121                                                    request, virtualLayout.getSourceGroupId(),
122                                                    virtualLayout.getPrivateLayout(),
123                                                    virtualLayout.getLayoutId(), expandedLayoutIds,
124                                                    incomplete);
125    
126                                    }
127                                    else {
128                                            childrenJSON = getLayoutsJSON(
129                                                    request, groupId, layout.getPrivateLayout(),
130                                                    layout.getLayoutId(), expandedLayoutIds, incomplete);
131                                    }
132    
133                                    jsonObject.put(
134                                            "children", JSONFactoryUtil.createJSONObject(childrenJSON));
135                            }
136    
137                            jsonObject.put("contentDisplayPage", layout.isContentDisplayPage());
138                            jsonObject.put("friendlyURL", layout.getFriendlyURL());
139    
140                            if (layout instanceof VirtualLayout) {
141                                    VirtualLayout virtualLayout = (VirtualLayout)layout;
142    
143                                    jsonObject.put("groupId", virtualLayout.getSourceGroupId());
144                            }
145                            else {
146                                    jsonObject.put("groupId", layout.getGroupId());
147                            }
148    
149                            jsonObject.put("hasChildren", layout.hasChildren());
150                            jsonObject.put("layoutId", layout.getLayoutId());
151                            jsonObject.put("name", layout.getName(themeDisplay.getLocale()));
152                            jsonObject.put("parentLayoutId", layout.getParentLayoutId());
153                            jsonObject.put("plid", layout.getPlid());
154                            jsonObject.put("priority", layout.getPriority());
155                            jsonObject.put("privateLayout", layout.isPrivateLayout());
156                            jsonObject.put("type", layout.getType());
157                            jsonObject.put("updateable", SitesUtil.isLayoutUpdateable(layout));
158                            jsonObject.put("uuid", layout.getUuid());
159    
160                            LayoutRevision layoutRevision = LayoutStagingUtil.getLayoutRevision(
161                                    layout);
162    
163                            if (layoutRevision != null) {
164                                    User user = themeDisplay.getUser();
165    
166                                    long recentLayoutSetBranchId =
167                                            StagingUtil.getRecentLayoutSetBranchId(
168                                                    user, layout.getLayoutSet().getLayoutSetId());
169    
170                                    if (StagingUtil.isIncomplete(layout, recentLayoutSetBranchId)) {
171                                            jsonObject.put("incomplete", true);
172                                    }
173    
174                                    long layoutSetBranchId = layoutRevision.getLayoutSetBranchId();
175    
176                                    LayoutSetBranch layoutSetBranch =
177                                            LayoutSetBranchLocalServiceUtil.getLayoutSetBranch(
178                                                    layoutSetBranchId);
179    
180                                    LayoutBranch layoutBranch = layoutRevision.getLayoutBranch();
181    
182                                    if (!layoutBranch.isMaster()) {
183                                            jsonObject.put(
184                                                    "layoutBranchId", layoutBranch.getLayoutBranchId());
185                                            jsonObject.put("layoutBranchName", layoutBranch.getName());
186                                    }
187    
188                                    jsonObject.put(
189                                            "layoutRevisionId", layoutRevision.getLayoutRevisionId());
190                                    jsonObject.put("layoutSetBranchId", layoutSetBranchId);
191                                    jsonObject.put(
192                                            "layoutSetBranchName", layoutSetBranch.getName());
193                            }
194    
195                            jsonArray.put(jsonObject);
196                    }
197    
198                    JSONObject responseJSONObject = JSONFactoryUtil.createJSONObject();
199    
200                    responseJSONObject.put("layouts", jsonArray);
201                    responseJSONObject.put("total", layouts.size());
202    
203                    return responseJSONObject.toString();
204            }
205    
206            private static int _getLoadedLayoutsCount(
207                            HttpServletRequest request, long layoutId)
208                    throws Exception {
209    
210                    HttpSession session = request.getSession();
211    
212                    String treeId = ParamUtil.getString(request, "treeId");
213                    long groupId = ParamUtil.getLong(request, "groupId");
214                    boolean privateLayout = ParamUtil.getBoolean(request, "privateLayout");
215    
216                    StringBundler sb = new StringBundler(7);
217    
218                    sb.append(treeId);
219                    sb.append(StringPool.COLON);
220                    sb.append(groupId);
221                    sb.append(StringPool.COLON);
222                    sb.append(privateLayout);
223                    sb.append(StringPool.COLON);
224                    sb.append("Pagination");
225    
226                    String paginationJSON = SessionClicks.get(
227                            session, sb.toString(), JSONFactoryUtil.getNullJSON());
228    
229                    JSONObject paginationJSONObject = JSONFactoryUtil.createJSONObject(
230                            paginationJSON);
231    
232                    return paginationJSONObject.getInt(String.valueOf(layoutId), 0);
233            }
234    
235    }