forked from ProcessMaker/processmaker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBPMNValidation.php
More file actions
89 lines (78 loc) · 1.94 KB
/
BPMNValidation.php
File metadata and controls
89 lines (78 loc) · 1.94 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
namespace ProcessMaker\Rules;
use DOMXPath;
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Support\Facades\Validator;
use ProcessMaker\Nayra\Storage\BpmnElement;
use ProcessMaker\Rules\BPMN\AssignPreviousUser;
class BPMNValidation implements Rule
{
protected $rules = [
AssignPreviousUser::class,
];
/** @var \Illuminate\Support\MessageBag */
protected $errors = [];
/**
* Create a new rule instance.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $document
* @return bool
*/
public function passes($attribute, $document)
{
$nodes = [];
$rules = [];
$xpath = new DOMXPath($document);
$childNodes = $xpath->query('//*[@id]');
foreach ($childNodes as $node) {
if ($node instanceof BpmnElement) {
$nodes[$node->getAttribute('id')] = $node;
$rules = $this->addRulesFor($node, $rules);
}
}
$validator = Validator::make($nodes, $rules);
$passes = $validator->passes();
$this->errors = $validator->errors();
return $passes;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'BPMN Validation failed';
}
public function errors($attribute, $document)
{
return $this->errors;
}
/**
* Add rule for BPMN element $node
*
* @param BpmnElement $node
* @param array $rules
*
* @return array
*/
private function addRulesFor(BpmnElement $node, array $rules)
{
foreach ($this->rules as $rule) {
if ($rule::applyTo($node)) {
$rules[$node->getAttribute('id')][] = new $rule;
}
}
return $rules;
}
}