Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
former_member182534
Active Participant

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:

piyaskumar.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.

Labels in this area