001
014
015 package com.liferay.portal.service.impl;
016
017 import com.liferay.exportimport.kernel.staging.MergeLayoutPrototypesThreadLocal;
018 import com.liferay.exportimport.kernel.staging.StagingUtil;
019 import com.liferay.portal.kernel.exception.NoSuchLayoutRevisionException;
020 import com.liferay.portal.kernel.exception.NoSuchPortletPreferencesException;
021 import com.liferay.portal.kernel.exception.PortalException;
022 import com.liferay.portal.kernel.model.Layout;
023 import com.liferay.portal.kernel.model.LayoutConstants;
024 import com.liferay.portal.kernel.model.LayoutRevision;
025 import com.liferay.portal.kernel.model.LayoutRevisionConstants;
026 import com.liferay.portal.kernel.model.LayoutSetBranch;
027 import com.liferay.portal.kernel.model.PortletPreferences;
028 import com.liferay.portal.kernel.model.User;
029 import com.liferay.portal.kernel.service.ServiceContext;
030 import com.liferay.portal.kernel.util.AutoResetThreadLocal;
031 import com.liferay.portal.kernel.util.OrderByComparator;
032 import com.liferay.portal.kernel.util.ParamUtil;
033 import com.liferay.portal.kernel.util.StringBundler;
034 import com.liferay.portal.kernel.util.comparator.LayoutRevisionCreateDateComparator;
035 import com.liferay.portal.kernel.workflow.WorkflowConstants;
036 import com.liferay.portal.kernel.workflow.WorkflowHandlerRegistryUtil;
037 import com.liferay.portal.service.base.LayoutRevisionLocalServiceBaseImpl;
038
039 import java.util.ArrayList;
040 import java.util.Date;
041 import java.util.List;
042
043
047 public class LayoutRevisionLocalServiceImpl
048 extends LayoutRevisionLocalServiceBaseImpl {
049
050 @Override
051 public LayoutRevision addLayoutRevision(
052 long userId, long layoutSetBranchId, long layoutBranchId,
053 long parentLayoutRevisionId, boolean head, long plid,
054 long portletPreferencesPlid, boolean privateLayout, String name,
055 String title, String description, String keywords, String robots,
056 String typeSettings, boolean iconImage, long iconImageId,
057 String themeId, String colorSchemeId, String css,
058 ServiceContext serviceContext)
059 throws PortalException {
060
061
062
063 User user = userPersistence.findByPrimaryKey(userId);
064 LayoutSetBranch layoutSetBranch =
065 layoutSetBranchPersistence.findByPrimaryKey(layoutSetBranchId);
066 parentLayoutRevisionId = getParentLayoutRevisionId(
067 layoutSetBranchId, parentLayoutRevisionId, plid);
068 Date now = new Date();
069
070 long layoutRevisionId = counterLocalService.increment();
071
072 LayoutRevision layoutRevision = layoutRevisionPersistence.create(
073 layoutRevisionId);
074
075 layoutRevision.setGroupId(layoutSetBranch.getGroupId());
076 layoutRevision.setCompanyId(user.getCompanyId());
077 layoutRevision.setUserId(user.getUserId());
078 layoutRevision.setUserName(user.getFullName());
079 layoutRevision.setLayoutSetBranchId(layoutSetBranchId);
080 layoutRevision.setLayoutBranchId(layoutBranchId);
081 layoutRevision.setParentLayoutRevisionId(parentLayoutRevisionId);
082 layoutRevision.setHead(head);
083 layoutRevision.setPlid(plid);
084 layoutRevision.setPrivateLayout(privateLayout);
085 layoutRevision.setName(name);
086 layoutRevision.setTitle(title);
087 layoutRevision.setDescription(description);
088 layoutRevision.setKeywords(keywords);
089 layoutRevision.setRobots(robots);
090 layoutRevision.setTypeSettings(typeSettings);
091 layoutRevision.setIconImageId(iconImageId);
092 layoutRevision.setThemeId(themeId);
093 layoutRevision.setColorSchemeId(colorSchemeId);
094 layoutRevision.setCss(css);
095 layoutRevision.setStatus(WorkflowConstants.STATUS_DRAFT);
096 layoutRevision.setStatusDate(serviceContext.getModifiedDate(now));
097
098 layoutRevisionPersistence.update(layoutRevision);
099
100 _layoutRevisionId.set(layoutRevision.getLayoutRevisionId());
101
102
103
104 if (portletPreferencesPlid == LayoutConstants.DEFAULT_PLID) {
105 portletPreferencesPlid = plid;
106 }
107
108 copyPortletPreferences(layoutRevision, portletPreferencesPlid);
109
110
111
112 if (isWorkflowEnabled(plid)) {
113 WorkflowHandlerRegistryUtil.startWorkflowInstance(
114 user.getCompanyId(), layoutRevision.getGroupId(),
115 user.getUserId(), LayoutRevision.class.getName(),
116 layoutRevision.getLayoutRevisionId(), layoutRevision,
117 serviceContext);
118 }
119 else {
120 updateMajor(layoutRevision);
121
122 updateStatus(
123 userId, layoutRevisionId, WorkflowConstants.STATUS_APPROVED,
124 serviceContext);
125 }
126
127 StagingUtil.setRecentLayoutRevisionId(
128 user, layoutSetBranchId, plid,
129 layoutRevision.getLayoutRevisionId());
130
131 return layoutRevision;
132 }
133
134 @Override
135 public void deleteLayoutLayoutRevisions(long plid) throws PortalException {
136 for (LayoutRevision layoutRevision : getLayoutRevisions(plid)) {
137 layoutRevisionLocalService.deleteLayoutRevision(layoutRevision);
138 }
139 }
140
141 @Override
142 public LayoutRevision deleteLayoutRevision(LayoutRevision layoutRevision)
143 throws PortalException {
144
145 if (layoutRevision.hasChildren()) {
146 for (LayoutRevision curLayoutRevision :
147 layoutRevision.getChildren()) {
148
149 curLayoutRevision.setParentLayoutRevisionId(
150 layoutRevision.getParentLayoutRevisionId());
151
152 layoutRevisionPersistence.update(curLayoutRevision);
153 }
154 }
155
156 List<PortletPreferences> portletPreferencesList =
157 portletPreferencesLocalService.getPortletPreferencesByPlid(
158 layoutRevision.getLayoutRevisionId());
159
160 for (PortletPreferences portletPreferences : portletPreferencesList) {
161 try {
162 portletPreferencesLocalService.deletePortletPreferences(
163 portletPreferences.getPortletPreferencesId());
164 }
165 catch (NoSuchPortletPreferencesException nsppe) {
166 }
167 }
168
169 recentLayoutRevisionLocalService.deleteRecentLayoutRevisions(
170 layoutRevision.getLayoutRevisionId());
171
172 if (layoutRevision.isPending()) {
173 workflowInstanceLinkLocalService.deleteWorkflowInstanceLink(
174 layoutRevision.getCompanyId(), layoutRevision.getGroupId(),
175 LayoutRevision.class.getName(),
176 layoutRevision.getLayoutRevisionId());
177 }
178
179 return layoutRevisionPersistence.remove(layoutRevision);
180 }
181
182 @Override
183 public LayoutRevision deleteLayoutRevision(long layoutRevisionId)
184 throws PortalException {
185
186 LayoutRevision layoutRevision =
187 layoutRevisionPersistence.findByPrimaryKey(layoutRevisionId);
188
189 return deleteLayoutRevision(layoutRevision);
190 }
191
192 @Override
193 public void deleteLayoutRevisions(long layoutSetBranchId, long plid)
194 throws PortalException {
195
196 for (LayoutRevision layoutRevision : getLayoutRevisions(
197 layoutSetBranchId, plid)) {
198
199 layoutRevisionLocalService.deleteLayoutRevision(layoutRevision);
200 }
201 }
202
203 @Override
204 public void deleteLayoutRevisions(
205 long layoutSetBranchId, long layoutBranchId, long plid)
206 throws PortalException {
207
208 List<LayoutRevision> layoutRevisions =
209 layoutRevisionPersistence.findByL_L_P(
210 layoutSetBranchId, layoutBranchId, plid);
211
212 for (LayoutRevision layoutRevision : layoutRevisions) {
213 layoutRevisionLocalService.deleteLayoutRevision(layoutRevision);
214 }
215 }
216
217 @Override
218 public void deleteLayoutSetBranchLayoutRevisions(long layoutSetBranchId)
219 throws PortalException {
220
221 List<LayoutRevision> layoutRevisions =
222 layoutRevisionPersistence.findByLayoutSetBranchId(
223 layoutSetBranchId);
224
225 for (LayoutRevision layoutRevision : layoutRevisions) {
226 layoutRevisionLocalService.deleteLayoutRevision(layoutRevision);
227 }
228 }
229
230 @Override
231 public LayoutRevision fetchLastLayoutRevision(long plid, boolean head) {
232 try {
233 return layoutRevisionPersistence.findByH_P_Last(
234 head, plid, new LayoutRevisionCreateDateComparator(true));
235 }
236 catch (NoSuchLayoutRevisionException nslre) {
237 return null;
238 }
239 }
240
241 @Override
242 public LayoutRevision fetchLatestLayoutRevision(
243 long layoutSetBranchId, long plid) {
244
245 return layoutRevisionPersistence.fetchByL_P_First(
246 layoutSetBranchId, plid,
247 new LayoutRevisionCreateDateComparator(false));
248 }
249
250 @Override
251 public LayoutRevision fetchLayoutRevision(
252 long layoutSetBranchId, boolean head, long plid) {
253
254 return layoutRevisionPersistence.fetchByL_H_P(
255 layoutSetBranchId, head, plid);
256 }
257
258 @Override
259 public List<LayoutRevision> getChildLayoutRevisions(
260 long layoutSetBranchId, long parentLayoutRevisionId, long plid) {
261
262 return layoutRevisionPersistence.findByL_P_P(
263 layoutSetBranchId, parentLayoutRevisionId, plid);
264 }
265
266 @Override
267 public List<LayoutRevision> getChildLayoutRevisions(
268 long layoutSetBranchId, long parentLayoutRevision, long plid, int start,
269 int end, OrderByComparator<LayoutRevision> orderByComparator) {
270
271 return layoutRevisionPersistence.findByL_P_P(
272 layoutSetBranchId, parentLayoutRevision, plid, start, end,
273 orderByComparator);
274 }
275
276 @Override
277 public int getChildLayoutRevisionsCount(
278 long layoutSetBranchId, long parentLayoutRevision, long plid) {
279
280 return layoutRevisionPersistence.countByL_P_P(
281 layoutSetBranchId, parentLayoutRevision, plid);
282 }
283
284 @Override
285 public LayoutRevision getLayoutRevision(
286 long layoutSetBranchId, long plid, boolean head)
287 throws PortalException {
288
289 return layoutRevisionPersistence.findByL_H_P(
290 layoutSetBranchId, head, plid);
291 }
292
293 @Override
294 public LayoutRevision getLayoutRevision(
295 long layoutSetBranchId, long layoutBranchId, long plid)
296 throws PortalException {
297
298 List<LayoutRevision> layoutRevisions =
299 layoutRevisionPersistence.findByL_L_P(
300 layoutSetBranchId, layoutBranchId, plid, 0, 1,
301 new LayoutRevisionCreateDateComparator(false));
302
303 if (!layoutRevisions.isEmpty()) {
304 return layoutRevisions.get(0);
305 }
306
307 StringBundler sb = new StringBundler(7);
308
309 sb.append("{layoutSetBranchId=");
310 sb.append(layoutSetBranchId);
311 sb.append(", layoutBranchId=");
312 sb.append(layoutBranchId);
313 sb.append(", plid=");
314 sb.append(plid);
315 sb.append("}");
316
317 throw new NoSuchLayoutRevisionException(sb.toString());
318 }
319
320 @Override
321 public List<LayoutRevision> getLayoutRevisions(long plid) {
322 return layoutRevisionPersistence.findByPlid(plid);
323 }
324
325 @Override
326 public List<LayoutRevision> getLayoutRevisions(
327 long layoutSetBranchId, boolean head) {
328
329 return layoutRevisionPersistence.findByL_H(layoutSetBranchId, head);
330 }
331
332 @Override
333 public List<LayoutRevision> getLayoutRevisions(
334 long layoutSetBranchId, int status) {
335
336 return layoutRevisionPersistence.findByL_S(layoutSetBranchId, status);
337 }
338
339 @Override
340 public List<LayoutRevision> getLayoutRevisions(
341 long layoutSetBranchId, long plid) {
342
343 return layoutRevisionPersistence.findByL_P(layoutSetBranchId, plid);
344 }
345
346 @Override
347 public List<LayoutRevision> getLayoutRevisions(
348 long layoutSetBranchId, long plid, int status) {
349
350 return layoutRevisionPersistence.findByL_P_S(
351 layoutSetBranchId, plid, status);
352 }
353
354 @Override
355 public List<LayoutRevision> getLayoutRevisions(
356 long layoutSetBranchId, long plid, int start, int end,
357 OrderByComparator<LayoutRevision> orderByComparator) {
358
359 return layoutRevisionPersistence.findByL_P(
360 layoutSetBranchId, plid, start, end, orderByComparator);
361 }
362
363 @Override
364 public List<LayoutRevision> getLayoutRevisions(
365 long layoutSetBranchId, long layoutBranchId, long plid, int start,
366 int end, OrderByComparator<LayoutRevision> orderByComparator) {
367
368 return layoutRevisionPersistence.findByL_L_P(
369 layoutSetBranchId, layoutBranchId, plid, start, end,
370 orderByComparator);
371 }
372
373 @Override
374 public int getLayoutRevisionsCount(
375 long layoutSetBranchId, long layoutBranchId, long plid) {
376
377 return layoutRevisionPersistence.countByL_L_P(
378 layoutSetBranchId, layoutBranchId, plid);
379 }
380
381 @Override
382 public LayoutRevision updateLayoutRevision(
383 long userId, long layoutRevisionId, long layoutBranchId,
384 String name, String title, String description, String keywords,
385 String robots, String typeSettings, boolean iconImage,
386 long iconImageId, String themeId, String colorSchemeId, String css,
387 ServiceContext serviceContext)
388 throws PortalException {
389
390
391
392 User user = userPersistence.findByPrimaryKey(userId);
393 LayoutRevision oldLayoutRevision =
394 layoutRevisionPersistence.findByPrimaryKey(layoutRevisionId);
395 Date now = new Date();
396
397 LayoutRevision layoutRevision = null;
398
399 int workflowAction = serviceContext.getWorkflowAction();
400
401 boolean revisionInProgress = ParamUtil.getBoolean(
402 serviceContext, "revisionInProgress");
403
404 if (!MergeLayoutPrototypesThreadLocal.isInProgress() &&
405 (workflowAction != WorkflowConstants.ACTION_PUBLISH) &&
406 (_layoutRevisionId.get() <= 0) && !revisionInProgress) {
407
408 long newLayoutRevisionId = counterLocalService.increment();
409
410 layoutRevision = layoutRevisionPersistence.create(
411 newLayoutRevisionId);
412
413 layoutRevision.setGroupId(oldLayoutRevision.getGroupId());
414 layoutRevision.setCompanyId(oldLayoutRevision.getCompanyId());
415 layoutRevision.setUserId(user.getUserId());
416 layoutRevision.setUserName(user.getFullName());
417 layoutRevision.setLayoutSetBranchId(
418 oldLayoutRevision.getLayoutSetBranchId());
419 layoutRevision.setParentLayoutRevisionId(
420 oldLayoutRevision.getLayoutRevisionId());
421 layoutRevision.setHead(false);
422 layoutRevision.setLayoutBranchId(layoutBranchId);
423 layoutRevision.setPlid(oldLayoutRevision.getPlid());
424 layoutRevision.setPrivateLayout(
425 oldLayoutRevision.isPrivateLayout());
426 layoutRevision.setName(name);
427 layoutRevision.setTitle(title);
428 layoutRevision.setDescription(description);
429 layoutRevision.setKeywords(keywords);
430 layoutRevision.setRobots(robots);
431 layoutRevision.setTypeSettings(typeSettings);
432 layoutRevision.setIconImageId(iconImageId);
433 layoutRevision.setThemeId(themeId);
434 layoutRevision.setColorSchemeId(colorSchemeId);
435 layoutRevision.setCss(css);
436 layoutRevision.setStatus(WorkflowConstants.STATUS_DRAFT);
437 layoutRevision.setStatusDate(serviceContext.getModifiedDate(now));
438
439 layoutRevisionPersistence.update(layoutRevision);
440
441 _layoutRevisionId.set(layoutRevision.getLayoutRevisionId());
442
443
444
445 copyPortletPreferences(
446 layoutRevision, layoutRevision.getParentLayoutRevisionId());
447
448 StagingUtil.setRecentLayoutBranchId(
449 user, layoutRevision.getLayoutSetBranchId(),
450 layoutRevision.getPlid(), layoutRevision.getLayoutBranchId());
451
452 StagingUtil.setRecentLayoutRevisionId(
453 user, layoutRevision.getLayoutSetBranchId(),
454 layoutRevision.getPlid(), layoutRevision.getLayoutRevisionId());
455 }
456 else {
457 if (_layoutRevisionId.get() > 0) {
458 layoutRevision = layoutRevisionPersistence.findByPrimaryKey(
459 _layoutRevisionId.get());
460 }
461 else {
462 layoutRevision = oldLayoutRevision;
463 }
464
465 layoutRevision.setName(name);
466 layoutRevision.setTitle(title);
467 layoutRevision.setDescription(description);
468 layoutRevision.setKeywords(keywords);
469 layoutRevision.setRobots(robots);
470 layoutRevision.setTypeSettings(typeSettings);
471 layoutRevision.setIconImageId(iconImageId);
472 layoutRevision.setThemeId(themeId);
473 layoutRevision.setColorSchemeId(colorSchemeId);
474 layoutRevision.setCss(css);
475
476 layoutRevisionPersistence.update(layoutRevision);
477
478 _layoutRevisionId.set(layoutRevision.getLayoutRevisionId());
479 }
480
481 boolean major = ParamUtil.getBoolean(serviceContext, "major");
482
483 if (major || !isWorkflowEnabled(layoutRevision.getPlid())) {
484 updateMajor(layoutRevision);
485 }
486
487
488
489 if (isWorkflowEnabled(layoutRevision.getPlid())) {
490 WorkflowHandlerRegistryUtil.startWorkflowInstance(
491 layoutRevision.getCompanyId(), layoutRevision.getGroupId(),
492 userId, LayoutRevision.class.getName(),
493 layoutRevision.getLayoutRevisionId(), layoutRevision,
494 serviceContext);
495 }
496 else {
497 updateStatus(
498 userId, layoutRevision.getLayoutRevisionId(),
499 WorkflowConstants.STATUS_APPROVED, serviceContext);
500 }
501
502 return layoutRevision;
503 }
504
505 @Override
506 public LayoutRevision updateStatus(
507 long userId, long layoutRevisionId, int status,
508 ServiceContext serviceContext)
509 throws PortalException {
510
511 User user = userPersistence.findByPrimaryKey(userId);
512
513 LayoutRevision layoutRevision =
514 layoutRevisionPersistence.findByPrimaryKey(layoutRevisionId);
515
516 layoutRevision.setStatus(status);
517 layoutRevision.setStatusByUserId(user.getUserId());
518 layoutRevision.setStatusByUserName(user.getFullName());
519 layoutRevision.setStatusDate(new Date());
520
521 if (status == WorkflowConstants.STATUS_APPROVED) {
522 layoutRevision.setHead(true);
523 }
524 else {
525 layoutRevision.setHead(false);
526 layoutRevision.setMajor(false);
527 }
528
529 layoutRevisionPersistence.update(layoutRevision);
530
531 if (status == WorkflowConstants.STATUS_APPROVED) {
532 List<LayoutRevision> layoutRevisions =
533 layoutRevisionPersistence.findByL_P(
534 layoutRevision.getLayoutSetBranchId(),
535 layoutRevision.getPlid());
536
537 for (LayoutRevision curLayoutRevision : layoutRevisions) {
538 if (curLayoutRevision.getLayoutRevisionId() !=
539 layoutRevision.getLayoutRevisionId()) {
540
541 curLayoutRevision.setHead(false);
542
543 layoutRevisionPersistence.update(curLayoutRevision);
544 }
545 }
546 }
547 else {
548 List<LayoutRevision> layoutRevisions =
549 layoutRevisionPersistence.findByL_P_S(
550 layoutRevision.getLayoutSetBranchId(),
551 layoutRevision.getPlid(),
552 WorkflowConstants.STATUS_APPROVED);
553
554 for (LayoutRevision curLayoutRevision : layoutRevisions) {
555 if (curLayoutRevision.getLayoutRevisionId() !=
556 layoutRevision.getLayoutRevisionId()) {
557
558 curLayoutRevision.setHead(true);
559
560 layoutRevisionPersistence.update(curLayoutRevision);
561
562 break;
563 }
564 }
565 }
566
567 return layoutRevision;
568 }
569
570 protected void copyPortletPreferences(
571 LayoutRevision layoutRevision, long parentLayoutRevisionId) {
572
573 List<PortletPreferences> portletPreferencesList =
574 portletPreferencesLocalService.getPortletPreferencesByPlid(
575 parentLayoutRevisionId);
576
577 for (PortletPreferences portletPreferences : portletPreferencesList) {
578 portletPreferencesLocalService.addPortletPreferences(
579 layoutRevision.getCompanyId(), portletPreferences.getOwnerId(),
580 portletPreferences.getOwnerType(),
581 layoutRevision.getLayoutRevisionId(),
582 portletPreferences.getPortletId(), null,
583 portletPreferences.getPreferences());
584 }
585 }
586
587 protected long getParentLayoutRevisionId(
588 long layoutSetBranchId, long parentLayoutRevisionId, long plid) {
589
590 LayoutRevision parentLayoutRevision = null;
591
592 if (parentLayoutRevisionId > 0) {
593 parentLayoutRevision = layoutRevisionPersistence.fetchByPrimaryKey(
594 parentLayoutRevisionId);
595
596 if (parentLayoutRevision == null) {
597 List<LayoutRevision> layoutRevisions =
598 layoutRevisionPersistence.findByL_P(
599 layoutSetBranchId, plid, 0, 1);
600
601 if (!layoutRevisions.isEmpty()) {
602 parentLayoutRevision = layoutRevisions.get(0);
603 }
604 }
605 }
606
607 if (parentLayoutRevision != null) {
608 return parentLayoutRevision.getLayoutRevisionId();
609 }
610
611 return LayoutRevisionConstants.DEFAULT_PARENT_LAYOUT_REVISION_ID;
612 }
613
614 protected boolean isWorkflowEnabled(long plid) throws PortalException {
615 Layout layout = layoutLocalService.getLayout(plid);
616
617 if (layout.isTypeLinkToLayout() || layout.isTypeURL()) {
618 return false;
619 }
620
621 return true;
622 }
623
624 protected LayoutRevision updateMajor(LayoutRevision layoutRevision)
625 throws PortalException {
626
627 List<LayoutRevision> parentLayoutRevisions = new ArrayList<>();
628
629 long parentLayoutRevisionId =
630 layoutRevision.getParentLayoutRevisionId();
631
632 while (parentLayoutRevisionId !=
633 LayoutRevisionConstants.DEFAULT_PARENT_LAYOUT_REVISION_ID) {
634
635 LayoutRevision parentLayoutRevision =
636 layoutRevisionPersistence.findByPrimaryKey(
637 parentLayoutRevisionId);
638
639 if (parentLayoutRevision.isMajor()) {
640 break;
641 }
642
643 parentLayoutRevisions.add(parentLayoutRevision);
644
645 parentLayoutRevisionId =
646 parentLayoutRevision.getParentLayoutRevisionId();
647 }
648
649 layoutRevision.setParentLayoutRevisionId(parentLayoutRevisionId);
650 layoutRevision.setMajor(true);
651
652 layoutRevisionPersistence.update(layoutRevision);
653
654 for (LayoutRevision parentLayoutRevision : parentLayoutRevisions) {
655 List<LayoutRevision> childrenLayoutRevisions =
656 parentLayoutRevision.getChildren();
657
658 if (!childrenLayoutRevisions.isEmpty()) {
659 break;
660 }
661
662 layoutRevisionLocalService.deleteLayoutRevision(
663 parentLayoutRevision);
664 }
665
666 return layoutRevision;
667 }
668
669 private static final ThreadLocal<Long> _layoutRevisionId =
670 new AutoResetThreadLocal<>(
671 LayoutRevisionLocalServiceImpl.class + "._layoutRevisionId", 0L);
672
673 }