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.portal.lar;
016    
017    import com.liferay.portal.kernel.dao.orm.ActionableDynamicQuery;
018    import com.liferay.portal.kernel.dao.orm.Conjunction;
019    import com.liferay.portal.kernel.dao.orm.Disjunction;
020    import com.liferay.portal.kernel.dao.orm.DynamicQuery;
021    import com.liferay.portal.kernel.dao.orm.Property;
022    import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
023    import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;
024    import com.liferay.portal.kernel.exception.PortalException;
025    import com.liferay.portal.kernel.lar.ExportImportPathUtil;
026    import com.liferay.portal.kernel.lar.ManifestSummary;
027    import com.liferay.portal.kernel.lar.PortletDataContext;
028    import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
029    import com.liferay.portal.kernel.lar.StagedModelType;
030    import com.liferay.portal.kernel.util.MapUtil;
031    import com.liferay.portal.kernel.xml.Document;
032    import com.liferay.portal.kernel.xml.Element;
033    import com.liferay.portal.kernel.xml.SAXReaderUtil;
034    import com.liferay.portal.model.SystemEvent;
035    import com.liferay.portal.model.SystemEventConstants;
036    import com.liferay.portal.service.SystemEventLocalServiceUtil;
037    import com.liferay.portal.util.PortalUtil;
038    
039    import java.util.Date;
040    import java.util.Set;
041    
042    /**
043     * @author Zsolt Berentey
044     */
045    public class DeletionSystemEventExporter {
046    
047            public static DeletionSystemEventExporter getInstance() {
048                    return _instance;
049            }
050    
051            public void exportDeletionSystemEvents(
052                            PortletDataContext portletDataContext)
053                    throws Exception {
054    
055                    Document document = SAXReaderUtil.createDocument();
056    
057                    Element rootElement = document.addElement("deletion-system-events");
058    
059                    Set<StagedModelType> deletionSystemEventStagedModelTypes =
060                            portletDataContext.getDeletionSystemEventStagedModelTypes();
061    
062                    if (!deletionSystemEventStagedModelTypes.isEmpty() &&
063                            MapUtil.getBoolean(
064                                    portletDataContext.getParameterMap(),
065                                    PortletDataHandlerKeys.DELETIONS)) {
066    
067                            doExportDeletionSystemEvents(
068                                    portletDataContext, rootElement,
069                                    deletionSystemEventStagedModelTypes);
070                    }
071    
072                    portletDataContext.addZipEntry(
073                            ExportImportPathUtil.getRootPath(portletDataContext) +
074                                    "/deletion-system-events.xml",
075                            document.formattedString());
076            }
077    
078            protected void addCreateDateProperty(
079                    PortletDataContext portletDataContext, DynamicQuery dynamicQuery) {
080    
081                    if (!portletDataContext.hasDateRange()) {
082                            return;
083                    }
084    
085                    Property createDateProperty = PropertyFactoryUtil.forName("createDate");
086    
087                    Date startDate = portletDataContext.getStartDate();
088    
089                    dynamicQuery.add(createDateProperty.ge(startDate));
090    
091                    Date endDate = portletDataContext.getEndDate();
092    
093                    dynamicQuery.add(createDateProperty.le(endDate));
094            }
095    
096            protected void doAddCriteria(
097                    PortletDataContext portletDataContext,
098                    Set<StagedModelType> deletionSystemEventStagedModelTypes,
099                    DynamicQuery dynamicQuery) {
100    
101                    Disjunction disjunction = RestrictionsFactoryUtil.disjunction();
102    
103                    Property groupIdProperty = PropertyFactoryUtil.forName("groupId");
104    
105                    disjunction.add(groupIdProperty.eq(0L));
106                    disjunction.add(
107                            groupIdProperty.eq(portletDataContext.getScopeGroupId()));
108    
109                    dynamicQuery.add(disjunction);
110    
111                    if (!deletionSystemEventStagedModelTypes.isEmpty()) {
112                            Property classNameIdProperty = PropertyFactoryUtil.forName(
113                                    "classNameId");
114    
115                            Property referrerClassNameIdProperty = PropertyFactoryUtil.forName(
116                                    "referrerClassNameId");
117    
118                            Disjunction referrerClassNameIdDisjunction =
119                                    RestrictionsFactoryUtil.disjunction();
120    
121                            for (StagedModelType stagedModelType :
122                                            deletionSystemEventStagedModelTypes) {
123    
124                                    Conjunction conjunction = RestrictionsFactoryUtil.conjunction();
125    
126                                    conjunction.add(
127                                            classNameIdProperty.eq(stagedModelType.getClassNameId()));
128    
129                                    if (stagedModelType.getReferrerClassNameId() >= 0) {
130                                            conjunction.add(
131                                                    referrerClassNameIdProperty.eq(
132                                                            stagedModelType.getReferrerClassNameId()));
133                                    }
134    
135                                    referrerClassNameIdDisjunction.add(conjunction);
136                            }
137    
138                            dynamicQuery.add(referrerClassNameIdDisjunction);
139                    }
140    
141                    Property typeProperty = PropertyFactoryUtil.forName("type");
142    
143                    dynamicQuery.add(typeProperty.eq(SystemEventConstants.TYPE_DELETE));
144    
145                    addCreateDateProperty(portletDataContext, dynamicQuery);
146            }
147    
148            protected void doExportDeletionSystemEvents(
149                            final PortletDataContext portletDataContext,
150                            final Element rootElement,
151                            final Set<StagedModelType> deletionSystemEventStagedModelTypes)
152                    throws PortalException {
153    
154                    ActionableDynamicQuery actionableDynamicQuery =
155                            SystemEventLocalServiceUtil.getActionableDynamicQuery();
156    
157                    actionableDynamicQuery.setAddCriteriaMethod(
158                            new ActionableDynamicQuery.AddCriteriaMethod() {
159    
160                                    @Override
161                                    public void addCriteria(DynamicQuery dynamicQuery) {
162                                            doAddCriteria(
163                                                    portletDataContext, deletionSystemEventStagedModelTypes,
164                                                    dynamicQuery);
165                                    }
166    
167                            });
168                    actionableDynamicQuery.setCompanyId(portletDataContext.getCompanyId());
169                    actionableDynamicQuery.setPerformActionMethod(
170                            new ActionableDynamicQuery.PerformActionMethod() {
171    
172                                    @Override
173                                    public void performAction(Object object) {
174                                            SystemEvent systemEvent = (SystemEvent)object;
175    
176                                            exportDeletionSystemEvent(
177                                                    portletDataContext, systemEvent, rootElement);
178                                    }
179    
180                            });
181    
182                    actionableDynamicQuery.performActions();
183            }
184    
185            protected void exportDeletionSystemEvent(
186                    PortletDataContext portletDataContext, SystemEvent systemEvent,
187                    Element deletionSystemEventsElement) {
188    
189                    Element deletionSystemEventElement =
190                            deletionSystemEventsElement.addElement("deletion-system-event");
191    
192                    deletionSystemEventElement.addAttribute(
193                            "class-name",
194                            PortalUtil.getClassName(systemEvent.getClassNameId()));
195                    deletionSystemEventElement.addAttribute(
196                            "extra-data", systemEvent.getExtraData());
197                    deletionSystemEventElement.addAttribute(
198                            "group-id", String.valueOf(systemEvent.getGroupId()));
199    
200                    if (systemEvent.getReferrerClassNameId() > 0) {
201                            deletionSystemEventElement.addAttribute(
202                                    "referrer-class-name",
203                                    PortalUtil.getClassName(systemEvent.getReferrerClassNameId()));
204                    }
205    
206                    deletionSystemEventElement.addAttribute(
207                            "uuid", systemEvent.getClassUuid());
208    
209                    ManifestSummary manifestSummary =
210                            portletDataContext.getManifestSummary();
211    
212                    manifestSummary.incrementModelDeletionCount(
213                            new StagedModelType(
214                                    systemEvent.getClassNameId(),
215                                    systemEvent.getReferrerClassNameId()));
216            }
217    
218            private DeletionSystemEventExporter() {
219            }
220    
221            private static final DeletionSystemEventExporter _instance =
222                    new DeletionSystemEventExporter();
223    
224    }