This guide provides instructions on how to download a document from custom ECM Upload for a 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 download a document upload in the custom ECM for a process using BPM API as a rest full service.


About Me:

Piyas Kumar Das

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 Upload A Document For A Task to design your custom ECM using BPM API as a RESTful service.


We will be discussing following points in detail in this document –


  1. Adding Libraries.
  2. Setting up the foundation for using Libraries.
  3. Creating Deploy-able Object.
  4. 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 5.1 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.IOException;
import java.io.InputStream;
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.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.activation.DataHandler;
import javax.servlet.http.HttpServletRequest;
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.CacheControl;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.cxf.jaxrs.ext.multipart.Attachment;
import org.apache.cxf.jaxrs.ext.multipart.MultipartBody;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import bo.FileDto;
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.ProcessInstance;
import com.sap.bpm.pm.api.ProcessInstanceManager;
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.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/";
  private String getProcessInstanceForTaskInstance(String taskInstanceId)
  {
  System.err.println("ArticleMaintenanceService -> getTaskDetails");
  System.err.println("Task Instance ID: "+taskInstanceId);
  try
  {
  URI taskInstId = new URI("bpm://bpm.sap.com/task-instance/" + taskInstanceId);
  ProcessInstanceManager processInstanceManager = BPMFactory.getProcessInstanceManager();
  ProcessInstance processInstance = processInstanceManager.getProcessInstanceForTaskInstanceId(taskInstId);
  String processInstanceId = extractID(processInstance.getId().toString());
  System.err.println("Process Instance ID : "+processInstanceId);
  return processInstanceId;
  }
  catch (Exception e)
  {
  System.err.println("Exception : "+e.getMessage());
  }
  return null;
  }
  private String extractID(String instanceId)
  {
  if(instanceId == null || instanceId.trim().length() == 0)
  return instanceId;
  String [] ids = instanceId.split("/");
  return ids[ids.length-1];
  }
  @Path("/downloadDocument/{requestId}")
    @GET
    @Produces({"application/txt","application/doc","application/docx","application/pdf"})
  public Response downloadDocument(@Context HttpServletRequest req, @PathParam("requestId") String requestId) throws IOException
  {
    System.err.println("ECMDocumentService -> downloadDocument");
    System.err.println("Request ID : "+requestId);
    if(requestId == null || requestId.trim().length() == 0)
    return null;
    requestId = getProcessInstanceForTaskInstance(requestId);
    ECMDocumentService ecmService = new ECMDocumentService();
    FileDto fileDto = ecmService.downloadDocument(requestId);
  if (fileDto != null && fileDto.getFile() != null)
  {
  System.err.println("File Name : "+fileDto.getDocumentId());
  byte[] file = fileDto.getFile();
  String fileName = fileDto.getDocumentId();
  Response.ResponseBuilder response = Response.ok(file);
  response.cacheControl(CacheControl.valueOf("private"));
  response.header("Accept-Ranges", "none");
  response.header("Content-Disposition", "attachment; filename="+ fileName);
  return response.build();
  }
  else
  {
  Response.ResponseBuilder builder = Response.status(Response.Status.FORBIDDEN);
  builder.type(MediaType.APPLICATION_JSON);
  builder.entity("There is no download file for this request.");
  return builder.build();
  }
  }
}

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.

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply