1010import java .lang .reflect .Constructor ;
1111import java .lang .reflect .InvocationTargetException ;
1212import java .lang .reflect .Method ;
13- import java .lang .reflect .Modifier ;
1413import java .util .ArrayList ;
15- import java .util .Arrays ;
16- import java .util .HashMap ;
1714import java .util .List ;
1815import java .util .Map ;
1916import java .util .Optional ;
20- import java .util .function .BiConsumer ;
2117import java .util .function .Predicate ;
2218import java .util .stream .Collectors ;
2319
@@ -58,7 +54,8 @@ public static void loadResources()
5854 ProcessPluginDefinition definition = new TutorialProcessPluginDefinition ();
5955 ProcessPluginImpl processPlugin = TestProcessPluginGenerator .generate (definition , false ,
6056 BpmnAndUserTaskListenerTest .class );
61- boolean initialized = processPlugin .initializeAndValidateResources (ConstantsTutorial .TUTORIAL_DIC_ORGANIZATION_IDENTIFIER );
57+ boolean initialized = processPlugin
58+ .initializeAndValidateResources (ConstantsTutorial .TUTORIAL_DIC_ORGANIZATION_IDENTIFIER );
6259
6360 assertEquals (true , initialized );
6461 }
@@ -70,8 +67,8 @@ public void testVoteBpmnFile()
7067 String processId = "dsfdev_vote" ;
7168 String questionnaireUrl = "http://dsf.dev/fhir/Questionnaire/user-vote|#{version}" ;
7269
73- BpmnModelInstance model = Bpmn . readModelFromStream (
74- this .getClass ().getClassLoader ().getResourceAsStream (filename ));
70+ BpmnModelInstance model = Bpmn
71+ . readModelFromStream ( this .getClass ().getClassLoader ().getResourceAsStream (filename ));
7572 assertNotNull (model );
7673
7774 List <Process > processes = model .getModelElementsByType (Process .class ).stream ()
@@ -84,54 +81,73 @@ public void testVoteBpmnFile()
8481 int userTaskCount = process .getChildElementsByType (UserTask .class ).size ();
8582 assertTrue (errorMissingUserTask , userTaskCount > 0 );
8683
87- String errorMissingCorrectUserTask = "Process '" + processId + "' in file '" + filename + " is missing User Task with incoming flow from exclusive gateway with name 'User Vote?' and outgoing flow to service task with name 'Save User Vote'" ;
84+ String errorMissingCorrectUserTask = "Process '" + processId + "' in file '" + filename
85+ + " is missing User Task with incoming flow from exclusive gateway with name 'User Vote?' and outgoing flow to service task with name 'Save User Vote'" ;
8886 Optional <UserTask > optUserTask = process .getChildElementsByType (UserTask .class ).stream ()
89- .filter (userTask -> userTask .getIncoming ().stream ().anyMatch (isFlowConnectingUserTaskAndExclusiveGateway (userTask )))
90- .filter (userTask -> userTask .getOutgoing ().stream ().anyMatch (isFlowConnectingUserTaskAndSaveUserVoteServer (userTask ))).findFirst ();
87+ .filter (userTask -> userTask .getIncoming ().stream ()
88+ .anyMatch (isFlowConnectingUserTaskAndExclusiveGateway (userTask )))
89+ .filter (userTask -> userTask .getOutgoing ().stream ()
90+ .anyMatch (isFlowConnectingUserTaskAndSaveUserVoteServer (userTask )))
91+ .findFirst ();
9192 assertTrue (errorMissingCorrectUserTask , optUserTask .isPresent ());
9293 UserTask userTask = optUserTask .get ();
9394
94- String errorUserTaskIncomingFlowMissingCondition =
95- "User Task in process '" + processId + "' in file '" + filename + " with name " + userTask .getOutgoing ()
96- + " is missing condition expression '${userVote}' on incoming flow from exclusive gateway with name 'User Vote?'" ;
95+ String errorUserTaskIncomingFlowMissingCondition = "User Task in process '" + processId + "' in file '"
96+ + filename + " with name " + userTask .getOutgoing ()
97+ + " is missing condition expression '${userVote}' on incoming flow from exclusive gateway with name 'User Vote?'" ;
9798 assertTrue (errorUserTaskIncomingFlowMissingCondition ,
98- userTask .getIncoming ().stream ().filter (isFlowConnectingUserTaskAndExclusiveGateway (userTask )).allMatch (hasCorrectConditionExpression ()));
99+ userTask .getIncoming ().stream ().filter (isFlowConnectingUserTaskAndExclusiveGateway (userTask ))
100+ .allMatch (hasCorrectConditionExpression ()));
99101
100- String errorUserTaskIsMissingCorrectFormKey =
101- "User Task in process '" + processId + "' in file '" + filename + " with name " + userTask .getOutgoing ()
102- + " is missing Form Key with value " + questionnaireUrl ;
102+ String errorUserTaskIsMissingCorrectFormKey = "User Task in process '" + processId + "' in file '" + filename
103+ + " with name " + userTask .getOutgoing () + " is missing Form Key with value " + questionnaireUrl ;
103104 assertEquals (errorUserTaskIsMissingCorrectFormKey , userTask .getCamundaFormKey (), questionnaireUrl );
104105
105106 String packageName = "dev.dsf.process.tutorial.listener" ;
106- String errorNoUserTaskListenerFound =
107- "No class extending DefaultUserTaskListener found in package '" + packageName + "'. Unable to verify if User Task has correct Task Listener set." ;
107+ String errorNoUserTaskListenerFound = "No class extending DefaultUserTaskListener found in package '"
108+ + packageName + "'. Unable to verify if User Task has correct Task Listener set." ;
108109 List <Class <? extends DefaultUserTaskListener >> userTaskListeners = Utils .getUserTaskListeners (packageName );
109110 assertTrue (errorNoUserTaskListenerFound , !userTaskListeners .isEmpty ());
110111
111- String errorUserTaskIsMissingTaskListener =
112- "User Task in process '" + processId + "' in file '" + filename + " with name " + userTask .getOutgoing ()
113- + " is missing at least one Task Listener which extends DefaultUserTaskListener. Found classes to add which extend DefaultUserTaskListener: " + userTaskListeners .stream ().map (Class ::getSimpleName ).reduce ("" , (i , next ) -> i + next + " " );
114- List <CamundaTaskListener > camundaTaskListeners = userTask .getExtensionElements ().getElements ().stream ()
115- .filter (extensionElement -> extensionElement instanceof CamundaTaskListener )
112+ String errorUserTaskIsMissingTaskListener = "User Task in process '" + processId + "' in file '" + filename
113+ + " with name " + userTask .getOutgoing ()
114+ + " is missing at least one Task Listener which extends DefaultUserTaskListener. Found classes to add which extend DefaultUserTaskListener: "
115+ + userTaskListeners .stream ().map (Class ::getSimpleName ).reduce ("" , (i , next ) -> i + next + " " );
116+ List <CamundaTaskListener > camundaTaskListeners = userTask
117+ .getExtensionElements ().getElements ().stream ().filter (
118+ extensionElement -> extensionElement instanceof CamundaTaskListener )
116119 .map (extensionElement -> (CamundaTaskListener ) extensionElement )
117- .filter (camundaTaskListener -> userTaskListeners .stream ().anyMatch (userTaskListener -> userTaskListener .getName ().equals (camundaTaskListener .getAttributeValue ("class" ))))
120+ .filter (camundaTaskListener -> userTaskListeners .stream ().anyMatch (userTaskListener -> userTaskListener
121+ .getName ().equals (camundaTaskListener .getAttributeValue ("class" ))))
118122 .toList ();
119123 assertTrue (errorUserTaskIsMissingTaskListener , !camundaTaskListeners .isEmpty ());
120124
121- List <Class <? extends DefaultUserTaskListener >> userTaskListenersInUserTask = userTaskListeners .stream ().filter (userTaskListener -> camundaTaskListeners .stream ().anyMatch (camundaTaskListener -> camundaTaskListener .getAttributeValue ("class" ).equals (userTaskListener .getName ()))).toList ();
122- userTaskListenersInUserTask .forEach (userTaskListener -> assertEquals (Utils .errorMessageBeanMethod (userTaskListener ), 1 , Utils .countBeanMethods (userTaskListener )));
123-
124- Map <Class <? extends DefaultUserTaskListener >, List <String >> userTaskListenersWithErrors = userTaskListenersInUserTask .stream ().collect (Collectors .toMap (userTaskListener -> userTaskListener , this ::validateUserTaskListener ));
125-
126- String errorNoTaskListenerInUserTaskIsValid = "User Task in process '" + processId + "' in file '" + filename + " with name " + userTask .getOutgoing () + " is missing at least one valid UserTaskListener. Errors are: \n " ;
127- errorNoTaskListenerInUserTaskIsValid += userTaskListenersWithErrors .keySet ().stream ().map (key -> formatErrors (key , userTaskListenersWithErrors .get (key ))).collect (Collectors .joining ());
128-
129- assertTrue (errorNoTaskListenerInUserTaskIsValid , userTaskListenersWithErrors .keySet ().stream ().anyMatch (userTaskListener -> userTaskListenersWithErrors .get (userTaskListener ).isEmpty ()));
125+ List <Class <? extends DefaultUserTaskListener >> userTaskListenersInUserTask = userTaskListeners .stream ().filter (
126+ userTaskListener -> camundaTaskListeners .stream ().anyMatch (camundaTaskListener -> camundaTaskListener
127+ .getAttributeValue ("class" ).equals (userTaskListener .getName ())))
128+ .toList ();
129+ userTaskListenersInUserTask
130+ .forEach (userTaskListener -> assertEquals (Utils .errorMessageBeanMethod (userTaskListener ), 1 ,
131+ Utils .countBeanMethods (userTaskListener )));
132+
133+ Map <Class <? extends DefaultUserTaskListener >, List <String >> userTaskListenersWithErrors = userTaskListenersInUserTask
134+ .stream ()
135+ .collect (Collectors .toMap (userTaskListener -> userTaskListener , this ::validateUserTaskListener ));
136+
137+ String errorNoTaskListenerInUserTaskIsValid = "User Task in process '" + processId + "' in file '" + filename
138+ + " with name " + userTask .getOutgoing ()
139+ + " is missing at least one valid UserTaskListener. Errors are: \n " ;
140+ errorNoTaskListenerInUserTaskIsValid += userTaskListenersWithErrors .keySet ().stream ()
141+ .map (key -> formatErrors (key , userTaskListenersWithErrors .get (key ))).collect (Collectors .joining ());
142+
143+ assertTrue (errorNoTaskListenerInUserTaskIsValid , userTaskListenersWithErrors .keySet ().stream ()
144+ .anyMatch (userTaskListener -> userTaskListenersWithErrors .get (userTaskListener ).isEmpty ()));
130145 }
131146
132147 private Predicate <SequenceFlow > isFlowConnectingUserTaskAndExclusiveGateway (UserTask userTask )
133148 {
134- return flow -> flow .getTarget ().equals (userTask ) && flow .getSource () instanceof ExclusiveGateway && flow .getSource ().getName ().equals ("User Vote?" );
149+ return flow -> flow .getTarget ().equals (userTask ) && flow .getSource () instanceof ExclusiveGateway
150+ && flow .getSource ().getName ().equals ("User Vote?" );
135151 }
136152
137153 private Predicate <SequenceFlow > hasCorrectConditionExpression ()
@@ -141,15 +157,16 @@ private Predicate<SequenceFlow> hasCorrectConditionExpression()
141157
142158 private Predicate <SequenceFlow > isFlowConnectingUserTaskAndSaveUserVoteServer (UserTask userTask )
143159 {
144- return flow -> flow .getSource ().equals (userTask ) && flow .getTarget () instanceof ServiceTask && flow .getTarget ().getName ().equals ("Save User Vote" );
160+ return flow -> flow .getSource ().equals (userTask ) && flow .getTarget () instanceof ServiceTask
161+ && flow .getTarget ().getName ().equals ("Save User Vote" );
145162 }
146163
147164 private String formatErrors (Class <? extends DefaultUserTaskListener > userTaskListener , List <String > errors )
148165 {
149166 String formatted = "" ;
150167
151168 formatted += "Class: " + userTaskListener .getSimpleName () + "\n " ;
152- formatted += " Errors:\n " + errors .stream ().reduce ("" , (i , next ) -> i + " " + next + "\n " );
169+ formatted += " Errors:\n " + errors .stream ().reduce ("" , (i , next ) -> i + " " + next + "\n " );
153170
154171 return formatted ;
155172 }
@@ -162,24 +179,26 @@ private List<String> validateUserTaskListener(Class<? extends DefaultUserTaskLis
162179 List <String > errors = new ArrayList <>();
163180 try
164181 {
165- Constructor <? extends DefaultUserTaskListener > constructor = userTaskListenerClass . getConstructor (
166- ProcessPluginApi .class );
182+ Constructor <? extends DefaultUserTaskListener > constructor = userTaskListenerClass
183+ . getConstructor ( ProcessPluginApi .class );
167184
168185 ProcessPluginApi apiMock = Mockito .mock (ProcessPluginApi .class );
169186 TaskHelper taskHelperMock = Mockito .mock (TaskHelper .class );
170187 DelegateTask taskMock = Mockito .mock (DelegateTask .class );
171188 QuestionnaireResponse questionnaireResponseMock = Mockito .mock (QuestionnaireResponse .class );
172189 Variables variablesMock = Mockito .mock (Variables .class );
173190 Task startTaskMock = Mockito .mock (Task .class );
174- QuestionnaireResponse .QuestionnaireResponseItemComponent itemMock = Mockito .mock (QuestionnaireResponse .QuestionnaireResponseItemComponent .class );
191+ QuestionnaireResponse .QuestionnaireResponseItemComponent itemMock = Mockito
192+ .mock (QuestionnaireResponse .QuestionnaireResponseItemComponent .class );
175193
176194 String binaryQuestion = "test?" ;
177195
178196 Mockito .lenient ().when (apiMock .getVariables (any ())).thenReturn (variablesMock );
179197 Mockito .lenient ().when (apiMock .getTaskHelper ()).thenReturn (taskHelperMock );
180198 Mockito .lenient ().when (variablesMock .getStartTask ()).thenReturn (startTaskMock );
181- Mockito .lenient ().when (taskHelperMock .getFirstInputParameterStringValue (startTaskMock , CODESYSTEM_VOTING_PROCESS ,
182- CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION )).thenReturn (Optional .of (binaryQuestion ));
199+ Mockito .lenient ().when (taskHelperMock .getFirstInputParameterStringValue (startTaskMock ,
200+ CODESYSTEM_VOTING_PROCESS , CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION ))
201+ .thenReturn (Optional .of (binaryQuestion ));
183202 Mockito .lenient ().when (questionnaireResponseMock .getItem ()).thenReturn (List .of (itemMock ));
184203 Mockito .lenient ().when (itemMock .getLinkId ()).thenReturn (CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION );
185204 Mockito .lenient ().when (itemMock .getText ()).thenReturn ("foo" );
@@ -195,15 +214,21 @@ private List<String> validateUserTaskListener(Class<? extends DefaultUserTaskLis
195214 .filter (invocation -> invocation .getMethod ().getName ().equals ("getFirstInputParameterStringValue" ))
196215 .filter (invocation -> invocation .getArguments ()[0 ].equals (startTaskMock ))
197216 .filter (invocation -> invocation .getArguments ()[1 ].equals (CODESYSTEM_VOTING_PROCESS ))
198- .filter (invocation -> invocation .getArguments ()[2 ].equals (CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION ))
217+ .filter (invocation -> invocation .getArguments ()[2 ]
218+ .equals (CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION ))
199219 .findFirst ();
200- if (optionalInvocation .isEmpty ()) errors .add ("Expected one call to TaskHelper#getFirstInputParameterStringValue for Start Task and CodeSystem '" + CODESYSTEM_VOTING_PROCESS + "' and Code '" + CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION + "'" );
220+ if (optionalInvocation .isEmpty ())
221+ errors .add (
222+ "Expected one call to TaskHelper#getFirstInputParameterStringValue for Start Task and CodeSystem '"
223+ + CODESYSTEM_VOTING_PROCESS + "' and Code '"
224+ + CODESYSTEM_VOTING_PROCESS_VALUE_BINARY_QUESTION + "'" );
201225
202226 optionalInvocation = Mockito .mockingDetails (itemMock ).getInvocations ().stream ()
203227 .filter (invocation -> invocation .getMethod ().getName ().equals ("setText" ))
204- .filter (invocation -> invocation .getArguments ()[0 ].equals (binaryQuestion ))
205- .findFirst ();
206- if (optionalInvocation .isEmpty ()) errors .add ("Expected one call to QuestionnaireResponseItemComponent#setText for the QuestionnaireResponseItemComponent with linkId 'binary-question'" );
228+ .filter (invocation -> invocation .getArguments ()[0 ].equals (binaryQuestion )).findFirst ();
229+ if (optionalInvocation .isEmpty ())
230+ errors .add (
231+ "Expected one call to QuestionnaireResponseItemComponent#setText for the QuestionnaireResponseItemComponent with linkId 'binary-question'" );
207232 }
208233 catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException | InstantiationException e )
209234 {
0 commit comments