Skip to content

Commit 5386fc4

Browse files
engalarengalar
authored andcommitted
feat: support full user targeting on workflow USER TASK (fixes #169)
Parser now reads both legacy UserSource and current UserTargeting BSON fields, recognizing all five $Type variants: MicroflowUserTargeting, XPathUserTargeting, MicroflowGroupTargeting, XPathGroupTargeting, and NoUserTargeting. MDL syntax extended with optional USERS/GROUPS modifier: TARGETING [USERS|GROUPS] MICROFLOW/XPATH.
1 parent 1b86f6c commit 5386fc4

19 files changed

+7036
-6685
lines changed

cmd/mxcli/lsp_completions_gen.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mdl/ast/ast_workflow.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,11 @@ type WorkflowUserTaskNode struct {
5656
func (n *WorkflowUserTaskNode) workflowActivityNode() {}
5757

5858
// WorkflowTargetingNode represents user targeting strategy.
59+
// Kind: "microflow", "xpath", "group_microflow", "group_xpath", or ""
5960
type WorkflowTargetingNode struct {
60-
Kind string // "microflow", "xpath", or ""
61-
Microflow QualifiedName // for microflow targeting
62-
XPath string // for xpath targeting
61+
Kind string // "microflow", "xpath", "group_microflow", "group_xpath", or ""
62+
Microflow QualifiedName // for microflow targeting (user or group)
63+
XPath string // for xpath targeting (user or group)
6364
}
6465

6566
// WorkflowUserTaskOutcomeNode represents an outcome of a user task.

mdl/executor/cmd_workflows.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,14 @@ func formatUserTask(a *workflows.UserTask, indent string) []string {
431431
if us.XPath != "" {
432432
lines = append(lines, fmt.Sprintf("%s TARGETING XPATH '%s'", indent, us.XPath))
433433
}
434+
case *workflows.MicroflowGroupSource:
435+
if us.Microflow != "" {
436+
lines = append(lines, fmt.Sprintf("%s TARGETING GROUPS MICROFLOW %s", indent, us.Microflow))
437+
}
438+
case *workflows.XPathGroupSource:
439+
if us.XPath != "" {
440+
lines = append(lines, fmt.Sprintf("%s TARGETING GROUPS XPATH '%s'", indent, us.XPath))
441+
}
434442
}
435443
}
436444

mdl/executor/cmd_workflows_write.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,14 @@ func buildUserTask(n *ast.WorkflowUserTaskNode) *workflows.UserTask {
250250
task.UserSource = &workflows.XPathBasedUserSource{
251251
XPath: n.Targeting.XPath,
252252
}
253+
case "group_microflow":
254+
task.UserSource = &workflows.MicroflowGroupSource{
255+
Microflow: n.Targeting.Microflow.Module + "." + n.Targeting.Microflow.Name,
256+
}
257+
case "group_xpath":
258+
task.UserSource = &workflows.XPathGroupSource{
259+
XPath: n.Targeting.XPath,
260+
}
253261
}
254262

255263
// Outcomes

mdl/grammar/MDLLexer.g4

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,7 @@ ACTIVITY: A C T I V I T Y;
650650
CONDITION: C O N D I T I O N;
651651
OFF: O F F;
652652
USERS: U S E R S;
653+
GROUPS: G R O U P S;
653654

654655
// Workflow microflow action tokens
655656
DATA: D A T A;

mdl/grammar/MDLParser.g4

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2698,17 +2698,17 @@ workflowActivityStmt
26982698
workflowUserTaskStmt
26992699
: USER TASK IDENTIFIER STRING_LITERAL
27002700
(PAGE qualifiedName)?
2701-
(TARGETING MICROFLOW qualifiedName)?
2702-
(TARGETING XPATH STRING_LITERAL)?
2701+
(TARGETING (USERS | GROUPS)? MICROFLOW qualifiedName)?
2702+
(TARGETING (USERS | GROUPS)? XPATH STRING_LITERAL)?
27032703
(ENTITY qualifiedName)?
27042704
(DUE DATE_TYPE STRING_LITERAL)?
27052705
(DESCRIPTION STRING_LITERAL)?
27062706
(OUTCOMES workflowUserTaskOutcome+)?
27072707
(BOUNDARY EVENT workflowBoundaryEventClause+)?
27082708
| MULTI USER TASK IDENTIFIER STRING_LITERAL
27092709
(PAGE qualifiedName)?
2710-
(TARGETING MICROFLOW qualifiedName)?
2711-
(TARGETING XPATH STRING_LITERAL)?
2710+
(TARGETING (USERS | GROUPS)? MICROFLOW qualifiedName)?
2711+
(TARGETING (USERS | GROUPS)? XPATH STRING_LITERAL)?
27122712
(ENTITY qualifiedName)?
27132713
(DUE DATE_TYPE STRING_LITERAL)?
27142714
(DESCRIPTION STRING_LITERAL)?

mdl/grammar/parser/MDLLexer.interp

Lines changed: 4 additions & 1 deletion
Large diffs are not rendered by default.

mdl/grammar/parser/MDLLexer.tokens

Lines changed: 77 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -505,79 +505,80 @@ ACTIVITY=504
505505
CONDITION=505
506506
OFF=506
507507
USERS=507
508-
DATA=508
509-
RECORDS=509
510-
NOTIFY=510
511-
PAUSE=511
512-
UNPAUSE=512
513-
ABORT=513
514-
RETRY=514
515-
RESTART=515
516-
LOCK=516
517-
UNLOCK=517
518-
REASON=518
519-
OPEN=519
520-
COMPLETE_TASK=520
521-
NOT_EQUALS=521
522-
LESS_THAN_OR_EQUAL=522
523-
GREATER_THAN_OR_EQUAL=523
524-
EQUALS=524
525-
LESS_THAN=525
526-
GREATER_THAN=526
527-
PLUS=527
528-
MINUS=528
529-
STAR=529
530-
SLASH=530
531-
PERCENT=531
532-
MOD=532
533-
DIV=533
534-
SEMICOLON=534
535-
COMMA=535
536-
DOT=536
537-
LPAREN=537
538-
RPAREN=538
539-
LBRACE=539
540-
RBRACE=540
541-
LBRACKET=541
542-
RBRACKET=542
543-
COLON=543
544-
AT=544
545-
PIPE=545
546-
DOUBLE_COLON=546
547-
ARROW=547
548-
QUESTION=548
549-
HASH=549
550-
MENDIX_TOKEN=550
551-
STRING_LITERAL=551
552-
DOLLAR_STRING=552
553-
NUMBER_LITERAL=553
554-
VARIABLE=554
555-
IDENTIFIER=555
556-
HYPHENATED_ID=556
557-
QUOTED_IDENTIFIER=557
558-
'<='=522
559-
'>='=523
560-
'='=524
561-
'<'=525
562-
'>'=526
563-
'+'=527
564-
'-'=528
565-
'*'=529
566-
'/'=530
567-
'%'=531
568-
';'=534
569-
','=535
570-
'.'=536
571-
'('=537
572-
')'=538
573-
'{'=539
574-
'}'=540
575-
'['=541
576-
']'=542
577-
':'=543
578-
'@'=544
579-
'|'=545
580-
'::'=546
581-
'->'=547
582-
'?'=548
583-
'#'=549
508+
GROUPS=508
509+
DATA=509
510+
RECORDS=510
511+
NOTIFY=511
512+
PAUSE=512
513+
UNPAUSE=513
514+
ABORT=514
515+
RETRY=515
516+
RESTART=516
517+
LOCK=517
518+
UNLOCK=518
519+
REASON=519
520+
OPEN=520
521+
COMPLETE_TASK=521
522+
NOT_EQUALS=522
523+
LESS_THAN_OR_EQUAL=523
524+
GREATER_THAN_OR_EQUAL=524
525+
EQUALS=525
526+
LESS_THAN=526
527+
GREATER_THAN=527
528+
PLUS=528
529+
MINUS=529
530+
STAR=530
531+
SLASH=531
532+
PERCENT=532
533+
MOD=533
534+
DIV=534
535+
SEMICOLON=535
536+
COMMA=536
537+
DOT=537
538+
LPAREN=538
539+
RPAREN=539
540+
LBRACE=540
541+
RBRACE=541
542+
LBRACKET=542
543+
RBRACKET=543
544+
COLON=544
545+
AT=545
546+
PIPE=546
547+
DOUBLE_COLON=547
548+
ARROW=548
549+
QUESTION=549
550+
HASH=550
551+
MENDIX_TOKEN=551
552+
STRING_LITERAL=552
553+
DOLLAR_STRING=553
554+
NUMBER_LITERAL=554
555+
VARIABLE=555
556+
IDENTIFIER=556
557+
HYPHENATED_ID=557
558+
QUOTED_IDENTIFIER=558
559+
'<='=523
560+
'>='=524
561+
'='=525
562+
'<'=526
563+
'>'=527
564+
'+'=528
565+
'-'=529
566+
'*'=530
567+
'/'=531
568+
'%'=532
569+
';'=535
570+
','=536
571+
'.'=537
572+
'('=538
573+
')'=539
574+
'{'=540
575+
'}'=541
576+
'['=542
577+
']'=543
578+
':'=544
579+
'@'=545
580+
'|'=546
581+
'::'=547
582+
'->'=548
583+
'?'=549
584+
'#'=550

mdl/grammar/parser/MDLParser.interp

Lines changed: 3 additions & 1 deletion
Large diffs are not rendered by default.

mdl/grammar/parser/MDLParser.tokens

Lines changed: 77 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -505,79 +505,80 @@ ACTIVITY=504
505505
CONDITION=505
506506
OFF=506
507507
USERS=507
508-
DATA=508
509-
RECORDS=509
510-
NOTIFY=510
511-
PAUSE=511
512-
UNPAUSE=512
513-
ABORT=513
514-
RETRY=514
515-
RESTART=515
516-
LOCK=516
517-
UNLOCK=517
518-
REASON=518
519-
OPEN=519
520-
COMPLETE_TASK=520
521-
NOT_EQUALS=521
522-
LESS_THAN_OR_EQUAL=522
523-
GREATER_THAN_OR_EQUAL=523
524-
EQUALS=524
525-
LESS_THAN=525
526-
GREATER_THAN=526
527-
PLUS=527
528-
MINUS=528
529-
STAR=529
530-
SLASH=530
531-
PERCENT=531
532-
MOD=532
533-
DIV=533
534-
SEMICOLON=534
535-
COMMA=535
536-
DOT=536
537-
LPAREN=537
538-
RPAREN=538
539-
LBRACE=539
540-
RBRACE=540
541-
LBRACKET=541
542-
RBRACKET=542
543-
COLON=543
544-
AT=544
545-
PIPE=545
546-
DOUBLE_COLON=546
547-
ARROW=547
548-
QUESTION=548
549-
HASH=549
550-
MENDIX_TOKEN=550
551-
STRING_LITERAL=551
552-
DOLLAR_STRING=552
553-
NUMBER_LITERAL=553
554-
VARIABLE=554
555-
IDENTIFIER=555
556-
HYPHENATED_ID=556
557-
QUOTED_IDENTIFIER=557
558-
'<='=522
559-
'>='=523
560-
'='=524
561-
'<'=525
562-
'>'=526
563-
'+'=527
564-
'-'=528
565-
'*'=529
566-
'/'=530
567-
'%'=531
568-
';'=534
569-
','=535
570-
'.'=536
571-
'('=537
572-
')'=538
573-
'{'=539
574-
'}'=540
575-
'['=541
576-
']'=542
577-
':'=543
578-
'@'=544
579-
'|'=545
580-
'::'=546
581-
'->'=547
582-
'?'=548
583-
'#'=549
508+
GROUPS=508
509+
DATA=509
510+
RECORDS=510
511+
NOTIFY=511
512+
PAUSE=512
513+
UNPAUSE=513
514+
ABORT=514
515+
RETRY=515
516+
RESTART=516
517+
LOCK=517
518+
UNLOCK=518
519+
REASON=519
520+
OPEN=520
521+
COMPLETE_TASK=521
522+
NOT_EQUALS=522
523+
LESS_THAN_OR_EQUAL=523
524+
GREATER_THAN_OR_EQUAL=524
525+
EQUALS=525
526+
LESS_THAN=526
527+
GREATER_THAN=527
528+
PLUS=528
529+
MINUS=529
530+
STAR=530
531+
SLASH=531
532+
PERCENT=532
533+
MOD=533
534+
DIV=534
535+
SEMICOLON=535
536+
COMMA=536
537+
DOT=537
538+
LPAREN=538
539+
RPAREN=539
540+
LBRACE=540
541+
RBRACE=541
542+
LBRACKET=542
543+
RBRACKET=543
544+
COLON=544
545+
AT=545
546+
PIPE=546
547+
DOUBLE_COLON=547
548+
ARROW=548
549+
QUESTION=549
550+
HASH=550
551+
MENDIX_TOKEN=551
552+
STRING_LITERAL=552
553+
DOLLAR_STRING=553
554+
NUMBER_LITERAL=554
555+
VARIABLE=555
556+
IDENTIFIER=556
557+
HYPHENATED_ID=557
558+
QUOTED_IDENTIFIER=558
559+
'<='=523
560+
'>='=524
561+
'='=525
562+
'<'=526
563+
'>'=527
564+
'+'=528
565+
'-'=529
566+
'*'=530
567+
'/'=531
568+
'%'=532
569+
';'=535
570+
','=536
571+
'.'=537
572+
'('=538
573+
')'=539
574+
'{'=540
575+
'}'=541
576+
'['=542
577+
']'=543
578+
':'=544
579+
'@'=545
580+
'|'=546
581+
'::'=547
582+
'->'=548
583+
'?'=549
584+
'#'=550

0 commit comments

Comments
 (0)