/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.mobile.device.rules.internal.exportimport.data.handler;
import com.liferay.exportimport.data.handler.base.BaseStagedModelDataHandler;
import com.liferay.exportimport.kernel.lar.ExportImportPathUtil;
import com.liferay.exportimport.kernel.lar.PortletDataContext;
import com.liferay.exportimport.kernel.lar.StagedModelDataHandler;
import com.liferay.exportimport.kernel.lar.StagedModelDataHandlerUtil;
import com.liferay.exportimport.kernel.lar.StagedModelModifiedDateComparator;
import com.liferay.mobile.device.rules.model.MDRAction;
import com.liferay.mobile.device.rules.model.MDRRuleGroupInstance;
import com.liferay.mobile.device.rules.rule.group.action.SiteRedirectActionHandler;
import com.liferay.mobile.device.rules.service.MDRActionLocalService;
import com.liferay.mobile.device.rules.service.MDRRuleGroupInstanceLocalService;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.Layout;
import com.liferay.portal.kernel.service.LayoutLocalService;
import com.liferay.portal.kernel.service.ServiceContext;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.MapUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.UnicodeProperties;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.xml.Element;
import java.util.List;
import java.util.Map;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
/**
* @author Mate Thurzo
*/
@Component(immediate = true, service = StagedModelDataHandler.class)
public class MDRActionStagedModelDataHandler
extends BaseStagedModelDataHandler<MDRAction> {
public static final String[] CLASS_NAMES = {MDRAction.class.getName()};
@Override
public void deleteStagedModel(MDRAction action) {
_mdrActionLocalService.deleteAction(action);
}
@Override
public void deleteStagedModel(
String uuid, long groupId, String className, String extraData) {
MDRAction action = fetchStagedModelByUuidAndGroupId(uuid, groupId);
if (action != null) {
deleteStagedModel(action);
}
}
@Override
public MDRAction fetchStagedModelByUuidAndGroupId(
String uuid, long groupId) {
return _mdrActionLocalService.fetchMDRActionByUuidAndGroupId(
uuid, groupId);
}
@Override
public List<MDRAction> fetchStagedModelsByUuidAndCompanyId(
String uuid, long companyId) {
return _mdrActionLocalService.getMDRActionsByUuidAndCompanyId(
uuid, companyId, QueryUtil.ALL_POS, QueryUtil.ALL_POS,
new StagedModelModifiedDateComparator<MDRAction>());
}
@Override
public String[] getClassNames() {
return CLASS_NAMES;
}
@Override
public String getDisplayName(MDRAction action) {
return action.getNameCurrentValue();
}
@Override
protected void doExportStagedModel(
PortletDataContext portletDataContext, MDRAction action)
throws Exception {
MDRRuleGroupInstance ruleGroupInstance =
_mdrRuleGroupInstanceLocalService.getRuleGroupInstance(
action.getRuleGroupInstanceId());
StagedModelDataHandlerUtil.exportReferenceStagedModel(
portletDataContext, action, ruleGroupInstance,
PortletDataContext.REFERENCE_TYPE_PARENT);
Element actionElement = portletDataContext.getExportDataElement(action);
String type = action.getType();
if (type.equals(SiteRedirectActionHandler.class.getName())) {
UnicodeProperties typeSettingsProperties =
action.getTypeSettingsProperties();
long plid = GetterUtil.getLong(
typeSettingsProperties.getProperty("plid"));
try {
Layout layout = _layoutLocalService.getLayout(plid);
actionElement.addAttribute("layout-uuid", layout.getUuid());
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
_log.warn(
"Unable to set the layout uuid of layout " + plid +
". Site redirect may not match after import.",
e);
}
}
}
portletDataContext.addClassedModel(
actionElement, ExportImportPathUtil.getModelPath(action), action);
}
@Override
protected void doImportStagedModel(
PortletDataContext portletDataContext, MDRAction action)
throws Exception {
Map<Long, Long> ruleGroupInstanceIds =
(Map<Long, Long>)portletDataContext.getNewPrimaryKeysMap(
MDRRuleGroupInstance.class);
long ruleGroupInstanceId = MapUtil.getLong(
ruleGroupInstanceIds, action.getRuleGroupInstanceId(),
action.getRuleGroupInstanceId());
ServiceContext serviceContext = portletDataContext.createServiceContext(
action);
serviceContext.setUserId(
portletDataContext.getUserId(action.getUserUuid()));
Element element = portletDataContext.getImportDataStagedModelElement(
action);
validateLayout(element, action);
MDRAction importedAction = null;
if (portletDataContext.isDataStrategyMirror()) {
MDRAction existingAction = fetchStagedModelByUuidAndGroupId(
action.getUuid(), portletDataContext.getScopeGroupId());
if (existingAction == null) {
serviceContext.setUuid(action.getUuid());
importedAction = _mdrActionLocalService.addAction(
ruleGroupInstanceId, action.getNameMap(),
action.getDescriptionMap(), action.getType(),
action.getTypeSettingsProperties(), serviceContext);
}
else {
importedAction = _mdrActionLocalService.updateAction(
existingAction.getActionId(), action.getNameMap(),
action.getDescriptionMap(), action.getType(),
action.getTypeSettingsProperties(), serviceContext);
}
}
else {
importedAction = _mdrActionLocalService.addAction(
ruleGroupInstanceId, action.getNameMap(),
action.getDescriptionMap(), action.getType(),
action.getTypeSettingsProperties(), serviceContext);
}
portletDataContext.importClassedModel(action, importedAction);
}
@Reference(unbind = "-")
protected void setLayoutLocalService(
LayoutLocalService layoutLocalService) {
_layoutLocalService = layoutLocalService;
}
@Reference(unbind = "-")
protected void setMDRActionLocalService(
MDRActionLocalService mdrActionLocalService) {
_mdrActionLocalService = mdrActionLocalService;
}
@Reference(unbind = "-")
protected void setMDRRuleGroupInstanceLocalService(
MDRRuleGroupInstanceLocalService mdrRuleGroupInstanceLocalService) {
_mdrRuleGroupInstanceLocalService = mdrRuleGroupInstanceLocalService;
}
protected void validateLayout(Element actionElement, MDRAction action) {
String type = action.getType();
if (!type.equals(SiteRedirectActionHandler.class.getName())) {
return;
}
String layoutUuid = actionElement.attributeValue("layout-uuid");
if (Validator.isNull(layoutUuid)) {
return;
}
UnicodeProperties typeSettingsProperties =
action.getTypeSettingsProperties();
long groupId = GetterUtil.getLong(
typeSettingsProperties.getProperty("groupId"));
boolean privateLayout = GetterUtil.getBoolean(
actionElement.attributeValue("private-layout"));
try {
Layout layout = _layoutLocalService.getLayoutByUuidAndGroupId(
layoutUuid, groupId, privateLayout);
typeSettingsProperties.setProperty(
"plid", String.valueOf(layout.getPlid()));
}
catch (Exception e) {
if (_log.isWarnEnabled()) {
StringBundler sb = new StringBundler(5);
sb.append("Unable to find layout with uuid ");
sb.append(layoutUuid);
sb.append(" in group ");
sb.append(groupId);
sb.append(". Site redirect may not match the target layout.");
_log.warn(sb.toString(), e);
}
}
}
private static final Log _log = LogFactoryUtil.getLog(
MDRActionStagedModelDataHandler.class);
private LayoutLocalService _layoutLocalService;
private MDRActionLocalService _mdrActionLocalService;
private MDRRuleGroupInstanceLocalService _mdrRuleGroupInstanceLocalService;
}