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