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