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