/**
* 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.exportimport.lar;
import aQute.bnd.annotation.ProviderType;
import com.liferay.exportimport.kernel.lar.ExportImportPathUtil;
import com.liferay.exportimport.kernel.lar.ManifestSummary;
import com.liferay.exportimport.kernel.lar.PortletDataContext;
import com.liferay.exportimport.kernel.lar.PortletDataHandlerKeys;
import com.liferay.exportimport.kernel.lar.StagedModelType;
import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
import com.liferay.portal.kernel.dao.orm.Conjunction;
import com.liferay.portal.kernel.dao.orm.Disjunction;
import com.liferay.portal.kernel.dao.orm.DynamicQuery;
import com.liferay.portal.kernel.dao.orm.Property;
import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.SystemEvent;
import com.liferay.portal.kernel.model.SystemEventConstants;
import com.liferay.portal.kernel.service.SystemEventLocalServiceUtil;
import com.liferay.portal.kernel.util.MapUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.xml.Document;
import com.liferay.portal.kernel.xml.Element;
import com.liferay.portal.kernel.xml.SAXReaderUtil;
import java.util.Date;
import java.util.Set;
/**
* @author Zsolt Berentey
*/
@ProviderType
public class DeletionSystemEventExporter {
public static DeletionSystemEventExporter getInstance() {
return _instance;
}
public void exportDeletionSystemEvents(
PortletDataContext portletDataContext)
throws Exception {
Document document = SAXReaderUtil.createDocument();
Element rootElement = document.addElement("deletion-system-events");
Set<StagedModelType> deletionSystemEventStagedModelTypes =
portletDataContext.getDeletionSystemEventStagedModelTypes();
if (!deletionSystemEventStagedModelTypes.isEmpty() &&
MapUtil.getBoolean(
portletDataContext.getParameterMap(),
PortletDataHandlerKeys.DELETIONS)) {
doExportDeletionSystemEvents(
portletDataContext, rootElement,
deletionSystemEventStagedModelTypes);
}
portletDataContext.addZipEntry(
ExportImportPathUtil.getRootPath(portletDataContext) +
"/deletion-system-events.xml",
document.formattedString());
}
protected void addCreateDateProperty(
PortletDataContext portletDataContext, DynamicQuery dynamicQuery) {
if (!portletDataContext.hasDateRange()) {
return;
}
Property createDateProperty = PropertyFactoryUtil.forName("createDate");
Date startDate = portletDataContext.getStartDate();
dynamicQuery.add(createDateProperty.ge(startDate));
Date endDate = portletDataContext.getEndDate();
dynamicQuery.add(createDateProperty.le(endDate));
}
protected void doAddCriteria(
PortletDataContext portletDataContext,
Set<StagedModelType> deletionSystemEventStagedModelTypes,
DynamicQuery dynamicQuery) {
Disjunction disjunction = RestrictionsFactoryUtil.disjunction();
Property groupIdProperty = PropertyFactoryUtil.forName("groupId");
disjunction.add(groupIdProperty.eq(0L));
disjunction.add(
groupIdProperty.eq(portletDataContext.getScopeGroupId()));
dynamicQuery.add(disjunction);
if (!deletionSystemEventStagedModelTypes.isEmpty()) {
Property classNameIdProperty = PropertyFactoryUtil.forName(
"classNameId");
Property referrerClassNameIdProperty = PropertyFactoryUtil.forName(
"referrerClassNameId");
Disjunction referrerClassNameIdDisjunction =
RestrictionsFactoryUtil.disjunction();
for (StagedModelType stagedModelType :
deletionSystemEventStagedModelTypes) {
Conjunction conjunction = RestrictionsFactoryUtil.conjunction();
conjunction.add(
classNameIdProperty.eq(stagedModelType.getClassNameId()));
if (stagedModelType.getReferrerClassNameId() >= 0) {
conjunction.add(
referrerClassNameIdProperty.eq(
stagedModelType.getReferrerClassNameId()));
}
referrerClassNameIdDisjunction.add(conjunction);
}
dynamicQuery.add(referrerClassNameIdDisjunction);
}
Property typeProperty = PropertyFactoryUtil.forName("type");
dynamicQuery.add(typeProperty.eq(SystemEventConstants.TYPE_DELETE));
addCreateDateProperty(portletDataContext, dynamicQuery);
}
protected void doExportDeletionSystemEvents(
final PortletDataContext portletDataContext,
final Element rootElement,
final Set<StagedModelType> deletionSystemEventStagedModelTypes)
throws PortalException {
ActionableDynamicQuery actionableDynamicQuery =
SystemEventLocalServiceUtil.getActionableDynamicQuery();
actionableDynamicQuery.setAddCriteriaMethod(
new ActionableDynamicQuery.AddCriteriaMethod() {
@Override
public void addCriteria(DynamicQuery dynamicQuery) {
doAddCriteria(
portletDataContext, deletionSystemEventStagedModelTypes,
dynamicQuery);
}
});
actionableDynamicQuery.setCompanyId(portletDataContext.getCompanyId());
actionableDynamicQuery.setPerformActionMethod(
new ActionableDynamicQuery.PerformActionMethod<SystemEvent>() {
@Override
public void performAction(SystemEvent systemEvent) {
exportDeletionSystemEvent(
portletDataContext, systemEvent, rootElement);
}
});
actionableDynamicQuery.performActions();
}
protected void exportDeletionSystemEvent(
PortletDataContext portletDataContext, SystemEvent systemEvent,
Element deletionSystemEventsElement) {
Element deletionSystemEventElement =
deletionSystemEventsElement.addElement("deletion-system-event");
deletionSystemEventElement.addAttribute(
"class-name",
PortalUtil.getClassName(systemEvent.getClassNameId()));
deletionSystemEventElement.addAttribute(
"extra-data", systemEvent.getExtraData());
deletionSystemEventElement.addAttribute(
"group-id", String.valueOf(systemEvent.getGroupId()));
if (systemEvent.getReferrerClassNameId() > 0) {
deletionSystemEventElement.addAttribute(
"referrer-class-name",
PortalUtil.getClassName(systemEvent.getReferrerClassNameId()));
}
deletionSystemEventElement.addAttribute(
"uuid", systemEvent.getClassUuid());
ManifestSummary manifestSummary =
portletDataContext.getManifestSummary();
manifestSummary.incrementModelDeletionCount(
new StagedModelType(
systemEvent.getClassNameId(),
systemEvent.getReferrerClassNameId()));
}
private DeletionSystemEventExporter() {
}
private static final DeletionSystemEventExporter _instance =
new DeletionSystemEventExporter();
}