/** * 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(); }