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.portlet.dynamicdatamapping.action;
016    
017    import com.liferay.portal.kernel.servlet.SessionErrors;
018    import com.liferay.portal.kernel.servlet.SessionMessages;
019    import com.liferay.portal.kernel.template.TemplateConstants;
020    import com.liferay.portal.kernel.upload.UploadPortletRequest;
021    import com.liferay.portal.kernel.util.Constants;
022    import com.liferay.portal.kernel.util.ContentTypes;
023    import com.liferay.portal.kernel.util.FileUtil;
024    import com.liferay.portal.kernel.util.GetterUtil;
025    import com.liferay.portal.kernel.util.HttpUtil;
026    import com.liferay.portal.kernel.util.LocalizationUtil;
027    import com.liferay.portal.kernel.util.MimeTypesUtil;
028    import com.liferay.portal.kernel.util.ParamUtil;
029    import com.liferay.portal.kernel.util.StringUtil;
030    import com.liferay.portal.kernel.util.Validator;
031    import com.liferay.portal.security.auth.PrincipalException;
032    import com.liferay.portal.service.ServiceContext;
033    import com.liferay.portal.service.ServiceContextFactory;
034    import com.liferay.portal.struts.PortletAction;
035    import com.liferay.portal.theme.ThemeDisplay;
036    import com.liferay.portal.util.PortalUtil;
037    import com.liferay.portal.util.WebKeys;
038    import com.liferay.portlet.PortletURLImpl;
039    import com.liferay.portlet.dynamicdatamapping.NoSuchTemplateException;
040    import com.liferay.portlet.dynamicdatamapping.RequiredTemplateException;
041    import com.liferay.portlet.dynamicdatamapping.TemplateNameException;
042    import com.liferay.portlet.dynamicdatamapping.TemplateScriptException;
043    import com.liferay.portlet.dynamicdatamapping.TemplateSmallImageNameException;
044    import com.liferay.portlet.dynamicdatamapping.TemplateSmallImageSizeException;
045    import com.liferay.portlet.dynamicdatamapping.model.DDMTemplate;
046    import com.liferay.portlet.dynamicdatamapping.model.DDMTemplateConstants;
047    import com.liferay.portlet.dynamicdatamapping.service.DDMTemplateServiceUtil;
048    
049    import java.io.File;
050    
051    import java.util.Locale;
052    import java.util.Map;
053    
054    import javax.portlet.ActionRequest;
055    import javax.portlet.ActionResponse;
056    import javax.portlet.PortletConfig;
057    import javax.portlet.PortletPreferences;
058    import javax.portlet.PortletRequest;
059    import javax.portlet.RenderRequest;
060    import javax.portlet.RenderResponse;
061    
062    import org.apache.struts.action.ActionForm;
063    import org.apache.struts.action.ActionForward;
064    import org.apache.struts.action.ActionMapping;
065    
066    /**
067     * @author Eduardo Lundgren
068     */
069    public class EditTemplateAction extends PortletAction {
070    
071            @Override
072            public void processAction(
073                            ActionMapping actionMapping, ActionForm actionForm,
074                            PortletConfig portletConfig, ActionRequest actionRequest,
075                            ActionResponse actionResponse)
076                    throws Exception {
077    
078                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
079    
080                    DDMTemplate template = null;
081    
082                    try {
083                            if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
084                                    template = updateTemplate(actionRequest);
085                            }
086                            else if (cmd.equals(Constants.DELETE)) {
087                                    deleteTemplates(actionRequest);
088                            }
089    
090                            if (Validator.isNotNull(cmd)) {
091                                    String redirect = ParamUtil.getString(
092                                            actionRequest, "redirect");
093                                    String closeRedirect = ParamUtil.getString(
094                                            actionRequest, "closeRedirect");
095    
096                                    if (Validator.isNotNull(closeRedirect)) {
097                                            redirect = HttpUtil.setParameter(
098                                                    redirect, "closeRedirect", closeRedirect);
099    
100                                            SessionMessages.add(
101                                                    actionRequest,
102                                                    PortalUtil.getPortletId(actionRequest) +
103                                                            SessionMessages.KEY_SUFFIX_CLOSE_REDIRECT,
104                                                    closeRedirect);
105                                    }
106    
107                                    if (template != null) {
108                                            boolean saveAndContinue = ParamUtil.getBoolean(
109                                                    actionRequest, "saveAndContinue");
110    
111                                            if (saveAndContinue) {
112                                                    redirect = getSaveAndContinueRedirect(
113                                                            portletConfig, actionRequest, template, redirect);
114                                            }
115                                    }
116    
117                                    sendRedirect(actionRequest, actionResponse, redirect);
118                            }
119                    }
120                    catch (Exception e) {
121                            if (e instanceof NoSuchTemplateException ||
122                                    e instanceof PrincipalException) {
123    
124                                    SessionErrors.add(actionRequest, e.getClass());
125    
126                                    setForward(actionRequest, "portlet.dynamic_data_mapping.error");
127                            }
128                            else if (e instanceof RequiredTemplateException ||
129                                             e instanceof TemplateNameException ||
130                                             e instanceof TemplateScriptException ||
131                                             e instanceof TemplateSmallImageNameException ||
132                                             e instanceof TemplateSmallImageSizeException) {
133    
134                                    SessionErrors.add(actionRequest, e.getClass(), e);
135    
136                                    if (e instanceof RequiredTemplateException) {
137                                            String redirect = PortalUtil.escapeRedirect(
138                                                    ParamUtil.getString(actionRequest, "redirect"));
139    
140                                            if (Validator.isNotNull(redirect)) {
141                                                    actionResponse.sendRedirect(redirect);
142                                            }
143                                    }
144                            }
145                            else {
146                                    throw e;
147                            }
148                    }
149            }
150    
151            @Override
152            public ActionForward render(
153                            ActionMapping actionMapping, ActionForm actionForm,
154                            PortletConfig portletConfig, RenderRequest renderRequest,
155                            RenderResponse renderResponse)
156                    throws Exception {
157    
158                    try {
159                            ActionUtil.getStructure(renderRequest);
160                            ActionUtil.getTemplate(renderRequest);
161                    }
162                    catch (Exception e) {
163                            if (e instanceof NoSuchTemplateException ||
164                                    e instanceof PrincipalException) {
165    
166                                    SessionErrors.add(renderRequest, e.getClass());
167    
168                                    return actionMapping.findForward(
169                                            "portlet.dynamic_data_mapping.error");
170                            }
171                            else {
172                                    throw e;
173                            }
174                    }
175    
176                    return actionMapping.findForward(
177                            getForward(
178                                    renderRequest, "portlet.dynamic_data_mapping.edit_template"));
179            }
180    
181            protected void deleteTemplates(ActionRequest actionRequest)
182                    throws Exception {
183    
184                    long[] deleteTemplateIds = null;
185    
186                    long templateId = ParamUtil.getLong(actionRequest, "templateId");
187    
188                    if (templateId > 0) {
189                            deleteTemplateIds = new long[] {templateId};
190                    }
191                    else {
192                            deleteTemplateIds = StringUtil.split(
193                                    ParamUtil.getString(actionRequest, "deleteTemplateIds"), 0L);
194                    }
195    
196                    for (long deleteTemplateId : deleteTemplateIds) {
197                            DDMTemplateServiceUtil.deleteTemplate(deleteTemplateId);
198                    }
199            }
200    
201            protected String getSaveAndContinueRedirect(
202                            PortletConfig portletConfig, ActionRequest actionRequest,
203                            DDMTemplate template, String redirect)
204                    throws Exception {
205    
206                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
207                            WebKeys.THEME_DISPLAY);
208    
209                    String portletResourceNamespace = ParamUtil.getString(
210                            actionRequest, "portletResourceNamespace");
211                    long classNameId = ParamUtil.getLong(actionRequest, "classNameId");
212                    long classPK = ParamUtil.getLong(actionRequest, "classPK");
213                    String structureAvailableFields = ParamUtil.getString(
214                            actionRequest, "structureAvailableFields");
215    
216                    PortletURLImpl portletURL = new PortletURLImpl(
217                            actionRequest, portletConfig.getPortletName(),
218                            themeDisplay.getPlid(), PortletRequest.RENDER_PHASE);
219    
220                    portletURL.setParameter(Constants.CMD, Constants.UPDATE, false);
221                    portletURL.setParameter(
222                            "struts_action", "/dynamic_data_mapping/edit_template");
223                    portletURL.setParameter("redirect", redirect, false);
224                    portletURL.setParameter(
225                            "portletResourceNamespace", portletResourceNamespace, false);
226                    portletURL.setParameter(
227                            "templateId", String.valueOf(template.getTemplateId()), false);
228                    portletURL.setParameter(
229                            "groupId", String.valueOf(template.getGroupId()), false);
230                    portletURL.setParameter(
231                            "classNameId", String.valueOf(classNameId), false);
232                    portletURL.setParameter("classPK", String.valueOf(classPK), false);
233                    portletURL.setParameter("type", template.getType(), false);
234                    portletURL.setParameter(
235                            "structureAvailableFields", structureAvailableFields, false);
236                    portletURL.setWindowState(actionRequest.getWindowState());
237    
238                    return portletURL.toString();
239            }
240    
241            protected String getScript(UploadPortletRequest uploadPortletRequest)
242                    throws Exception {
243    
244                    String scriptContent = ParamUtil.getString(
245                            uploadPortletRequest, "scriptContent");
246    
247                    File file = uploadPortletRequest.getFile("script");
248    
249                    if (file == null) {
250                            return scriptContent;
251                    }
252    
253                    String script = FileUtil.read(file);
254    
255                    if (Validator.isNotNull(script) && !isValidFile(file)) {
256                            throw new TemplateScriptException();
257                    }
258    
259                    return GetterUtil.getString(script, scriptContent);
260            }
261    
262            protected boolean isValidFile(File file) {
263                    String contentType = MimeTypesUtil.getContentType(file);
264    
265                    if (contentType.equals(ContentTypes.APPLICATION_XSLT_XML) ||
266                            contentType.startsWith(ContentTypes.TEXT)) {
267    
268                            return true;
269                    }
270    
271                    return false;
272            }
273    
274            protected DDMTemplate updateTemplate(ActionRequest actionRequest)
275                    throws Exception {
276    
277                    UploadPortletRequest uploadPortletRequest =
278                            PortalUtil.getUploadPortletRequest(actionRequest);
279    
280                    long templateId = ParamUtil.getLong(uploadPortletRequest, "templateId");
281    
282                    long groupId = ParamUtil.getLong(uploadPortletRequest, "groupId");
283                    long classNameId = ParamUtil.getLong(
284                            uploadPortletRequest, "classNameId");
285                    long classPK = ParamUtil.getLong(uploadPortletRequest, "classPK");
286                    String templateKey = ParamUtil.getString(
287                            uploadPortletRequest, "templateKey");
288                    Map<Locale, String> nameMap = LocalizationUtil.getLocalizationMap(
289                            uploadPortletRequest, "name");
290                    Map<Locale, String> descriptionMap =
291                            LocalizationUtil.getLocalizationMap(
292                                    uploadPortletRequest, "description");
293                    String type = ParamUtil.getString(uploadPortletRequest, "type");
294                    String mode = ParamUtil.getString(uploadPortletRequest, "mode");
295                    String language = ParamUtil.getString(
296                            uploadPortletRequest, "language", TemplateConstants.LANG_TYPE_VM);
297    
298                    String script = getScript(uploadPortletRequest);
299    
300                    boolean cacheable = ParamUtil.getBoolean(
301                            uploadPortletRequest, "cacheable");
302                    boolean smallImage = ParamUtil.getBoolean(
303                            uploadPortletRequest, "smallImage");
304                    String smallImageURL = ParamUtil.getString(
305                            uploadPortletRequest, "smallImageURL");
306                    File smallImageFile = uploadPortletRequest.getFile("smallImageFile");
307    
308                    ServiceContext serviceContext = ServiceContextFactory.getInstance(
309                            DDMTemplate.class.getName(), uploadPortletRequest);
310    
311                    DDMTemplate template = null;
312    
313                    if (templateId <= 0) {
314                            template = DDMTemplateServiceUtil.addTemplate(
315                                    groupId, classNameId, classPK, templateKey, nameMap,
316                                    descriptionMap, type, mode, language, script, cacheable,
317                                    smallImage, smallImageURL, smallImageFile, serviceContext);
318                    }
319                    else {
320                            template = DDMTemplateServiceUtil.updateTemplate(
321                                    templateId, classPK, nameMap, descriptionMap, type, mode,
322                                    language, script, cacheable, smallImage, smallImageURL,
323                                    smallImageFile, serviceContext);
324                    }
325    
326                    PortletPreferences portletPreferences = getStrictPortletSetup(
327                            actionRequest);
328    
329                    if (portletPreferences != null) {
330                            if (type.equals(DDMTemplateConstants.TEMPLATE_TYPE_DISPLAY)) {
331                                    portletPreferences.setValue(
332                                            "displayDDMTemplateId",
333                                            String.valueOf(template.getTemplateId()));
334                            }
335                            else {
336                                    portletPreferences.setValue(
337                                            "formDDMTemplateId",
338                                            String.valueOf(template.getTemplateId()));
339                            }
340    
341                            portletPreferences.store();
342                    }
343    
344                    return template;
345            }
346    
347    }