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.portlet.portletdisplaytemplate.lar;
016    
017    import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
018    import com.liferay.portal.kernel.dao.orm.DynamicQuery;
019    import com.liferay.portal.kernel.dao.orm.ExportActionableDynamicQuery;
020    import com.liferay.portal.kernel.dao.orm.Property;
021    import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
022    import com.liferay.portal.kernel.lar.BasePortletDataHandler;
023    import com.liferay.portal.kernel.lar.ManifestSummary;
024    import com.liferay.portal.kernel.lar.PortletDataContext;
025    import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
026    import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
027    import com.liferay.portal.kernel.lar.StagedModelType;
028    import com.liferay.portal.kernel.template.TemplateHandlerRegistryUtil;
029    import com.liferay.portal.kernel.util.ArrayUtil;
030    import com.liferay.portal.kernel.xml.Element;
031    import com.liferay.portal.util.PortalUtil;
032    import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
033    import com.liferay.portlet.dynamicdatamapping.model.DDMTemplateConstants;
034    import com.liferay.portlet.dynamicdatamapping.service.DDMTemplateLocalServiceUtil;
035    
036    import java.util.ArrayList;
037    import java.util.List;
038    
039    import javax.portlet.PortletPreferences;
040    
041    /**
042     * @author Juan Fern??ndez
043     */
044    public class PortletDisplayTemplatePortletDataHandler
045            extends BasePortletDataHandler {
046    
047            public static final String NAMESPACE = "portlet_display_templates";
048    
049            public PortletDisplayTemplatePortletDataHandler() {
050                    setExportControls(
051                            new PortletDataHandlerBoolean(
052                                    NAMESPACE, "application-display-templates", true, true));
053            }
054    
055            @Override
056            public StagedModelType[] getDeletionSystemEventStagedModelTypes() {
057                    return getStagedModelTypes();
058            }
059    
060            @Override
061            public long getExportModelCount(ManifestSummary manifestSummary) {
062                    long totalModelCount = -1;
063    
064                    for (StagedModelType stagedModelType : getStagedModelTypes()) {
065                            long modelCount = manifestSummary.getModelAdditionCount(
066                                    stagedModelType.getClassName(),
067                                    stagedModelType.getReferrerClassName());
068    
069                            if (modelCount == -1) {
070                                    continue;
071                            }
072    
073                            if (totalModelCount == -1) {
074                                    totalModelCount = modelCount;
075                            }
076                            else {
077                                    totalModelCount += modelCount;
078                            }
079                    }
080    
081                    return totalModelCount;
082            }
083    
084            @Override
085            protected String doExportData(
086                            PortletDataContext portletDataContext, String portletId,
087                            PortletPreferences portletPreferences)
088                    throws Exception {
089    
090                    Element rootElement = addExportDataRootElement(portletDataContext);
091    
092                    long[] classNameIds = TemplateHandlerRegistryUtil.getClassNameIds();
093    
094                    ActionableDynamicQuery actionableDynamicQuery =
095                            getDDMTemplateActionableDynamicQuery(
096                                    portletDataContext, ArrayUtil.toArray(classNameIds),
097                                    new StagedModelType(
098                                            PortalUtil.getClassNameId(DDMTemplate.class),
099                                            StagedModelType.REFERRER_CLASS_NAME_ID_ALL));
100    
101                    actionableDynamicQuery.performActions();
102    
103                    return getExportDataRootElementString(rootElement);
104            }
105    
106            @Override
107            protected PortletPreferences doImportData(
108                            PortletDataContext portletDataContext, String portletId,
109                            PortletPreferences portletPreferences, String data)
110                    throws Exception {
111    
112                    Element ddmTemplatesElement =
113                            portletDataContext.getImportDataGroupElement(DDMTemplate.class);
114    
115                    List<Element> ddmTemplateElements = ddmTemplatesElement.elements();
116    
117                    for (Element ddmTemplateElement : ddmTemplateElements) {
118                            StagedModelDataHandlerUtil.importStagedModel(
119                                    portletDataContext, ddmTemplateElement);
120                    }
121    
122                    return null;
123            }
124    
125            @Override
126            protected void doPrepareManifestSummary(
127                            PortletDataContext portletDataContext,
128                            PortletPreferences portletPreferences)
129                    throws Exception {
130    
131                    for (StagedModelType stagedModelType : getStagedModelTypes()) {
132                            ActionableDynamicQuery actionableDynamicQuery =
133                                    getDDMTemplateActionableDynamicQuery(
134                                            portletDataContext,
135                                            new Long[] {stagedModelType.getReferrerClassNameId()},
136                                            stagedModelType);
137    
138                            actionableDynamicQuery.performCount();
139                    }
140            }
141    
142            protected ActionableDynamicQuery getDDMTemplateActionableDynamicQuery(
143                    final PortletDataContext portletDataContext, final Long[] classNameIds,
144                    final StagedModelType stagedModelType) {
145    
146                    ExportActionableDynamicQuery exportActionableDynamicQuery =
147                            DDMTemplateLocalServiceUtil.getExportActionableDynamicQuery(
148                                    portletDataContext);
149    
150                    final ActionableDynamicQuery.AddCriteriaMethod addCriteriaMethod =
151                            exportActionableDynamicQuery.getAddCriteriaMethod();
152    
153                    exportActionableDynamicQuery.setAddCriteriaMethod(
154                            new ActionableDynamicQuery.AddCriteriaMethod() {
155    
156                                    @Override
157                                    public void addCriteria(DynamicQuery dynamicQuery) {
158                                            addCriteriaMethod.addCriteria(dynamicQuery);
159    
160                                            Property classNameIdProperty = PropertyFactoryUtil.forName(
161                                                    "classNameId");
162    
163                                            dynamicQuery.add(classNameIdProperty.in(classNameIds));
164    
165                                            Property classPKProperty = PropertyFactoryUtil.forName(
166                                                    "classPK");
167    
168                                            dynamicQuery.add(classPKProperty.eq(0L));
169    
170                                            Property typeProperty = PropertyFactoryUtil.forName("type");
171    
172                                            dynamicQuery.add(
173                                                    typeProperty.eq(
174                                                            DDMTemplateConstants.TEMPLATE_TYPE_DISPLAY));
175                                    }
176    
177                            });
178                    exportActionableDynamicQuery.setStagedModelType(stagedModelType);
179    
180                    return exportActionableDynamicQuery;
181            }
182    
183            protected StagedModelType[] getStagedModelTypes() {
184                    if (_stagedModelTypes != null) {
185                            return _stagedModelTypes;
186                    }
187    
188                    List<StagedModelType> stagedModelTypes =
189                            new ArrayList<StagedModelType>();
190    
191                    long ddmTemplateClassNameId = PortalUtil.getClassNameId(
192                            DDMTemplate.class);
193    
194                    for (long classNameId : TemplateHandlerRegistryUtil.getClassNameIds()) {
195                            stagedModelTypes.add(
196                                    new StagedModelType(ddmTemplateClassNameId, classNameId));
197                    }
198    
199                    _stagedModelTypes = stagedModelTypes.toArray(
200                            new StagedModelType[stagedModelTypes.size()]);
201    
202                    return _stagedModelTypes;
203            }
204    
205            private StagedModelType[] _stagedModelTypes;
206    
207    }