001
014
015 package com.liferay.portlet.exportimport.lar;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.plugin.Version;
020 import com.liferay.portal.kernel.util.ArrayUtil;
021 import com.liferay.portal.kernel.util.GetterUtil;
022 import com.liferay.portal.kernel.util.StringPool;
023 import com.liferay.portal.kernel.util.Time;
024 import com.liferay.portal.kernel.util.Validator;
025 import com.liferay.portal.kernel.xml.Document;
026 import com.liferay.portal.kernel.xml.DocumentException;
027 import com.liferay.portal.kernel.xml.Element;
028 import com.liferay.portal.kernel.xml.SAXReaderUtil;
029 import com.liferay.portal.model.Portlet;
030 import com.liferay.portal.service.PortletPreferencesLocalServiceUtil;
031 import com.liferay.portal.util.PortletKeys;
032
033 import java.io.IOException;
034
035 import java.util.ArrayList;
036 import java.util.List;
037
038 import javax.portlet.PortletPreferences;
039
040
043 public abstract class BasePortletDataHandler implements PortletDataHandler {
044
045 @Override
046 public PortletPreferences addDefaultData(
047 PortletDataContext portletDataContext, String portletId,
048 PortletPreferences portletPreferences)
049 throws PortletDataException {
050
051 long startTime = 0;
052
053 if (_log.isInfoEnabled()) {
054 _log.info("Adding default data to portlet " + portletId);
055
056 startTime = System.currentTimeMillis();
057 }
058
059 try {
060 return doAddDefaultData(
061 portletDataContext, portletId, portletPreferences);
062 }
063 catch (PortletDataException pde) {
064 throw pde;
065 }
066 catch (Exception e) {
067 throw new PortletDataException(e);
068 }
069 finally {
070 if (_log.isInfoEnabled()) {
071 long duration = System.currentTimeMillis() - startTime;
072
073 _log.info(
074 "Added default data to portlet in " +
075 Time.getDuration(duration));
076 }
077 }
078 }
079
080 @Override
081 public PortletPreferences deleteData(
082 PortletDataContext portletDataContext, String portletId,
083 PortletPreferences portletPreferences)
084 throws PortletDataException {
085
086 long startTime = 0;
087
088 if (_log.isInfoEnabled()) {
089 _log.info("Deleting portlet " + portletId);
090
091 startTime = System.currentTimeMillis();
092 }
093
094 try {
095 return doDeleteData(
096 portletDataContext, portletId, portletPreferences);
097 }
098 catch (PortletDataException pde) {
099 throw pde;
100 }
101 catch (Exception e) {
102 throw new PortletDataException(e);
103 }
104 finally {
105 if (_log.isInfoEnabled()) {
106 long duration = System.currentTimeMillis() - startTime;
107
108 _log.info("Deleted portlet in " + Time.getDuration(duration));
109 }
110 }
111 }
112
113 @Override
114 public String exportData(
115 PortletDataContext portletDataContext, String portletId,
116 PortletPreferences portletPreferences)
117 throws PortletDataException {
118
119 long startTime = 0;
120
121 if (_log.isInfoEnabled()) {
122 _log.info("Exporting portlet " + portletId);
123
124 startTime = System.currentTimeMillis();
125 }
126
127 try {
128 portletDataContext.addDeletionSystemEventStagedModelTypes(
129 getDeletionSystemEventStagedModelTypes());
130
131 for (PortletDataHandlerControl portletDataHandlerControl :
132 getExportControls()) {
133
134 addUncheckedModelAdditionCount(
135 portletDataContext, portletDataHandlerControl);
136 }
137
138 return doExportData(
139 portletDataContext, portletId, portletPreferences);
140 }
141 catch (PortletDataException pde) {
142 throw pde;
143 }
144 catch (Exception e) {
145 throw new PortletDataException(e);
146 }
147 finally {
148 if (_log.isInfoEnabled()) {
149 long duration = System.currentTimeMillis() - startTime;
150
151 _log.info("Exported portlet in " + Time.getDuration(duration));
152 }
153 }
154 }
155
156 @Override
157 public DataLevel getDataLevel() {
158 return _dataLevel;
159 }
160
161 @Override
162 public String[] getDataPortletPreferences() {
163 return _dataPortletPreferences;
164 }
165
166 @Override
167 public StagedModelType[] getDeletionSystemEventStagedModelTypes() {
168 return _deletionSystemEventStagedModelTypes;
169 }
170
171 @Override
172 public PortletDataHandlerControl[] getExportConfigurationControls(
173 long companyId, long groupId, Portlet portlet,
174 boolean privateLayout)
175 throws Exception {
176
177 return getExportConfigurationControls(
178 companyId, groupId, portlet, -1, privateLayout);
179 }
180
181 @Override
182 public PortletDataHandlerControl[] getExportConfigurationControls(
183 long companyId, long groupId, Portlet portlet, long plid,
184 boolean privateLayout)
185 throws Exception {
186
187 List<PortletDataHandlerBoolean> configurationControls =
188 new ArrayList<>();
189
190
191
192 if ((PortletPreferencesLocalServiceUtil.getPortletPreferencesCount(
193 PortletKeys.PREFS_OWNER_ID_DEFAULT,
194 PortletKeys.PREFS_OWNER_TYPE_LAYOUT, plid, portlet, false) >
195 0) ||
196 (PortletPreferencesLocalServiceUtil.getPortletPreferencesCount(
197 groupId, PortletKeys.PREFS_OWNER_TYPE_GROUP,
198 portlet.getRootPortletId(), false) > 0) ||
199 (PortletPreferencesLocalServiceUtil.getPortletPreferencesCount(
200 companyId, PortletKeys.PREFS_OWNER_TYPE_COMPANY,
201 portlet.getRootPortletId(), false) > 0)) {
202
203 PortletDataHandlerControl[] portletDataHandlerControls = null;
204
205 if (isDisplayPortlet()) {
206 portletDataHandlerControls = getExportControls();
207 }
208
209 configurationControls.add(
210 new PortletDataHandlerBoolean(
211 null, PortletDataHandlerKeys.PORTLET_SETUP, "setup", true,
212 false, portletDataHandlerControls, null, null));
213 }
214
215
216
217 if (PortletPreferencesLocalServiceUtil.getPortletPreferencesCount(
218 -1, PortletKeys.PREFS_OWNER_TYPE_ARCHIVED,
219 portlet.getRootPortletId(), false) > 0) {
220
221 configurationControls.add(
222 new PortletDataHandlerBoolean(
223 null, PortletDataHandlerKeys.PORTLET_ARCHIVED_SETUPS,
224 "archived-setups", true, false, null, null, null)
225 );
226 }
227
228
229
230 if ((PortletPreferencesLocalServiceUtil.getPortletPreferencesCount(
231 -1, PortletKeys.PREFS_OWNER_TYPE_USER, plid, portlet, false) >
232 0) ||
233 (PortletPreferencesLocalServiceUtil.getPortletPreferencesCount(
234 groupId, PortletKeys.PREFS_OWNER_TYPE_USER,
235 PortletKeys.PREFS_PLID_SHARED, portlet, false) > 0)) {
236
237 configurationControls.add(
238 new PortletDataHandlerBoolean(
239 null, PortletDataHandlerKeys.PORTLET_USER_PREFERENCES,
240 "user-preferences", true, false, null, null, null));
241 }
242
243 return configurationControls.toArray(
244 new PortletDataHandlerBoolean[configurationControls.size()]);
245 }
246
247 @Override
248 public PortletDataHandlerControl[] getExportControls() {
249 return _exportControls;
250 }
251
252 @Override
253 public PortletDataHandlerControl[] getExportMetadataControls() {
254 return _exportMetadataControls;
255 }
256
257 @Override
258 public long getExportModelCount(ManifestSummary manifestSummary) {
259 return getExportModelCount(manifestSummary, getExportControls());
260 }
261
262 @Override
263 public PortletDataHandlerControl[] getImportConfigurationControls(
264 Portlet portlet, ManifestSummary manifestSummary) {
265
266 String[] configurationPortletOptions =
267 manifestSummary.getConfigurationPortletOptions(
268 portlet.getRootPortletId());
269
270 return getImportConfigurationControls(configurationPortletOptions);
271 }
272
273 @Override
274 public PortletDataHandlerControl[] getImportConfigurationControls(
275 String[] configurationPortletOptions) {
276
277 List<PortletDataHandlerBoolean> configurationControls =
278 new ArrayList<>();
279
280
281
282 if (ArrayUtil.contains(configurationPortletOptions, "setup")) {
283 PortletDataHandlerControl[] portletDataHandlerControls = null;
284
285 if (isDisplayPortlet()) {
286 portletDataHandlerControls = getExportControls();
287 }
288
289 configurationControls.add(
290 new PortletDataHandlerBoolean(
291 null, PortletDataHandlerKeys.PORTLET_SETUP, "setup", true,
292 false, portletDataHandlerControls, null, null));
293 }
294
295
296
297 if (ArrayUtil.contains(
298 configurationPortletOptions, "archived-setups")) {
299
300 configurationControls.add(
301 new PortletDataHandlerBoolean(
302 null, PortletDataHandlerKeys.PORTLET_ARCHIVED_SETUPS,
303 "archived-setups", true, false, null, null, null));
304 }
305
306
307
308 if (ArrayUtil.contains(
309 configurationPortletOptions, "user-preferences")) {
310
311 configurationControls.add(
312 new PortletDataHandlerBoolean(
313 null, PortletDataHandlerKeys.PORTLET_USER_PREFERENCES,
314 "user-preferences", true, false, null, null, null));
315 }
316
317 return configurationControls.toArray(
318 new PortletDataHandlerBoolean[configurationControls.size()]);
319 }
320
321 @Override
322 public PortletDataHandlerControl[] getImportControls() {
323 return _importControls;
324 }
325
326 @Override
327 public PortletDataHandlerControl[] getImportMetadataControls() {
328 return _importMetadataControls;
329 }
330
331 @Override
332 public String getPortletId() {
333 return _portletId;
334 }
335
336 @Override
337 public int getRank() {
338 return _rank;
339 }
340
341 @Override
342 public String getSchemaVersion() {
343 return "1.0.0";
344 }
345
346 @Override
347 public String getServiceName() {
348 return null;
349 }
350
351 @Override
352 public PortletPreferences importData(
353 PortletDataContext portletDataContext, String portletId,
354 PortletPreferences portletPreferences, String data)
355 throws PortletDataException {
356
357 long startTime = 0;
358
359 if (_log.isInfoEnabled()) {
360 _log.info("Importing portlet " + portletId);
361
362 startTime = System.currentTimeMillis();
363 }
364
365 long sourceGroupId = portletDataContext.getSourceGroupId();
366
367 try {
368 if (Validator.isXml(data)) {
369 addImportDataRootElement(portletDataContext, data);
370 }
371
372 return doImportData(
373 portletDataContext, portletId, portletPreferences, data);
374 }
375 catch (PortletDataException pde) {
376 throw pde;
377 }
378 catch (Exception e) {
379 throw new PortletDataException(e);
380 }
381 finally {
382 portletDataContext.setSourceGroupId(sourceGroupId);
383
384 if (_log.isInfoEnabled()) {
385 long duration = System.currentTimeMillis() - startTime;
386
387 _log.info("Imported portlet in " + Time.getDuration(duration));
388 }
389 }
390 }
391
392 @Override
393 public boolean isDataAlwaysStaged() {
394 return _dataAlwaysStaged;
395 }
396
397 @Override
398 public boolean isDataLocalized() {
399 return _dataLocalized;
400 }
401
402 @Override
403 public boolean isDataPortalLevel() {
404 return _dataLevel.equals(DataLevel.PORTAL);
405 }
406
407 @Override
408 public boolean isDataPortletInstanceLevel() {
409 return _dataLevel.equals(DataLevel.PORTLET_INSTANCE);
410 }
411
412 @Override
413 public boolean isDataSiteLevel() {
414 return _dataLevel.equals(DataLevel.SITE);
415 }
416
417 @Override
418 public boolean isDisplayPortlet() {
419 if (isDataPortletInstanceLevel() &&
420 !ArrayUtil.isEmpty(getDataPortletPreferences())) {
421
422 return true;
423 }
424
425 return false;
426 }
427
428 @Override
429 public boolean isPublishToLiveByDefault() {
430 return _publishToLiveByDefault;
431 }
432
433 @Override
434 public boolean isRollbackOnException() {
435
436
437
438
439
440
441
442 return true;
443 }
444
445 @Override
446 public boolean isSupportsDataStrategyCopyAsNew() {
447 return _supportsDataStrategyCopyAsNew;
448 }
449
450 @Override
451 public void prepareManifestSummary(PortletDataContext portletDataContext)
452 throws PortletDataException {
453
454 prepareManifestSummary(portletDataContext, null);
455 }
456
457 @Override
458 public void prepareManifestSummary(
459 PortletDataContext portletDataContext,
460 PortletPreferences portletPreferences)
461 throws PortletDataException {
462
463 try {
464 doPrepareManifestSummary(portletDataContext, portletPreferences);
465 }
466 catch (PortletDataException pde) {
467 throw pde;
468 }
469 catch (Exception e) {
470 throw new PortletDataException(e);
471 }
472 }
473
474 @Override
475 public PortletPreferences processExportPortletPreferences(
476 PortletDataContext portletDataContext, String portletId,
477 PortletPreferences portletPreferences)
478 throws PortletDataException {
479
480 try {
481 return doProcessExportPortletPreferences(
482 portletDataContext, portletId, portletPreferences);
483 }
484 catch (PortletDataException pde) {
485 throw pde;
486 }
487 catch (Exception e) {
488 throw new PortletDataException(e);
489 }
490 }
491
492 @Override
493 public PortletPreferences processImportPortletPreferences(
494 PortletDataContext portletDataContext, String portletId,
495 PortletPreferences portletPreferences)
496 throws PortletDataException {
497
498 try {
499 return doProcessImportPortletPreferences(
500 portletDataContext, portletId, portletPreferences);
501 }
502 catch (PortletDataException pde) {
503 throw pde;
504 }
505 catch (Exception e) {
506 throw new PortletDataException(e);
507 }
508 }
509
510 @Override
511 public void setPortletId(String portletId) {
512 _portletId = portletId;
513 }
514
515 @Override
516 public void setRank(int rank) {
517 _rank = rank;
518 }
519
520 @Override
521 public boolean validateSchemaVersion(String schemaVersion) {
522 try {
523 return doValidateSchemaVersion(schemaVersion);
524 }
525 catch (Exception e) {
526 return false;
527 }
528 }
529
530 protected Element addExportDataRootElement(
531 PortletDataContext portletDataContext) {
532
533 Document document = SAXReaderUtil.createDocument();
534
535 Class<?> clazz = getClass();
536
537 Element rootElement = document.addElement(clazz.getSimpleName());
538
539 portletDataContext.setExportDataRootElement(rootElement);
540
541 return rootElement;
542 }
543
544 protected Element addImportDataRootElement(
545 PortletDataContext portletDataContext, String data)
546 throws DocumentException {
547
548 Document document = SAXReaderUtil.read(data);
549
550 Element rootElement = document.getRootElement();
551
552 portletDataContext.setImportDataRootElement(rootElement);
553
554 long groupId = GetterUtil.getLong(
555 rootElement.attributeValue("group-id"));
556
557 if (groupId != 0) {
558 portletDataContext.setSourceGroupId(groupId);
559 }
560
561 return rootElement;
562 }
563
564 protected void addUncheckedModelAdditionCount(
565 PortletDataContext portletDataContext,
566 PortletDataHandlerControl portletDataHandlerControl) {
567
568 if (!(portletDataHandlerControl instanceof PortletDataHandlerBoolean)) {
569 return;
570 }
571
572 PortletDataHandlerBoolean portletDataHandlerBoolean =
573 (PortletDataHandlerBoolean)portletDataHandlerControl;
574
575 PortletDataHandlerControl[] childPortletDataHandlerControls =
576 portletDataHandlerBoolean.getChildren();
577
578 if (childPortletDataHandlerControls != null) {
579 for (PortletDataHandlerControl childPortletDataHandlerControl :
580 childPortletDataHandlerControls) {
581
582 addUncheckedModelAdditionCount(
583 portletDataContext, childPortletDataHandlerControl);
584 }
585 }
586
587 if (Validator.isNull(portletDataHandlerControl.getClassName())) {
588 return;
589 }
590
591 boolean checkedControl = GetterUtil.getBoolean(
592 portletDataContext.getBooleanParameter(
593 portletDataHandlerControl.getNamespace(),
594 portletDataHandlerControl.getControlName(), false));
595
596 if (!checkedControl) {
597 ManifestSummary manifestSummary =
598 portletDataContext.getManifestSummary();
599
600 StagedModelType stagedModelType = new StagedModelType(
601 portletDataHandlerControl.getClassName(),
602 portletDataHandlerBoolean.getReferrerClassName());
603
604 String manifestSummaryKey = ManifestSummary.getManifestSummaryKey(
605 stagedModelType);
606
607 manifestSummary.addModelAdditionCount(manifestSummaryKey, 0);
608 }
609 }
610
611 protected PortletPreferences doAddDefaultData(
612 PortletDataContext portletDataContext, String portletId,
613 PortletPreferences portletPreferences)
614 throws Exception {
615
616 return portletPreferences;
617 }
618
619 protected PortletPreferences doDeleteData(
620 PortletDataContext portletDataContext, String portletId,
621 PortletPreferences portletPreferences)
622 throws Exception {
623
624 return portletPreferences;
625 }
626
627 protected String doExportData(
628 PortletDataContext portletDataContext, String portletId,
629 PortletPreferences portletPreferences)
630 throws Exception {
631
632 return null;
633 }
634
635 protected PortletPreferences doImportData(
636 PortletDataContext portletDataContext, String portletId,
637 PortletPreferences portletPreferences, String data)
638 throws Exception {
639
640 return null;
641 }
642
643 protected void doPrepareManifestSummary(
644 PortletDataContext portletDataContext,
645 PortletPreferences portletPreferences)
646 throws Exception {
647 }
648
649 protected PortletPreferences doProcessExportPortletPreferences(
650 PortletDataContext portletDataContext, String portletId,
651 PortletPreferences portletPreferences)
652 throws Exception {
653
654 return portletPreferences;
655 }
656
657 protected PortletPreferences doProcessImportPortletPreferences(
658 PortletDataContext portletDataContext, String portletId,
659 PortletPreferences portletPreferences)
660 throws Exception {
661
662 return portletPreferences;
663 }
664
665 protected boolean doValidateSchemaVersion(String schemaVersion)
666 throws Exception {
667
668
669
670 Version currentVersion = Version.getInstance(getSchemaVersion());
671 Version importedVersion = Version.getInstance(schemaVersion);
672
673 if (!Validator.equals(
674 currentVersion.getMajor(), importedVersion.getMajor())) {
675
676 return false;
677 }
678
679
680
681
682 int currentMinorVersion = GetterUtil.getInteger(
683 currentVersion.getMinor(), -1);
684 int importedMinorVersion = GetterUtil.getInteger(
685 importedVersion.getMinor(), -1);
686
687 if (((currentMinorVersion == -1) && (importedMinorVersion == -1)) ||
688 (currentMinorVersion < importedMinorVersion)) {
689
690 return false;
691 }
692
693
694
695
696 return true;
697 }
698
699 protected String getExportDataRootElementString(Element rootElement) {
700 if (rootElement == null) {
701 return StringPool.BLANK;
702 }
703
704 try {
705 Document document = rootElement.getDocument();
706
707 return document.formattedString();
708 }
709 catch (IOException ioe) {
710 return StringPool.BLANK;
711 }
712 }
713
714 protected long getExportModelCount(
715 ManifestSummary manifestSummary,
716 PortletDataHandlerControl[] portletDataHandlerControls) {
717
718 long totalModelCount = -1;
719
720 for (PortletDataHandlerControl portletDataHandlerControl :
721 portletDataHandlerControls) {
722
723 StagedModelType stagedModelType = new StagedModelType(
724 portletDataHandlerControl.getClassName(),
725 portletDataHandlerControl.getReferrerClassName());
726
727 long modelAdditionCount = manifestSummary.getModelAdditionCount(
728 stagedModelType);
729
730 if (portletDataHandlerControl
731 instanceof PortletDataHandlerBoolean) {
732
733 PortletDataHandlerBoolean portletDataHandlerBoolean =
734 (PortletDataHandlerBoolean)portletDataHandlerControl;
735
736 PortletDataHandlerControl[] childPortletDataHandlerControls =
737 portletDataHandlerBoolean.getChildren();
738
739 if (childPortletDataHandlerControls != null) {
740 long childModelCount = getExportModelCount(
741 manifestSummary, childPortletDataHandlerControls);
742
743 if (childModelCount != -1) {
744 if (modelAdditionCount == -1) {
745 modelAdditionCount = childModelCount;
746 }
747 else {
748 modelAdditionCount += childModelCount;
749 }
750 }
751 }
752 }
753
754 if (modelAdditionCount == -1) {
755 continue;
756 }
757
758 if (totalModelCount == -1) {
759 totalModelCount = modelAdditionCount;
760 }
761 else {
762 totalModelCount += modelAdditionCount;
763 }
764 }
765
766 return totalModelCount;
767 }
768
769
772 @Deprecated
773 protected void setAlwaysExportable(boolean alwaysExportable) {
774 }
775
776
779 @Deprecated
780 protected void setAlwaysStaged(boolean alwaysStaged) {
781 }
782
783 protected void setDataAlwaysStaged(boolean dataAlwaysStaged) {
784 _dataAlwaysStaged = dataAlwaysStaged;
785 }
786
787 protected void setDataLevel(DataLevel dataLevel) {
788 _dataLevel = dataLevel;
789 }
790
791 protected void setDataLocalized(boolean dataLocalized) {
792 _dataLocalized = dataLocalized;
793 }
794
795 protected void setDataPortletPreferences(String... dataPortletPreferences) {
796 _dataPortletPreferences = dataPortletPreferences;
797 }
798
799 protected void setDeletionSystemEventStagedModelTypes(
800 StagedModelType... deletionSystemEventStagedModelTypes) {
801
802 _deletionSystemEventStagedModelTypes =
803 deletionSystemEventStagedModelTypes;
804 }
805
806 protected void setExportControls(
807 PortletDataHandlerControl... exportControls) {
808
809 _exportControls = exportControls;
810
811 setImportControls(exportControls);
812 }
813
814 protected void setExportMetadataControls(
815 PortletDataHandlerControl... exportMetadataControls) {
816
817 _exportMetadataControls = exportMetadataControls;
818
819 setImportMetadataControls(exportMetadataControls);
820 }
821
822 protected void setImportControls(
823 PortletDataHandlerControl... importControls) {
824
825 _importControls = importControls;
826 }
827
828 protected void setImportMetadataControls(
829 PortletDataHandlerControl... importMetadataControls) {
830
831 _importMetadataControls = importMetadataControls;
832 }
833
834 protected void setPublishToLiveByDefault(boolean publishToLiveByDefault) {
835 _publishToLiveByDefault = publishToLiveByDefault;
836 }
837
838 protected void setSupportsDataStrategyCopyAsNew(
839 boolean supportsDataStrategyCopyAsNew) {
840
841 _supportsDataStrategyCopyAsNew = supportsDataStrategyCopyAsNew;
842 }
843
844 private static final Log _log = LogFactoryUtil.getLog(
845 BasePortletDataHandler.class);
846
847 private boolean _dataAlwaysStaged;
848 private DataLevel _dataLevel = DataLevel.SITE;
849 private boolean _dataLocalized;
850 private String[] _dataPortletPreferences = StringPool.EMPTY_ARRAY;
851 private StagedModelType[] _deletionSystemEventStagedModelTypes =
852 new StagedModelType[0];
853 private PortletDataHandlerControl[] _exportControls =
854 new PortletDataHandlerControl[0];
855 private PortletDataHandlerControl[] _exportMetadataControls =
856 new PortletDataHandlerControl[0];
857 private PortletDataHandlerControl[] _importControls =
858 new PortletDataHandlerControl[0];
859 private PortletDataHandlerControl[] _importMetadataControls =
860 new PortletDataHandlerControl[0];
861 private String _portletId;
862 private boolean _publishToLiveByDefault;
863 private int _rank = 100;
864 private boolean _supportsDataStrategyCopyAsNew = true;
865
866 }