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.BaseStagedModelDataHandler;
018    import com.liferay.portal.kernel.lar.PortletDataContext;
019    import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
020    import com.liferay.portal.kernel.lar.StagedModelPathUtil;
021    import com.liferay.portal.kernel.util.MapUtil;
022    import com.liferay.portal.kernel.xml.Element;
023    import com.liferay.portal.service.ServiceContext;
024    import com.liferay.portlet.dynamicdatalists.model.DDLRecordSet;
025    import com.liferay.portlet.dynamicdatalists.service.DDLRecordSetLocalServiceUtil;
026    import com.liferay.portlet.dynamicdatalists.service.persistence.DDLRecordSetUtil;
027    import com.liferay.portlet.dynamicdatamapping.model.DDMStructure;
028    import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
029    
030    import java.util.List;
031    import java.util.Map;
032    
033    /**
034     * @author Brian Wing Shun Chan
035     */
036    public class DDLRecordSetStagedModelDataHandler
037            extends BaseStagedModelDataHandler<DDLRecordSet> {
038    
039            @Override
040            public String getClassName() {
041                    return DDLRecordSet.class.getName();
042            }
043    
044            @Override
045            protected void doExportStagedModel(
046                            PortletDataContext portletDataContext, Element[] elements,
047                            DDLRecordSet recordSet)
048                    throws Exception {
049    
050                    Element recordSetsElement = elements[0];
051    
052                    Element recordSetElement = recordSetsElement.addElement("record-set");
053    
054                    portletDataContext.addClassedModel(
055                            recordSetElement, StagedModelPathUtil.getPath(recordSet), recordSet,
056                            DDLPortletDataHandler.NAMESPACE);
057    
058                    Element ddmStructuresElement = recordSetElement.addElement(
059                            "ddm-structures");
060    
061                    DDMStructure ddmStructure = recordSet.getDDMStructure();
062    
063                    StagedModelDataHandlerUtil.exportStagedModel(
064                            portletDataContext, ddmStructuresElement, ddmStructure);
065    
066                    Element ddmTemplatesElement = recordSetElement.addElement(
067                            "ddm-templates");
068    
069                    List<DDMTemplate> ddmTemplates = ddmStructure.getTemplates();
070    
071                    for (DDMTemplate ddmTemplate : ddmTemplates) {
072                            StagedModelDataHandlerUtil.exportStagedModel(
073                                    portletDataContext, ddmTemplatesElement, ddmTemplate);
074                    }
075            }
076    
077            @Override
078            protected void doImportStagedModel(
079                            PortletDataContext portletDataContext, Element element, String path,
080                            DDLRecordSet recordSet)
081                    throws Exception {
082    
083                    Element ddmStructuresElement = element.element("ddm-structures");
084    
085                    if (ddmStructuresElement != null) {
086                            importDDMStructures(portletDataContext, ddmStructuresElement);
087                    }
088    
089                    Element ddmTemplatesElement = element.element("ddm-templates");
090    
091                    if (ddmTemplatesElement != null) {
092                            importDDMTemplates(portletDataContext, ddmTemplatesElement);
093                    }
094    
095                    long userId = portletDataContext.getUserId(recordSet.getUserUuid());
096    
097                    Map<Long, Long> ddmStructureIds =
098                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
099                                    DDMStructure.class);
100    
101                    long ddmStructureId = MapUtil.getLong(
102                            ddmStructureIds, recordSet.getDDMStructureId(),
103                            recordSet.getDDMStructureId());
104    
105                    ServiceContext serviceContext = portletDataContext.createServiceContext(
106                            path, recordSet, DDLPortletDataHandler.NAMESPACE);
107    
108                    DDLRecordSet importedRecordSet = null;
109    
110                    if (portletDataContext.isDataStrategyMirror()) {
111                            DDLRecordSet existingRecordSet = DDLRecordSetUtil.fetchByUUID_G(
112                                    recordSet.getUuid(), portletDataContext.getScopeGroupId());
113    
114                            if (existingRecordSet == null) {
115                                    serviceContext.setUuid(recordSet.getUuid());
116    
117                                    importedRecordSet = DDLRecordSetLocalServiceUtil.addRecordSet(
118                                            userId, portletDataContext.getScopeGroupId(),
119                                            ddmStructureId, recordSet.getRecordSetKey(),
120                                            recordSet.getNameMap(), recordSet.getDescriptionMap(),
121                                            recordSet.getMinDisplayRows(), recordSet.getScope(),
122                                            serviceContext);
123                            }
124                            else {
125                                    importedRecordSet =
126                                            DDLRecordSetLocalServiceUtil.updateRecordSet(
127                                                    existingRecordSet.getRecordSetId(), ddmStructureId,
128                                                    recordSet.getNameMap(), recordSet.getDescriptionMap(),
129                                                    recordSet.getMinDisplayRows(), serviceContext);
130                            }
131                    }
132                    else {
133                            importedRecordSet = DDLRecordSetLocalServiceUtil.addRecordSet(
134                                    userId, portletDataContext.getScopeGroupId(), ddmStructureId,
135                                    recordSet.getRecordSetKey(), recordSet.getNameMap(),
136                                    recordSet.getDescriptionMap(), recordSet.getMinDisplayRows(),
137                                    recordSet.getScope(), serviceContext);
138                    }
139    
140                    portletDataContext.importClassedModel(
141                            recordSet, importedRecordSet, DDLPortletDataHandler.NAMESPACE);
142            }
143    
144            protected void importDDMStructures(
145                            PortletDataContext portletDataContext,
146                            Element ddmStructureReferencesElement)
147                    throws Exception {
148    
149                    List<Element> ddmStructureElements =
150                            ddmStructureReferencesElement.elements("structure");
151    
152                    for (Element ddmStructureElement : ddmStructureElements) {
153                            StagedModelDataHandlerUtil.importStagedModel(
154                                    portletDataContext, ddmStructureElement);
155                    }
156            }
157    
158            protected void importDDMTemplates(
159                            PortletDataContext portletDataContext,
160                            Element ddmTemplateReferencesElement)
161                    throws Exception {
162    
163                    List<Element> ddmTemplateElements =
164                            ddmTemplateReferencesElement.elements("template");
165    
166                    for (Element ddmTemplateElement : ddmTemplateElements) {
167                            StagedModelDataHandlerUtil.importStagedModel(
168                                    portletDataContext, ddmTemplateElement);
169                    }
170            }
171    
172    }