001
014
015 package com.liferay.portal.model.impl;
016
017 import com.liferay.portal.kernel.configuration.Filter;
018 import com.liferay.portal.kernel.exception.PortalException;
019 import com.liferay.portal.kernel.exception.SystemException;
020 import com.liferay.portal.kernel.log.Log;
021 import com.liferay.portal.kernel.log.LogFactoryUtil;
022 import com.liferay.portal.kernel.portlet.PortletLayoutListener;
023 import com.liferay.portal.kernel.util.ArrayUtil;
024 import com.liferay.portal.kernel.util.DateFormatFactoryUtil;
025 import com.liferay.portal.kernel.util.FastDateFormatFactoryUtil;
026 import com.liferay.portal.kernel.util.GetterUtil;
027 import com.liferay.portal.kernel.util.ListUtil;
028 import com.liferay.portal.kernel.util.PropsKeys;
029 import com.liferay.portal.kernel.util.StringPool;
030 import com.liferay.portal.kernel.util.StringUtil;
031 import com.liferay.portal.kernel.util.UnicodeProperties;
032 import com.liferay.portal.kernel.util.UniqueList;
033 import com.liferay.portal.kernel.util.Validator;
034 import com.liferay.portal.model.CustomizedPages;
035 import com.liferay.portal.model.Group;
036 import com.liferay.portal.model.Layout;
037 import com.liferay.portal.model.LayoutSet;
038 import com.liferay.portal.model.LayoutTemplate;
039 import com.liferay.portal.model.LayoutTypePortlet;
040 import com.liferay.portal.model.LayoutTypePortletConstants;
041 import com.liferay.portal.model.Plugin;
042 import com.liferay.portal.model.Portlet;
043 import com.liferay.portal.model.PortletConstants;
044 import com.liferay.portal.model.PortletPreferences;
045 import com.liferay.portal.model.PortletPreferencesIds;
046 import com.liferay.portal.model.Theme;
047 import com.liferay.portal.security.permission.ActionKeys;
048 import com.liferay.portal.security.permission.PermissionChecker;
049 import com.liferay.portal.security.permission.PermissionThreadLocal;
050 import com.liferay.portal.service.LayoutTemplateLocalServiceUtil;
051 import com.liferay.portal.service.PluginSettingLocalServiceUtil;
052 import com.liferay.portal.service.PortletLocalServiceUtil;
053 import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
054 import com.liferay.portal.service.permission.LayoutPermissionUtil;
055 import com.liferay.portal.service.permission.PortletPermissionUtil;
056 import com.liferay.portal.util.PortalUtil;
057 import com.liferay.portal.util.PortletKeys;
058 import com.liferay.portal.util.PropsUtil;
059 import com.liferay.portal.util.PropsValues;
060 import com.liferay.portlet.PortalPreferences;
061 import com.liferay.portlet.PortletPreferencesFactoryUtil;
062 import com.liferay.portlet.sites.util.SitesUtil;
063 import com.liferay.util.JS;
064 import com.liferay.util.PwdGenerator;
065
066 import java.text.DateFormat;
067 import java.text.Format;
068
069 import java.util.ArrayList;
070 import java.util.Date;
071 import java.util.List;
072 import java.util.Map;
073 import java.util.Set;
074
075
081 public class LayoutTypePortletImpl
082 extends LayoutTypeImpl implements LayoutTypePortlet {
083
084 public static String generateInstanceId() {
085 return PwdGenerator.getPassword(
086 PwdGenerator.KEY1 + PwdGenerator.KEY2 + PwdGenerator.KEY3, 12);
087 }
088
089 public LayoutTypePortletImpl(Layout layout) {
090 super(layout);
091
092 if (_nestedPortletsNamespace == null) {
093 _nestedPortletsNamespace = PortalUtil.getPortletNamespace(
094 PortletKeys.NESTED_PORTLETS);
095 }
096
097 _layoutSetPrototypeLayout = SitesUtil.getLayoutSetPrototypeLayout(
098 layout);
099 }
100
101 public void addModeAboutPortletId(String portletId) {
102 removeModesPortletId(portletId);
103 setModeAbout(StringUtil.add(getModeAbout(), portletId));
104 }
105
106 public void addModeConfigPortletId(String portletId) {
107 removeModesPortletId(portletId);
108 setModeConfig(StringUtil.add(getModeConfig(), portletId));
109 }
110
111 public void addModeEditDefaultsPortletId(String portletId) {
112 removeModesPortletId(portletId);
113 setModeEditDefaults(StringUtil.add(getModeEditDefaults(), portletId));
114 }
115
116 public void addModeEditGuestPortletId(String portletId) {
117 removeModesPortletId(portletId);
118 setModeEditGuest(StringUtil.add(getModeEditGuest(), portletId));
119 }
120
121 public void addModeEditPortletId(String portletId) {
122 removeModesPortletId(portletId);
123 setModeEdit(StringUtil.add(getModeEdit(), portletId));
124 }
125
126 public void addModeHelpPortletId(String portletId) {
127 removeModesPortletId(portletId);
128 setModeHelp(StringUtil.add(getModeHelp(), portletId));
129 }
130
131 public void addModePreviewPortletId(String portletId) {
132 removeModesPortletId(portletId);
133 setModePreview(StringUtil.add(getModePreview(), portletId));
134 }
135
136 public void addModePrintPortletId(String portletId) {
137 removeModesPortletId(portletId);
138 setModePrint(StringUtil.add(getModePrint(), portletId));
139 }
140
141 public String addPortletId(long userId, String portletId)
142 throws PortalException, SystemException {
143
144 return addPortletId(userId, portletId, true);
145 }
146
147 public String addPortletId(
148 long userId, String portletId, boolean checkPermission)
149 throws PortalException, SystemException {
150
151 return addPortletId(userId, portletId, null, -1, checkPermission);
152 }
153
154 public String addPortletId(
155 long userId, String portletId, String columnId, int columnPos)
156 throws PortalException, SystemException {
157
158 return addPortletId(userId, portletId, columnId, columnPos, true);
159 }
160
161 public String addPortletId(
162 long userId, String portletId, String columnId, int columnPos,
163 boolean checkPermission)
164 throws PortalException, SystemException {
165
166 return addPortletId(
167 userId, portletId, columnId, columnPos, checkPermission, false);
168 }
169
170 public void addPortletIds(
171 long userId, String[] portletIds, boolean checkPermission)
172 throws PortalException, SystemException {
173
174 for (String portletId : portletIds) {
175 addPortletId(userId, portletId, checkPermission);
176 }
177 }
178
179 public void addPortletIds(
180 long userId, String[] portletIds, String columnId,
181 boolean checkPermission)
182 throws PortalException, SystemException {
183
184 for (String portletId : portletIds) {
185 addPortletId(userId, portletId, columnId, -1, checkPermission);
186 }
187 }
188
189 public void addStateMaxPortletId(String portletId) {
190 removeStatesPortletId(portletId);
191
192 setStateMax(StringUtil.add(StringPool.BLANK, portletId));
193 }
194
195 public void addStateMinPortletId(String portletId) {
196 removeStateMaxPortletId(portletId);
197 setStateMin(StringUtil.add(getStateMin(), portletId));
198 }
199
200 public List<Portlet> addStaticPortlets(
201 List<Portlet> portlets, List<Portlet> startPortlets,
202 List<Portlet> endPortlets) {
203
204
205
206
207 if (startPortlets == null) {
208 startPortlets = new ArrayList<Portlet>();
209 }
210
211 if (endPortlets == null) {
212 endPortlets = new ArrayList<Portlet>();
213 }
214
215 if (startPortlets.isEmpty() && endPortlets.isEmpty()) {
216 return portlets;
217 }
218
219
220
221 List<Portlet> list = new ArrayList<Portlet>(
222 portlets.size() + startPortlets.size() + endPortlets.size());
223
224 if (!startPortlets.isEmpty()) {
225 list.addAll(startPortlets);
226 }
227
228 for (int i = 0; i < portlets.size(); i++) {
229 Portlet portlet = portlets.get(i);
230
231
232
233 if (!startPortlets.contains(portlet) &&
234 !endPortlets.contains(portlet)) {
235
236 list.add(portlet);
237 }
238 }
239
240 if (!endPortlets.isEmpty()) {
241 list.addAll(endPortlets);
242 }
243
244 return list;
245 }
246
247 public List<Portlet> getAllPortlets()
248 throws PortalException, SystemException {
249
250 List<Portlet> portlets = new ArrayList<Portlet>();
251
252 List<String> columns = getColumns();
253
254 for (int i = 0; i < columns.size(); i++) {
255 String columnId = columns.get(i);
256
257 portlets.addAll(getAllPortlets(columnId));
258 }
259
260 List<Portlet> staticPortlets = getStaticPortlets(
261 PropsKeys.LAYOUT_STATIC_PORTLETS_ALL);
262
263 List<Portlet> embeddedPortlets = getEmbeddedPortlets(
264 portlets, staticPortlets);
265
266 return addStaticPortlets(portlets, staticPortlets, embeddedPortlets);
267 }
268
269 public List<Portlet> getAllPortlets(String columnId)
270 throws PortalException, SystemException {
271
272 String columnValue = getColumnValue(columnId);
273
274 String[] portletIds = StringUtil.split(columnValue);
275
276 List<Portlet> portlets = new ArrayList<Portlet>(portletIds.length);
277
278 for (String portletId : portletIds) {
279 Portlet portlet = PortletLocalServiceUtil.getPortletById(
280 getCompanyId(), portletId);
281
282 if (portlet != null) {
283 portlets.add(portlet);
284 }
285 }
286
287 List<Portlet> startPortlets = getStaticPortlets(
288 PropsKeys.LAYOUT_STATIC_PORTLETS_START + columnId);
289
290 List<Portlet> endPortlets = getStaticPortlets(
291 PropsKeys.LAYOUT_STATIC_PORTLETS_END + columnId);
292
293 return addStaticPortlets(portlets, startPortlets, endPortlets);
294 }
295
296 public Layout getLayoutSetPrototypeLayout() {
297 return _layoutSetPrototypeLayout;
298 }
299
300 public String getLayoutSetPrototypeLayoutProperty(String key) {
301 if (_layoutSetPrototypeLayout== null) {
302 return StringPool.BLANK;
303 }
304
305 UnicodeProperties typeSettingsProperties =
306 _layoutSetPrototypeLayout.getTypeSettingsProperties();
307
308 return typeSettingsProperties.getProperty(key);
309 }
310
311 public LayoutTemplate getLayoutTemplate() {
312 String themeId = getThemeId();
313
314 LayoutTemplate layoutTemplate =
315 LayoutTemplateLocalServiceUtil.getLayoutTemplate(
316 getLayoutTemplateId(), false, themeId);
317
318 if (layoutTemplate == null) {
319 layoutTemplate = new LayoutTemplateImpl(
320 StringPool.BLANK, StringPool.BLANK);
321
322 List<String> columns = new ArrayList<String>();
323
324 for (int i = 1; i <= 10; i++) {
325 columns.add(LayoutTypePortletConstants.COLUMN_PREFIX + i);
326 }
327
328 layoutTemplate.setColumns(columns);
329 }
330
331 return layoutTemplate;
332 }
333
334 public String getLayoutTemplateId() {
335 String layoutTemplateId = StringPool.BLANK;
336
337 if (hasLayoutSetPrototypeLayout()) {
338 layoutTemplateId = getLayoutSetPrototypeLayoutProperty(
339 LayoutTypePortletConstants.LAYOUT_TEMPLATE_ID);
340 }
341 else {
342 layoutTemplateId = getTypeSettingsProperty(
343 LayoutTypePortletConstants.LAYOUT_TEMPLATE_ID);
344 }
345
346 if (Validator.isNull(layoutTemplateId)) {
347 layoutTemplateId = StringPool.BLANK;
348 }
349
350 return layoutTemplateId;
351 }
352
353 public String getModeAbout() {
354 return getTypeSettingsProperty(LayoutTypePortletConstants.MODE_ABOUT);
355 }
356
357 public String getModeConfig() {
358 return getTypeSettingsProperty(LayoutTypePortletConstants.MODE_CONFIG);
359 }
360
361 public String getModeEdit() {
362 return getTypeSettingsProperty(LayoutTypePortletConstants.MODE_EDIT);
363 }
364
365 public String getModeEditDefaults() {
366 return getTypeSettingsProperty(
367 LayoutTypePortletConstants.MODE_EDIT_DEFAULTS);
368 }
369
370 public String getModeEditGuest() {
371 return getTypeSettingsProperty(
372 LayoutTypePortletConstants.MODE_EDIT_GUEST);
373 }
374
375 public String getModeHelp() {
376 return getTypeSettingsProperty(LayoutTypePortletConstants.MODE_HELP);
377 }
378
379 public String getModePreview() {
380 return getTypeSettingsProperty(LayoutTypePortletConstants.MODE_PREVIEW);
381 }
382
383 public String getModePrint() {
384 return getTypeSettingsProperty(LayoutTypePortletConstants.MODE_PRINT);
385 }
386
387 public int getNumOfColumns() {
388 return getLayoutTemplate().getColumns().size();
389 }
390
391 public PortalPreferences getPortalPreferences() {
392 return _portalPreferences;
393 }
394
395 public List<String> getPortletIds() {
396 List<String> portletIds = new ArrayList<String>();
397
398 List<String> columns = getColumns();
399
400 for (int i = 0; i < columns.size(); i++) {
401 String columnId = columns.get(i);
402
403 String columnValue = getColumnValue(columnId);
404
405 portletIds.addAll(
406 ListUtil.fromArray(StringUtil.split(columnValue)));
407 }
408
409 return portletIds;
410 }
411
412 public List<Portlet> getPortlets() throws SystemException {
413 List<String> portletIds = getPortletIds();
414
415 List<Portlet> portlets = new ArrayList<Portlet>(portletIds.size());
416
417 for (int i = 0; i < portletIds.size(); i++) {
418 String portletId = portletIds.get(i);
419
420 Portlet portlet = PortletLocalServiceUtil.getPortletById(
421 getCompanyId(), portletId);
422
423 if (portlet != null) {
424 portlets.add(portlet);
425 }
426 }
427
428 return portlets;
429 }
430
431 public String getStateMax() {
432 return getTypeSettingsProperty(LayoutTypePortletConstants.STATE_MAX);
433 }
434
435 public String getStateMaxPortletId() {
436 String[] stateMax = StringUtil.split(getStateMax());
437
438 if (stateMax.length > 0) {
439 return stateMax[0];
440 }
441 else {
442 return StringPool.BLANK;
443 }
444 }
445
446 public String getStateMin() {
447 return getTypeSettingsProperty(LayoutTypePortletConstants.STATE_MIN);
448 }
449
450 public boolean hasDefaultScopePortletId(long groupId, String portletId)
451 throws PortalException, SystemException {
452
453 if (hasPortletId(portletId)) {
454 long scopeGroupId = PortalUtil.getScopeGroupId(
455 getLayout(), portletId);
456
457 if (groupId == scopeGroupId) {
458 return true;
459 }
460 }
461
462 return false;
463 }
464
465 public boolean hasLayoutSetPrototypeLayout() {
466 if (_layoutSetPrototypeLayout != null) {
467 return true;
468 }
469
470 return false;
471 }
472
473 public boolean hasModeAboutPortletId(String portletId) {
474 return StringUtil.contains(getModeAbout(), portletId);
475 }
476
477 public boolean hasModeConfigPortletId(String portletId) {
478 return StringUtil.contains(getModeConfig(), portletId);
479 }
480
481 public boolean hasModeEditDefaultsPortletId(String portletId) {
482 return StringUtil.contains(getModeEditDefaults(), portletId);
483 }
484
485 public boolean hasModeEditGuestPortletId(String portletId) {
486 return StringUtil.contains(getModeEditGuest(), portletId);
487 }
488
489 public boolean hasModeEditPortletId(String portletId) {
490 return StringUtil.contains(getModeEdit(), portletId);
491 }
492
493 public boolean hasModeHelpPortletId(String portletId) {
494 return StringUtil.contains(getModeHelp(), portletId);
495 }
496
497 public boolean hasModePreviewPortletId(String portletId) {
498 return StringUtil.contains(getModePreview(), portletId);
499 }
500
501 public boolean hasModePrintPortletId(String portletId) {
502 return StringUtil.contains(getModePrint(), portletId);
503 }
504
505 public boolean hasModeViewPortletId(String portletId) {
506 if (hasModeAboutPortletId(portletId) ||
507 hasModeConfigPortletId(portletId) ||
508 hasModeEditPortletId(portletId) ||
509 hasModeEditDefaultsPortletId(portletId) ||
510 hasModeEditGuestPortletId(portletId) ||
511 hasModeHelpPortletId(portletId) ||
512 hasModePreviewPortletId(portletId) ||
513 hasModePrintPortletId(portletId)) {
514
515 return false;
516 }
517 else {
518 return true;
519 }
520 }
521
522 public boolean hasPortletId(String portletId)
523 throws PortalException, SystemException {
524
525 return hasPortletId(portletId, false);
526 }
527
528 public boolean hasStateMax() {
529 String[] stateMax = StringUtil.split(getStateMax());
530
531 if (stateMax.length > 0) {
532 return true;
533 }
534 else {
535 return false;
536 }
537 }
538
539 public boolean hasStateMaxPortletId(String portletId) {
540 if (StringUtil.contains(getStateMax(), portletId)) {
541 return true;
542 }
543 else {
544 return false;
545 }
546 }
547
548 public boolean hasStateMin() {
549 String[] stateMin = StringUtil.split(getStateMin());
550
551 if (stateMin.length > 0) {
552 return true;
553 }
554 else {
555 return false;
556 }
557 }
558
559 public boolean hasStateMinPortletId(String portletId) {
560 if (StringUtil.contains(getStateMin(), portletId)) {
561 return true;
562 }
563 else {
564 return false;
565 }
566 }
567
568 public boolean hasStateNormalPortletId(String portletId) {
569 if (hasStateMaxPortletId(portletId) ||
570 hasStateMinPortletId(portletId)) {
571
572 return false;
573 }
574 else {
575 return true;
576 }
577 }
578
579 public boolean hasUpdatePermission() {
580 return _updatePermission;
581 }
582
583 public boolean isColumnCustomizable(String columnId) {
584 if (!isLayoutSetPrototype()) {
585 String customizableString = getTypeSettingsProperty(
586 CustomizedPages.namespaceColumnId(columnId));
587
588 boolean customizable = GetterUtil.getBoolean(customizableString);
589
590 if (!customizable && hasUserPreferences()) {
591 String columnValue = _portalPreferences.getValue(
592 CustomizedPages.namespacePlid(getPlid()), columnId,
593 StringPool.NULL);
594
595 if (!Validator.equals(columnValue, StringPool.NULL)) {
596 setUserPreference(columnId, null);
597 }
598 }
599
600 return customizable;
601 }
602
603 return false;
604 }
605
606 public boolean isColumnDisabled(String columnId) {
607 if ((isCustomizedView() && !isColumnCustomizable(columnId)) ||
608 (!isCustomizedView() && !hasUpdatePermission())) {
609
610 return true;
611 }
612
613 return false;
614 }
615
616 public boolean isCustomizable() {
617 for (String columnId : getColumns()) {
618 if (isColumnCustomizable(columnId)) {
619 return true;
620 }
621 }
622
623 return false;
624 }
625
626 public boolean isCustomizedView() {
627 return _customizedView;
628 }
629
630 public boolean isDefaultUpdated() {
631 if (!isCustomizedView() || !hasUserPreferences()) {
632 return false;
633 }
634
635 String preferencesModifiedDateString = _portalPreferences.getValue(
636 CustomizedPages.namespacePlid(getPlid()), _MODIFIED_DATE,
637 _NULL_DATE);
638
639 DateFormat dateFormat = DateFormatFactoryUtil.getSimpleDateFormat(
640 PropsValues.INDEX_DATE_FORMAT_PATTERN);
641
642 try {
643 Date preferencesModifiedDate = dateFormat.parse(
644 preferencesModifiedDateString);
645
646 if (hasLayoutSetPrototypeLayout()) {
647 String propertiesModifiedDateString =
648 _layoutSetPrototypeLayout.getTypeSettingsProperty(
649 _MODIFIED_DATE, _NULL_DATE);
650
651 Date propertiesModifiedDate = dateFormat.parse(
652 propertiesModifiedDateString);
653
654 return propertiesModifiedDate.after(preferencesModifiedDate);
655 }
656 else {
657 Layout layout = getLayout();
658
659 String propertiesModifiedDateString =
660 layout.getTypeSettingsProperty(_MODIFIED_DATE, _NULL_DATE);
661
662 Date propertiesModifiedDate = dateFormat.parse(
663 propertiesModifiedDateString);
664
665 return propertiesModifiedDate.after(preferencesModifiedDate);
666 }
667 }
668 catch (Exception e) {
669 _log.error(e, e);
670 }
671
672 return false;
673 }
674
675 public boolean isPortletCustomizable(String portletId) {
676 return isColumnCustomizable(getColumn(portletId));
677 }
678
679 public void movePortletId(
680 long userId, String portletId, String columnId, int columnPos)
681 throws PortalException, SystemException {
682
683 _enablePortletLayoutListener = false;
684
685 try {
686 removePortletId(userId, portletId, false);
687 addPortletId(userId, portletId, columnId, columnPos, false, true);
688 }
689 finally {
690 _enablePortletLayoutListener = true;
691 }
692
693 Layout layout = getLayout();
694
695 try {
696 Portlet portlet = PortletLocalServiceUtil.getPortletById(
697 layout.getCompanyId(), portletId);
698
699 if (portlet != null) {
700 PortletLayoutListener portletLayoutListener =
701 portlet.getPortletLayoutListenerInstance();
702
703 if (portletLayoutListener != null) {
704 portletLayoutListener.onMoveInLayout(
705 portletId, layout.getPlid());
706 }
707 }
708 }
709 catch (Exception e) {
710 _log.error("Unable to fire portlet layout listener event", e);
711 }
712 }
713
714 public void removeModeAboutPortletId(String portletId) {
715 setModeAbout(StringUtil.remove(getModeAbout(), portletId));
716 }
717
718 public void removeModeConfigPortletId(String portletId) {
719 setModeConfig(StringUtil.remove(getModeConfig(), portletId));
720 }
721
722 public void removeModeEditDefaultsPortletId(String portletId) {
723 setModeEditDefaults(
724 StringUtil.remove(getModeEditDefaults(), portletId));
725 }
726
727 public void removeModeEditGuestPortletId(String portletId) {
728 setModeEditGuest(StringUtil.remove(getModeEditGuest(), portletId));
729 }
730
731 public void removeModeEditPortletId(String portletId) {
732 setModeEdit(StringUtil.remove(getModeEdit(), portletId));
733 }
734
735 public void removeModeHelpPortletId(String portletId) {
736 setModeHelp(StringUtil.remove(getModeHelp(), portletId));
737 }
738
739 public void removeModePreviewPortletId(String portletId) {
740 setModePreview(StringUtil.remove(getModePreview(), portletId));
741 }
742
743 public void removeModePrintPortletId(String portletId) {
744 setModePrint(StringUtil.remove(getModePrint(), portletId));
745 }
746
747 public void removeModesPortletId(String portletId) {
748 removeModeAboutPortletId(portletId);
749 removeModeConfigPortletId(portletId);
750 removeModeEditPortletId(portletId);
751 removeModeEditDefaultsPortletId(portletId);
752 removeModeEditGuestPortletId(portletId);
753 removeModeHelpPortletId(portletId);
754 removeModePreviewPortletId(portletId);
755 removeModePrintPortletId(portletId);
756 }
757
758 public void removeNestedColumns(String portletNamespace) {
759 UnicodeProperties typeSettingsProperties = getTypeSettingsProperties();
760
761 UnicodeProperties newTypeSettingsProperties = new UnicodeProperties();
762
763 for (Map.Entry<String, String> entry :
764 typeSettingsProperties.entrySet()) {
765
766 String key = entry.getKey();
767
768 if (!key.startsWith(portletNamespace)) {
769 newTypeSettingsProperties.setProperty(key, entry.getValue());
770 }
771 }
772
773 Layout layout = getLayout();
774
775 layout.setTypeSettingsProperties(newTypeSettingsProperties);
776
777 String nestedColumnIds = GetterUtil.getString(
778 getTypeSettingsProperty(
779 LayoutTypePortletConstants.NESTED_COLUMN_IDS));
780
781 String[] nestedColumnIdsArray = ArrayUtil.removeByPrefix(
782 StringUtil.split(nestedColumnIds), portletNamespace);
783
784 setTypeSettingsProperty(
785 LayoutTypePortletConstants.NESTED_COLUMN_IDS,
786 StringUtil.merge(nestedColumnIdsArray));
787 }
788
789 public void removePortletId(long userId, String portletId) {
790 removePortletId(userId, portletId, true);
791 }
792
793 public void removePortletId(
794 long userId, String portletId, boolean cleanUp) {
795
796 try {
797 Portlet portlet = PortletLocalServiceUtil.getPortletById(
798 getCompanyId(), portletId);
799
800 if (portlet == null) {
801 _log.error(
802 "Portlet " + portletId +
803 " cannot be removed because it is not registered");
804
805 return;
806 }
807
808 PermissionChecker permissionChecker =
809 PermissionThreadLocal.getPermissionChecker();
810
811 if (!LayoutPermissionUtil.contains(
812 permissionChecker, getLayout(), ActionKeys.UPDATE) &&
813 !isCustomizable()) {
814
815 return;
816 }
817 }
818 catch (Exception e) {
819 _log.error(e, e);
820
821 return;
822 }
823
824 List<String> columns = getColumns();
825
826 for (int i = 0; i < columns.size(); i++) {
827 String columnId = columns.get(i);
828
829 if (isCustomizable() && isColumnDisabled(columnId)) {
830 continue;
831 }
832
833 String columnValue = StringPool.BLANK;
834
835 if (hasUserPreferences()) {
836 columnValue = getUserPreference(columnId);
837 }
838 else {
839 columnValue = getTypeSettingsProperty(columnId);
840 }
841
842 columnValue = StringUtil.remove(columnValue, portletId);
843
844 if (hasUserPreferences()) {
845 setUserPreference(columnId, columnValue);
846 }
847 else {
848 setTypeSettingsProperty(columnId, columnValue);
849 }
850 }
851
852 if (cleanUp) {
853 try {
854 onRemoveFromLayout(new String[] {portletId});
855 }
856 catch (Exception e) {
857 _log.error(e, e);
858 }
859 }
860 }
861
862 public void removeStateMaxPortletId(String portletId) {
863 setStateMax(StringUtil.remove(getStateMax(), portletId));
864 }
865
866 public void removeStateMinPortletId(String portletId) {
867 setStateMin(StringUtil.remove(getStateMin(), portletId));
868 }
869
870 public void removeStatesPortletId(String portletId) {
871 removeStateMaxPortletId(portletId);
872 removeStateMinPortletId(portletId);
873 }
874
875 public void reorganizePortlets(
876 List<String> newColumns, List<String> oldColumns) {
877
878 String lastNewColumnId = newColumns.get(newColumns.size() - 1);
879 String lastNewColumnValue = getTypeSettingsProperty(lastNewColumnId);
880
881 for (String oldColumnId : oldColumns) {
882 if (!newColumns.contains(oldColumnId)) {
883 String oldColumnValue = getTypeSettingsProperties().remove(
884 oldColumnId);
885
886 String[] portletIds = StringUtil.split(oldColumnValue);
887
888 for (String portletId : portletIds) {
889 lastNewColumnValue = StringUtil.add(
890 lastNewColumnValue, portletId);
891 }
892 }
893 }
894
895 setTypeSettingsProperty(lastNewColumnId, lastNewColumnValue);
896 }
897
898 public void resetModes() {
899 setModeAbout(StringPool.BLANK);
900 setModeConfig(StringPool.BLANK);
901 setModeEdit(StringPool.BLANK);
902 setModeEditDefaults(StringPool.BLANK);
903 setModeEditGuest(StringPool.BLANK);
904 setModeHelp(StringPool.BLANK);
905 setModePreview(StringPool.BLANK);
906 setModePrint(StringPool.BLANK);
907 }
908
909 public void resetStates() {
910 setStateMax(StringPool.BLANK);
911 setStateMin(StringPool.BLANK);
912 }
913
914 public void resetUserPreferences() {
915 if (!hasUserPreferences()) {
916 return;
917 }
918
919 long plid = getPlid();
920
921 List<String> customPortletIds = new UniqueList<String>();
922
923 for (String columnId : getColumns()) {
924 String value = _portalPreferences.getValue(
925 CustomizedPages.namespacePlid(plid), columnId);
926
927 for (String customPortletId : StringUtil.split(value)) {
928 customPortletIds.add(customPortletId);
929 }
930 }
931
932 try {
933 onRemoveFromLayout(
934 customPortletIds.toArray(new String[customPortletIds.size()]));
935 }
936 catch (Exception e) {
937 _log.error(e, e);
938 }
939
940 _portalPreferences.resetValues(CustomizedPages.namespacePlid(plid));
941
942 _portalPreferences.setValue(
943 CustomizedPages.namespacePlid(plid), _MODIFIED_DATE,
944 _dateFormat.format(new Date()));
945 }
946
947 public void setCustomizedView(boolean customizedView) {
948 _customizedView = customizedView;
949 }
950
951 public void setLayoutTemplateId(long userId, String newLayoutTemplateId) {
952 setLayoutTemplateId(userId, newLayoutTemplateId, true);
953 }
954
955 public void setLayoutTemplateId(
956 long userId, String newLayoutTemplateId, boolean checkPermission) {
957
958 if (checkPermission &&
959 !PluginSettingLocalServiceUtil.hasPermission(
960 userId, newLayoutTemplateId, Plugin.TYPE_LAYOUT_TEMPLATE)) {
961
962 return;
963 }
964
965 String oldLayoutTemplateId = getLayoutTemplateId();
966
967 if (Validator.isNull(oldLayoutTemplateId)) {
968 oldLayoutTemplateId = PropsValues.DEFAULT_LAYOUT_TEMPLATE_ID;
969 }
970
971 setTypeSettingsProperty(
972 LayoutTypePortletConstants.LAYOUT_TEMPLATE_ID, newLayoutTemplateId);
973
974 String themeId = getThemeId();
975
976 LayoutTemplate oldLayoutTemplate =
977 LayoutTemplateLocalServiceUtil.getLayoutTemplate(
978 oldLayoutTemplateId, false, themeId);
979
980 if (oldLayoutTemplate == null) {
981 return;
982 }
983
984 LayoutTemplate newLayoutTemplate =
985 LayoutTemplateLocalServiceUtil.getLayoutTemplate(
986 newLayoutTemplateId, false, themeId);
987
988 List<String> oldColumns = oldLayoutTemplate.getColumns();
989 List<String> newColumns = newLayoutTemplate.getColumns();
990
991 reorganizePortlets(newColumns, oldColumns);
992 }
993
994 public void setModeAbout(String modeAbout) {
995 setTypeSettingsProperty(
996 LayoutTypePortletConstants.MODE_ABOUT, modeAbout);
997 }
998
999 public void setModeConfig(String modeConfig) {
1000 setTypeSettingsProperty(
1001 LayoutTypePortletConstants.MODE_CONFIG, modeConfig);
1002 }
1003
1004 public void setModeEdit(String modeEdit) {
1005 setTypeSettingsProperty(LayoutTypePortletConstants.MODE_EDIT, modeEdit);
1006 }
1007
1008 public void setModeEditDefaults(String modeEditDefaults) {
1009 setTypeSettingsProperty(
1010 LayoutTypePortletConstants.MODE_EDIT_DEFAULTS, modeEditDefaults);
1011 }
1012
1013 public void setModeEditGuest(String modeEditGuest) {
1014 setTypeSettingsProperty(
1015 LayoutTypePortletConstants.MODE_EDIT_GUEST, modeEditGuest);
1016 }
1017
1018 public void setModeHelp(String modeHelp) {
1019 setTypeSettingsProperty(LayoutTypePortletConstants.MODE_HELP, modeHelp);
1020 }
1021
1022 public void setModePreview(String modePreview) {
1023 setTypeSettingsProperty(
1024 LayoutTypePortletConstants.MODE_PREVIEW, modePreview);
1025 }
1026
1027 public void setModePrint(String modePrint) {
1028 setTypeSettingsProperty(
1029 LayoutTypePortletConstants.MODE_PRINT, modePrint);
1030 }
1031
1032 public void setPortalPreferences(PortalPreferences portalPreferences) {
1033 _portalPreferences = portalPreferences;
1034 }
1035
1036 public void setStateMax(String stateMax) {
1037 setTypeSettingsProperty(LayoutTypePortletConstants.STATE_MAX, stateMax);
1038 }
1039
1040 public void setStateMin(String stateMin) {
1041 setTypeSettingsProperty(LayoutTypePortletConstants.STATE_MIN, stateMin);
1042 }
1043
1044 public void setUpdatePermission(boolean updatePermission) {
1045 _updatePermission = updatePermission;
1046 }
1047
1048 protected void addNestedColumn(String columnId) {
1049 String nestedColumnIds = getTypeSettingsProperty(
1050 LayoutTypePortletConstants.NESTED_COLUMN_IDS, StringPool.BLANK);
1051
1052 if (!nestedColumnIds.contains(columnId)) {
1053 nestedColumnIds = StringUtil.add(nestedColumnIds, columnId);
1054
1055 setTypeSettingsProperty(
1056 LayoutTypePortletConstants.NESTED_COLUMN_IDS, nestedColumnIds);
1057 }
1058 }
1059
1060 protected String addPortletId(
1061 long userId, String portletId, String columnId, int columnPos,
1062 boolean checkPermission, boolean strictHasPortlet)
1063 throws PortalException, SystemException {
1064
1065 portletId = JS.getSafeName(portletId);
1066
1067 Layout layout = getLayout();
1068
1069 Portlet portlet = null;
1070
1071 try {
1072 portlet = PortletLocalServiceUtil.getPortletById(
1073 layout.getCompanyId(), portletId);
1074
1075 if (portlet == null) {
1076 if (_log.isWarnEnabled()) {
1077 _log.warn(
1078 "Portlet " + portletId +
1079 " cannot be added because it is not registered");
1080 }
1081
1082 return null;
1083 }
1084
1085 PermissionChecker permissionChecker =
1086 PermissionThreadLocal.getPermissionChecker();
1087
1088 if (checkPermission &&
1089 !PortletPermissionUtil.contains(
1090 permissionChecker, layout, portlet,
1091 ActionKeys.ADD_TO_PAGE)) {
1092
1093 return null;
1094 }
1095 }
1096 catch (Exception e) {
1097 _log.error(e, e);
1098 }
1099
1100 if (portlet.isSystem()) {
1101 return null;
1102 }
1103
1104 if (portlet.isInstanceable() &&
1105 !PortletConstants.hasInstanceId(portletId)) {
1106
1107 portletId = PortletConstants.assemblePortletId(
1108 portletId, generateInstanceId());
1109 }
1110
1111 if (hasPortletId(portletId, strictHasPortlet)) {
1112 return null;
1113 }
1114
1115 if (columnId == null) {
1116 LayoutTemplate layoutTemplate = getLayoutTemplate();
1117
1118 List<String> columns = layoutTemplate.getColumns();
1119
1120 if (columns.size() > 0) {
1121 columnId = columns.get(0);
1122 }
1123 }
1124
1125 if (columnId == null) {
1126 return null;
1127 }
1128
1129 if (isCustomizable()) {
1130 if (isColumnDisabled(columnId)) {
1131 return null;
1132 }
1133
1134 if (PortletConstants.hasInstanceId(portletId) &&
1135 hasUserPreferences()) {
1136
1137 portletId = PortletConstants.assemblePortletId(
1138 portletId, userId);
1139 }
1140 }
1141
1142 String columnValue = StringPool.BLANK;
1143
1144 if (hasUserPreferences()) {
1145 columnValue = getUserPreference(columnId);
1146 }
1147 else {
1148 columnValue = getTypeSettingsProperty(columnId);
1149 }
1150
1151 if ((columnValue == null) &&
1152 columnId.startsWith(_nestedPortletsNamespace)) {
1153
1154 addNestedColumn(columnId);
1155 }
1156
1157 if (columnPos >= 0) {
1158 List<String> portletIds = ListUtil.fromArray(
1159 StringUtil.split(columnValue));
1160
1161 if (columnPos <= portletIds.size()) {
1162 portletIds.add(columnPos, portletId);
1163 }
1164 else {
1165 portletIds.add(portletId);
1166 }
1167
1168 columnValue = StringUtil.merge(portletIds);
1169 }
1170 else {
1171 columnValue = StringUtil.add(columnValue, portletId);
1172 }
1173
1174 if (hasUserPreferences()) {
1175 setUserPreference(columnId, columnValue);
1176 }
1177 else {
1178 setTypeSettingsProperty(columnId, columnValue);
1179 }
1180
1181 try {
1182 if (_enablePortletLayoutListener) {
1183 PortletLayoutListener portletLayoutListener =
1184 portlet.getPortletLayoutListenerInstance();
1185
1186 if (portletLayoutListener != null) {
1187 portletLayoutListener.onAddToLayout(
1188 portletId, layout.getPlid());
1189 }
1190 }
1191 }
1192 catch (Exception e) {
1193 _log.error("Unable to fire portlet layout listener event", e);
1194 }
1195
1196 return portletId;
1197 }
1198
1199 protected void copyPreferences(
1200 long userId, String sourcePortletId, String targetPortletId) {
1201
1202 Layout layout = getLayout();
1203
1204 try {
1205 PortletPreferencesIds portletPreferencesIds =
1206 PortletPreferencesFactoryUtil.getPortletPreferencesIds(
1207 layout.getGroupId(), 0, layout, sourcePortletId, false);
1208
1209 javax.portlet.PortletPreferences sourcePortletPreferences =
1210 PortletPreferencesLocalServiceUtil.getStrictPreferences(
1211 portletPreferencesIds);
1212
1213 portletPreferencesIds =
1214 PortletPreferencesFactoryUtil.getPortletPreferencesIds(
1215 layout.getGroupId(), userId, layout, targetPortletId,
1216 false);
1217
1218 PortletPreferencesLocalServiceUtil.updatePreferences(
1219 portletPreferencesIds.getOwnerId(),
1220 portletPreferencesIds.getOwnerType(),
1221 portletPreferencesIds.getPlid(),
1222 portletPreferencesIds.getPortletId(), sourcePortletPreferences);
1223 }
1224 catch (Exception e) {
1225 }
1226 }
1227
1228 protected String getColumn(String portletId) {
1229 List<String> columns = getColumns();
1230
1231 for (String columnId : columns) {
1232 String columnValue = getColumnValue(columnId);
1233
1234 String[] portletIds = StringUtil.split(columnValue);
1235
1236 for (String columnPortletId : portletIds) {
1237 if (PortletConstants.hasIdenticalRootPortletId(
1238 columnPortletId, portletId)) {
1239
1240 return columnId;
1241 }
1242 }
1243 }
1244
1245 return StringPool.BLANK;
1246 }
1247
1248 protected List<String> getColumns() {
1249 List<String> columns = new ArrayList<String>();
1250
1251 Layout layout = getLayout();
1252
1253 if (layout.isTypePortlet()) {
1254 LayoutTemplate layoutTemplate = getLayoutTemplate();
1255
1256 columns.addAll(layoutTemplate.getColumns());
1257
1258 columns.addAll(getNestedColumns());
1259 }
1260 else if (layout.isTypePanel()) {
1261 columns.add("panelSelectedPortlets");
1262 }
1263
1264 return columns;
1265 }
1266
1267 protected String getColumnValue(String columnId) {
1268 Boolean customizable = null;
1269 Boolean columnDisabled = null;
1270
1271 if (hasLayoutSetPrototypeLayout()) {
1272 customizable = isCustomizable();
1273
1274 if (customizable) {
1275 columnDisabled = isColumnDisabled(columnId);
1276
1277 if (columnDisabled) {
1278 return getLayoutSetPrototypeLayoutProperty(columnId);
1279 }
1280 }
1281 }
1282
1283 if (hasUserPreferences() &&
1284 ((customizable == null) ? isCustomizable() : customizable) &&
1285 ((columnDisabled == null) ?
1286 !isColumnDisabled(columnId) : !columnDisabled)) {
1287
1288 return getUserPreference(columnId);
1289 }
1290
1291 return getTypeSettingsProperty(columnId);
1292 }
1293
1294 protected long getCompanyId() {
1295 Layout layout = getLayout();
1296
1297 return layout.getCompanyId();
1298 }
1299
1300 protected List<Portlet> getEmbeddedPortlets(
1301 List<Portlet> columnPortlets, List<Portlet> staticPortlets)
1302 throws SystemException {
1303
1304 if (_embeddedPortlets != null) {
1305 return _embeddedPortlets;
1306 }
1307
1308 List<Portlet> portlets = new ArrayList<Portlet>();
1309
1310 Layout layout = getLayout();
1311
1312 List<PortletPreferences> portletPreferences =
1313 PortletPreferencesLocalServiceUtil.getPortletPreferences(
1314 PortletKeys.PREFS_OWNER_ID_DEFAULT,
1315 PortletKeys.PREFS_OWNER_TYPE_LAYOUT, layout.getPlid());
1316
1317 if (isCustomizable() && hasUserPreferences()) {
1318 portletPreferences = ListUtil.copy(portletPreferences);
1319
1320 portletPreferences.addAll(
1321 PortletPreferencesLocalServiceUtil.getPortletPreferences(
1322 _portalPreferences.getUserId(),
1323 PortletKeys.PREFS_OWNER_TYPE_USER, layout.getPlid()));
1324 }
1325
1326 Set<String> portletAddDefaultResourceCheckWhiteList =
1327 PortalUtil.getPortletAddDefaultResourceCheckWhitelist();
1328
1329 for (PortletPreferences portletPreference : portletPreferences) {
1330 String portletId = portletPreference.getPortletId();
1331
1332 Portlet portlet = PortletLocalServiceUtil.getPortletById(
1333 getCompanyId(), portletId);
1334
1335 if (Validator.isNull(portletId) ||
1336 columnPortlets.contains(portlet) ||
1337 staticPortlets.contains(portlet) ||
1338 portlet.isSystem() || portlet.isUndeployedPortlet() ||
1339 !portlet.isActive() ||
1340 portletAddDefaultResourceCheckWhiteList.contains(portletId)) {
1341
1342 continue;
1343 }
1344
1345 if (portlet != null) {
1346 Portlet embeddedPortlet = portlet;
1347
1348 if (portlet.isInstanceable()) {
1349
1350
1351
1352
1353
1354
1355 }
1356 else {
1357 embeddedPortlet = (Portlet)embeddedPortlet.clone();
1358 }
1359
1360
1361
1362
1363 embeddedPortlet.setStatic(true);
1364
1365 portlets.add(embeddedPortlet);
1366 }
1367 }
1368
1369 _embeddedPortlets = portlets;
1370
1371 return _embeddedPortlets;
1372 }
1373
1374 protected List<String> getNestedColumns() {
1375 String nestedColumnIds = getTypeSettingsProperty(
1376 LayoutTypePortletConstants.NESTED_COLUMN_IDS);
1377
1378 return ListUtil.fromArray(StringUtil.split(nestedColumnIds));
1379 }
1380
1381 protected long getPlid() {
1382 Layout layout = getLayout();
1383
1384 return layout.getPlid();
1385 }
1386
1387 protected String[] getStaticPortletIds(String position)
1388 throws PortalException, SystemException {
1389
1390 Layout layout = getLayout();
1391
1392 if (hasLayoutSetPrototypeLayout()) {
1393 layout = _layoutSetPrototypeLayout;
1394 }
1395
1396 String selector1 = StringPool.BLANK;
1397
1398 Group group = layout.getGroup();
1399
1400 if (group.isUser()) {
1401 selector1 = LayoutTypePortletConstants.STATIC_PORTLET_USER_SELECTOR;
1402 }
1403 else if (group.isOrganization()) {
1404 selector1 =
1405 LayoutTypePortletConstants.STATIC_PORTLET_ORGANIZATION_SELECTOR;
1406 }
1407 else if (group.isRegularSite()) {
1408 selector1 =
1409 LayoutTypePortletConstants.STATIC_PORTLET_REGULAR_SITE_SELECTOR;
1410 }
1411
1412 String selector2 = layout.getFriendlyURL();
1413
1414 String[] portletIds = PropsUtil.getArray(
1415 position, new Filter(selector1, selector2));
1416
1417 for (int i = 0; i < portletIds.length; i++) {
1418 portletIds[i] = JS.getSafeName(portletIds[i]);
1419 }
1420
1421 return portletIds;
1422 }
1423
1424 protected List<Portlet> getStaticPortlets(String position)
1425 throws PortalException, SystemException {
1426
1427 String[] portletIds = getStaticPortletIds(position);
1428
1429 List<Portlet> portlets = new ArrayList<Portlet>();
1430
1431 for (String portletId : portletIds) {
1432 if (Validator.isNull(portletId) ||
1433 hasNonstaticPortletId(portletId)) {
1434
1435 continue;
1436 }
1437
1438 Portlet portlet = PortletLocalServiceUtil.getPortletById(
1439 getCompanyId(), portletId);
1440
1441 if (portlet != null) {
1442 Portlet staticPortlet = portlet;
1443
1444 if (portlet.isInstanceable()) {
1445
1446
1447
1448
1449
1450
1451 }
1452 else {
1453 staticPortlet = (Portlet)staticPortlet.clone();
1454 }
1455
1456 staticPortlet.setStatic(true);
1457
1458 if (position.startsWith("layout.static.portlets.start")) {
1459 staticPortlet.setStaticStart(true);
1460 }
1461
1462 portlets.add(staticPortlet);
1463 }
1464 }
1465
1466 return portlets;
1467 }
1468
1469 protected String getThemeId() {
1470 String themeId = null;
1471
1472 try {
1473 Layout layout = getLayout();
1474
1475 Theme theme = layout.getTheme();
1476
1477 if (theme != null) {
1478 themeId = theme.getThemeId();
1479 }
1480 else {
1481 themeId = layout.getThemeId();
1482 }
1483 }
1484 catch (Exception e) {
1485 _log.error(e, e);
1486 }
1487
1488 return themeId;
1489 }
1490
1491 protected String getUserPreference(String key) {
1492 String value = StringPool.BLANK;
1493
1494 if (!hasUserPreferences()) {
1495 return value;
1496 }
1497
1498 value = _portalPreferences.getValue(
1499 CustomizedPages.namespacePlid(getPlid()), key, StringPool.NULL);
1500
1501 if (!value.equals(StringPool.NULL)) {
1502 return value;
1503 }
1504
1505 if (hasLayoutSetPrototypeLayout()) {
1506 value = getLayoutSetPrototypeLayoutProperty(key);
1507 }
1508 else {
1509 value = getTypeSettingsProperty(key);
1510 }
1511
1512 if (Validator.isNull(value)) {
1513 return value;
1514 }
1515
1516 String[] portletIds = StringUtil.split(value);
1517
1518 String[] newPortletIds = new String[portletIds.length];
1519
1520 for (int i = 0; i < portletIds.length; i++) {
1521 if (PortletConstants.hasInstanceId(portletIds[i])) {
1522 newPortletIds[i] = PortletConstants.assemblePortletId(
1523 portletIds[i], _portalPreferences.getUserId(),
1524 generateInstanceId());
1525
1526 copyPreferences(
1527 _portalPreferences.getUserId(), portletIds[i],
1528 newPortletIds[i]);
1529 }
1530 else {
1531 newPortletIds[i] = portletIds[i];
1532 }
1533 }
1534
1535 value = StringUtil.merge(newPortletIds);
1536
1537 setUserPreference(key, value);
1538
1539 return value;
1540 }
1541
1542 protected boolean hasNonstaticPortletId(String portletId) {
1543 LayoutTemplate layoutTemplate = getLayoutTemplate();
1544
1545 List<String> columns = layoutTemplate.getColumns();
1546
1547 for (int i = 0; i < columns.size(); i++) {
1548 String columnId = columns.get(i);
1549
1550 if (hasNonstaticPortletId(columnId, portletId)) {
1551 return true;
1552 }
1553 }
1554
1555 return false;
1556 }
1557
1558 protected boolean hasNonstaticPortletId(String columnId, String portletId) {
1559 String columnValue = getColumnValue(columnId);
1560
1561 String[] columnValues = StringUtil.split(columnValue);
1562
1563 for (String nonstaticPortletId : columnValues) {
1564 if (nonstaticPortletId.equals(portletId) ||
1565 PortletConstants.getRootPortletId(
1566 nonstaticPortletId).equals(portletId)) {
1567
1568 return true;
1569 }
1570 }
1571
1572 return false;
1573 }
1574
1575 protected boolean hasPortletId(String portletId, boolean strict)
1576 throws PortalException, SystemException {
1577
1578 List<String> columns = getColumns();
1579
1580 for (String columnId : columns) {
1581 if (hasNonstaticPortletId(columnId, portletId)) {
1582 return true;
1583 }
1584
1585 if (hasStaticPortletId(columnId, portletId)) {
1586 return true;
1587 }
1588 }
1589
1590 Layout layout = getLayout();
1591
1592 if (layout.isTypeControlPanel()) {
1593 return true;
1594 }
1595
1596 if (!strict &&
1597 ((PortletPreferencesLocalServiceUtil.getPortletPreferencesCount(
1598 PortletKeys.PREFS_OWNER_TYPE_LAYOUT, layout.getPlid(),
1599 portletId) > 0) ||
1600 (PortletPreferencesLocalServiceUtil.getPortletPreferencesCount(
1601 PortletKeys.PREFS_OWNER_TYPE_USER, layout.getPlid(),
1602 portletId) > 0))) {
1603
1604 return true;
1605 }
1606
1607 return false;
1608 }
1609
1610 protected boolean hasStaticPortletId(String columnId, String portletId)
1611 throws PortalException, SystemException {
1612
1613 String[] staticPortletIdsStart = getStaticPortletIds(
1614 PropsKeys.LAYOUT_STATIC_PORTLETS_START + columnId);
1615
1616 String[] staticPortletIdsEnd = getStaticPortletIds(
1617 PropsKeys.LAYOUT_STATIC_PORTLETS_END + columnId);
1618
1619 for (String staticPortletId : staticPortletIdsStart) {
1620 if (staticPortletId.equals(portletId) ||
1621 PortletConstants.getRootPortletId(
1622 staticPortletId).equals(portletId)) {
1623
1624 return true;
1625 }
1626 }
1627
1628 for (String staticPortletId : staticPortletIdsEnd) {
1629 if (staticPortletId.equals(portletId) ||
1630 PortletConstants.getRootPortletId(
1631 staticPortletId).equals(portletId)) {
1632
1633 return true;
1634 }
1635 }
1636
1637 return false;
1638 }
1639
1640 protected boolean hasUserPreferences() {
1641 if (_portalPreferences != null) {
1642 return true;
1643 }
1644
1645 return false;
1646 }
1647
1648 protected boolean isLayoutSetPrototype() {
1649 try {
1650 Layout layout = getLayout();
1651
1652 LayoutSet layoutSet = layout.getLayoutSet();
1653
1654 Group group = layoutSet.getGroup();
1655
1656 return group.isLayoutSetPrototype();
1657 }
1658 catch (Exception e) {
1659 _log.error(e, e);
1660 }
1661
1662 return false;
1663 }
1664
1665 protected void onRemoveFromLayout(String[] portletIds)
1666 throws SystemException {
1667
1668 List<String> portletIdList = new UniqueList<String>();
1669
1670 for (String portletId : portletIds) {
1671 removeModesPortletId(portletId);
1672 removeStatesPortletId(portletId);
1673
1674 portletIdList.add(portletId);
1675
1676 String rootPortletId = PortletConstants.getRootPortletId(portletId);
1677
1678 if (rootPortletId.equals(PortletKeys.NESTED_PORTLETS)) {
1679 String portletNamespace = PortalUtil.getPortletNamespace(
1680 portletId);
1681
1682 UnicodeProperties typeSettingsProperties =
1683 getTypeSettingsProperties();
1684
1685 for (Map.Entry<String, String> entry :
1686 typeSettingsProperties.entrySet()) {
1687
1688 String key = entry.getKey();
1689
1690 if (!key.startsWith(portletNamespace)) {
1691 continue;
1692 }
1693
1694 String nestedPortletIds = entry.getValue();
1695
1696 for (String nestedPortletId :
1697 StringUtil.split(nestedPortletIds)) {
1698
1699 removeModesPortletId(nestedPortletId);
1700 removeStatesPortletId(nestedPortletId);
1701
1702 portletIdList.add(nestedPortletId);
1703 }
1704 }
1705
1706 removeNestedColumns(portletNamespace);
1707 }
1708 }
1709
1710 try {
1711 PortletLocalServiceUtil.deletePortlets(
1712 getCompanyId(),
1713 portletIdList.toArray(new String[portletIdList.size()]),
1714 getPlid());
1715 }
1716 catch (PortalException pe) {
1717 _log.error(pe, pe);
1718 }
1719 }
1720
1721 protected void setUserPreference(String key, String value) {
1722 if (!hasUserPreferences()) {
1723 return;
1724 }
1725
1726 _portalPreferences.setValue(
1727 CustomizedPages.namespacePlid(getPlid()), key, value);
1728
1729 _portalPreferences.setValue(
1730 CustomizedPages.namespacePlid(getPlid()), _MODIFIED_DATE,
1731 _dateFormat.format(new Date()));
1732 }
1733
1734 private static final String _MODIFIED_DATE = "modifiedDate";
1735
1736 private static final String _NULL_DATE = "00000000000000";
1737
1738 private static Log _log = LogFactoryUtil.getLog(
1739 LayoutTypePortletImpl.class);
1740
1741 private static String _nestedPortletsNamespace;
1742
1743 private boolean _customizedView;
1744 private Format _dateFormat = FastDateFormatFactoryUtil.getSimpleDateFormat(
1745 PropsValues.INDEX_DATE_FORMAT_PATTERN);
1746 private List<Portlet> _embeddedPortlets;
1747 private boolean _enablePortletLayoutListener = true;
1748 private Layout _layoutSetPrototypeLayout;
1749 private PortalPreferences _portalPreferences;
1750 private boolean _updatePermission;
1751
1752 }