001    /**
002     * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
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    /**
044     * @author Raymond Aug??
045     * @author Brian Wing Shun Chan
046     */
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                    // Layout revision
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                    // Portlet preferences
105    
106                    if (portletPreferencesPlid == LayoutConstants.DEFAULT_PLID) {
107                            portletPreferencesPlid = plid;
108                    }
109    
110                    copyPortletPreferences(layoutRevision, portletPreferencesPlid);
111    
112                    // Workflow
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 fetchLatestLayoutRevision(
246                    long layoutSetBranchId, long plid) {
247    
248                    return layoutRevisionPersistence.fetchByL_P_First(
249                            layoutSetBranchId, plid,
250                            new LayoutRevisionCreateDateComparator(false));
251            }
252    
253            @Override
254            public LayoutRevision fetchLayoutRevision(
255                    long layoutSetBranchId, boolean head, long plid) {
256    
257                    return layoutRevisionPersistence.fetchByL_H_P(
258                            layoutSetBranchId, head, plid);
259            }
260    
261            @Override
262            public List<LayoutRevision> getChildLayoutRevisions(
263                    long layoutSetBranchId, long parentLayoutRevisionId, long plid) {
264    
265                    return layoutRevisionPersistence.findByL_P_P(
266                            layoutSetBranchId, parentLayoutRevisionId, plid);
267            }
268    
269            @Override
270            public List<LayoutRevision> getChildLayoutRevisions(
271                    long layoutSetBranchId, long parentLayoutRevision, long plid, int start,
272                    int end, OrderByComparator<LayoutRevision> orderByComparator) {
273    
274                    return layoutRevisionPersistence.findByL_P_P(
275                            layoutSetBranchId, parentLayoutRevision, plid, start, end,
276                            orderByComparator);
277            }
278    
279            @Override
280            public int getChildLayoutRevisionsCount(
281                    long layoutSetBranchId, long parentLayoutRevision, long plid) {
282    
283                    return layoutRevisionPersistence.countByL_P_P(
284                            layoutSetBranchId, parentLayoutRevision, plid);
285            }
286    
287            @Override
288            public LayoutRevision getLayoutRevision(
289                            long layoutSetBranchId, long plid, boolean head)
290                    throws PortalException {
291    
292                    return layoutRevisionPersistence.findByL_H_P(
293                            layoutSetBranchId, head, plid);
294            }
295    
296            @Override
297            public LayoutRevision getLayoutRevision(
298                            long layoutSetBranchId, long layoutBranchId, long plid)
299                    throws PortalException {
300    
301                    List<LayoutRevision> layoutRevisions =
302                            layoutRevisionPersistence.findByL_L_P(
303                                    layoutSetBranchId, layoutBranchId, plid, 0, 1,
304                                    new LayoutRevisionCreateDateComparator(false));
305    
306                    if (!layoutRevisions.isEmpty()) {
307                            return layoutRevisions.get(0);
308                    }
309    
310                    StringBundler sb = new StringBundler(7);
311    
312                    sb.append("{layoutSetBranchId=");
313                    sb.append(layoutSetBranchId);
314                    sb.append(", layoutBranchId=");
315                    sb.append(layoutBranchId);
316                    sb.append(", plid=");
317                    sb.append(plid);
318                    sb.append("}");
319    
320                    throw new NoSuchLayoutRevisionException(sb.toString());
321            }
322    
323            @Override
324            public List<LayoutRevision> getLayoutRevisions(long plid) {
325                    return layoutRevisionPersistence.findByPlid(plid);
326            }
327    
328            @Override
329            public List<LayoutRevision> getLayoutRevisions(
330                    long layoutSetBranchId, boolean head) {
331    
332                    return layoutRevisionPersistence.findByL_H(layoutSetBranchId, head);
333            }
334    
335            @Override
336            public List<LayoutRevision> getLayoutRevisions(
337                    long layoutSetBranchId, int status) {
338    
339                    return layoutRevisionPersistence.findByL_S(layoutSetBranchId, status);
340            }
341    
342            @Override
343            public List<LayoutRevision> getLayoutRevisions(
344                    long layoutSetBranchId, long plid) {
345    
346                    return layoutRevisionPersistence.findByL_P(layoutSetBranchId, plid);
347            }
348    
349            @Override
350            public List<LayoutRevision> getLayoutRevisions(
351                    long layoutSetBranchId, long plid, int status) {
352    
353                    return layoutRevisionPersistence.findByL_P_S(
354                            layoutSetBranchId, plid, status);
355            }
356    
357            @Override
358            public List<LayoutRevision> getLayoutRevisions(
359                    long layoutSetBranchId, long plid, int start, int end,
360                    OrderByComparator<LayoutRevision> orderByComparator) {
361    
362                    return layoutRevisionPersistence.findByL_P(
363                            layoutSetBranchId, plid, start, end, orderByComparator);
364            }
365    
366            @Override
367            public List<LayoutRevision> getLayoutRevisions(
368                    long layoutSetBranchId, long layoutBranchId, long plid, int start,
369                    int end, OrderByComparator<LayoutRevision> orderByComparator) {
370    
371                    return layoutRevisionPersistence.findByL_L_P(
372                            layoutSetBranchId, layoutBranchId, plid, start, end,
373                            orderByComparator);
374            }
375    
376            @Override
377            public int getLayoutRevisionsCount(
378                    long layoutSetBranchId, long layoutBranchId, long plid) {
379    
380                    return layoutRevisionPersistence.countByL_L_P(
381                            layoutSetBranchId, layoutBranchId, plid);
382            }
383    
384            @Override
385            public LayoutRevision updateLayoutRevision(
386                            long userId, long layoutRevisionId, long layoutBranchId,
387                            String name, String title, String description, String keywords,
388                            String robots, String typeSettings, boolean iconImage,
389                            long iconImageId, String themeId, String colorSchemeId,
390                            String wapThemeId, String wapColorSchemeId, String css,
391                            ServiceContext serviceContext)
392                    throws PortalException {
393    
394                    // Layout revision
395    
396                    User user = userPersistence.findByPrimaryKey(userId);
397                    LayoutRevision oldLayoutRevision =
398                            layoutRevisionPersistence.findByPrimaryKey(layoutRevisionId);
399                    Date now = new Date();
400    
401                    LayoutRevision layoutRevision = null;
402    
403                    int workflowAction = serviceContext.getWorkflowAction();
404    
405                    boolean revisionInProgress = ParamUtil.getBoolean(
406                            serviceContext, "revisionInProgress");
407    
408                    if (!MergeLayoutPrototypesThreadLocal.isInProgress() &&
409                            (workflowAction != WorkflowConstants.ACTION_PUBLISH) &&
410                            (_layoutRevisionId.get() <= 0) && !revisionInProgress) {
411    
412                            long newLayoutRevisionId = counterLocalService.increment();
413    
414                            layoutRevision = layoutRevisionPersistence.create(
415                                    newLayoutRevisionId);
416    
417                            layoutRevision.setGroupId(oldLayoutRevision.getGroupId());
418                            layoutRevision.setCompanyId(oldLayoutRevision.getCompanyId());
419                            layoutRevision.setUserId(user.getUserId());
420                            layoutRevision.setUserName(user.getFullName());
421                            layoutRevision.setLayoutSetBranchId(
422                                    oldLayoutRevision.getLayoutSetBranchId());
423                            layoutRevision.setParentLayoutRevisionId(
424                                    oldLayoutRevision.getLayoutRevisionId());
425                            layoutRevision.setHead(false);
426                            layoutRevision.setLayoutBranchId(layoutBranchId);
427                            layoutRevision.setPlid(oldLayoutRevision.getPlid());
428                            layoutRevision.setPrivateLayout(
429                                    oldLayoutRevision.isPrivateLayout());
430                            layoutRevision.setName(name);
431                            layoutRevision.setTitle(title);
432                            layoutRevision.setDescription(description);
433                            layoutRevision.setKeywords(keywords);
434                            layoutRevision.setRobots(robots);
435                            layoutRevision.setTypeSettings(typeSettings);
436                            layoutRevision.setIconImageId(iconImageId);
437                            layoutRevision.setThemeId(themeId);
438                            layoutRevision.setColorSchemeId(colorSchemeId);
439                            layoutRevision.setWapThemeId(wapThemeId);
440                            layoutRevision.setWapColorSchemeId(wapColorSchemeId);
441                            layoutRevision.setCss(css);
442                            layoutRevision.setStatus(WorkflowConstants.STATUS_DRAFT);
443                            layoutRevision.setStatusDate(serviceContext.getModifiedDate(now));
444    
445                            layoutRevisionPersistence.update(layoutRevision);
446    
447                            _layoutRevisionId.set(layoutRevision.getLayoutRevisionId());
448    
449                            // Portlet preferences
450    
451                            copyPortletPreferences(
452                                    layoutRevision, layoutRevision.getParentLayoutRevisionId());
453    
454                            StagingUtil.setRecentLayoutBranchId(
455                                    user, layoutRevision.getLayoutSetBranchId(),
456                                    layoutRevision.getPlid(), layoutRevision.getLayoutBranchId());
457    
458                            StagingUtil.setRecentLayoutRevisionId(
459                                    user, layoutRevision.getLayoutSetBranchId(),
460                                    layoutRevision.getPlid(), layoutRevision.getLayoutRevisionId());
461                    }
462                    else {
463                            if (_layoutRevisionId.get() > 0) {
464                                    layoutRevision = layoutRevisionPersistence.findByPrimaryKey(
465                                            _layoutRevisionId.get());
466                            }
467                            else {
468                                    layoutRevision = oldLayoutRevision;
469                            }
470    
471                            layoutRevision.setName(name);
472                            layoutRevision.setTitle(title);
473                            layoutRevision.setDescription(description);
474                            layoutRevision.setKeywords(keywords);
475                            layoutRevision.setRobots(robots);
476                            layoutRevision.setTypeSettings(typeSettings);
477                            layoutRevision.setIconImageId(iconImageId);
478                            layoutRevision.setThemeId(themeId);
479                            layoutRevision.setColorSchemeId(colorSchemeId);
480                            layoutRevision.setWapThemeId(wapThemeId);
481                            layoutRevision.setWapColorSchemeId(wapColorSchemeId);
482                            layoutRevision.setCss(css);
483    
484                            layoutRevisionPersistence.update(layoutRevision);
485    
486                            _layoutRevisionId.set(layoutRevision.getLayoutRevisionId());
487                    }
488    
489                    boolean major = ParamUtil.getBoolean(serviceContext, "major");
490    
491                    if (major || !isWorkflowEnabled(layoutRevision.getPlid())) {
492                            updateMajor(layoutRevision);
493                    }
494    
495                    // Workflow
496    
497                    if (isWorkflowEnabled(layoutRevision.getPlid())) {
498                            WorkflowHandlerRegistryUtil.startWorkflowInstance(
499                                    layoutRevision.getCompanyId(), layoutRevision.getGroupId(),
500                                    userId, LayoutRevision.class.getName(),
501                                    layoutRevision.getLayoutRevisionId(), layoutRevision,
502                                    serviceContext);
503                    }
504                    else {
505                            updateStatus(
506                                    userId, layoutRevision.getLayoutRevisionId(),
507                                    WorkflowConstants.STATUS_APPROVED, serviceContext);
508                    }
509    
510                    return layoutRevision;
511            }
512    
513            @Override
514            public LayoutRevision updateStatus(
515                            long userId, long layoutRevisionId, int status,
516                            ServiceContext serviceContext)
517                    throws PortalException {
518    
519                    User user = userPersistence.findByPrimaryKey(userId);
520    
521                    LayoutRevision layoutRevision =
522                            layoutRevisionPersistence.findByPrimaryKey(layoutRevisionId);
523    
524                    layoutRevision.setStatus(status);
525                    layoutRevision.setStatusByUserId(user.getUserId());
526                    layoutRevision.setStatusByUserName(user.getFullName());
527                    layoutRevision.setStatusDate(new Date());
528    
529                    if (status == WorkflowConstants.STATUS_APPROVED) {
530                            layoutRevision.setHead(true);
531                    }
532                    else {
533                            layoutRevision.setHead(false);
534                            layoutRevision.setMajor(false);
535                    }
536    
537                    layoutRevisionPersistence.update(layoutRevision);
538    
539                    if (status == WorkflowConstants.STATUS_APPROVED) {
540                            List<LayoutRevision> layoutRevisions =
541                                    layoutRevisionPersistence.findByL_P(
542                                            layoutRevision.getLayoutSetBranchId(),
543                                            layoutRevision.getPlid());
544    
545                            for (LayoutRevision curLayoutRevision : layoutRevisions) {
546                                    if (curLayoutRevision.getLayoutRevisionId() !=
547                                                    layoutRevision.getLayoutRevisionId()) {
548    
549                                            curLayoutRevision.setHead(false);
550    
551                                            layoutRevisionPersistence.update(curLayoutRevision);
552                                    }
553                            }
554                    }
555                    else {
556                            List<LayoutRevision> layoutRevisions =
557                                    layoutRevisionPersistence.findByL_P_S(
558                                            layoutRevision.getLayoutSetBranchId(),
559                                            layoutRevision.getPlid(),
560                                            WorkflowConstants.STATUS_APPROVED);
561    
562                            for (LayoutRevision curLayoutRevision : layoutRevisions) {
563                                    if (curLayoutRevision.getLayoutRevisionId() !=
564                                                    layoutRevision.getLayoutRevisionId()) {
565    
566                                            curLayoutRevision.setHead(true);
567    
568                                            layoutRevisionPersistence.update(curLayoutRevision);
569    
570                                            break;
571                                    }
572                            }
573                    }
574    
575                    return layoutRevision;
576            }
577    
578            protected void copyPortletPreferences(
579                    LayoutRevision layoutRevision, long parentLayoutRevisionId) {
580    
581                    List<PortletPreferences> portletPreferencesList =
582                            portletPreferencesLocalService.getPortletPreferencesByPlid(
583                                    parentLayoutRevisionId);
584    
585                    for (PortletPreferences portletPreferences : portletPreferencesList) {
586                            portletPreferencesLocalService.addPortletPreferences(
587                                    layoutRevision.getCompanyId(), portletPreferences.getOwnerId(),
588                                    portletPreferences.getOwnerType(),
589                                    layoutRevision.getLayoutRevisionId(),
590                                    portletPreferences.getPortletId(), null,
591                                    portletPreferences.getPreferences());
592                    }
593            }
594    
595            protected long getParentLayoutRevisionId(
596                    long layoutSetBranchId, long parentLayoutRevisionId, long plid) {
597    
598                    LayoutRevision parentLayoutRevision = null;
599    
600                    if (parentLayoutRevisionId > 0) {
601                            parentLayoutRevision = layoutRevisionPersistence.fetchByPrimaryKey(
602                                    parentLayoutRevisionId);
603    
604                            if (parentLayoutRevision == null) {
605                                    List<LayoutRevision> layoutRevisions =
606                                            layoutRevisionPersistence.findByL_P(
607                                                    layoutSetBranchId, plid, 0, 1);
608    
609                                    if (!layoutRevisions.isEmpty()) {
610                                            parentLayoutRevision = layoutRevisions.get(0);
611                                    }
612                            }
613                    }
614    
615                    if (parentLayoutRevision != null) {
616                            return parentLayoutRevision.getLayoutRevisionId();
617                    }
618    
619                    return LayoutRevisionConstants.DEFAULT_PARENT_LAYOUT_REVISION_ID;
620            }
621    
622            protected boolean isWorkflowEnabled(long plid) throws PortalException {
623                    Layout layout = layoutLocalService.getLayout(plid);
624    
625                    if (layout.isTypeLinkToLayout() || layout.isTypeURL()) {
626                            return false;
627                    }
628    
629                    return true;
630            }
631    
632            protected LayoutRevision updateMajor(LayoutRevision layoutRevision)
633                    throws PortalException {
634    
635                    List<LayoutRevision> parentLayoutRevisions = new ArrayList<>();
636    
637                    long parentLayoutRevisionId =
638                            layoutRevision.getParentLayoutRevisionId();
639    
640                    while (parentLayoutRevisionId !=
641                                            LayoutRevisionConstants.DEFAULT_PARENT_LAYOUT_REVISION_ID) {
642    
643                            LayoutRevision parentLayoutRevision =
644                                    layoutRevisionPersistence.findByPrimaryKey(
645                                            parentLayoutRevisionId);
646    
647                            if (parentLayoutRevision.isMajor()) {
648                                    break;
649                            }
650    
651                            parentLayoutRevisions.add(parentLayoutRevision);
652    
653                            parentLayoutRevisionId =
654                                    parentLayoutRevision.getParentLayoutRevisionId();
655                    }
656    
657                    layoutRevision.setParentLayoutRevisionId(parentLayoutRevisionId);
658                    layoutRevision.setMajor(true);
659    
660                    layoutRevisionPersistence.update(layoutRevision);
661    
662                    for (LayoutRevision parentLayoutRevision : parentLayoutRevisions) {
663                            List<LayoutRevision> childrenLayoutRevisions =
664                                    parentLayoutRevision.getChildren();
665    
666                            if (!childrenLayoutRevisions.isEmpty()) {
667                                    break;
668                            }
669    
670                            layoutRevisionLocalService.deleteLayoutRevision(
671                                    parentLayoutRevision);
672                    }
673    
674                    return layoutRevision;
675            }
676    
677            private static final ThreadLocal<Long> _layoutRevisionId =
678                    new AutoResetThreadLocal<>(
679                            LayoutRevisionLocalServiceImpl.class + "._layoutRevisionId", 0L);
680    
681    }