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