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.lar.BasePortletDataHandler;
018    import com.liferay.portal.kernel.lar.PortletDataContext;
019    import com.liferay.portal.kernel.util.MapUtil;
020    import com.liferay.portal.kernel.util.StringBundler;
021    import com.liferay.portal.kernel.xml.Document;
022    import com.liferay.portal.kernel.xml.Element;
023    import com.liferay.portal.kernel.xml.SAXReaderUtil;
024    import com.liferay.portal.service.ServiceContext;
025    import com.liferay.portal.util.PortletKeys;
026    import com.liferay.portlet.dynamicdatalists.model.DDLRecordSet;
027    import com.liferay.portlet.dynamicdatalists.service.DDLRecordSetLocalServiceUtil;
028    import com.liferay.portlet.dynamicdatalists.service.persistence.DDLRecordSetUtil;
029    import com.liferay.portlet.dynamicdatamapping.lar.DDMPortletDataHandlerImpl;
030    import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
031    import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
032    
033    import java.util.List;
034    import java.util.Map;
035    
036    import javax.portlet.PortletPreferences;
037    
038    /**
039     * @author Michael C. Han
040     */
041    public class DDLPortletDataHandlerImpl
042            extends BasePortletDataHandler implements DDLPortletDataHandler {
043    
044            @Override
045            public void exportRecordSet(
046                            PortletDataContext portletDataContext, Element recordSetsElement,
047                            DDLRecordSet recordSet)
048                    throws Exception {
049    
050                    String path = getRecordSetPath(portletDataContext, recordSet);
051    
052                    if (!portletDataContext.isPathNotProcessed(path)) {
053                            return;
054                    }
055    
056                    Element recordSetElement = recordSetsElement.addElement("record-set");
057    
058                    portletDataContext.addClassedModel(
059                            recordSetElement, path, recordSet, _NAMESPACE);
060    
061                    Element ddmStructuresElement = recordSetElement.addElement(
062                            "ddm-structures");
063    
064                    DDMStructure ddmStructure = recordSet.getDDMStructure();
065    
066                    DDMPortletDataHandlerImpl.exportStructure(
067                            portletDataContext, ddmStructuresElement, ddmStructure);
068    
069                    Element ddmTemplatesElement = recordSetElement.addElement(
070                            "ddm-templates");
071    
072                    List<DDMTemplate> ddmTemplates = ddmStructure.getTemplates();
073    
074                    for (DDMTemplate ddmTemplate : ddmTemplates) {
075                            DDMPortletDataHandlerImpl.exportTemplate(
076                                    portletDataContext, ddmTemplatesElement, ddmTemplate);
077                    }
078            }
079    
080            @Override
081            public void importRecordSet(
082                            PortletDataContext portletDataContext, Element recordSetElement)
083                    throws Exception {
084    
085                    Element ddmStructuresElement = recordSetElement.element(
086                            "ddm-structures");
087    
088                    if (ddmStructuresElement != null) {
089                            importDDMStructures(portletDataContext, ddmStructuresElement);
090                    }
091    
092                    Element ddmTemplatesElement = recordSetElement.element("ddm-templates");
093    
094                    if (ddmTemplatesElement != null) {
095                            importDDMTemplates(portletDataContext, ddmTemplatesElement);
096                    }
097    
098                    String path = recordSetElement.attributeValue("path");
099    
100                    if (!portletDataContext.isPathNotProcessed(path)) {
101                            return;
102                    }
103    
104                    DDLRecordSet recordSet =
105                            (DDLRecordSet)portletDataContext.getZipEntryAsObject(path);
106    
107                    long userId = portletDataContext.getUserId(recordSet.getUserUuid());
108    
109                    Map<Long, Long> structureIds =
110                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
111                                    DDMStructure.class);
112    
113                    long structureId = MapUtil.getLong(
114                            structureIds, recordSet.getDDMStructureId(),
115                            recordSet.getDDMStructureId());
116    
117                    ServiceContext serviceContext = portletDataContext.createServiceContext(
118                            recordSetElement, recordSet, _NAMESPACE);
119    
120                    DDLRecordSet importedRecordSet = null;
121    
122                    if (portletDataContext.isDataStrategyMirror()) {
123                            DDLRecordSet existingRecordSet = DDLRecordSetUtil.fetchByUUID_G(
124                                    recordSet.getUuid(), portletDataContext.getScopeGroupId());
125    
126                            if (existingRecordSet == null) {
127                                    serviceContext.setUuid(recordSet.getUuid());
128    
129                                    importedRecordSet = DDLRecordSetLocalServiceUtil.addRecordSet(
130                                            userId, portletDataContext.getScopeGroupId(), structureId,
131                                            recordSet.getRecordSetKey(), recordSet.getNameMap(),
132                                            recordSet.getDescriptionMap(),
133                                            recordSet.getMinDisplayRows(), recordSet.getScope(),
134                                            serviceContext);
135                            }
136                            else {
137                                    importedRecordSet =
138                                            DDLRecordSetLocalServiceUtil.updateRecordSet(
139                                                    existingRecordSet.getRecordSetId(), structureId,
140                                                    recordSet.getNameMap(), recordSet.getDescriptionMap(),
141                                                    recordSet.getMinDisplayRows(), serviceContext);
142                            }
143                    }
144                    else {
145                            importedRecordSet = DDLRecordSetLocalServiceUtil.addRecordSet(
146                                    userId, portletDataContext.getScopeGroupId(), structureId,
147                                    recordSet.getRecordSetKey(), recordSet.getNameMap(),
148                                    recordSet.getDescriptionMap(), recordSet.getMinDisplayRows(),
149                                    recordSet.getScope(), serviceContext);
150                    }
151    
152                    portletDataContext.importClassedModel(
153                            recordSet, importedRecordSet, _NAMESPACE);
154            }
155    
156            @Override
157            public boolean isAlwaysExportable() {
158                    return _ALWAYS_EXPORTABLE;
159            }
160    
161            @Override
162            public boolean isDataLocalized() {
163                    return _DATA_LOCALIZED;
164            }
165    
166            @Override
167            protected PortletPreferences doDeleteData(
168                            PortletDataContext portletDataContext, String portletId,
169                            PortletPreferences portletPreferences)
170                    throws Exception {
171    
172                    if (!portletDataContext.addPrimaryKey(
173                                    DDLPortletDataHandlerImpl.class, "deleteData")) {
174    
175                            DDLRecordSetLocalServiceUtil.deleteRecordSets(
176                                    portletDataContext.getScopeGroupId());
177                    }
178    
179                    return portletPreferences;
180            }
181    
182            @Override
183            protected String doExportData(
184                            PortletDataContext portletDataContext, String portletId,
185                            PortletPreferences portletPreferences)
186                    throws Exception {
187    
188                    portletDataContext.addPermissions(
189                            "com.liferay.portlet.dynamicdatalist",
190                            portletDataContext.getScopeGroupId());
191    
192                    Document document = SAXReaderUtil.createDocument();
193    
194                    Element rootElement = document.addElement("ddl-data");
195    
196                    Element recordSetsElement = rootElement.addElement("record-sets");
197    
198                    List<DDLRecordSet> recordSets =
199                            DDLRecordSetLocalServiceUtil.getRecordSets(
200                                    portletDataContext.getScopeGroupId());
201    
202                    for (DDLRecordSet recordSet : recordSets) {
203                            if (portletDataContext.isWithinDateRange(
204                                            recordSet.getModifiedDate())) {
205    
206                                    exportRecordSet(
207                                            portletDataContext, recordSetsElement, recordSet);
208                            }
209                    }
210    
211                    return document.formattedString();
212            }
213    
214            @Override
215            protected PortletPreferences doImportData(
216                            PortletDataContext portletDataContext, String portletId,
217                            PortletPreferences portletPreferences, String data)
218                    throws Exception {
219    
220                    portletDataContext.importPermissions(
221                            "com.liferay.portlet.dynamicdatalist",
222                            portletDataContext.getSourceGroupId(),
223                            portletDataContext.getScopeGroupId());
224    
225                    Document document = SAXReaderUtil.read(data);
226    
227                    Element rootElement = document.getRootElement();
228    
229                    Element recordSetsElement = rootElement.element("record-sets");
230    
231                    List<Element> recordSetElements = recordSetsElement.elements(
232                            "record-set");
233    
234                    for (Element recordSetElement : recordSetElements) {
235                            importRecordSet(portletDataContext, recordSetElement);
236                    }
237    
238                    return portletPreferences;
239            }
240    
241            protected String getRecordSetPath(
242                    PortletDataContext portletDataContext, DDLRecordSet recordSet) {
243    
244                    StringBundler sb = new StringBundler(4);
245    
246                    sb.append(
247                            portletDataContext.getPortletPath(PortletKeys.DYNAMIC_DATA_LISTS));
248                    sb.append("/record-sets/");
249                    sb.append(recordSet.getRecordSetId());
250                    sb.append(".xml");
251    
252                    return sb.toString();
253            }
254    
255            protected void importDDMStructures(
256                            PortletDataContext portletDataContext,
257                            Element ddmStructureReferencesElement)
258                    throws Exception {
259    
260                    List<Element> ddmStructureElements =
261                            ddmStructureReferencesElement.elements("structure");
262    
263                    for (Element ddmStructureElement : ddmStructureElements) {
264                            DDMPortletDataHandlerImpl.importStructure(
265                                    portletDataContext, ddmStructureElement);
266                    }
267            }
268    
269            protected void importDDMTemplates(
270                            PortletDataContext portletDataContext,
271                            Element ddmTemplateReferencesElement)
272                    throws Exception {
273    
274                    List<Element> ddmTemplateElements =
275                            ddmTemplateReferencesElement.elements("template");
276    
277                    for (Element ddmTemplateElement : ddmTemplateElements) {
278                            DDMPortletDataHandlerImpl.importTemplate(
279                                    portletDataContext, ddmTemplateElement);
280                    }
281            }
282    
283            private static final boolean _ALWAYS_EXPORTABLE = true;
284    
285            private static final boolean _DATA_LOCALIZED = true;
286    
287            private static final String _NAMESPACE = "ddl";
288    
289    }