001    /**
002     * Copyright (c) 2000-present 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.portlet.exportimport.action;
016    
017    import com.liferay.portal.LocaleException;
018    import com.liferay.portal.NoSuchLayoutException;
019    import com.liferay.portal.PortletIdException;
020    import com.liferay.portal.kernel.log.Log;
021    import com.liferay.portal.kernel.log.LogFactoryUtil;
022    import com.liferay.portal.kernel.servlet.SessionErrors;
023    import com.liferay.portal.kernel.servlet.SessionMessages;
024    import com.liferay.portal.kernel.util.Constants;
025    import com.liferay.portal.kernel.util.ParamUtil;
026    import com.liferay.portal.kernel.util.StringPool;
027    import com.liferay.portal.kernel.util.Validator;
028    import com.liferay.portal.kernel.workflow.WorkflowConstants;
029    import com.liferay.portal.model.Portlet;
030    import com.liferay.portal.security.auth.PrincipalException;
031    import com.liferay.portal.service.ServiceContext;
032    import com.liferay.portal.theme.ThemeDisplay;
033    import com.liferay.portal.util.PortalUtil;
034    import com.liferay.portal.util.WebKeys;
035    import com.liferay.portlet.dynamicdatamapping.StructureDuplicateStructureKeyException;
036    import com.liferay.portlet.exportimport.LARFileException;
037    import com.liferay.portlet.exportimport.LARFileNameException;
038    import com.liferay.portlet.exportimport.LARFileSizeException;
039    import com.liferay.portlet.exportimport.LARTypeException;
040    import com.liferay.portlet.exportimport.configuration.ExportImportConfigurationConstants;
041    import com.liferay.portlet.exportimport.configuration.ExportImportConfigurationSettingsMapFactory;
042    import com.liferay.portlet.exportimport.lar.ExportImportHelper;
043    import com.liferay.portlet.exportimport.lar.MissingReferences;
044    import com.liferay.portlet.exportimport.model.ExportImportConfiguration;
045    import com.liferay.portlet.exportimport.service.ExportImportConfigurationLocalServiceUtil;
046    import com.liferay.portlet.exportimport.service.ExportImportServiceUtil;
047    import com.liferay.portlet.exportimport.staging.StagingUtil;
048    import com.liferay.portlet.portletconfiguration.action.ActionUtil;
049    
050    import java.io.InputStream;
051    import java.io.Serializable;
052    
053    import java.util.Map;
054    
055    import javax.portlet.ActionRequest;
056    import javax.portlet.ActionResponse;
057    import javax.portlet.PortletConfig;
058    import javax.portlet.PortletContext;
059    import javax.portlet.PortletRequestDispatcher;
060    import javax.portlet.RenderRequest;
061    import javax.portlet.RenderResponse;
062    import javax.portlet.ResourceRequest;
063    import javax.portlet.ResourceResponse;
064    
065    import org.apache.struts.action.ActionForm;
066    import org.apache.struts.action.ActionForward;
067    import org.apache.struts.action.ActionMapping;
068    
069    /**
070     * @author Jorge Ferrer
071     * @author Raymond Aug??
072     */
073    public class ExportImportAction extends ImportLayoutsAction {
074    
075            @Override
076            public void processAction(
077                            ActionMapping actionMapping, ActionForm actionForm,
078                            PortletConfig portletConfig, ActionRequest actionRequest,
079                            ActionResponse actionResponse)
080                    throws Exception {
081    
082                    Portlet portlet = null;
083    
084                    try {
085                            portlet = ActionUtil.getPortlet(actionRequest);
086                    }
087                    catch (PrincipalException pe) {
088                            SessionErrors.add(actionRequest, pe.getClass());
089    
090                            setForward(actionRequest, "portlet.export_import.error");
091    
092                            return;
093                    }
094    
095                    actionRequest = ActionUtil.getWrappedActionRequest(actionRequest, null);
096    
097                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
098    
099                    try {
100                            if (Validator.isNotNull(cmd)) {
101                                    String redirect = ParamUtil.getString(
102                                            actionRequest, "redirect");
103    
104                                    if (cmd.equals(Constants.ADD_TEMP)) {
105                                            addTempFileEntry(
106                                                    actionRequest,
107                                                    ExportImportHelper.TEMP_FOLDER_NAME +
108                                                            portlet.getPortletId());
109    
110                                            validateFile(
111                                                    actionRequest, actionResponse,
112                                                    ExportImportHelper.TEMP_FOLDER_NAME +
113                                                            portlet.getPortletId());
114                                    }
115                                    else if (cmd.equals("copy_from_live")) {
116                                            StagingUtil.copyFromLive(actionRequest, portlet);
117    
118                                            sendRedirect(actionRequest, actionResponse);
119                                    }
120                                    else if (cmd.equals(Constants.DELETE_TEMP)) {
121                                            deleteTempFileEntry(
122                                                    actionRequest, actionResponse,
123                                                    ExportImportHelper.TEMP_FOLDER_NAME +
124                                                            portlet.getPortletId());
125                                    }
126                                    else if (cmd.equals(Constants.EXPORT)) {
127                                            hideDefaultSuccessMessage(actionRequest);
128    
129                                            exportData(actionRequest, actionResponse, portlet);
130    
131                                            sendRedirect(actionRequest, actionResponse, redirect);
132                                    }
133                                    else if (cmd.equals(Constants.IMPORT)) {
134                                            hideDefaultSuccessMessage(actionRequest);
135    
136                                            importData(
137                                                    actionRequest, actionResponse,
138                                                    ExportImportHelper.TEMP_FOLDER_NAME +
139                                                            portlet.getPortletId());
140    
141                                            SessionMessages.add(
142                                                    actionRequest,
143                                                    PortalUtil.getPortletId(actionRequest) +
144                                                            SessionMessages.KEY_SUFFIX_CLOSE_REFRESH_PORTLET,
145                                                    portlet.getPortletId());
146    
147                                            sendRedirect(actionRequest, actionResponse, redirect);
148                                    }
149                                    else if (cmd.equals(Constants.PUBLISH_TO_LIVE)) {
150                                            hideDefaultSuccessMessage(actionRequest);
151    
152                                            StagingUtil.publishToLive(actionRequest, portlet);
153    
154                                            sendRedirect(actionRequest, actionResponse);
155                                    }
156                            }
157                    }
158                    catch (Exception e) {
159                            if (cmd.equals(Constants.ADD_TEMP) ||
160                                    cmd.equals(Constants.DELETE_TEMP)) {
161    
162                                    handleUploadException(
163                                            portletConfig, actionRequest, actionResponse,
164                                            ExportImportHelper.TEMP_FOLDER_NAME +
165                                                    portlet.getPortletId(),
166                                            e);
167                            }
168                            else {
169                                    if ((e instanceof LARFileException) ||
170                                            (e instanceof LARFileNameException) ||
171                                            (e instanceof LARFileSizeException) ||
172                                            (e instanceof LARTypeException) ||
173                                            (e instanceof LocaleException) ||
174                                            (e instanceof NoSuchLayoutException) ||
175                                            (e instanceof PortletIdException) ||
176                                            (e instanceof PrincipalException) ||
177                                            (e instanceof StructureDuplicateStructureKeyException)) {
178    
179                                            SessionErrors.add(actionRequest, e.getClass());
180                                    }
181                                    else {
182                                            _log.error(e, e);
183    
184                                            SessionErrors.add(
185                                                    actionRequest, ExportImportAction.class.getName());
186                                    }
187                            }
188                    }
189            }
190    
191            @Override
192            public ActionForward render(
193                            ActionMapping actionMapping, ActionForm actionForm,
194                            PortletConfig portletConfig, RenderRequest renderRequest,
195                            RenderResponse renderResponse)
196                    throws Exception {
197    
198                    Portlet portlet = null;
199    
200                    try {
201                            portlet = ActionUtil.getPortlet(renderRequest);
202                    }
203                    catch (PrincipalException pe) {
204                            SessionErrors.add(renderRequest, pe.getClass());
205    
206                            return actionMapping.findForward("portlet.export_import.error");
207                    }
208    
209                    renderResponse.setTitle(ActionUtil.getTitle(portlet, renderRequest));
210    
211                    renderRequest = ActionUtil.getWrappedRenderRequest(renderRequest, null);
212    
213                    String cmd = ParamUtil.getString(renderRequest, Constants.CMD);
214    
215                    String forward = "portlet.export_import.export_import";
216    
217                    if (cmd.equals(Constants.PUBLISH_TO_LIVE)) {
218                            forward = "portlet.export_import.staging";
219                    }
220    
221                    return actionMapping.findForward(getForward(renderRequest, forward));
222            }
223    
224            @Override
225            public void serveResource(
226                            ActionMapping actionMapping, ActionForm actionForm,
227                            PortletConfig portletConfig, ResourceRequest resourceRequest,
228                            ResourceResponse resourceResponse)
229                    throws Exception {
230    
231                    String cmd = ParamUtil.getString(resourceRequest, Constants.CMD);
232    
233                    PortletContext portletContext = portletConfig.getPortletContext();
234    
235                    PortletRequestDispatcher portletRequestDispatcher = null;
236    
237                    if (cmd.equals(Constants.EXPORT)) {
238                            portletRequestDispatcher = portletContext.getRequestDispatcher(
239                                    "/html/portlet/export_import/export_portlet_processes.jsp");
240                    }
241                    else if (cmd.equals(Constants.IMPORT)) {
242                            portletRequestDispatcher = portletContext.getRequestDispatcher(
243                                    "/html/portlet/export_import/import_portlet_processes.jsp");
244                    }
245                    else if (cmd.equals(Constants.PUBLISH)) {
246                            portletRequestDispatcher = portletContext.getRequestDispatcher(
247                                    "/html/portlet/export_import/publish_portlet_processes.jsp");
248                    }
249                    else {
250                            portletRequestDispatcher = portletContext.getRequestDispatcher(
251                                    "/html/portlet/export_import/import_portlet_resources.jsp");
252                    }
253    
254                    resourceRequest = ActionUtil.getWrappedResourceRequest(
255                            resourceRequest, null);
256    
257                    portletRequestDispatcher.include(resourceRequest, resourceResponse);
258            }
259    
260            protected void exportData(
261                            ActionRequest actionRequest, ActionResponse actionResponse,
262                            Portlet portlet)
263                    throws Exception {
264    
265                    try {
266                            ThemeDisplay themeDisplay =
267                                    (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
268    
269                            long plid = ParamUtil.getLong(actionRequest, "plid");
270                            long groupId = ParamUtil.getLong(actionRequest, "groupId");
271                            String fileName = ParamUtil.getString(
272                                    actionRequest, "exportFileName");
273    
274                            Map<String, Serializable> settingsMap =
275                                    ExportImportConfigurationSettingsMapFactory.
276                                            buildExportSettingsMap(
277                                                    themeDisplay.getUserId(), plid, groupId,
278                                                    portlet.getPortletId(), actionRequest.getParameterMap(),
279                                                    StringPool.BLANK, themeDisplay.getLocale(),
280                                                    themeDisplay.getTimeZone(), fileName);
281    
282                            ExportImportConfiguration exportImportConfiguration =
283                                    ExportImportConfigurationLocalServiceUtil.
284                                            addExportImportConfiguration(
285                                                    themeDisplay.getUserId(), groupId,
286                                                    portlet.getPortletId(), StringPool.BLANK,
287                                                    ExportImportConfigurationConstants.TYPE_EXPORT_PORTLET,
288                                                    settingsMap, WorkflowConstants.STATUS_DRAFT,
289                                                    new ServiceContext());
290    
291                            ExportImportServiceUtil.exportPortletInfoAsFileInBackground(
292                                    exportImportConfiguration);
293                    }
294                    catch (Exception e) {
295                            if (e instanceof LARFileNameException) {
296                                    throw e;
297                            }
298    
299                            if (_log.isDebugEnabled()) {
300                                    _log.debug(e, e);
301                            }
302    
303                            SessionErrors.add(actionRequest, e.getClass(), e);
304                    }
305            }
306    
307            @Override
308            protected void importData(
309                            ActionRequest actionRequest, String fileName,
310                            InputStream inputStream)
311                    throws Exception {
312    
313                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
314                            WebKeys.THEME_DISPLAY);
315    
316                    long plid = ParamUtil.getLong(actionRequest, "plid");
317                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
318    
319                    Portlet portlet = ActionUtil.getPortlet(actionRequest);
320    
321                    Map<String, Serializable> settingsMap =
322                            ExportImportConfigurationSettingsMapFactory.buildImportSettingsMap(
323                                    themeDisplay.getUserId(), plid, groupId, portlet.getPortletId(),
324                                    actionRequest.getParameterMap(), StringPool.BLANK,
325                                    themeDisplay.getLocale(), themeDisplay.getTimeZone(),
326                                    StringPool.BLANK);
327    
328                    ExportImportConfiguration exportImportConfiguration =
329                            ExportImportConfigurationLocalServiceUtil.
330                                    addExportImportConfiguration(
331                                            themeDisplay.getUserId(), groupId, portlet.getPortletId(),
332                                            StringPool.BLANK,
333                                            ExportImportConfigurationConstants.TYPE_IMPORT_PORTLET,
334                                            settingsMap, WorkflowConstants.STATUS_DRAFT,
335                                            new ServiceContext());
336    
337                    ExportImportServiceUtil.importPortletInfoInBackground(
338                            exportImportConfiguration, inputStream);
339            }
340    
341            @Override
342            protected MissingReferences validateFile(
343                            ActionRequest actionRequest, InputStream inputStream)
344                    throws Exception {
345    
346                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
347                            WebKeys.THEME_DISPLAY);
348    
349                    long plid = ParamUtil.getLong(actionRequest, "plid");
350                    long groupId = ParamUtil.getLong(actionRequest, "groupId");
351    
352                    Portlet portlet = ActionUtil.getPortlet(actionRequest);
353    
354                    Map<String, Serializable> settingsMap =
355                            ExportImportConfigurationSettingsMapFactory.buildImportSettingsMap(
356                                    themeDisplay.getUserId(), plid, groupId, portlet.getPortletId(),
357                                    actionRequest.getParameterMap(), StringPool.BLANK,
358                                    themeDisplay.getLocale(), themeDisplay.getTimeZone(),
359                                    StringPool.BLANK);
360    
361                    ExportImportConfiguration exportImportConfiguration =
362                            ExportImportConfigurationLocalServiceUtil.
363                                    addExportImportConfiguration(
364                                            themeDisplay.getUserId(), groupId, portlet.getPortletId(),
365                                            StringPool.BLANK,
366                                            ExportImportConfigurationConstants.TYPE_IMPORT_PORTLET,
367                                            settingsMap, WorkflowConstants.STATUS_DRAFT,
368                                            new ServiceContext());
369    
370                    return ExportImportServiceUtil.validateImportPortletInfo(
371                            exportImportConfiguration, inputStream);
372            }
373    
374            private static final Log _log = LogFactoryUtil.getLog(
375                    ExportImportAction.class);
376    
377    }