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.workflowdefinitions.action;
016    
017    import com.liferay.portal.kernel.language.LanguageUtil;
018    import com.liferay.portal.kernel.log.Log;
019    import com.liferay.portal.kernel.log.LogFactoryUtil;
020    import com.liferay.portal.kernel.servlet.SessionErrors;
021    import com.liferay.portal.kernel.servlet.SessionMessages;
022    import com.liferay.portal.kernel.upload.UploadPortletRequest;
023    import com.liferay.portal.kernel.util.Constants;
024    import com.liferay.portal.kernel.util.FileUtil;
025    import com.liferay.portal.kernel.util.LocaleUtil;
026    import com.liferay.portal.kernel.util.LocalizationUtil;
027    import com.liferay.portal.kernel.util.ParamUtil;
028    import com.liferay.portal.kernel.util.StringPool;
029    import com.liferay.portal.kernel.util.Validator;
030    import com.liferay.portal.kernel.workflow.RequiredWorkflowDefinitionException;
031    import com.liferay.portal.kernel.workflow.WorkflowDefinition;
032    import com.liferay.portal.kernel.workflow.WorkflowDefinitionFileException;
033    import com.liferay.portal.kernel.workflow.WorkflowDefinitionManagerUtil;
034    import com.liferay.portal.kernel.workflow.WorkflowException;
035    import com.liferay.portal.struts.PortletAction;
036    import com.liferay.portal.theme.ThemeDisplay;
037    import com.liferay.portal.util.PortalUtil;
038    import com.liferay.portal.util.WebKeys;
039    
040    import java.io.File;
041    
042    import java.util.Locale;
043    import java.util.Map;
044    
045    import javax.portlet.ActionRequest;
046    import javax.portlet.ActionResponse;
047    import javax.portlet.PortletConfig;
048    import javax.portlet.RenderRequest;
049    import javax.portlet.RenderResponse;
050    
051    import org.apache.struts.action.ActionForm;
052    import org.apache.struts.action.ActionForward;
053    import org.apache.struts.action.ActionMapping;
054    
055    /**
056     * @author Bruno Farache
057     */
058    public class EditWorkflowDefinitionAction extends PortletAction {
059    
060            @Override
061            public void processAction(
062                            ActionMapping actionMapping, ActionForm actionForm,
063                            PortletConfig portletConfig, ActionRequest actionRequest,
064                            ActionResponse actionResponse)
065                    throws Exception {
066    
067                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
068    
069                    try {
070                            if (cmd.equals(Constants.ADD) || cmd.equals(Constants.UPDATE)) {
071                                    updateWorkflowDefinition(actionRequest);
072                            }
073                            else if (cmd.equals(Constants.DEACTIVATE) ||
074                                             cmd.equals(Constants.DELETE) ||
075                                             cmd.equals(Constants.RESTORE)) {
076    
077                                    deleteWorkflowDefinition(actionRequest);
078                            }
079    
080                            sendRedirect(actionRequest, actionResponse);
081                    }
082                    catch (Exception e) {
083                            if (e instanceof RequiredWorkflowDefinitionException) {
084                                    SessionErrors.add(actionRequest, e.getClass());
085    
086                                    SessionMessages.add(
087                                            actionRequest,
088                                            PortalUtil.getPortletId(actionRequest) +
089                                                    SessionMessages.KEY_SUFFIX_HIDE_DEFAULT_ERROR_MESSAGE);
090    
091                                    setForward(actionRequest, "portlet.workflow_definitions.view");
092                            }
093                            else if (e instanceof WorkflowDefinitionFileException) {
094                                    SessionErrors.add(actionRequest, e.getClass());
095                            }
096                            else if (e instanceof WorkflowException) {
097                                    _log.error(e, e);
098    
099                                    SessionErrors.add(actionRequest, e.getClass());
100    
101                                    setForward(actionRequest, "portlet.workflow_definitions.error");
102                            }
103                            else {
104                                    throw e;
105                            }
106                    }
107            }
108    
109            @Override
110            public ActionForward render(
111                            ActionMapping actionMapping, ActionForm actionForm,
112                            PortletConfig portletConfig, RenderRequest renderRequest,
113                            RenderResponse renderResponse)
114                    throws Exception {
115    
116                    try {
117                            ActionUtil.getWorkflowDefinition(renderRequest);
118                    }
119                    catch (Exception e) {
120                            if (e instanceof WorkflowException) {
121                                    SessionErrors.add(renderRequest, e.getClass());
122    
123                                    return actionMapping.findForward(
124                                            "portlet.workflow_definitions.error");
125                            }
126                            else {
127                                    throw e;
128                            }
129                    }
130    
131                    return actionMapping.findForward(
132                            getForward(
133                                    renderRequest,
134                                    "portlet.workflow_definitions.edit_workflow_definition"));
135            }
136    
137            protected void deleteWorkflowDefinition(ActionRequest actionRequest)
138                    throws Exception {
139    
140                    String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
141    
142                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
143                            WebKeys.THEME_DISPLAY);
144    
145                    String name = ParamUtil.getString(actionRequest, "name");
146                    int version = ParamUtil.getInteger(actionRequest, "version");
147    
148                    if (cmd.equals(Constants.DEACTIVATE) || cmd.equals(Constants.RESTORE)) {
149                            boolean active = !cmd.equals(Constants.DEACTIVATE);
150    
151                            WorkflowDefinitionManagerUtil.updateActive(
152                                    themeDisplay.getCompanyId(), themeDisplay.getUserId(), name,
153                                    version, active);
154                    }
155                    else {
156                            WorkflowDefinitionManagerUtil.undeployWorkflowDefinition(
157                                    themeDisplay.getCompanyId(), themeDisplay.getUserId(), name,
158                                    version);
159                    }
160            }
161    
162            protected String getTitle(Map<Locale, String> titleMap) {
163                    if (titleMap == null) {
164                            return null;
165                    }
166    
167                    String value = StringPool.BLANK;
168    
169                    Locale[] locales = LanguageUtil.getAvailableLocales();
170    
171                    for (Locale locale : locales) {
172                            String languageId = LocaleUtil.toLanguageId(locale);
173                            String title = titleMap.get(locale);
174    
175                            if (Validator.isNotNull(title)) {
176                                    value = LocalizationUtil.updateLocalization(
177                                            value, "Title", title, languageId);
178                            }
179                            else {
180                                    value = LocalizationUtil.removeLocalization(
181                                            value, "Title", languageId);
182                            }
183                    }
184    
185                    return value;
186            }
187    
188            @Override
189            protected boolean isCheckMethodOnProcessAction() {
190                    return _CHECK_METHOD_ON_PROCESS_ACTION;
191            }
192    
193            protected void updateWorkflowDefinition(ActionRequest actionRequest)
194                    throws Exception {
195    
196                    UploadPortletRequest uploadPortletRequest =
197                            PortalUtil.getUploadPortletRequest(actionRequest);
198    
199                    ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
200                            WebKeys.THEME_DISPLAY);
201    
202                    Map<Locale, String> titleMap = LocalizationUtil.getLocalizationMap(
203                            actionRequest, "title");
204    
205                    File file = uploadPortletRequest.getFile("file");
206    
207                    WorkflowDefinition workflowDefinition = null;
208    
209                    if (file == null) {
210                            String name = ParamUtil.getString(actionRequest, "name");
211                            int version = ParamUtil.getInteger(actionRequest, "version");
212    
213                            workflowDefinition =
214                                    WorkflowDefinitionManagerUtil.getWorkflowDefinition(
215                                            themeDisplay.getCompanyId(), name, version);
216    
217                            WorkflowDefinitionManagerUtil.updateTitle(
218                                    themeDisplay.getCompanyId(), themeDisplay.getUserId(), name,
219                                    version, getTitle(titleMap));
220                    }
221                    else {
222                            workflowDefinition =
223                                    WorkflowDefinitionManagerUtil.deployWorkflowDefinition(
224                                            themeDisplay.getCompanyId(), themeDisplay.getUserId(),
225                                            getTitle(titleMap), FileUtil.getBytes(file));
226                    }
227    
228                    actionRequest.setAttribute(
229                            WebKeys.WORKFLOW_DEFINITION, workflowDefinition);
230            }
231    
232            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
233    
234            private static Log _log = LogFactoryUtil.getLog(
235                    EditWorkflowDefinitionAction.class);
236    
237    }