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.portlet.dynamicdatalists.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.DynamicQueryFactoryUtil;
020    import com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil;
021    import com.liferay.portal.kernel.dao.orm.Property;
022    import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
023    import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
024    import com.liferay.portal.kernel.exception.PortalException;
025    import com.liferay.portal.kernel.exception.SystemException;
026    import com.liferay.portal.kernel.lar.BasePortletDataHandler;
027    import com.liferay.portal.kernel.lar.PortletDataContext;
028    import com.liferay.portal.kernel.lar.PortletDataHandlerBoolean;
029    import com.liferay.portal.kernel.lar.StagedModelDataHandler;
030    import com.liferay.portal.kernel.lar.StagedModelDataHandlerRegistryUtil;
031    import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
032    import com.liferay.portal.kernel.lar.StagedModelType;
033    import com.liferay.portal.kernel.util.PortalClassLoaderUtil;
034    import com.liferay.portal.kernel.xml.Element;
035    import com.liferay.portal.util.PortalUtil;
036    import com.liferay.portlet.dynamicdatalists.model.DDLRecord;
037    import com.liferay.portlet.dynamicdatalists.model.DDLRecordSet;
038    import com.liferay.portlet.dynamicdatalists.model.DDLRecordVersion;
039    import com.liferay.portlet.dynamicdatalists.service.DDLRecordSetLocalServiceUtil;
040    import com.liferay.portlet.dynamicdatalists.service.permission.DDLPermission;
041    import com.liferay.portlet.dynamicdatalists.service.persistence.DDLRecordExportActionableDynamicQuery;
042    import com.liferay.portlet.dynamicdatalists.service.persistence.DDLRecordSetExportActionableDynamicQuery;
043    import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
044    import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
045    import com.liferay.portlet.dynamicdatamapping.service.persistence.DDMStructureExportActionableDynamicQuery;
046    
047    import java.util.ArrayList;
048    import java.util.List;
049    
050    import javax.portlet.PortletPreferences;
051    
052    /**
053     * @author Michael C. Han
054     */
055    public class DDLPortletDataHandler extends BasePortletDataHandler {
056    
057            public static final String NAMESPACE = "dynamic_data_lists";
058    
059            public DDLPortletDataHandler() {
060                    setDataLocalized(true);
061                    setDeletionSystemEventStagedModelTypes(
062                            new StagedModelType(DDLRecord.class),
063                            new StagedModelType(DDLRecordSet.class));
064                    setExportControls(
065                            new PortletDataHandlerBoolean(
066                                    NAMESPACE, "record-sets", true, false, null,
067                                    DDLRecordSet.class.getName()),
068                            new PortletDataHandlerBoolean(
069                                    NAMESPACE, "records", true, false, null,
070                                    DDLRecord.class.getName()),
071                            new PortletDataHandlerBoolean(
072                                    NAMESPACE, "data-definitions", true, false, null,
073                                    DDMStructure.class.getName(), DDLRecordSet.class.getName()));
074            }
075    
076            @Override
077            protected PortletPreferences doDeleteData(
078                            PortletDataContext portletDataContext, String portletId,
079                            PortletPreferences portletPreferences)
080                    throws Exception {
081    
082                    if (portletDataContext.addPrimaryKey(
083                                    DDLPortletDataHandler.class, "deleteData")) {
084    
085                            return portletPreferences;
086                    }
087    
088                    DDLRecordSetLocalServiceUtil.deleteRecordSets(
089                            portletDataContext.getScopeGroupId());
090    
091                    return portletPreferences;
092            }
093    
094            @Override
095            protected String doExportData(
096                            final PortletDataContext portletDataContext, String portletId,
097                            PortletPreferences portletPreferences)
098                    throws Exception {
099    
100                    portletDataContext.addPortletPermissions(DDLPermission.RESOURCE_NAME);
101    
102                    Element rootElement = addExportDataRootElement(portletDataContext);
103    
104                    if (portletDataContext.getBooleanParameter(
105                                    NAMESPACE, "data-definitions")) {
106    
107                            List<DDMTemplate> ddmTemplates = new ArrayList<DDMTemplate>();
108    
109                            ActionableDynamicQuery ddmStructureActionableDynamicQuery =
110                                    getDDMStructureActionableDynamicQuery(
111                                            portletDataContext, ddmTemplates);
112    
113                            ddmStructureActionableDynamicQuery.performActions();
114    
115                            for (DDMTemplate ddmTemplate : ddmTemplates) {
116                                    StagedModelDataHandlerUtil.exportStagedModel(
117                                            portletDataContext, ddmTemplate);
118                            }
119                    }
120    
121                    if (portletDataContext.getBooleanParameter(NAMESPACE, "record-sets")) {
122                            ActionableDynamicQuery recordSetActionableDynamicQuery =
123                                    new DDLRecordSetExportActionableDynamicQuery(
124                                            portletDataContext);
125    
126                            recordSetActionableDynamicQuery.performActions();
127                    }
128    
129                    if (portletDataContext.getBooleanParameter(NAMESPACE, "records")) {
130                            ActionableDynamicQuery recordActionableDynamicQuery =
131                                    getRecordActionableDynamicQuery(portletDataContext);
132    
133                            recordActionableDynamicQuery.performActions();
134                    }
135    
136                    return getExportDataRootElementString(rootElement);
137            }
138    
139            @Override
140            protected PortletPreferences doImportData(
141                            PortletDataContext portletDataContext, String portletId,
142                            PortletPreferences portletPreferences, String data)
143                    throws Exception {
144    
145                    portletDataContext.importPortletPermissions(
146                            DDLPermission.RESOURCE_NAME);
147    
148                    if (portletDataContext.getBooleanParameter(
149                                    NAMESPACE, "data-definitions")) {
150    
151                            Element ddmStructuresElement =
152                                    portletDataContext.getImportDataGroupElement(
153                                            DDMStructure.class);
154    
155                            List<Element> ddmStructureElements =
156                                    ddmStructuresElement.elements();
157    
158                            for (Element ddmStructureElement : ddmStructureElements) {
159                                    StagedModelDataHandlerUtil.importStagedModel(
160                                            portletDataContext, ddmStructureElement);
161                            }
162    
163                            Element ddmTemplatesElement =
164                                    portletDataContext.getImportDataGroupElement(DDMTemplate.class);
165    
166                            List<Element> ddmTemplateElements = ddmTemplatesElement.elements();
167    
168                            for (Element ddmTemplateElement : ddmTemplateElements) {
169                                    StagedModelDataHandlerUtil.importStagedModel(
170                                            portletDataContext, ddmTemplateElement);
171                            }
172                    }
173    
174                    if (portletDataContext.getBooleanParameter(NAMESPACE, "record-sets")) {
175                            Element recordSetsElement =
176                                    portletDataContext.getImportDataGroupElement(
177                                            DDLRecordSet.class);
178    
179                            List<Element> recordSetElements = recordSetsElement.elements();
180    
181                            for (Element recordSetElement : recordSetElements) {
182                                    StagedModelDataHandlerUtil.importStagedModel(
183                                            portletDataContext, recordSetElement);
184                            }
185                    }
186    
187                    if (portletDataContext.getBooleanParameter(NAMESPACE, "records")) {
188                            Element recordsElement =
189                                    portletDataContext.getImportDataGroupElement(DDLRecord.class);
190    
191                            List<Element> recordElements = recordsElement.elements();
192    
193                            for (Element recordElement : recordElements) {
194                                    StagedModelDataHandlerUtil.importStagedModel(
195                                            portletDataContext, recordElement);
196                            }
197                    }
198    
199                    return portletPreferences;
200            }
201    
202            @Override
203            protected void doPrepareManifestSummary(
204                            PortletDataContext portletDataContext,
205                            PortletPreferences portletPreferences)
206                    throws Exception {
207    
208                    List<DDMTemplate> ddmTemplates = new ArrayList<DDMTemplate>();
209    
210                    ActionableDynamicQuery ddmStructureActionableDynamicQuery =
211                            getDDMStructureActionableDynamicQuery(
212                                    portletDataContext, ddmTemplates);
213    
214                    ddmStructureActionableDynamicQuery.performCount();
215    
216                    ActionableDynamicQuery recordSetActionableDynamicQuery =
217                            new DDLRecordSetExportActionableDynamicQuery(portletDataContext);
218    
219                    recordSetActionableDynamicQuery.performCount();
220    
221                    ActionableDynamicQuery recordActionableDynamicQuery =
222                            getRecordActionableDynamicQuery(portletDataContext);
223    
224                    recordActionableDynamicQuery.performCount();
225            }
226    
227            protected ActionableDynamicQuery getDDMStructureActionableDynamicQuery(
228                            final PortletDataContext portletDataContext,
229                            final List<DDMTemplate> ddmTemplates)
230                    throws SystemException {
231    
232                    return new DDMStructureExportActionableDynamicQuery(
233                            portletDataContext) {
234    
235                            @Override
236                            protected void addCriteria(DynamicQuery dynamicQuery) {
237                                    super.addCriteria(dynamicQuery);
238    
239                                    Property classNameIdProperty = PropertyFactoryUtil.forName(
240                                            "classNameId");
241    
242                                    long classNameId = PortalUtil.getClassNameId(
243                                            DDLRecordSet.class);
244    
245                                    dynamicQuery.add(classNameIdProperty.eq(classNameId));
246                            }
247    
248                            @Override
249                            protected StagedModelType getStagedModelType() {
250                                    return new StagedModelType(
251                                            DDMStructure.class.getName(), DDLRecordSet.class.getName());
252                            }
253    
254                            @Override
255                            protected void performAction(Object object) throws PortalException {
256                                    DDMStructure ddmStructure = (DDMStructure)object;
257    
258                                    StagedModelDataHandlerUtil.exportStagedModel(
259                                            portletDataContext, ddmStructure);
260    
261                                    try {
262                                            ddmTemplates.addAll(ddmStructure.getTemplates());
263                                    }
264                                    catch (SystemException se) {
265                                    }
266                            }
267    
268                    };
269            }
270    
271            protected ActionableDynamicQuery getRecordActionableDynamicQuery(
272                            final PortletDataContext portletDataContext)
273                    throws SystemException {
274    
275                    return new DDLRecordExportActionableDynamicQuery(
276                            portletDataContext) {
277    
278                            @Override
279                            protected void addCriteria(DynamicQuery dynamicQuery) {
280                                    super.addCriteria(dynamicQuery);
281    
282                                    Property recordIdProperty = PropertyFactoryUtil.forName(
283                                            "recordId");
284    
285                                    DynamicQuery recordVersionDynamicQuery =
286                                            DynamicQueryFactoryUtil.forClass(
287                                                    DDLRecordVersion.class, "recordVersion",
288                                                    PortalClassLoaderUtil.getClassLoader());
289    
290                                    recordVersionDynamicQuery.setProjection(
291                                            ProjectionFactoryUtil.property("recordId"));
292    
293                                    Property statusProperty = PropertyFactoryUtil.forName("status");
294    
295                                    StagedModelDataHandler<?> stagedModelDataHandler =
296                                            StagedModelDataHandlerRegistryUtil.
297                                                    getStagedModelDataHandler(DDLRecord.class.getName());
298    
299                                    recordVersionDynamicQuery.add(
300                                            statusProperty.in(
301                                                    stagedModelDataHandler.getExportableStatuses()));
302    
303                                    recordVersionDynamicQuery.add(
304                                            RestrictionsFactoryUtil.eqProperty(
305                                                    "recordVersion.version", "version"));
306    
307                                    recordVersionDynamicQuery.add(
308                                            RestrictionsFactoryUtil.eqProperty(
309                                                    "recordVersion.recordId", "recordId"));
310    
311                                    dynamicQuery.add(
312                                            recordIdProperty.in(recordVersionDynamicQuery));
313                            }
314    
315                    };
316            }
317    
318    }