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