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