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