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.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
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 }