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