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