1 25 package org.ofbiz.workflow.client; 26 27 import java.sql.Timestamp ; 28 import java.util.Iterator ; 29 import java.util.Map ; 30 31 import org.ofbiz.base.util.Debug; 32 import org.ofbiz.entity.GenericDelegator; 33 import org.ofbiz.service.DispatchContext; 34 import org.ofbiz.service.LocalDispatcher; 35 import org.ofbiz.service.job.Job; 36 import org.ofbiz.service.job.JobManagerException; 37 import org.ofbiz.workflow.CannotStop; 38 import org.ofbiz.workflow.NotRunning; 39 import org.ofbiz.workflow.WfActivity; 40 import org.ofbiz.workflow.WfAssignment; 41 import org.ofbiz.workflow.WfException; 42 import org.ofbiz.workflow.WfExecutionObject; 43 import org.ofbiz.workflow.WfFactory; 44 import org.ofbiz.workflow.WfProcess; 45 import org.ofbiz.workflow.WfResource; 46 47 54 public class WorkflowClient { 55 56 public static final String module = WorkflowClient.class.getName(); 57 58 protected GenericDelegator delegator = null; 59 protected LocalDispatcher dispatcher = null; 60 61 protected WorkflowClient() {} 62 63 68 public WorkflowClient(GenericDelegator delegator, LocalDispatcher dispatcher) { 69 if (delegator == null) 70 throw new IllegalArgumentException ("GenericDelegator cannot be null"); 71 if (dispatcher == null) 72 throw new IllegalArgumentException ("LocalDispatcher cannot be null"); 73 this.delegator = delegator; 74 this.dispatcher = dispatcher; 75 } 76 77 82 public WorkflowClient(DispatchContext context) { 83 this(context.getDelegator(), context.getDispatcher()); 84 } 85 86 95 public WfAssignment assign(String workEffortId, String partyId, String roleTypeId, Timestamp fromDate, boolean append) throws WfException { 96 WfActivity activity = WfFactory.getWfActivity(delegator, workEffortId); 97 WfResource resource = WfFactory.getWfResource(delegator, null, null, partyId, roleTypeId); 98 99 if (!append) { 100 Iterator i = activity.getIteratorAssignment(); 101 102 while (i.hasNext()) { 103 WfAssignment a = (WfAssignment) i.next(); 104 a.remove(); 105 } 106 } 107 return WfFactory.getWfAssignment(activity, resource, fromDate, true); 108 } 109 110 118 public void accept(String workEffortId, String partyId, String roleTypeId, Timestamp fromDate) throws WfException { 119 WfAssignment assign = WfFactory.getWfAssignment(delegator, workEffortId, partyId, roleTypeId, fromDate); 120 assign.accept(); 121 } 122 123 132 public void acceptAndStart(String workEffortId, String partyId, String roleTypeId, Timestamp fromDate) throws WfException { 133 accept(workEffortId, partyId, roleTypeId, fromDate); 134 start(workEffortId); 135 } 136 137 149 public WfAssignment delegate(String workEffortId, String fromPartyId, String fromRoleTypeId, Timestamp fromFromDate, String toPartyId, String toRoleTypeId, Timestamp toFromDate) throws WfException { 150 WfActivity activity = WfFactory.getWfActivity(delegator, workEffortId); 151 WfAssignment fromAssign = null; 152 153 if (activity.state().equals("open.running") && !activity.getDefinitionObject().getBoolean("delegateAfterStart").booleanValue()) 155 throw new WfException("This activity cannot be delegated once it has been started"); 156 157 if (fromPartyId == null && fromRoleTypeId == null && fromFromDate == null) { 158 Iterator i = activity.getIteratorAssignment(); 159 fromAssign = (WfAssignment) i.next(); 160 if (i.hasNext()) { 161 throw new WfException("Cannot locate the assignment to delegate from, there is more then one " + 162 "assignment for this activity."); 163 } 164 } 165 166 if (fromAssign == null) { 167 fromAssign = WfFactory.getWfAssignment(delegator, workEffortId, fromPartyId, fromRoleTypeId, fromFromDate); 168 } 169 fromAssign.delegate(); 170 171 WfActivity newActivity = null; 173 if (activity.getDefinitionObject().getBoolean("restartOnDelegate").booleanValue()) { 174 if (activity.state().equals("open.running") && activity.howManyAssignment() == 0) { 176 try { 177 activity.abort(); 178 } catch (CannotStop cs) { 179 throw new WfException("Cannot stop the current activity"); 180 } catch (NotRunning nr) { 181 throw new WfException("Current activity is not running; cannot abort"); 182 } 183 String parentProcessId = activity.container().runtimeKey(); 184 newActivity = WfFactory.getWfActivity(activity.getDefinitionObject(), parentProcessId); 185 } 186 } 187 188 WfAssignment assign = null; 189 if (newActivity != null) { 190 assign = assign(newActivity.runtimeKey(), toPartyId, toRoleTypeId, toFromDate, true); 191 } else { 192 assign = assign(workEffortId, toPartyId, toRoleTypeId, toFromDate, true); 193 } 194 195 return assign; 196 } 197 198 208 public void delegateAndAccept(String workEffortId, String fromPartyId, String fromRoleTypeId, Timestamp fromFromDate, String toPartyId, String toRoleTypeId, Timestamp toFromDate, boolean start) throws WfException { 209 WfAssignment assign = delegate(workEffortId, fromPartyId, fromRoleTypeId, fromFromDate, toPartyId, toRoleTypeId, toFromDate); 210 assign.accept(); 211 Debug.logVerbose("Delegated assignment.", module); 212 213 if (start) { 214 Debug.logVerbose("Starting activity.", module); 215 if (!activityRunning(assign.activity())) { 216 start(assign.activity().runtimeKey()); 217 } else { 218 Debug.logWarning("Activity already running; not starting.", module); 219 } 220 } else { 221 Debug.logVerbose("Not starting assignment.", module); 222 } 223 } 224 225 231 public void start(String workEffortId) throws WfException { 232 if (dispatcher == null) { 233 throw new WfException("LocalDispatcher is null; cannot create job for activity startup"); 234 } 235 236 WfActivity activity = WfFactory.getWfActivity(delegator, workEffortId); 237 238 if (Debug.verboseOn()) Debug.logVerbose("Starting activity: " + activity.name(), module); 239 if (activityRunning(activity)) 240 throw new WfException("Activity is already running"); 241 242 Job job = new StartActivityJob(activity); 243 244 if (Debug.verboseOn()) Debug.logVerbose("Job: " + job, module); 245 try { 246 dispatcher.getJobManager().runJob(job); 247 } catch (JobManagerException e) { 248 throw new WfException(e.getMessage(), e); 249 } 250 251 } 252 253 262 public void complete(String workEffortId, String partyId, String roleTypeId, Timestamp fromDate, Map result) throws WfException { 263 WfAssignment assign = WfFactory.getWfAssignment(delegator, workEffortId, partyId, roleTypeId, fromDate); 264 if (result != null && result.size() > 0) 265 assign.setResult(result); 266 assign.complete(); 267 } 268 269 274 public void suspend(String workEffortId) throws WfException { 275 WfActivity activity = WfFactory.getWfActivity(delegator, workEffortId); 276 277 if (Debug.verboseOn()) Debug.logVerbose("Suspending activity: " + activity.name(), module); 278 if (!activityRunning(activity)) 279 throw new WfException("Activity is not running"); 280 281 activity.suspend(); 282 } 283 284 289 public void resume(String workEffortId) throws WfException { 290 WfActivity activity = WfFactory.getWfActivity(delegator, workEffortId); 291 292 if (Debug.verboseOn()) Debug.logVerbose("Resuming activity: " + activity.name(), module); 293 if (activityRunning(activity)) 294 throw new WfException("Activity is already running"); 295 296 activity.resume(); 297 } 298 299 304 public void abortProcess(String workEffortId) throws WfException { 305 WfProcess process = WfFactory.getWfProcess(delegator, workEffortId); 306 process.abort(); 307 } 308 309 315 public void appendContext(String workEffortId, Map append) throws WfException { 316 WfExecutionObject obj = getExecutionObject(workEffortId); 317 318 if (obj != null) { 319 Map oCtx = obj.processContext(); 320 321 oCtx.putAll(append); 322 obj.setProcessContext(oCtx); 323 if (Debug.verboseOn()) Debug.logVerbose("ProcessContext (" + workEffortId + ") => " + obj.processContext(), module); 324 } 325 } 326 327 332 public Map getContext(String workEffortId) throws WfException { 333 WfExecutionObject obj = getExecutionObject(workEffortId); 334 335 if (obj == null) throw new WfException("Invalid Execution Object (null value)"); 336 if (Debug.verboseOn()) Debug.logVerbose("ProcessContext (" + workEffortId + ") => " + obj.processContext(), module); 337 return obj.processContext(); 338 } 339 340 345 public String getState(String workEffortId) throws WfException { 346 WfExecutionObject obj = getExecutionObject(workEffortId); 347 348 if (obj == null) throw new WfException("Invalid Execution Object (null value)"); 349 if (Debug.verboseOn()) Debug.logVerbose("Current State (" + workEffortId + ") => " + obj.state(), module); 350 return obj.state(); 351 } 352 353 360 public void setState(String workEffortId, String state) throws WfException { 361 WfExecutionObject obj = getExecutionObject(workEffortId); 362 363 if (obj == null) throw new WfException("Invalid Execution Object (null value)"); 364 obj.changeState(state); 365 if (Debug.verboseOn()) Debug.logVerbose("Current State (" + workEffortId + ") => " + obj.state(), module); 366 } 367 368 374 public long getPriority(String workEffortId) throws WfException { 375 WfExecutionObject obj = getExecutionObject(workEffortId); 376 377 if (obj == null) throw new WfException("Invalid Execution Object (null value)"); 378 if (Debug.verboseOn()) Debug.logVerbose("Current Priority (" + workEffortId + ") => " + obj.priority(), module); 379 return obj.priority(); 380 } 381 382 388 public void setPriority(String workEffortId, long priority) throws WfException { 389 WfExecutionObject obj = getExecutionObject(workEffortId); 390 391 if (obj == null) throw new WfException("Invalid Execution Object (null value)"); 392 obj.setPriority(priority); 393 if (Debug.verboseOn()) Debug.logVerbose("Current Priority (" + workEffortId + ") => " + obj.priority(), module); 394 } 395 396 private WfExecutionObject getExecutionObject(String workEffortId) { 398 WfExecutionObject obj = null; 399 400 try { 401 obj = (WfExecutionObject) WfFactory.getWfActivity(delegator, workEffortId); 402 } catch (WfException e) { } 404 if (obj == null) { 405 try { 406 obj = (WfExecutionObject) WfFactory.getWfProcess(delegator, workEffortId); 407 } catch (WfException e) { } 409 } 410 return obj; 411 } 412 413 private boolean activityRunning(String workEffortId) throws WfException { 415 return activityRunning(WfFactory.getWfActivity(delegator, workEffortId)); 416 } 417 418 private boolean activityRunning(WfActivity activity) throws WfException { 420 if (activity.state().equals("open.running")) 421 return true; 422 return false; 423 } 424 425 } 426 | Popular Tags |