Passed
Pull Request — master (#175)
by
unknown
08:11
created

DocumentWorkflow::constructState()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 2
dl 0
loc 2
rs 10
c 0
b 0
f 0
1
<?php
2
namespace EWW\Dpf\Domain\Workflow;
3
4
/*
5
 * This file is part of the TYPO3 CMS project.
6
 *
7
 * It is free software; you can redistribute it and/or modify it under
8
 * the terms of the GNU General Public License, either version 2
9
 * of the License, or any later version.
10
 *
11
 * For the full copyright and license information, please read the
12
 * LICENSE.txt file that was distributed with this source code.
13
 *
14
 * The TYPO3 project - inspiring people to share!
15
 */
16
17
use Symfony\Component\Workflow\DefinitionBuilder;
18
use Symfony\Component\Workflow\MarkingStore\MethodMarkingStore;
19
use Symfony\Component\Workflow\Transition;
20
use Symfony\Component\Workflow\Workflow;
21
use Symfony\Component\Workflow\Registry;
22
23
class DocumentWorkflow
24
{
25
    const LOCAL_STATE_NONE          = 'NONE';
26
    const LOCAL_STATE_NEW           = 'NEW';
27
    const LOCAL_STATE_REGISTERED    = 'REGISTERED';
28
    const LOCAL_STATE_IN_PROGRESS   = 'IN_PROGRESS';
29
    const LOCAL_STATE_DISCARDED     = 'DISCARDED';
30
    const LOCAL_STATE_POSTPONED     = 'POSTPONED';
31
32
    const REMOTE_STATE_NONE         = 'NONE';
33
    const REMOTE_STATE_ACTIVE       = "ACTIVE";
34
    const REMOTE_STATE_INACTIVE     = "INACTIVE";
35
    const REMOTE_STATE_DELETED      = "DELETED";
36
37
    const STATE_NONE_NONE            = self::LOCAL_STATE_NONE.':'.self::REMOTE_STATE_NONE;
38
39
    // New
40
    const STATE_NEW_NONE             = self::LOCAL_STATE_NEW.':'.self::REMOTE_STATE_NONE;
41
42
    // Registered
43
    const STATE_REGISTERED_NONE      = self::LOCAL_STATE_REGISTERED.':'.self::REMOTE_STATE_NONE;
44
45
    // In progress
46
    const STATE_IN_PROGRESS_NONE     = self::LOCAL_STATE_IN_PROGRESS.':'.self::REMOTE_STATE_NONE;
47
    const STATE_IN_PROGRESS_ACTIVE   = self::LOCAL_STATE_IN_PROGRESS.":".self::REMOTE_STATE_ACTIVE;
48
    const STATE_IN_PROGRESS_INACTIVE = self::LOCAL_STATE_IN_PROGRESS.":".self::REMOTE_STATE_INACTIVE;
49
    const STATE_IN_PROGRESS_DELETED  = self::LOCAL_STATE_IN_PROGRESS.":".self::REMOTE_STATE_DELETED;
50
51
    // Active
52
    const STATE_NONE_ACTIVE          = self::LOCAL_STATE_NONE.':'.self::REMOTE_STATE_ACTIVE;
53
54
    // Postponed
55
    const STATE_POSTPONED_NONE       = self::LOCAL_STATE_POSTPONED.':'.self::REMOTE_STATE_NONE;
56
    const STATE_NONE_INACTIVE        = self::LOCAL_STATE_NONE.':'.self::REMOTE_STATE_INACTIVE;
57
58
    // Discarded
59
    const STATE_DISCARDED_NONE       = self::LOCAL_STATE_DISCARDED.':'.self::REMOTE_STATE_NONE;
60
    const STATE_NONE_DELETED         = self::LOCAL_STATE_NONE.':'.self::REMOTE_STATE_DELETED;
61
62
    const TRANSITION_CREATE              = "CREATE_TRANSITION";
63
    const TRANSITION_CREATE_REGISTER     = "CREATE_REGISTER_TRANSITION";
64
    const TRANSITION_REGISTER            = "REGISTER_TRANSITION";
65
    const TRANSITION_DISCARD             = "DISCARD_TRANSITION";
66
    const TRANSITION_POSTPONE            = "POSTPONE_TRANSITION";
67
    const TRANSITION_RELEASE_PUBLISH     = "RELEASE_PUBLISH_TRANSITION";
68
    const TRANSITION_RELEASE_ACTIVATE    = "RELEASE_ACTIVATE_TRANSITION";
69
    const TRANSITION_REMOTE_UPDATE       = "REMOTE_UPDATE_TRANSITION";
70
    const TRANSITION_IN_PROGRESS         = "IN_PROGRESS_TRANSITION";
71
    const TRANSITION_DELETE_LOCALLY      = "DELETE_LOCALLY_TRANSITION";
72
    const TRANSITION_DELETE_WORKING_COPY = "DELETE_WORKING_COPY_TRANSITION";
73
    const TRANSITION_DELETE_DISCARDED    = "DELETE_DISCARDED_TRANSITION";
74
75
    const ALIAS_STATE_NEW = "new";
76
    const ALIAS_STATE_REGISTERED = "registered";
77
    const ALIAS_STATE_POSTPONED = "postponed";
78
    const ALIAS_STATE_DISCARDED = "discarded";
79
    const ALIAS_STATE_IN_PROGRESS = "in_progress";
80
    const ALIAS_STATE_RELEASED = "released";
81
82
    const ALIAS_STATES = [
83
        self::ALIAS_STATE_NEW,
84
        self::ALIAS_STATE_REGISTERED,
85
        self::ALIAS_STATE_POSTPONED,
86
        self::ALIAS_STATE_DISCARDED,
87
        self::ALIAS_STATE_IN_PROGRESS,
88
        self::ALIAS_STATE_RELEASED
89
    ];
90
91
    const STATE_TO_ALIASSTATE_MAPPING = [
92
        DocumentWorkflow::STATE_NEW_NONE => DocumentWorkflow::ALIAS_STATE_NEW,
93
        DocumentWorkflow::STATE_REGISTERED_NONE => DocumentWorkflow::ALIAS_STATE_REGISTERED,
94
        DocumentWorkflow::STATE_POSTPONED_NONE => DocumentWorkflow::ALIAS_STATE_POSTPONED,
95
        DocumentWorkflow::STATE_DISCARDED_NONE => DocumentWorkflow::ALIAS_STATE_DISCARDED,
96
        DocumentWorkflow::STATE_IN_PROGRESS_NONE =>DocumentWorkflow::ALIAS_STATE_IN_PROGRESS,
97
        DocumentWorkflow::STATE_IN_PROGRESS_ACTIVE => DocumentWorkflow::ALIAS_STATE_IN_PROGRESS,
98
        DocumentWorkflow::STATE_IN_PROGRESS_INACTIVE => DocumentWorkflow::ALIAS_STATE_IN_PROGRESS,
99
        DocumentWorkflow::STATE_IN_PROGRESS_DELETED => DocumentWorkflow::ALIAS_STATE_IN_PROGRESS,
100
        DocumentWorkflow::STATE_NONE_ACTIVE => DocumentWorkflow::ALIAS_STATE_RELEASED,
101
        DocumentWorkflow::STATE_NONE_INACTIVE => DocumentWorkflow::ALIAS_STATE_POSTPONED,
102
        DocumentWorkflow::STATE_NONE_DELETED => DocumentWorkflow::ALIAS_STATE_DISCARDED
103
    ];
104
105
    const ALIASSTATE_TO_STATE_MAPPING = [
106
        DocumentWorkflow::ALIAS_STATE_NEW => [DocumentWorkflow::STATE_NEW_NONE],
107
        DocumentWorkflow::ALIAS_STATE_REGISTERED => [DocumentWorkflow::STATE_REGISTERED_NONE],
108
        DocumentWorkflow::ALIAS_STATE_POSTPONED => [
109
            DocumentWorkflow::STATE_POSTPONED_NONE,
110
            DocumentWorkflow::STATE_NONE_INACTIVE
111
        ],
112
        DocumentWorkflow::ALIAS_STATE_DISCARDED => [
113
            DocumentWorkflow::STATE_DISCARDED_NONE,
114
            DocumentWorkflow::STATE_NONE_DELETED
115
        ],
116
        DocumentWorkflow::ALIAS_STATE_IN_PROGRESS => [
117
            DocumentWorkflow::STATE_IN_PROGRESS_NONE,
118
            DocumentWorkflow::STATE_IN_PROGRESS_ACTIVE,
119
            DocumentWorkflow::STATE_IN_PROGRESS_INACTIVE,
120
            DocumentWorkflow::STATE_IN_PROGRESS_DELETED
121
        ],
122
        DocumentWorkflow::ALIAS_STATE_RELEASED => [DocumentWorkflow::STATE_NONE_ACTIVE]
123
    ];
124
125
    const PLACES = [
126
        self::STATE_NONE_NONE,
127
        self::STATE_NEW_NONE,
128
        self::STATE_REGISTERED_NONE,
129
        self::STATE_IN_PROGRESS_NONE,
130
        self::STATE_DISCARDED_NONE,
131
        self::STATE_NONE_DELETED,
132
        self::STATE_POSTPONED_NONE,
133
        self::STATE_NONE_INACTIVE,
134
        self::STATE_NONE_ACTIVE,
135
        self::STATE_IN_PROGRESS_ACTIVE,
136
        self::STATE_IN_PROGRESS_INACTIVE,
137
        self::STATE_IN_PROGRESS_DELETED
138
    ];
139
140
    const TRANSITIONS = [
141
        self::TRANSITION_CREATE => [
142
            "from" => [self::STATE_NONE_NONE],
143
            "to" => self::STATE_NEW_NONE
144
        ],
145
        self::TRANSITION_CREATE_REGISTER => [
146
            "from" => [self::STATE_NONE_NONE],
147
            "to" => self::STATE_REGISTERED_NONE
148
        ],
149
        self::TRANSITION_REGISTER => [
150
            "from" => [self::STATE_NEW_NONE],
151
            "to" => self::STATE_REGISTERED_NONE
152
        ],
153
        self::TRANSITION_DISCARD => [
154
            "from" => [
155
                self::STATE_REGISTERED_NONE,
156
                self::STATE_IN_PROGRESS_NONE,
157
                self::STATE_POSTPONED_NONE,
158
                self::STATE_IN_PROGRESS_ACTIVE,
159
                self::STATE_IN_PROGRESS_INACTIVE,
160
                self::STATE_IN_PROGRESS_DELETED,
161
                self::STATE_NONE_ACTIVE,
162
                self::STATE_NONE_INACTIVE,
163
                self::STATE_NONE_DELETED
164
            ],
165
            "to" => [
166
                self::STATE_DISCARDED_NONE,
167
                self::STATE_DISCARDED_NONE,
168
                self::STATE_DISCARDED_NONE,
169
                self::STATE_NONE_DELETED,
170
                self::STATE_NONE_DELETED,
171
                self::STATE_NONE_DELETED,
172
                self::STATE_NONE_DELETED,
173
                self::STATE_NONE_DELETED,
174
                self::STATE_NONE_DELETED
175
            ]
176
        ],
177
        self::TRANSITION_POSTPONE => [
178
            "from" => [
179
                self::STATE_REGISTERED_NONE,
180
                self::STATE_IN_PROGRESS_NONE,
181
                self::STATE_DISCARDED_NONE,
182
                self::STATE_IN_PROGRESS_ACTIVE,
183
                self::STATE_IN_PROGRESS_DELETED,
184
                self::STATE_IN_PROGRESS_INACTIVE,
185
                self::STATE_NONE_ACTIVE,
186
                self::STATE_NONE_DELETED,
187
                self::STATE_NONE_INACTIVE
188
            ],
189
            "to" => [
190
                self::STATE_POSTPONED_NONE,
191
                self::STATE_POSTPONED_NONE,
192
                self::STATE_POSTPONED_NONE,
193
                self::STATE_NONE_INACTIVE,
194
                self::STATE_NONE_INACTIVE,
195
                self::STATE_NONE_INACTIVE,
196
                self::STATE_NONE_INACTIVE,
197
                self::STATE_NONE_INACTIVE,
198
                self::STATE_NONE_INACTIVE
199
            ]
200
        ],
201
        self::TRANSITION_RELEASE_PUBLISH => [
202
            "from" => [
203
                self::STATE_REGISTERED_NONE,
204
                self::STATE_IN_PROGRESS_NONE,
205
                self::STATE_DISCARDED_NONE,
206
                self::STATE_POSTPONED_NONE,
207
            ],
208
            "to" => self::STATE_NONE_ACTIVE
209
        ],
210
        self::TRANSITION_RELEASE_ACTIVATE => [
211
            "from" => [
212
                self::STATE_IN_PROGRESS_ACTIVE,
213
                self::STATE_IN_PROGRESS_INACTIVE,
214
                self::STATE_IN_PROGRESS_DELETED,
215
                self::STATE_NONE_ACTIVE,
216
                self::STATE_NONE_INACTIVE,
217
                self::STATE_NONE_DELETED
218
            ],
219
            "to" => self::STATE_NONE_ACTIVE
220
        ],
221
        self::TRANSITION_DELETE_LOCALLY => [
222
            "from" => [self::STATE_NEW_NONE],
223
            "to" => self::STATE_NONE_NONE
224
        ],
225
        self::TRANSITION_DELETE_DISCARDED => [
226
            "from" => [self::STATE_DISCARDED_NONE],
227
            "to" => self::STATE_NONE_NONE
228
        ],
229
        self::TRANSITION_DELETE_WORKING_COPY => [
230
            "from" => [self::STATE_IN_PROGRESS_ACTIVE, self::STATE_IN_PROGRESS_INACTIVE, self::STATE_IN_PROGRESS_DELETED],
231
            "to" => [self::STATE_NONE_ACTIVE, self::STATE_NONE_INACTIVE, self::STATE_NONE_DELETED]
232
        ],
233
        self::TRANSITION_REMOTE_UPDATE => [
234
            "from" => [
235
                self::STATE_IN_PROGRESS_ACTIVE,
236
                self::STATE_IN_PROGRESS_INACTIVE,
237
                self::STATE_IN_PROGRESS_DELETED,
238
                self::STATE_NONE_ACTIVE,
239
                self::STATE_NONE_INACTIVE,
240
                self::STATE_NONE_DELETED
241
            ],
242
            "to" => [
243
                self::STATE_NONE_ACTIVE,
244
                self::STATE_NONE_INACTIVE,
245
                self::STATE_NONE_DELETED,
246
                self::STATE_NONE_ACTIVE,
247
                self::STATE_NONE_INACTIVE,
248
                self::STATE_NONE_DELETED
249
            ]
250
        ],
251
        self::TRANSITION_IN_PROGRESS => [
252
            "from" => [
253
                self::STATE_REGISTERED_NONE,
254
                self::STATE_NONE_ACTIVE,
255
                self::STATE_NONE_INACTIVE,
256
                self::STATE_NONE_DELETED
257
            ],
258
            "to" => [
259
                self::STATE_IN_PROGRESS_NONE,
260
                self::STATE_IN_PROGRESS_ACTIVE,
261
                self::STATE_IN_PROGRESS_INACTIVE,
262
                self::STATE_IN_PROGRESS_DELETED
263
            ]
264
        ]
265
    ];
266
    
267
    public static function getWorkflow()
268
    {
269
        $definitionBuilder = new DefinitionBuilder();
270
271
        $definitionBuilder->addPlaces(self::PLACES);
272
273
        foreach (self::TRANSITIONS as $transitionName => $transition) {
274
            if (!empty($transition["from"]) && !empty($transition["to"])) {
275
                foreach ($transition["from"] as $key => $fromState) {
276
                    if (is_array($transition["to"])) {
277
                        $definitionBuilder->addTransition(
278
                            new Transition($transitionName, $fromState, $transition["to"][$key])
279
                        );
280
                    } else {
281
                        $definitionBuilder->addTransition(
282
                             new Transition($transitionName, $fromState, $transition["to"])
283
                        );
284
                    }
285
                }
286
            }
287
        }
288
289
        $definition = $definitionBuilder->build();
290
291
        $marking = new MethodMarkingStore(TRUE, 'state');
292
293
        return new Workflow($definition, $marking);
294
    }
295
296
    public static function constructState($localState, $remoteState) {
297
        return $localState . ':' . $remoteState;
298
    }
299
300
}