001
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
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 }