Completed
Push — 1.0 ( 2156a0...733517 )
by Valentin
07:09
created

EzPlatformAdapter::executeAction()   B

Complexity

Conditions 5
Paths 5

Size

Total Lines 18
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 5

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 18
ccs 13
cts 13
cp 1
rs 8.8571
cc 5
eloc 12
nc 5
nop 2
crap 5
1
<?php
2
3
/*
4
 * This file is part of Transfer.
5
 *
6
 * For the full copyright and license information, please view the LICENSE file located
7
 * in the root directory.
8
 */
9
10
namespace Transfer\EzPlatform\Adapter;
11
12
use eZ\Publish\API\Repository\Repository;
13
use Psr\Log\LoggerAwareInterface;
14
use Psr\Log\LoggerInterface;
15
use Symfony\Component\OptionsResolver\OptionsResolver;
16
use Transfer\Adapter\TargetAdapterInterface;
17
use Transfer\Adapter\Transaction\Request;
18
use Transfer\Adapter\Transaction\Response;
19
use Transfer\Data\ObjectInterface;
20
use Transfer\Data\TreeObject;
21
use Transfer\EzPlatform\Repository\Values\Action\Enum\Action;
22
use Transfer\EzPlatform\Repository\Manager\Core\AbstractRepositoryService;
23
use Transfer\EzPlatform\Repository\Manager\Core\ContentTreeService;
24
use Transfer\EzPlatform\Repository\Manager\Core\ObjectService;
25
use Transfer\EzPlatform\Repository\Values\EzPlatformObject;
26
27
/**
28
 * eZ Platform adapter.
29
 */
30
class EzPlatformAdapter implements TargetAdapterInterface, LoggerAwareInterface
31
{
32
    /**
33
     * @var ContentTreeService Tree service
34
     */
35
    protected $treeService;
36
37
    /**
38
     * @var ObjectService Object service
39
     */
40
    protected $objectService;
41
42
    /**
43
     * @var LoggerInterface Logger
44
     */
45
    protected $logger;
46
47
    /**
48
     * @var array Options
49
     */
50
    protected $options;
51
52
    /**
53
     * Constructor.
54
     *
55
     * @param array $options
56
     */
57 65
    public function __construct(array $options = array())
58
    {
59 65
        $resolver = new OptionsResolver();
60 65
        $this->configureOptions($resolver);
61
62 65
        $this->options = $resolver->resolve($options);
63
64 65
        $this->objectService = new ObjectService($this->options['repository']);
65 65
        $this->treeService = new ContentTreeService($this->options['repository'], $this->objectService);
66 65
    }
67
68
    /**
69
     * Option configuration.
70
     *
71
     * @param OptionsResolver $resolver
72
     */
73 65
    protected function configureOptions(OptionsResolver $resolver)
74
    {
75 65
        $resolver->setDefaults(array(
76 65
            'repository_current_user' => 'admin',
77 65
        ));
78
79 65
        $resolver->setRequired(array('repository'));
80
81 65
        $resolver->setAllowedTypes('repository', array('eZ\Publish\API\Repository\Repository'));
82 65
        $resolver->setAllowedTypes('repository_current_user', array('string', 'null'));
83 65
    }
84
85
    /**
86
     * {@inheritdoc}
87
     */
88 65
    public function setLogger(LoggerInterface $logger)
89
    {
90 65
        $this->logger = $logger;
91 65
        $this->objectService->setLogger($logger);
92 65
        $this->treeService->setLogger($logger);
93 65
    }
94
95
    /**
96
     * {@inheritdoc}
97
     */
98 25
    public function send(Request $request)
99
    {
100
        /** @var Repository $repository */
101 25
        $repository = $this->options['repository'];
102 25
        $repository->beginTransaction();
103
104 25
        if ($this->logger) {
105 25
            $this->treeService->setLogger($this->logger);
106 25
            $this->objectService->setLogger($this->logger);
107 25
        }
108
109 25
        $response = new Response();
110
111 25
        $objects = array();
112 25
        foreach ($request as $object) {
113 25
            $service = $this->getService($object);
114
115
            try {
116 25
                $objects[] = $this->executeAction($object, $service);
117 25
            } catch (\Exception $e) {
118 2
                $repository->rollback();
119 2
                throw $e;
120
            }
121
122 23
            if (!empty($objects)) {
123 23
                $response->setData(new \ArrayIterator($objects));
124 23
            }
125 23
        }
126
127 23
        $repository->commit();
128
129 23
        return $response;
130
    }
131
132
    /**
133
     * @param ObjectInterface           $object
134
     * @param AbstractRepositoryService $service
135
     *
136
     * @return ObjectInterface|null
137
     */
138 25
    protected function executeAction(ObjectInterface $object, AbstractRepositoryService $service)
139
    {
140 25
        if (is_a($object, EzPlatformObject::class)) {
141
            /** @var EzPlatformObject $object */
142 22
            switch ($object->getAction()) {
143 22
                case Action::CREATEORUPDATE:
144 17
                    return $service->createOrUpdate($object);
145 7
                case Action::DELETE:
146 6
                    return $service->remove($object);
147 1
                case Action::SKIP:
148 1
                default:
149 1
            }
150 1
        } else {
151 3
            return $service->createOrUpdate($object);
152
        }
153
154 1
        return;
155
    }
156
157
    /**
158
     * Decides which service to use, based on the type of $object given.
159
     *
160
     * @param ObjectInterface $object
161
     *
162
     * @return ContentTreeService|ObjectService
163
     */
164 25
    protected function getService($object)
165
    {
166 25
        if ($object instanceof TreeObject) {
167 2
            $service = $this->treeService;
168 2
        } else {
169 23
            $service = $this->objectService;
170
        }
171
172 25
        if ($this->options['repository_current_user']) {
173 25
            $service->setCurrentUser($this->options['repository_current_user']);
174 25
        }
175
176 25
        return $service;
177
    }
178
}
179