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