001
014
015 package com.liferay.portlet.workflowinstances.action;
016
017 import com.liferay.portal.kernel.servlet.SessionErrors;
018 import com.liferay.portal.kernel.util.Constants;
019 import com.liferay.portal.kernel.util.GetterUtil;
020 import com.liferay.portal.kernel.util.ParamUtil;
021 import com.liferay.portal.kernel.util.WebKeys;
022 import com.liferay.portal.kernel.workflow.WorkflowConstants;
023 import com.liferay.portal.kernel.workflow.WorkflowException;
024 import com.liferay.portal.kernel.workflow.WorkflowHandler;
025 import com.liferay.portal.kernel.workflow.WorkflowHandlerRegistryUtil;
026 import com.liferay.portal.kernel.workflow.WorkflowInstance;
027 import com.liferay.portal.kernel.workflow.WorkflowInstanceManagerUtil;
028 import com.liferay.portal.model.Group;
029 import com.liferay.portal.model.Layout;
030 import com.liferay.portal.security.auth.PrincipalException;
031 import com.liferay.portal.service.WorkflowInstanceLinkLocalServiceUtil;
032 import com.liferay.portal.struts.PortletAction;
033 import com.liferay.portal.theme.ThemeDisplay;
034
035 import java.io.Serializable;
036
037 import java.util.Map;
038
039 import javax.portlet.ActionRequest;
040 import javax.portlet.ActionResponse;
041 import javax.portlet.PortletConfig;
042 import javax.portlet.RenderRequest;
043 import javax.portlet.RenderResponse;
044
045 import org.apache.struts.action.ActionForm;
046 import org.apache.struts.action.ActionForward;
047 import org.apache.struts.action.ActionMapping;
048
049
052 public class EditWorkflowInstanceAction extends PortletAction {
053
054 @Override
055 public void processAction(
056 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
057 ActionRequest actionRequest, ActionResponse actionResponse)
058 throws Exception {
059
060 String cmd = ParamUtil.getString(actionRequest, Constants.CMD);
061
062 try {
063 String redirect = null;
064
065 if (cmd.equals(Constants.DELETE)) {
066 redirect = deleteInstance(actionRequest);
067 }
068 else if (cmd.equals(Constants.SIGNAL)) {
069 signalInstance(actionRequest);
070 }
071
072 if (redirect == null) {
073 redirect = ParamUtil.getString(actionRequest, "redirect");
074 }
075
076 sendRedirect(actionRequest, actionResponse, redirect);
077 }
078 catch (Exception e) {
079 if (e instanceof PrincipalException ||
080 e instanceof WorkflowException) {
081
082 SessionErrors.add(actionRequest, e.getClass().getName());
083
084 setForward(actionRequest, "portlet.workflow_instances.error");
085 }
086 else {
087 throw e;
088 }
089 }
090 }
091
092 @Override
093 public ActionForward render(
094 ActionMapping mapping, ActionForm form, PortletConfig portletConfig,
095 RenderRequest renderRequest, RenderResponse renderResponse)
096 throws Exception {
097
098 try {
099 ActionUtil.getWorkflowInstance(renderRequest);
100 }
101 catch (Exception e) {
102 if (e instanceof WorkflowException) {
103
104 SessionErrors.add(renderRequest, e.getClass().getName());
105
106 return mapping.findForward("portlet.workflow_instances.error");
107 }
108 else {
109 throw e;
110 }
111 }
112
113 String forward = getForward(
114 renderRequest, "portlet.workflow_instances.edit_workflow_instance");
115
116 return mapping.findForward(forward);
117 }
118
119 protected String deleteInstance(ActionRequest actionRequest)
120 throws Exception {
121
122 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
123 WebKeys.THEME_DISPLAY);
124
125 long workflowInstanceId = ParamUtil.getLong(
126 actionRequest, "workflowInstanceId");
127
128 WorkflowInstance workflowInstance =
129 WorkflowInstanceManagerUtil.getWorkflowInstance(
130 themeDisplay.getCompanyId(), workflowInstanceId);
131
132 Map<String, Serializable> workflowContext =
133 workflowInstance.getWorkflowContext();
134
135 long companyId = GetterUtil.getLong(
136 workflowContext.get(WorkflowConstants.CONTEXT_COMPANY_ID));
137 long userId = GetterUtil.getLong(
138 workflowContext.get(WorkflowConstants.CONTEXT_USER_ID));
139 long groupId = GetterUtil.getLong(
140 workflowContext.get(WorkflowConstants.CONTEXT_GROUP_ID));
141 String className = GetterUtil.getString(
142 workflowContext.get(WorkflowConstants.CONTEXT_ENTRY_CLASS_NAME));
143 long classPK = GetterUtil.getLong(
144 workflowContext.get(WorkflowConstants.CONTEXT_ENTRY_CLASS_PK));
145
146 WorkflowHandler workflowHandler =
147 WorkflowHandlerRegistryUtil.getWorkflowHandler(className);
148
149 workflowHandler.updateStatus(
150 WorkflowConstants.STATUS_DRAFT, workflowContext);
151
152 WorkflowInstanceLinkLocalServiceUtil.deleteWorkflowInstanceLink(
153 companyId, groupId, className, classPK);
154
155 Layout layout = themeDisplay.getLayout();
156
157 Group layoutGroup = layout.getGroup();
158
159 if (layoutGroup.isControlPanel() &&
160 (WorkflowInstanceManagerUtil.getWorkflowInstanceCount(
161 companyId, userId, null, null, null) == 0)) {
162
163 return themeDisplay.getURLControlPanel();
164 }
165
166 return null;
167 }
168
169 @Override
170 protected boolean isCheckMethodOnProcessAction() {
171 return _CHECK_METHOD_ON_PROCESS_ACTION;
172 }
173
174 protected void signalInstance(ActionRequest actionRequest)
175 throws Exception {
176
177 ThemeDisplay themeDisplay = (ThemeDisplay)actionRequest.getAttribute(
178 WebKeys.THEME_DISPLAY);
179
180 long workflowInstanceId = ParamUtil.getLong(
181 actionRequest, "workflowInstanceId");
182
183 String transitionName = ParamUtil.getString(
184 actionRequest, "transitionName");
185
186 WorkflowInstanceManagerUtil.signalWorkflowInstance(
187 themeDisplay.getCompanyId(), themeDisplay.getUserId(),
188 workflowInstanceId, transitionName, null);
189 }
190
191 private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
192
193 }