001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * The contents of this file are subject to the terms of the Liferay Enterprise
005     * Subscription License ("License"). You may not use this file except in
006     * compliance with the License. You can obtain a copy of the License by
007     * contacting Liferay, Inc. See the License for the specific language governing
008     * permissions and limitations under the License, including but not limited to
009     * distribution rights of the Software.
010     *
011     *
012     *
013     */
014    
015    package com.liferay.portal.lar;
016    
017    import com.liferay.portal.kernel.exception.SystemException;
018    import com.liferay.portal.kernel.lar.ExportImportPathUtil;
019    import com.liferay.portal.kernel.lar.PortletDataContext;
020    import com.liferay.portal.kernel.lar.PortletDataHandler;
021    import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
022    import com.liferay.portal.kernel.lar.StagedModelDataHandlerUtil;
023    import com.liferay.portal.kernel.lar.StagedModelType;
024    import com.liferay.portal.kernel.log.Log;
025    import com.liferay.portal.kernel.log.LogFactoryUtil;
026    import com.liferay.portal.kernel.util.MapUtil;
027    import com.liferay.portal.kernel.util.StringBundler;
028    import com.liferay.portal.kernel.xml.Document;
029    import com.liferay.portal.kernel.xml.DocumentException;
030    import com.liferay.portal.kernel.xml.Element;
031    import com.liferay.portal.kernel.xml.ElementHandler;
032    import com.liferay.portal.kernel.xml.ElementProcessor;
033    import com.liferay.portal.kernel.xml.SAXReaderUtil;
034    import com.liferay.portal.model.Portlet;
035    import com.liferay.portal.security.xml.SecureXMLFactoryProviderUtil;
036    import com.liferay.portal.service.PortletLocalServiceUtil;
037    
038    import java.io.StringReader;
039    
040    import java.util.ArrayList;
041    import java.util.Collections;
042    import java.util.List;
043    import java.util.Map;
044    import java.util.Set;
045    
046    import org.xml.sax.InputSource;
047    import org.xml.sax.XMLReader;
048    
049    /**
050     * @author Zsolt Berentey
051     */
052    public class DeletionSystemEventImporter {
053    
054            public void importDeletionSystemEvents(
055                            final PortletDataContext portletDataContext)
056                    throws Exception {
057    
058                    if (!MapUtil.getBoolean(
059                                    portletDataContext.getParameterMap(),
060                                    PortletDataHandlerKeys.DELETIONS)) {
061    
062                            return;
063                    }
064    
065                    initDeletionSystemEventStagedModelTypes(portletDataContext);
066    
067                    String xml = portletDataContext.getZipEntryAsString(
068                            ExportImportPathUtil.getSourceRootPath(portletDataContext) +
069                                    "/deletion-system-events.xml");
070    
071                    if (xml == null) {
072                            return;
073                    }
074    
075                    XMLReader xmlReader = SecureXMLFactoryProviderUtil.newXMLReader();
076    
077                    ElementHandler elementHandler = new ElementHandler(
078                            new ElementProcessor() {
079    
080                                    @Override
081                                    public void processElement(Element element) {
082                                            doImportDeletionSystemEvents(portletDataContext, element);
083                                    }
084    
085                            },
086                            new String[] {"deletion-system-event"});
087    
088                    xmlReader.setContentHandler(elementHandler);
089    
090                    xmlReader.parse(new InputSource(new StringReader(xml)));
091            }
092    
093            protected void initDeletionSystemEventStagedModelTypes(
094                            PortletDataContext portletDataContext)
095                    throws SystemException {
096    
097                    Element importDataRootElement =
098                            portletDataContext.getImportDataRootElement();
099    
100                    if (importDataRootElement == null) {
101                            return;
102                    }
103    
104                    Element portletsElement = importDataRootElement.element("portlets");
105    
106                    List<Element> portletElements = Collections.emptyList();
107    
108                    if (portletsElement != null) {
109                            portletElements = portletsElement.elements("portlet");
110                    }
111                    else {
112                            Element element = importDataRootElement.element("portlet");
113    
114                            portletElements = new ArrayList<Element>();
115    
116                            portletElements.add(element);
117                    }
118    
119                    for (Element portletElement : portletElements) {
120                            String portletPath = portletElement.attributeValue("path");
121    
122                            Document portletDocument = null;
123    
124                            try {
125                                    portletDocument = SAXReaderUtil.read(
126                                            portletDataContext.getZipEntryAsString(portletPath));
127                            }
128                            catch (DocumentException de) {
129                                    continue;
130                            }
131    
132                            portletElement = portletDocument.getRootElement();
133    
134                            if (portletElement == null) {
135                                    continue;
136                            }
137    
138                            Element portletDataElement = portletElement.element("portlet-data");
139    
140                            String portletId = portletElement.attributeValue("portlet-id");
141    
142                            Portlet portlet = PortletLocalServiceUtil.getPortletById(
143                                    portletDataContext.getCompanyId(), portletId);
144    
145                            if (!portlet.isActive() || portlet.isUndeployedPortlet()) {
146                                    continue;
147                            }
148    
149                            PortletDataHandler portletDataHandler =
150                                    portlet.getPortletDataHandlerInstance();
151    
152                            if (portletDataHandler == null) {
153                                    continue;
154                            }
155    
156                            Map<String, Boolean> importPortletControlsMap =
157                                    Collections.emptyMap();
158    
159                            try {
160                                    importPortletControlsMap =
161                                            LayoutImporter.getImportPortletControlsMap(
162                                                    portletDataContext.getCompanyId(), portletId,
163                                                    portletDataContext.getParameterMap(),
164                                                    portletDataElement,
165                                                    portletDataContext.getManifestSummary());
166                            }
167                            catch (Exception e) {
168                            }
169    
170                            if (importPortletControlsMap.get(
171                                            PortletDataHandlerKeys.PORTLET_DATA)) {
172    
173                                    portletDataContext.addDeletionSystemEventStagedModelTypes(
174                                            portletDataHandler.
175                                                    getDeletionSystemEventStagedModelTypes());
176                            }
177                    }
178            }
179    
180            protected void doImportDeletionSystemEvents(
181                    PortletDataContext portletDataContext, Element element) {
182    
183                    Set<StagedModelType> stagedModelTypes =
184                            portletDataContext.getDeletionSystemEventStagedModelTypes();
185    
186                    StagedModelType stagedModelType = new StagedModelType(
187                            element.attributeValue("class-name"),
188                            element.attributeValue("referrer-class-name"));
189    
190                    if (!stagedModelTypes.contains(stagedModelType)) {
191                            return;
192                    }
193    
194                    try {
195                            StagedModelDataHandlerUtil.deleteStagedModel(
196                                    portletDataContext, element);
197                    }
198                    catch (Exception e) {
199                            if (_log.isWarnEnabled()) {
200                                    StringBundler sb = new StringBundler(4);
201    
202                                    sb.append("Unable to process deletion for ");
203                                    sb.append(stagedModelType);
204                                    sb.append(" with UUID ");
205                                    sb.append(element.attributeValue("uuid"));
206    
207                                    _log.warn(sb.toString());
208                            }
209                    }
210            }
211    
212            private static Log _log = LogFactoryUtil.getLog(
213                    DeletionSystemEventImporter.class);
214    
215    }