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