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