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