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 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                    // Layout revision
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                            // Portlet preferences
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                    // Workflow
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    }