Completed
Push — middleware-wip ( 5cfd03...f2f782 )
by Romain
05:53
created

ConditionTree   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 103
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 0
Metric Value
wmc 11
lcom 1
cbo 1
dl 0
loc 103
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 7 2
A alongNodes() 0 4 1
A injectDependencies() 0 15 3
A getCssConditions() 0 4 1
A getJavaScriptConditions() 0 4 1
A getPhpResult() 0 4 1
A getValidationResult() 0 4 1
A __wakeup() 0 4 1
1
<?php
2
/*
3
 * 2017 Romain CANON <[email protected]>
4
 *
5
 * This file is part of the TYPO3 FormZ project.
6
 * It is free software; you can redistribute it and/or modify it
7
 * under the terms of the GNU General Public License, either
8
 * version 3 of the License, or any later version.
9
 *
10
 * For the full copyright and license information, see:
11
 * http://www.gnu.org/licenses/gpl-3.0.html
12
 */
13
14
namespace Romm\Formz\Condition\Parser\Tree;
15
16
use Romm\Formz\Condition\Parser\Node\ActivationDependencyAwareInterface;
17
use Romm\Formz\Condition\Parser\Node\NodeInterface;
18
use Romm\Formz\Condition\Processor\ConditionProcessor;
19
use Romm\Formz\Condition\Processor\DataObject\PhpConditionDataObject;
20
use Romm\Formz\Form\Definition\Field\Activation\ActivationInterface;
21
use TYPO3\CMS\Extbase\Error\Result;
22
23
/**
24
 * Tree built with instances of `NodeInterface` that represents a condition
25
 * instance.
26
 *
27
 * It can be used to get CSS, JavaScript or PHP results of the condition.
28
 */
29
class ConditionTree
30
{
31
    /**
32
     * @var NodeInterface
33
     */
34
    private $rootNode;
35
36
    /**
37
     * @var Result
38
     */
39
    private $validationResult;
40
41
    /**
42
     * @var bool
43
     */
44
    private $dependenciesWereInjected = false;
45
46
    /**
47
     * @param NodeInterface $rootNode
48
     * @param Result        $validationResult
49
     */
50
    public function __construct(NodeInterface $rootNode, Result $validationResult = null)
51
    {
52
        $this->rootNode = $rootNode;
53
        $this->validationResult = $validationResult ?: new Result;
54
55
        $this->rootNode->setTree($this);
56
    }
57
58
    /**
59
     * Allows to go through all the nodes and sub-nodes of the tree. The
60
     * callback is called for every node, with a unique argument: the node
61
     * instance.
62
     *
63
     * @param callable $callback
64
     */
65
    public function alongNodes(callable $callback)
66
    {
67
        $this->rootNode->along($callback);
68
    }
69
70
    /**
71
     * @param ConditionProcessor  $conditionProcessor
72
     * @param ActivationInterface $activation
73
     * @return $this
74
     */
75
    public function injectDependencies(ConditionProcessor $conditionProcessor, ActivationInterface $activation)
76
    {
77
        if (false === $this->dependenciesWereInjected) {
78
            $this->dependenciesWereInjected = true;
79
80
            // Looping on nodes to detect which ones have a dependency to the activation.
81
            $this->alongNodes(function (NodeInterface $node) use ($conditionProcessor, $activation) {
82
                if ($node instanceof ActivationDependencyAwareInterface) {
83
                    $node->injectDependencies($conditionProcessor, $activation);
84
                }
85
            });
86
        }
87
88
        return $this;
89
    }
90
91
    /**
92
     * @return array
93
     */
94
    public function getCssConditions()
95
    {
96
        return $this->rootNode->getCssResult();
97
    }
98
99
    /**
100
     * @return array
101
     */
102
    public function getJavaScriptConditions()
103
    {
104
        return $this->rootNode->getJavaScriptResult();
105
    }
106
107
    /**
108
     * @param PhpConditionDataObject $dataObject
109
     * @return bool
110
     */
111
    public function getPhpResult(PhpConditionDataObject $dataObject)
112
    {
113
        return $this->rootNode->getPhpResult($dataObject);
114
    }
115
116
    /**
117
     * @return Result
118
     */
119
    public function getValidationResult()
120
    {
121
        return $this->validationResult;
122
    }
123
124
    /**
125
     * Resetting the dependencies injection.
126
     */
127
    public function __wakeup()
128
    {
129
        $this->dependenciesWereInjected = false;
130
    }
131
}
132