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