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