Setting datatype case variables through the rest api.

1
+1
-1

How do I set a datatype case variable through the rest API? I have created a very simple workflow which has two human tasks.

Start --> Get Data --> Show Data --> End

The data is written to a process variable which is a datatype. This datatype is deployed as a jar file in the org.bonitasoft.person package and it is called VitalStats. It has three fields which are:

firstName (string) lastName (string) age (integer)

This datatype is declared at the process level as a variable called vitalStats. It is initialized as a new org.bonitasoft.person.VitalStats() object using a groovy script.

The Get Data task uses a form in the Bonita portal to write data to the vitalStats record. The three fields in the form invoke the setter functions generated by the datatype.

The Show Data task uses a form in the Bonita portal to call the getter functions on the datatype to display the data.

I can run this workflow through the Bonita portal with no issues.

My question is, how would I run this through an external web application. I see the results when I make these calls (assume I have logged in and I am correctly passing the JSESSIONID cookie):

Find the Human Tasks: url: http://localhost:8080/bonita/API/bpm/humanTask?p=0&c=10&f=state=ready type: get result: { displayDescription: "" executedBySubstitute: "0" processId: "5760430587330547090" state: "ready" rootContainerId: "3007" type: "USER_TASK" assigned_id: "504" assigned_date: "2014-10-08 10:04:23.522" id: "60007" executedBy: "0" caseId: "3007" priority: "normal" actorId: "306" description: "" name: "Show Data." reached_state_date: "2014-10-08 10:04:20.243" displayName: "Show Data." dueDate: "2014-10-08 11:04:20.235" last_update_date: "2014-10-08 10:04:20.243" }

Get the case variables: url: http://localhost:8080/bonita/API/bpm/caseVariable?p=0&c=10&f=case_id=3007 type: get result: { description: "" name: "vitalStats" value: "VitalStats [firstName: Roger] [lastName: Wilco] [age: 21]" case_id: "3007" type: "org.bonitasoft.person.VitalStats" }

The variable above appears to be a serialized repsentation of the vitalStats variable. Now I want to change the age to 22. I would imagine that I could set it by calling the appropriate API.

** Set the case variable ** url: http://localhost:8080/bonita/API/bpm/caseVariable/3001/vitalStats payload: { "id":"3001/vitalStats", "name":"vitalStats", "type":"org.bonitasoft.person.VitalStats", "value":"VitalStats [firstName: Roger] [lastName: Wilco] [age: 22]" } content-type: application/json

When I try this I get a 500 server error with the following stack trace:

