Notice: This Wiki is now read only and edits are no longer possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.
Stardust/Knowledge Base/Java API/Reading Process Data
Reading Process Data of a Process Instance from outside its Context
(Versions: 5.3.17)
Assuming you have a
- process instance with the OID 175 using
- a structured data with the id CAData,
- a primitive data of type Sting with the id ISINData
and want to read the data values of those two data from within the context of another process instance or from client code that is running completely outside any process context.
Within the context of a process instance we can inject process data to an activity instance via in data mappings that are mapped to the setter methods of our code. However, when data needs to be accessed from outside the context of its process instance, e.g. from within another unrelated process instance, then this is not possible. Process data is scoped per process instance. Code that is not executed within the context of an activity instance of the same process instance needs to use process data paths to access a process instance's data. The example below illustrates how this is done. The required process data paths have to be previously declared on the process definition of the target process instance.
In this example two data mappings on process definition level exist:
- a data mapping with the id CorporateAction which is mapped to a structured data
- a data mapping with the id ISIN that is mapped to data (field) of type String
package test; import java.io.Serializable; import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ag.carnot.error.ObjectNotFoundException; import ag.carnot.workflow.runtime.ServiceFactory; import ag.carnot.workflow.runtime.ServiceFactoryLocator; import ag.carnot.workflow.runtime.WorkflowService; public class QueryTest { public static final Logger log = LoggerFactory.getLogger(QueryTest.class); /** * @param args */ @SuppressWarnings("unchecked") public static void main(String[] args) { ServiceFactory sf = ServiceFactoryLocator.get("motu", "motu"); WorkflowService wfs = sf.getWorkflowService(); long oid = 175; // null in the second parameter fetches all datapaths. // You should limit this to the data you actually need! // Map<String, Serializable> dpaths = wfs.getInDataPaths(oid, null); Set<String> datapthIds = new HashSet<String>(Arrays .asList(new String[] { "CorporateAction", "ISIN" })); try { Map<String, Serializable> dpaths = wfs.getInDataPaths(oid, datapthIds); for (Iterator itr = dpaths.keySet().iterator(); itr.hasNext();) { String id = (String) itr.next(); Serializable dataValue = (Serializable) dpaths.get(id); if (dataValue instanceof Map) { log.info("Data: " + id); Map<String, Serializable> sdata = (Map<String, Serializable>) dataValue; for (Map.Entry<String, Serializable> entry : sdata .entrySet()) { log.info(" field: " + entry.getKey() + " = " + entry.getValue()); } } else log.info("Data: " + id + " value: " + dataValue); } } catch (ObjectNotFoundException e) { log.error("The process definition does not have that data path"); log.error(e.getMessage()); } sf.close(); } }