001
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
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
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
107
108 if (portletPreferencesPlid == LayoutConstants.DEFAULT_PLID) {
109 portletPreferencesPlid = plid;
110 }
111
112 copyPortletPreferences(layoutRevision, portletPreferencesPlid);
113
114
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
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
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
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 }