Hitachi

uCosminexus Service Coordinator Interactive Workflow BPMN連携機能 使用の手引


4.2 Webリソースクライアントの実装例

販売業務ビジネスプロセスを実行するWebリソースクライアントの実装例を示します。

案件を投入したあと,その案件の作業一覧を取得し,作業を完了させる例です。

SampleRESTClient.java

package rest.sample;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;

public class SampleRESTClient {

    public static void main(final String[] args) {
        try {
            SampleRESTClient sampleClient = new SampleRESTClient();
            sampleClient.demonstration("restserver", "80", "csciwws");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    private void demonstration(final String host, final String port, final String contextroot) {
        System.out.println("Demonstration started.");

        String targetURL = "http://" + host + ":" + port + "/" + contextroot;

        // Invoke resource
        Client client = ClientBuilder.newClient();

        // Set the target resource's URL
        String postURL = new String(targetURL + "/v1/process-instance/create-and-start");
        System.out.println("The target URL is \"POST " + postURL + "\".");
	
        // ProcessInstance RequestBody
        CreateAndStartProcessInstance parameter = new CreateAndStartProcessInstance();
        parameter.setName("process1");
        parameter.setDeadline("2020-12-31T12:00:00+09:00");
        parameter.setPriority("10");
        parameter.setProcessDataList(null);
        parameter.setDefinitionName("APCS3process");
        parameter.setDefinitionVersion("1");

        // ProcessData
        List<ProcessData> processData = new ArrayList<ProcessData>();
        ProcessData data1 = new ProcessData();
        data1.setKey("$SAPP");
        data1.setValue("Y");
        processData.add(data1);
        ProcessData data2 = new ProcessData();
        data2.setKey("$NID");
        data2.setValue("1");
        processData.add(data2);
        parameter.setProcessDataList(processData);

        Entity<?> entity = Entity.entity(parameter, MediaType.APPLICATION_XML);

        WebTarget targetPost = client.target(postURL);
        Response postResponse = targetPost
                                .request()
                                .accept(MediaType.APPLICATION_XML)
                                .post(entity);

        ProcessInstance processInstance = null;
        int statusCode = postResponse.getStatus();
        if (statusCode == 201) {
            processInstance = postResponse.readEntity(ProcessInstance.class);
        } else {
            String error = postResponse.readEntity(String.class);
            System.out.println("Status Code=" + statusCode);
            client.close();
            throw new RuntimeException(error);
        }

        System.out.println("Response of ProcessInstance is"
                + "\r\n  Name:" + processInstance.getProcessDefinitionName()
                + "\r\n  PIID:" + processInstance.getID()
                + "\r\n  StateCode:" + processInstance.getStateCode());

        // Set the target resource's URL
        String piid = processInstance.getID();
        String getURL = new String(targetURL + "/v1/work-item"
                                             + "?filter=ProcessInstanceID%3D" + piid);
        System.out.println("The target URL is \"GET " + getURL + "\".");

        WebTarget targetGet = client.target(getURL);
        Response getResponse = targetGet
                               .request()
                               .accept(MediaType.APPLICATION_XML)
                               .get();

        statusCode = getResponse.getStatus();
        if (statusCode != 200) {
            String error = getResponse.readEntity(String.class);
            System.out.println("Status Code=" + statusCode);
            client.close();
            throw new RuntimeException(error);
        }

        WorkItemList workItemList = getResponse.readEntity(WorkItemList.class);
        System.out.println("The number of WorkItems is " + workItemList.getWorkItems().size());

        List<WorkItem> workItems = workItemList.getWorkItems();
        if (workItems != null) {
            Iterator<WorkItem> it = workItems.iterator();
            while (it.hasNext()) {
                WorkItem wi = it.next();

                // Set the target resource's URL
                String putURL = new String(targetURL + "/v1/work-item/" + piid + "/" + wi.getID()
                                                     + "/perform-and-complete");
                System.out.println("The target URL is \"PUT " + putURL + "\".");

                entity = Entity.entity( "<Parameter />", MediaType.APPLICATION_XML);
                
                WebTarget targetPut = client.target(putURL);
                Response putResponse = targetPut
                                       .request()
                                       .accept(MediaType.APPLICATION_XML)
                                       .put(entity);

                WorkItem workItem = null;
                statusCode = putResponse.getStatus();
                if (statusCode == 200) {
                    workItem = putResponse.readEntity(WorkItem.class);
                } else {
                    String error = putResponse.readEntity(String.class);
                    System.out.println("Status Code=" + statusCode);
                    client.close();
                    throw new RuntimeException(error);
                }

                System.out.println("WorkItem is"
                        + "\r\n  Name:" + workItem.getWorkDefinitionName()
                        + "\r\n  WIID:" + workItem.getID()	
                        + "\r\n  State:" + workItem.getStateCode());
            }
        }

        client.close();
        System.out.println("Demonstration ended.");
    }
}

ProcessInstance.java

package rest.sample;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="ProcessInstance")
class ProcessInstance {
    private String closedDate;
    private String creator;
    private String deadline;
    private String ID;
    private String movedDate;
    private String name;
    private String priority;
    private String processDefinitionID;
    private String processDefinitionName;
    private String startDate;
    private String stateCode;

