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.mobiledevicerules.lar;
016    
017    import com.liferay.portal.kernel.dao.orm.QueryUtil;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.kernel.util.MapUtil;
021    import com.liferay.portal.kernel.util.StringBundler;
022    import com.liferay.portal.kernel.util.Validator;
023    import com.liferay.portal.kernel.xml.Element;
024    import com.liferay.portal.model.Layout;
025    import com.liferay.portal.model.LayoutSet;
026    import com.liferay.portal.service.LayoutLocalServiceUtil;
027    import com.liferay.portal.service.LayoutSetLocalServiceUtil;
028    import com.liferay.portal.service.ServiceContext;
029    import com.liferay.portlet.exportimport.lar.BaseStagedModelDataHandler;
030    import com.liferay.portlet.exportimport.lar.ExportImportPathUtil;
031    import com.liferay.portlet.exportimport.lar.PortletDataContext;
032    import com.liferay.portlet.exportimport.lar.StagedModelDataHandlerUtil;
033    import com.liferay.portlet.exportimport.lar.StagedModelModifiedDateComparator;
034    import com.liferay.portlet.mobiledevicerules.model.MDRRuleGroup;
035    import com.liferay.portlet.mobiledevicerules.model.MDRRuleGroupInstance;
036    import com.liferay.portlet.mobiledevicerules.service.MDRRuleGroupInstanceLocalServiceUtil;
037    import com.liferay.portlet.mobiledevicerules.service.MDRRuleGroupLocalServiceUtil;
038    
039    import java.util.List;
040    import java.util.Map;
041    
042    /**
043     * @author Mate Thurzo
044     */
045    public class MDRRuleGroupInstanceStagedModelDataHandler
046            extends BaseStagedModelDataHandler<MDRRuleGroupInstance> {
047    
048            public static final String[] CLASS_NAMES =
049                    {MDRRuleGroupInstance.class.getName()};
050    
051            @Override
052            public void deleteStagedModel(MDRRuleGroupInstance ruleGroupInstance) {
053                    MDRRuleGroupInstanceLocalServiceUtil.deleteRuleGroupInstance(
054                            ruleGroupInstance);
055            }
056    
057            @Override
058            public void deleteStagedModel(
059                    String uuid, long groupId, String className, String extraData) {
060    
061                    MDRRuleGroupInstance ruleGroupInstance =
062                            fetchStagedModelByUuidAndGroupId(uuid, groupId);
063    
064                    if (ruleGroupInstance != null) {
065                            deleteStagedModel(ruleGroupInstance);
066                    }
067            }
068    
069            @Override
070            public MDRRuleGroupInstance fetchStagedModelByUuidAndGroupId(
071                    String uuid, long groupId) {
072    
073                    return MDRRuleGroupInstanceLocalServiceUtil.
074                            fetchMDRRuleGroupInstanceByUuidAndGroupId(uuid, groupId);
075            }
076    
077            @Override
078            public List<MDRRuleGroupInstance> fetchStagedModelsByUuidAndCompanyId(
079                    String uuid, long companyId) {
080    
081                    return MDRRuleGroupInstanceLocalServiceUtil.
082                            getMDRRuleGroupInstancesByUuidAndCompanyId(
083                                    uuid, companyId, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
084                                    new StagedModelModifiedDateComparator<MDRRuleGroupInstance>());
085            }
086    
087            @Override
088            public String[] getClassNames() {
089                    return CLASS_NAMES;
090            }
091    
092            @Override
093            protected void doExportStagedModel(
094                            PortletDataContext portletDataContext,
095                            MDRRuleGroupInstance ruleGroupInstance)
096                    throws Exception {
097    
098                    MDRRuleGroup ruleGroup = MDRRuleGroupLocalServiceUtil.getRuleGroup(
099                            ruleGroupInstance.getRuleGroupId());
100    
101                    StagedModelDataHandlerUtil.exportReferenceStagedModel(
102                            portletDataContext, ruleGroupInstance, ruleGroup,
103                            PortletDataContext.REFERENCE_TYPE_PARENT);
104    
105                    Element ruleGroupInstanceElement =
106                            portletDataContext.getExportDataElement(ruleGroupInstance);
107    
108                    String className = ruleGroupInstance.getClassName();
109    
110                    if (className.equals(Layout.class.getName())) {
111                            Layout layout = LayoutLocalServiceUtil.getLayout(
112                                    ruleGroupInstance.getClassPK());
113    
114                            ruleGroupInstanceElement.addAttribute(
115                                    "layout-uuid", layout.getUuid());
116                    }
117    
118                    portletDataContext.addClassedModel(
119                            ruleGroupInstanceElement,
120                            ExportImportPathUtil.getModelPath(ruleGroupInstance),
121                            ruleGroupInstance);
122            }
123    
124            @Override
125            protected void doImportStagedModel(
126                            PortletDataContext portletDataContext,
127                            MDRRuleGroupInstance ruleGroupInstance)
128                    throws Exception {
129    
130                    long userId = portletDataContext.getUserId(
131                            ruleGroupInstance.getUserUuid());
132    
133                    Map<Long, Long> ruleGroupIds =
134                            (Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
135                                    MDRRuleGroup.class);
136    
137                    Long ruleGroupId = MapUtil.getLong(
138                            ruleGroupIds, ruleGroupInstance.getRuleGroupId(),
139                            ruleGroupInstance.getRuleGroupId());
140    
141                    long classPK = 0;
142    
143                    Element ruleGroupInstanceElement =
144                            portletDataContext.getImportDataStagedModelElement(
145                                    ruleGroupInstance);
146    
147                    String layoutUuid = ruleGroupInstanceElement.attributeValue(
148                            "layout-uuid");
149    
150                    try {
151                            if (Validator.isNotNull(layoutUuid)) {
152                                    Layout layout =
153                                            LayoutLocalServiceUtil.getLayoutByUuidAndGroupId(
154                                                    layoutUuid, portletDataContext.getScopeGroupId(),
155                                                    portletDataContext.isPrivateLayout());
156    
157                                    classPK = layout.getPrimaryKey();
158                            }
159                            else {
160                                    LayoutSet layoutSet = LayoutSetLocalServiceUtil.getLayoutSet(
161                                            portletDataContext.getScopeGroupId(),
162                                            portletDataContext.isPrivateLayout());
163    
164                                    classPK = layoutSet.getLayoutSetId();
165                            }
166                    }
167                    catch (Exception e) {
168                            if (_log.isWarnEnabled()) {
169                                    StringBundler sb = new StringBundler(5);
170    
171                                    sb.append("Layout ");
172                                    sb.append(layoutUuid);
173                                    sb.append(" is missing for rule group instance ");
174                                    sb.append(ruleGroupInstance.getRuleGroupInstanceId());
175                                    sb.append(", skipping this rule group instance.");
176    
177                                    _log.warn(sb.toString());
178                            }
179    
180                            return;
181                    }
182    
183                    ServiceContext serviceContext = portletDataContext.createServiceContext(
184                            ruleGroupInstance);
185    
186                    serviceContext.setUserId(userId);
187    
188                    MDRRuleGroupInstance importedRuleGroupInstance = null;
189    
190                    if (portletDataContext.isDataStrategyMirror()) {
191                            MDRRuleGroupInstance existingMDRRuleGroupInstance =
192                                    fetchStagedModelByUuidAndGroupId(
193                                            ruleGroupInstance.getUuid(),
194                                            portletDataContext.getScopeGroupId());
195    
196                            if (existingMDRRuleGroupInstance == null) {
197                                    serviceContext.setUuid(ruleGroupInstance.getUuid());
198    
199                                    importedRuleGroupInstance =
200                                            MDRRuleGroupInstanceLocalServiceUtil.addRuleGroupInstance(
201                                                    portletDataContext.getScopeGroupId(),
202                                                    ruleGroupInstance.getClassName(), classPK, ruleGroupId,
203                                                    ruleGroupInstance.getPriority(), serviceContext);
204                            }
205                            else {
206                                    importedRuleGroupInstance =
207                                            MDRRuleGroupInstanceLocalServiceUtil.
208                                                    updateRuleGroupInstance(
209                                                            existingMDRRuleGroupInstance.
210                                                                    getRuleGroupInstanceId(),
211                                                            ruleGroupInstance.getPriority());
212                            }
213                    }
214                    else {
215                            importedRuleGroupInstance =
216                                    MDRRuleGroupInstanceLocalServiceUtil.addRuleGroupInstance(
217                                            portletDataContext.getScopeGroupId(),
218                                            ruleGroupInstance.getClassName(), classPK, ruleGroupId,
219                                            ruleGroupInstance.getPriority(), serviceContext);
220                    }
221    
222                    portletDataContext.importClassedModel(
223                            ruleGroupInstance, importedRuleGroupInstance);
224            }
225    
226            private static final Log _log = LogFactoryUtil.getLog(
227                    MDRRuleGroupInstanceStagedModelDataHandler.class);
228    
229    }