Completed
Push — feature/version-2 ( a1aace...47461d )
by Romain
03:02
created

Activation   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 130
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 0
Metric Value
wmc 12
lcom 1
cbo 6
dl 0
loc 130
rs 10
c 0
b 0
f 0

8 Methods

Rating   Name   Duplication   Size   Complexity  
A getExpression() 0 4 1
A setExpression() 0 6 1
A getConditions() 0 4 1
A getAllConditions() 0 14 2
A hasCondition() 0 6 1
A getCondition() 0 10 2
A addCondition() 0 20 3
A getRootObject() 0 7 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\Form\Definition\Condition;
15
16
use Romm\Formz\Condition\ConditionFactory;
17
use Romm\Formz\Condition\Items\ConditionItemInterface;
18
use Romm\Formz\Exceptions\DuplicateEntryException;
19
use Romm\Formz\Exceptions\EntryNotFoundException;
20
use Romm\Formz\Form\Definition\AbstractFormDefinitionComponent;
21
use Romm\Formz\Form\Definition\FormDefinition;
22
use TYPO3\CMS\Core\Utility\ArrayUtility;
23
24
class Activation extends AbstractFormDefinitionComponent implements ActivationInterface
25
{
26
    /**
27
     * @var string
28
     * @validate NotEmpty
29
     */
30
    protected $expression;
31
32
    /**
33
     * @var \Romm\Formz\Condition\Items\ConditionItemInterface[]
34
     * @mixedTypesResolver \Romm\Formz\Form\Definition\Condition\ConditionItemResolver
35
     */
36
    protected $conditions = [];
37
38
    /**
39
     * @return string
40
     */
41
    public function getExpression()
42
    {
43
        return $this->expression;
44
    }
45
46
    /**
47
     * @param string $expression
48
     */
49
    public function setExpression($expression)
50
    {
51
        $this->checkDefinitionFreezeState();
52
53
        $this->expression = $expression;
54
    }
55
56
    /**
57
     * @return ConditionItemInterface[]
58
     */
59
    public function getConditions()
60
    {
61
        return $this->conditions;
62
    }
63
64
    /**
65
     * Returns the merged list of the conditions of this object and the
66
     * conditions of the parent form.
67
     *
68
     * @return ConditionItemInterface[]
69
     */
70
    public function getAllConditions()
71
    {
72
        $conditionList = $this->withFirstParent(
73
            FormDefinition::class,
74
            function (FormDefinition $formConfiguration) {
75
                return $formConfiguration->getConditionList();
76
            }
77
        );
78
79
        $conditionList = ($conditionList) ?: [];
80
        ArrayUtility::mergeRecursiveWithOverrule($conditionList, $this->conditions);
81
82
        return $conditionList;
83
    }
84
85
    /**
86
     * @param string $name Name of the condition.
87
     * @return bool
88
     */
89
    public function hasCondition($name)
90
    {
91
        $conditions = $this->getAllConditions();
92
93
        return true === isset($conditions[$name]);
94
    }
95
96
    /**
97
     * Return the condition with the given name.
98
     *
99
     * @param string $name Name of the item.
100
     * @return ConditionItemInterface
101
     * @throws EntryNotFoundException
102
     */
103
    public function getCondition($name)
104
    {
105
        if (false === $this->hasCondition($name)) {
106
            throw EntryNotFoundException::activationConditionNotFound($name);
107
        }
108
109
        $items = $this->getAllConditions();
110
111
        return $items[$name];
112
    }
113
114
    /**
115
     * @param string $name
116
     * @param string $identifier
117
     * @param array  $arguments
118
     * @return ConditionItemInterface
119
     * @throws DuplicateEntryException
120
     * @throws EntryNotFoundException
121
     */
122
    public function addCondition($name, $identifier, $arguments = [])
123
    {
124
        $this->checkDefinitionFreezeState();
125
126
        if (true === isset($this->conditions[$name])) {
127
            throw DuplicateEntryException::activationConditionAlreadyAdded($name);
128
        }
129
130
        $conditionFactory = ConditionFactory::get();
131
132
        if (false === $conditionFactory->hasCondition($identifier)) {
133
            throw EntryNotFoundException::activationAddConditionNotFound($identifier, $conditionFactory->getConditions());
134
        }
135
136
        $condition = $conditionFactory->instantiateCondition($identifier, $arguments);
137
        $condition->attachParent($this);
138
        $this->conditions[$name] = $condition;
139
140
        return $condition;
141
    }
142
143
    /**
144
     * @return ActivationUsageInterface
145
     */
146
    public function getRootObject()
147
    {
148
        /** @var ActivationUsageInterface $rootObject */
149
        $rootObject = $this->getFirstParent(ActivationUsageInterface::class);
150
151
        return $rootObject;
152
    }
153
}
154