    public ProcessInstance() {}
    @XmlElement(name="ClosedDate")
    public String getClosedDate() { return closedDate; }
    public void setClosedDate(String closedDate) { this.closedDate = closedDate; }
    @XmlElement(name="Creator")
    public String getCreator() { return creator; }
    public void setCreator(String creator) { this.creator = creator; }
    @XmlElement(name="Deadline")
    public String getDeadline() { return deadline; }
    public void setDeadline(String deadline) { this.deadline = deadline; }
    @XmlElement(name="ID")
    public String getID() { return ID; }
    public void setID(String iD) { ID = iD; }
    @XmlElement(name="MovedDate")
    public String getMovedDate() { return movedDate; }
    public void setMovedDate(String movedDate) { this.movedDate = movedDate; }
    @XmlElement(name="Name")
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    @XmlElement(name="Priority")
    public String getPriority() { return priority; }
    public void setPriority(String priority) { this.priority = priority; }
    @XmlElement(name="ProcessDefinitionID")
    public String getProcessDefinitionID() { return processDefinitionID; }
    public void setProcessDefinitionID(String processDefinitionID) {
            this.processDefinitionID = processDefinitionID; }
    @XmlElement(name="ProcessDefinitionName")
    public String getProcessDefinitionName() { return processDefinitionName; }
    public void setProcessDefinitionName(String processDefinitionName) {
            this.processDefinitionName = processDefinitionName; }
    @XmlElement(name="StartDate")
    public String getStartDate() { return startDate; }
    public void setStartDate(String startDate) { this.startDate = startDate; }
    @XmlElement(name="StateCode")
    public String getStateCode() { return stateCode; }
    public void setStateCode(String stateCode) { this.stateCode = stateCode; }
}

ProcessData.java

package rest.sample;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "ProcessData")
public class ProcessData {
    private String key;
    private String value;

    public ProcessData() {}

    @XmlElement(name = "Key")
    public String getKey() { return key; }
    public void setKey(String aKey) { key = aKey; }

    @XmlElement(name = "Value")
    public String getValue() { return value; }
    public void setValue(String aValue) { value = aValue; }
}

CreateAndStartProcessInstance.java

package rest.sample;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Parameter")
public class CreateAndStartProcessInstance {
    @XmlElement(name = "Name")
    private String name;

    @XmlElement(name = "Deadline")
    private String deadline;

    @XmlElement(name = "Priority")
    private String priority;

    @XmlElementWrapper(name = "ProcessDataList")
    @XmlElement(name = "ProcessData")
    private List<ProcessData> processDataList;

    @XmlElement(name = "DefinitionName")
    private String definitionName;