exception: "class org.bonitasoft.web.toolkit.client.common.exception.api.APIException" message: "Error when updating case variable" stacktrace: "[org.bonitasoft.web.rest.server.datastore.bpm.cases.CaseVariableDatastore.updateVariableValue(CaseVariableDatastore.java:82), org.bonitasoft.web.rest.server.api.bpm.cases.APICaseVariable.runUpdate(APICaseVariable.java:40), org.bonitasoft.web.rest.server.api.bpm.cases.APICaseVariable.runUpdate(APICaseVariable.java:30), org.bonitasoft.web.rest.server.framework.APIServletCall.doPut(APIServletCall.java:217), org.bonitasoft.web.toolkit.server.servlet.ToolkitHttpServlet.doPut(ToolkitHttpServlet.java:193), javax.servlet.http.HttpServlet.service(HttpServlet.java:646), org.bonitasoft.web.toolkit.server.servlet.ToolkitHttpServlet.service(ToolkitHttpServlet.java:75), javax.servlet.http.HttpServlet.service(HttpServlet.java:723), org.bonitasoft.web.toolkit.server.servlet.ToolkitHttpServlet.service(ToolkitHttpServlet.java:226), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206), org.bonitasoft.console.common.server.login.filter.AbstractAuthorizationFilter.doFilter(AbstractAuthorizationFilter.java:60), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206), org.bonitasoft.console.common.server.login.filter.AbstractAuthorizationFilter.doFilter(AbstractAuthorizationFilter.java:60), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206), org.bonitasoft.console.common.server.sso.filter.AuthenticationFilter.checkExistingSessionOrFiltering(AuthenticationFilter.java:262), org.bonitasoft.console.common.server.sso.filter.AuthenticationFilter.checkExistingSessionOrFilteringAndManageException(AuthenticationFilter.java:144), org.bonitasoft.console.common.server.sso.filter.AuthenticationFilter.doFilter(AuthenticationFilter.java:120), org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235), org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206), org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233), org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191), org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127), org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103), org.bonitasoft.console.security.SessionFixationValve.invoke(SessionFixationValve.java:77), org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109), org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293), org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861), org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606), org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489), java.lang.Thread.run(Thread.java:695)]" cause: { exception: "class java.lang.UnsupportedOperationException" message: "Canno't create converter for class name : org.bonitasoft.person.VitalStats" stacktrace: [35] 0: "org.bonitasoft.web.rest.server.framework.utils.converter.ConverterFactory.createConverter(ConverterFactory.java:46)" 1: "org.bonitasoft.web.rest.server.framework.utils.converter.TypeConverter.convert(TypeConverter.java:41)" 2: "org.bonitasoft.web.rest.server.datastore.bpm.cases.CaseVariableDatastore.updateVariableValue(CaseVariableDatastore.java:79)" 3: "org.bonitasoft.web.rest.server.api.bpm.cases.APICaseVariable.runUpdate(APICaseVariable.java:40)" 4: "org.bonitasoft.web.rest.server.api.bpm.cases.APICaseVariable.runUpdate(APICaseVariable.java:30)" 5: "org.bonitasoft.web.rest.server.framework.APIServletCall.doPut(APIServletCall.java:217)" 6: "org.bonitasoft.web.toolkit.server.servlet.ToolkitHttpServlet.doPut(ToolkitHttpServlet.java:193)" 7: "javax.servlet.http.HttpServlet.service(HttpServlet.java:646)" 8: "org.bonitasoft.web.toolkit.server.servlet.ToolkitHttpServlet.service(ToolkitHttpServlet.java:75)" 9: "javax.servlet.http.HttpServlet.service(HttpServlet.java:723)" 10: "org.bonitasoft.web.toolkit.server.servlet.ToolkitHttpServlet.service(ToolkitHttpServlet.java:226)" 11: "org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)" 12: "org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)" 13: "org.bonitasoft.console.common.server.login.filter.AbstractAuthorizationFilter.doFilter(AbstractAuthorizationFilter.java:60)" 14: "org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)" 15: "org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)" 16: "org.bonitasoft.console.common.server.login.filter.AbstractAuthorizationFilter.doFilter(AbstractAuthorizationFilter.java:60)" 17: "org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)" 18: "org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)" 19: "org.bonitasoft.console.common.server.sso.filter.AuthenticationFilter.checkExistingSessionOrFiltering(AuthenticationFilter.java:262)" 20: "org.bonitasoft.console.common.server.sso.filter.AuthenticationFilter.checkExistingSessionOrFilteringAndManageException(AuthenticationFilter.java:144)" 21: "org.bonitasoft.console.common.server.sso.filter.AuthenticationFilter.doFilter(AuthenticationFilter.java:120)" 22: "org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)" 23: "org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)" 24: "org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)" 25: "org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)" 26: "org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)" 27: "org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)" 28: "org.bonitasoft.console.security.SessionFixationValve.invoke(SessionFixationValve.java:77)" 29: "org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)" 30: "org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)" 31: "org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)" 32: "org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)" 33: "org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)" 34: "java.lang.Thread.run(Thread.java:695)"

From this error it appears that Bonita cannot deserialize the string I sent back into the datatype variable.

I can think of ways around this. I could create a string variable and send some JSON or XML to bonita and then parse the string into a JSON/XML DOM object and then back into the datatype variable myself using a Java connector but that seems like a lot of work simply to get data into Bonita.

I don't have these issues if I simply try to set a primitive but then I would potentially need a large number of primitive variables rather than creating one datatype variable with all of the fields that I need.

If you have any advice or experience with this please feel free to share.

No answers yet.
Notifications