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