Can CMMN diagram elements by accessed from a CmmnModelInstance?

I’m trying to write some code that runs just before a Case Definition is deployed using the repository service.

I’m trying to make some changes to the CMMN Diagram before deployment happens. I’ve got hold of a CmmnModelInstance, and I thought I’d be able to do something like:

Collection shapesInModel = cmmnModelInstance.getModelElementsByType(Shape.class);

This code is returning a NullPointerException at runtime, though. Are the Diagram elements referencable from the CmmnModelInstance? If so, how can this be done?

Hi Scott,

Could you share the entire stack trace?

However, currently it is not possible to (easily) access the DI elements of a CMMN diagram by using cmmn-model-api.

Cheers,
Roman

Thanks for the reply, Roman. I will share the stacktrace below.

It looks like the CmmnModelInstance retains a collection of ModelElementTypes that can be retrieved from the CMMN model. Since the DI elements are not included in that collection an attempt to retrieve them using “getModelElementsByType” ends up throwing a NullPointerException.

2016-11-21 09:22:02,271 [http-nio-8080-exec-1] ERROR c.k.h.s.m.HydraGenericExceptionControllerAdvice Tenant=verint : Unhandled Exception
java.lang.NullPointerException: null
	at org.camunda.bpm.model.xml.impl.ModelInstanceImpl.getModelElementsByType(ModelInstanceImpl.java:112)
	at org.camunda.bpm.model.xml.impl.ModelInstanceImpl.getModelElementsByType(ModelInstanceImpl.java:125)
	at com.verint.bassworkflow.service.casedefinitionservice.transformer.StageCompletionTaskTransformer.findShapeForCmmnElementRef(StageCompletionTaskTransformer.java:110)
	at com.verint.bassworkflow.service.casedefinitionservice.transformer.StageCompletionTaskTransformer.getParentStageBounds(StageCompletionTaskTransformer.java:105)
	at com.verint.bassworkflow.service.casedefinitionservice.transformer.StageCompletionTaskTransformer.determineNewEdgeStartCoordinates(StageCompletionTaskTransformer.java:88)
	at com.verint.bassworkflow.service.casedefinitionservice.transformer.StageCompletionTaskTransformer.moveCompletionTransitionOnDiagram(StageCompletionTaskTransformer.java:49)
	at com.verint.bassworkflow.service.casedefinitionservice.transformer.StageCompletionTaskTransformer.transform(StageCompletionTaskTransformer.java:39)
	at com.verint.bassworkflow.service.casedefinitionservice.transformer.CmmnTransformer.transform(CmmnTransformer.java:16)
	at com.verint.bassworkflow.service.casedefinitionservice.CamundaCaseDefinitionService.createCaseDefinition(CamundaCaseDefinitionService.java:75)
	at com.verint.bassworkflow.service.casedefinitionservice.CamundaCaseDefinitionService.createCaseDefinition(CamundaCaseDefinitionService.java:68)
	at com.verint.bassworkflow.controller.CaseDefinitionController.uploadCaseDefinition(CaseDefinitionController.java:63)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:817)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:731)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:968)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:870)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:844)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(ShallowEtagHeaderFilter.java:87)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at com.kana.hydra.spring.mvc.HydraRepeatableBodyServletFilter.doFilterInternal(HydraRepeatableBodyServletFilter.java:25)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at com.kana.hydra.spring.mvc.HydraArgumentsServletFilter.doFilterInternal(HydraArgumentsServletFilter.java:23)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)

Hi Scott,

Thanks for stack trace.

Your observation is correct, since the class Shape is not part of the supported ModelElementTypes a NullPointerException is thrown, which is not very nice, but you would still not retrieve any shape elements.

As an alternative you could try to retrieve the shape elements from the underlying DOM. The underlying DOM can be retrieved by cmmnModelInstance.getDocument().

However, I created a feature request to read/write CMMN DI elements, see 1.

Cheers,
Roman

Thanks Roman, I ended up going with the DOM approach yesterday, and I’ve been able to make the required changes to my diagram that way.

It’s not quite as nice as having a first class API to interact with these elements, but it was a decent fallback. I’d give a +1 to that feature request!

Thanks again for your help.