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                                                    if (stagedModelType.getReferrerClassNameId() >= 0) {
118                                                            conjunction.add(
119                                                                    referrerClassNameIdProperty.eq(
120                                                                            stagedModelType.getReferrerClassNameId()));
121                                                    }
122    
123                                                    referrerClassNameIdDisjunction.add(conjunction);
124                                            }
125    
126                                            dynamicQuery.add(referrerClassNameIdDisjunction);
127                                    }
128    
129                                    Property typeProperty = PropertyFactoryUtil.forName("type");
130    
131                                    dynamicQuery.add(
132                                            typeProperty.eq(SystemEventConstants.TYPE_DELETE));
133    
134                                    _addCreateDateProperty(dynamicQuery);
135                            }
136    
137                            @Override
138                            protected void performAction(Object object) {
139                                    SystemEvent systemEvent = (SystemEvent)object;
140    
141                                    exportDeletionSystemEvent(
142                                            portletDataContext, systemEvent, rootElement);
143                            }
144    
145                            private void _addCreateDateProperty(DynamicQuery dynamicQuery) {
146                                    if (!portletDataContext.hasDateRange()) {
147                                            return;
148                                    }
149    
150                                    Property createDateProperty = PropertyFactoryUtil.forName(
151                                            "createDate");
152    
153                                    Date startDate = portletDataContext.getStartDate();
154    
155                                    dynamicQuery.add(createDateProperty.ge(startDate));
156    
157                                    Date endDate = portletDataContext.getEndDate();
158    
159                                    dynamicQuery.add(createDateProperty.le(endDate));
160                            }
161                    };
162    
163                    actionableDynamicQuery.setCompanyId(portletDataContext.getCompanyId());
164    
165                    actionableDynamicQuery.performActions();
166            }
167    
168            protected void exportDeletionSystemEvent(
169                    PortletDataContext portletDataContext, SystemEvent systemEvent,
170                    Element deletionSystemEventsElement) {
171    
172                    Element deletionSystemEventElement =
173                            deletionSystemEventsElement.addElement("deletion-system-event");
174    
175                    deletionSystemEventElement.addAttribute(
176                            "class-name",
177                            PortalUtil.getClassName(systemEvent.getClassNameId()));
178                    deletionSystemEventElement.addAttribute(
179                            "extra-data", systemEvent.getExtraData());
180                    deletionSystemEventElement.addAttribute(
181                            "group-id", String.valueOf(systemEvent.getGroupId()));
182    
183                    if (systemEvent.getReferrerClassNameId() > 0) {
184                            deletionSystemEventElement.addAttribute(
185                                    "referrer-class-name",
186                                    PortalUtil.getClassName(systemEvent.getReferrerClassNameId()));
187                    }
188    
189                    deletionSystemEventElement.addAttribute(
190                            "uuid", systemEvent.getClassUuid());
191    
192                    ManifestSummary manifestSummary =
193                            portletDataContext.getManifestSummary();
194    
195                    manifestSummary.incrementModelDeletionCount(
196                            new StagedModelType(
197                                    systemEvent.getClassNameId(),
198                                    systemEvent.getReferrerClassNameId()));
199            }
200    
201    }