    @XmlElement(name = "DefinitionVersion")
    private String definitionVersion;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getDeadline() { return deadline; }
    public void setDeadline(String deadline) { this.deadline = deadline; }
    public String getPriority() { return priority; }
    public void setPriority(String priority) { this.priority = priority; }
    public List<ProcessData> getProcessDataList() { return processDataList; }
    public void setProcessDataList(List<ProcessData> processes) { this.processDataList = processes; }
    public String getDefinitionName() { return definitionName; }
    public void setDefinitionName(String definitionName) { this.definitionName = definitionName; }
    public String getDefinitionVersion() { return definitionVersion; }
    public void setDefinitionVersion(String definitionVersion) { this.definitionVersion = definitionVersion; }
}

WorkItemList.java

package rest.sample;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="WorkItems")
class WorkItemList {
    private List<WorkItem> workItems;

    @XmlElement(name="WorkItem")
    public List<WorkItem> getWorkItems() { return workItems; }
    public void setWorkItems(List<WorkItem> workItems) { this.workItems = workItems; }
}

WorkItem.java

package rest.sample;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="WorkItem")
class WorkItem {
    private String activityInstanceID;
    private String closedDate;
    private String creationDate;
    private String deadline;
    private String ID;
    private String name;
    private String participant;
    private String priority;
    private String processDefinitionID;
    private String processInstanceID;
    private String processInstanceName;
    private String startDate;
    private String stateCode;
    private String workTypeCode;
    private String workDefinitionID;
    private String workDefinitionName;

    public WorkItem() {}
    @XmlElement(name="ActivityInstanceID")
    public String getActivityInstanceID() { return activityInstanceID; }
    public void setActivityInstanceID(String activityInstanceID) {
            this.activityInstanceID = activityInstanceID; }
    @XmlElement(name="ClosedDate")
    public String getClosedDate() { return closedDate; }
    public void setClosedDate(String closedDate) { this.closedDate = closedDate; }
    @XmlElement(name="CreationDate")
    public String getCreationDate() { return creationDate; }
    public void setCreationDate(String creationDate) { this.creationDate = creationDate; }
    @XmlElement(name="Deadline")
    public String getDeadline() { return deadline; }
    public void setDeadline(String deadline) { this.deadline = deadline; }
    @XmlElement(name="ID")
    public String getID() { return ID; }
    public void setID(String iD) { ID = iD; }
    @XmlElement(name="Name")
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    @XmlElement(name="Paticipant")
    public String getParticipant() { return participant; }
    public void setParticipant(String participant) { this.participant = participant; }
    @XmlElement(name="Priority")
    public String getPriority() { return priority; }
    public void setPriority(String priority) { this.priority = priority; }
    @XmlElement(name="ProcessDefinitionID")
    public String getProcessDefinitionID() { return processDefinitionID; }
    public void setProcessDefinitionID(String processDefinitionID) {
            this.processDefinitionID = processDefinitionID; }
    @XmlElement(name="ProcessInstanceID")
    public String getProcessInstanceID() { return processInstanceID; }
    public void setProcessInstanceID(String processInstanceID) {
            this.processInstanceID = processInstanceID; }
    @XmlElement(name="ProcessInstanceName")
    public String getProcessInstanceName() { return processInstanceName; }
    public void setProcessInstanceName(String processInstanceName) {
            this.processInstanceName = processInstanceName; }
    @XmlElement(name="StartDate")
    public String getStartDate() { return startDate; }
    public void setStartDate(String startDate) { this.startDate = startDate; }
    @XmlElement(name="StateCode")
    public String getStateCode() { return stateCode; }
    public void setStateCode(String stateCode) { this.stateCode = stateCode; }
    @XmlElement(name="WorkTypeCode")
    public String getWorkTypeCode() { return workTypeCode; }
    public void setWorkTypeCode(String workTypeCode) { this.workTypeCode = workTypeCode; }
    @XmlElement(name="WorkDefinitionID")
    public String getWorkDefinitionID() { return workDefinitionID; }
    public void setWorkDefinitionID(String workDefinitionID) { this.workDefinitionID = workDefinitionID; }
    @XmlElement(name="WorkDefinitionName")
    public String getWorkDefinitionName() { return workDefinitionName; }
    public void setWorkDefinitionName(String workDefinitionName) {
            this.workDefinitionName = workDefinitionName; };
}