How to Delegate , Claim , Release & Nominate a Task of a BPM Process using BPM API as a rest full service.
This guide provides instructions on how to Delegate , Release & Nominate Task of a SAP BPM Process using BPM API as a Restful Service.
Applies to:
This Document Holds good for all CE 7.3 SP05 onwards. This service can be called from UI5 Screen as an Ajax call.
Summary:
This guide describes step-by-step how to Complete Task of a BPM Process using BPM API as a rest full service.
About Me:
As a Sr. Netweaver Consultant, I’ve been undertaking consulting assignments leveraging on my undermentioned NetWeaver skills.
- Business Process Management (SAP NW BPM)
- Restful Services using BPM api to be used in UI5 Screens.
- SAP Web Dynpro Java (SAP WD4J)
- SAP Business Rules Management (SAP BRMS)
- SAP Composit Application Framework (SAP CAF)
- Master Data Management (SAP NW MDM)
- Enterprise Portal (SAP EP)
- Services creation using NWDS (SAP EJB)
- Enterprise SOA
Prerequisites:
You should have read through the document :
How to Start a BPM Process using BPM API as a RESTful service.
How to Complete Task of a BPM Process using BPM API as a rest full service.
How to get Task Details of a BPM Process using BPM API as a rest full service.
We will be discussing following points in detail in this document –
- Adding Libraries.
- Setting up the foundation for using Libraries.
- Creating Deploy-able Object.
- Accessing the methods exposed.
Adding Libraries:
Step 1 : Refer the document to add libraries.
Setting up the foundation for using Library:
Step 1 to Step 4 is same as mentioned in the document.
Step 5 : Create a restful service class file and write a code as shown below or if you are continuing from the document then just copy past the methods only.
import java.io.StringReader;
import java.net.URI;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import bo.Material;
import bo.MaterialCreation;
import bo.TaskHeader;
import bo.TaskHeaders;
import com.sap.bpm.api.BPMFactory;
import com.sap.bpm.exception.api.BPMException;
import com.sap.bpm.pm.api.ProcessDefinition;
import com.sap.bpm.pm.api.ProcessDefinitionManager;
import com.sap.bpm.pm.api.ProcessStartEvent;
import com.sap.bpm.pm.api.ProcessStartManager;
import com.sap.bpm.tm.api.Status;
import com.sap.bpm.tm.api.TaskAbstract;
import com.sap.bpm.tm.api.TaskDetail;
import com.sap.bpm.tm.api.TaskInstanceManager;
import com.sap.security.api.IUser;
import com.sap.tc.logging.Location;
import commonj.sdo.DataObject;
import commonj.sdo.helper.XMLHelper;
@Path("/MaterialCreationService")
@Produces({MediaType.APPLICATION_XML})
public class MaterialCreationToRestService {
private static final Location location = Location.getLocation(MaterialCreationToRestService.class);
private final String PRE_TASK_URI = "bpm://bpm.sap.com/task-instance/";
@Path("/delegate/{task-id}")
@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public String delegate(@PathParam("task-id") String taskInstanceId, IUser newOwner) throws Exception
{
String log = null;
try{
//Retrieve the TaskInstanceManager
TaskInstanceManager taskInstanceManager = BPMFactory.getTaskInstanceManager();
taskInstanceId = PRE_TASK_URI + taskInstanceId;
URI taskInstId = new URI(taskInstanceId);
//Claim the Task First
taskInstanceManager.claim(taskInstId);
taskInstanceManager.delegate(taskInstId, newOwner);
log = "Task delegated";
}
catch (Exception e)
{
e.printStackTrace();
System.err.println(e);
log = "Task in Exception "+e.getLocalizedMessage();
}
return log;
}
@Path("/claim/{task-id}")
@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public String claim(@PathParam("task-id") String taskInstanceId) throws Exception
{
String log = null;
try{
//Retrieve the TaskInstanceManager
TaskInstanceManager taskInstanceManager = BPMFactory.getTaskInstanceManager();
taskInstanceId = PRE_TASK_URI + taskInstanceId;
URI taskInstId = new URI(taskInstanceId);
taskInstanceManager.claim(taskInstId);
log = "Task claimed";
}
catch (Exception e)
{
e.printStackTrace();
System.err.println(e);
log = "Task in Exception "+e.getLocalizedMessage();
}
return log;
}
@Path("/release/{task-id}")
@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public String release(@PathParam("task-id") String taskInstanceId) throws Exception
{
String log = null;
try{
//Retrieve the TaskInstanceManager
TaskInstanceManager taskInstanceManager = BPMFactory.getTaskInstanceManager();
taskInstanceId = PRE_TASK_URI + taskInstanceId;
URI taskInstId = new URI(taskInstanceId);
taskInstanceManager.release(taskInstId);
log = "Task released";
}
catch (Exception e)
{
e.printStackTrace();
System.err.println(e);
log = "Task in Exception "+e.getLocalizedMessage();
}
return log;
}
@Path("/nominate/{task-id}")
@POST
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public String nominate(@PathParam("task-id") String taskInstanceId, IUser newOwner) throws Exception
{
String log = null;
try{
//Retrieve the TaskInstanceManager
TaskInstanceManager taskInstanceManager = BPMFactory.getTaskInstanceManager();
taskInstanceId = PRE_TASK_URI + taskInstanceId;
URI taskInstId = new URI(taskInstanceId);
//Claim the Task First
taskInstanceManager.claim(taskInstId);
taskInstanceManager.nominate(taskInstId, newOwner);
log = "Task delegated";
}
catch (Exception e)
{
e.printStackTrace();
System.err.println(e);
log = "Task in Exception "+e.getLocalizedMessage();
}
return log;
}
}
Step 6 & Step 7 is same as mentioned in the document. If you are continuing then you can ignore these steps.
Creating Deploy-able Object & Accessing the methods exposed.
Refer the document to “Creating Deploy-able Object” & “Accessing the methods exposed” as it is the same.
Hi Piyas
Very Helpful document.
But can we do this using Odata?
Regards
Kumar