001
014
015 package com.liferay.portal.service.impl;
016
017 import com.liferay.portal.LayoutFriendlyURLException;
018 import com.liferay.portal.LayoutHiddenException;
019 import com.liferay.portal.LayoutNameException;
020 import com.liferay.portal.LayoutParentLayoutIdException;
021 import com.liferay.portal.LayoutTypeException;
022 import com.liferay.portal.NoSuchLayoutException;
023 import com.liferay.portal.kernel.bean.BeanReference;
024 import com.liferay.portal.kernel.bean.IdentifiableBean;
025 import com.liferay.portal.kernel.exception.PortalException;
026 import com.liferay.portal.kernel.exception.SystemException;
027 import com.liferay.portal.kernel.util.FriendlyURLNormalizerUtil;
028 import com.liferay.portal.kernel.util.LocaleUtil;
029 import com.liferay.portal.kernel.util.StringPool;
030 import com.liferay.portal.kernel.util.Validator;
031 import com.liferay.portal.model.Group;
032 import com.liferay.portal.model.Layout;
033 import com.liferay.portal.model.LayoutConstants;
034 import com.liferay.portal.model.LayoutSet;
035 import com.liferay.portal.model.LayoutSetPrototype;
036 import com.liferay.portal.model.impl.LayoutImpl;
037 import com.liferay.portal.service.persistence.LayoutPersistence;
038 import com.liferay.portal.service.persistence.LayoutSetPersistence;
039 import com.liferay.portal.util.PortalUtil;
040 import com.liferay.portal.util.comparator.LayoutPriorityComparator;
041
042 import java.util.List;
043
044
047 public class LayoutLocalServiceHelper implements IdentifiableBean {
048
049 public String getBeanIdentifier() {
050 return _beanIdentifier;
051 }
052
053 public String getFriendlyURL(
054 long groupId, boolean privateLayout, long layoutId, String name,
055 String friendlyURL)
056 throws PortalException, SystemException {
057
058 friendlyURL = getFriendlyURL(friendlyURL);
059
060 if (Validator.isNull(friendlyURL)) {
061 friendlyURL = StringPool.SLASH + getFriendlyURL(name);
062
063 String originalFriendlyURL = friendlyURL;
064
065 for (int i = 1;; i++) {
066 try {
067 validateFriendlyURL(
068 groupId, privateLayout, layoutId, friendlyURL);
069
070 break;
071 }
072 catch (LayoutFriendlyURLException lfurle) {
073 int type = lfurle.getType();
074
075 if (type == LayoutFriendlyURLException.DUPLICATE) {
076 friendlyURL = originalFriendlyURL + i;
077 }
078 else {
079 friendlyURL = StringPool.SLASH + layoutId;
080
081 break;
082 }
083 }
084 }
085 }
086
087 return friendlyURL;
088 }
089
090 public String getFriendlyURL(String friendlyURL) {
091 return FriendlyURLNormalizerUtil.normalize(friendlyURL);
092 }
093
094 public int getNextPriority(
095 long groupId, boolean privateLayout, long parentLayoutId,
096 String sourcePrototypeLayoutUuid, int defaultPriority)
097 throws SystemException {
098
099 try {
100 int priority = defaultPriority;
101
102 if (priority < 0) {
103 Layout layout = layoutPersistence.findByG_P_P_First(
104 groupId, privateLayout, parentLayoutId,
105 new LayoutPriorityComparator(false));
106
107 priority = layout.getPriority() + 1;
108 }
109
110 if ((priority < _PRIORITY_BUFFER) &&
111 Validator.isNull(sourcePrototypeLayoutUuid)) {
112
113 LayoutSet layoutSet = layoutSetPersistence.fetchByG_P(
114 groupId, privateLayout);
115
116 if (Validator.isNotNull(
117 layoutSet.getLayoutSetPrototypeUuid())) {
118
119 priority = priority + _PRIORITY_BUFFER;
120 }
121 }
122
123 return priority;
124 }
125 catch (NoSuchLayoutException nsle) {
126 return 0;
127 }
128 }
129
130 public long getParentLayoutId(
131 long groupId, boolean privateLayout, long parentLayoutId)
132 throws SystemException {
133
134 if (parentLayoutId != LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
135
136
137
138 Layout parentLayout = layoutPersistence.fetchByG_P_L(
139 groupId, privateLayout, parentLayoutId);
140
141 if (parentLayout == null) {
142 parentLayoutId = LayoutConstants.DEFAULT_PARENT_LAYOUT_ID;
143 }
144 }
145
146 return parentLayoutId;
147 }
148
149 public boolean hasLayoutSetPrototypeLayout(
150 LayoutSetPrototype layoutSetPrototype, String layoutUuid)
151 throws PortalException, SystemException {
152
153 Group group = layoutSetPrototype.getGroup();
154
155 Layout layout = layoutPersistence.fetchByUUID_G_P(
156 layoutUuid, group.getGroupId(), true);
157
158 if (layout != null) {
159 return true;
160 }
161
162 return false;
163 }
164
165 public void setBeanIdentifier(String beanIdentifier) {
166 _beanIdentifier = beanIdentifier;
167 }
168
169 public void validate(
170 long groupId, boolean privateLayout, long layoutId,
171 long parentLayoutId, String name, String type, boolean hidden,
172 String friendlyURL)
173 throws PortalException, SystemException {
174
175 validateName(name);
176
177 boolean firstLayout = false;
178
179 if (parentLayoutId == LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
180 List<Layout> layouts = layoutPersistence.findByG_P_P(
181 groupId, privateLayout, parentLayoutId, 0, 1);
182
183 if (layouts.size() == 0) {
184 firstLayout = true;
185 }
186 else {
187 long firstLayoutId = layouts.get(0).getLayoutId();
188
189 if (firstLayoutId == layoutId) {
190 firstLayout = true;
191 }
192 }
193 }
194
195 if (firstLayout) {
196 validateFirstLayout(type);
197 }
198
199 if (!PortalUtil.isLayoutParentable(type)) {
200 if (layoutPersistence.countByG_P_P(
201 groupId, privateLayout, layoutId) > 0) {
202
203 throw new LayoutTypeException(
204 LayoutTypeException.NOT_PARENTABLE);
205 }
206 }
207
208 validateFriendlyURL(groupId, privateLayout, layoutId, friendlyURL);
209 }
210
211 public void validateFirstLayout(String type) throws PortalException {
212 if (Validator.isNull(type) || !PortalUtil.isLayoutFirstPageable(type)) {
213 LayoutTypeException lte = new LayoutTypeException(
214 LayoutTypeException.FIRST_LAYOUT);
215
216 lte.setLayoutType(type);
217
218 throw lte;
219 }
220 }
221
222 public void validateFriendlyURL(
223 long groupId, boolean privateLayout, long layoutId,
224 String friendlyURL)
225 throws PortalException, SystemException {
226
227 if (Validator.isNull(friendlyURL)) {
228 return;
229 }
230
231 int exceptionType = LayoutImpl.validateFriendlyURL(friendlyURL);
232
233 if (exceptionType != -1) {
234 throw new LayoutFriendlyURLException(exceptionType);
235 }
236
237 Layout layout = layoutPersistence.fetchByG_P_F(
238 groupId, privateLayout, friendlyURL);
239
240 if ((layout != null) && (layout.getLayoutId() != layoutId)) {
241 throw new LayoutFriendlyURLException(
242 LayoutFriendlyURLException.DUPLICATE);
243 }
244
245 LayoutImpl.validateFriendlyURLKeyword(friendlyURL);
246
247
261
262 String layoutIdFriendlyURL = friendlyURL.substring(1);
263
264 if (Validator.isNumber(layoutIdFriendlyURL) &&
265 !layoutIdFriendlyURL.equals(String.valueOf(layoutId))) {
266
267 LayoutFriendlyURLException lfurle = new LayoutFriendlyURLException(
268 LayoutFriendlyURLException.POSSIBLE_DUPLICATE);
269
270 lfurle.setKeywordConflict(layoutIdFriendlyURL);
271
272 throw lfurle;
273 }
274 }
275
276 public void validateName(String name) throws PortalException {
277 if (Validator.isNull(name)) {
278 throw new LayoutNameException();
279 }
280 }
281
282 public void validateName(String name, String languageId)
283 throws PortalException {
284
285 String defaultLanguageId = LocaleUtil.toLanguageId(
286 LocaleUtil.getDefault());
287
288 if (defaultLanguageId.equals(languageId)) {
289 validateName(name);
290 }
291 }
292
293 public void validateParentLayoutId(
294 long groupId, boolean privateLayout, long layoutId,
295 long parentLayoutId)
296 throws PortalException, SystemException {
297
298 Layout layout = layoutPersistence.findByG_P_L(
299 groupId, privateLayout, layoutId);
300
301 if (parentLayoutId != layout.getParentLayoutId()) {
302
303
304
305 if (parentLayoutId == LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
306 return;
307 }
308
309
310
311 Layout parentLayout = layoutPersistence.findByG_P_L(
312 groupId, privateLayout, parentLayoutId);
313
314 if (!PortalUtil.isLayoutParentable(parentLayout)) {
315 throw new LayoutParentLayoutIdException(
316 LayoutParentLayoutIdException.NOT_PARENTABLE);
317 }
318
319
320
321 if (PortalUtil.isLayoutDescendant(layout, parentLayoutId)) {
322 throw new LayoutParentLayoutIdException(
323 LayoutParentLayoutIdException.SELF_DESCENDANT);
324 }
325
326
327
328 if (layout.getParentLayoutId() ==
329 LayoutConstants.DEFAULT_PARENT_LAYOUT_ID) {
330
331 List<Layout> layouts = layoutPersistence.findByG_P_P(
332 groupId, privateLayout,
333 LayoutConstants.DEFAULT_PARENT_LAYOUT_ID, 0, 2);
334
335
336
337
338 long firstLayoutId = layouts.get(0).getLayoutId();
339
340 if (firstLayoutId == layoutId) {
341 Layout secondLayout = layouts.get(1);
342
343 try {
344 validateFirstLayout(secondLayout.getType());
345 }
346 catch (LayoutHiddenException lhe) {
347 throw new LayoutParentLayoutIdException(
348 LayoutParentLayoutIdException.FIRST_LAYOUT_HIDDEN);
349 }
350 catch (LayoutTypeException lte) {
351 throw new LayoutParentLayoutIdException(
352 LayoutParentLayoutIdException.FIRST_LAYOUT_TYPE);
353 }
354 }
355 }
356 }
357 }
358
359 @BeanReference(type = LayoutPersistence.class)
360 protected LayoutPersistence layoutPersistence;
361 @BeanReference(type = LayoutSetPersistence.class)
362 protected LayoutSetPersistence layoutSetPersistence;
363
364 private static final int _PRIORITY_BUFFER = 1000000;
365
366 private String _beanIdentifier;
367
368 }