AddToEntityInstantiatorBehavior   A
last analyzed

Complexity

Total Complexity 16

Size/Duplication

Total Lines 183
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Importance

Changes 0
Metric Value
wmc 16
lcom 1
cbo 3
dl 0
loc 183
rs 10
c 0
b 0
f 0

9 Methods

Rating   Name   Duplication   Size   Complexity  
A queryMethods() 0 7 1
A objectMethods() 0 7 1
A addObjectToGenerator() 0 9 2
A addQueryToGenerator() 0 9 2
A buildEntityFromObject() 0 12 1
A buildEntityFromQuery() 0 12 1
A returnDatabaseNameIfMethodNamePrefixIsNotProvided() 0 9 2
A getManager() 0 36 4
A addIt() 0 6 2
1
<?php
2
3
declare(strict_types=1);
4
5
use Net\Bazzline\Propel\Behavior\EntityInstantiator\Manager;
6
use Net\Bazzline\Propel\Behavior\EntityInstantiator\ObjectEntity;
7
use Net\Bazzline\Propel\Behavior\EntityInstantiator\QueryEntity;
8
9
10
/**
11
 * @author stev leibelt <[email protected]>
12
 * @since 2015-08-02
13
 * @todo make parameters optional (only set them when they are set) - this would enable it to define everything in the database scope and the rest in the table scope without overwriting database scoped things
14
 */
15
class AddToEntityInstantiatorBehavior extends Behavior
16
{
17
    public const PARAMETER_ENTITY_INSTANTIATOR_ADD_IT_TO_ENTITY_INSTANTIATOR   = 'entity_instantiator_add_to_entity_instantiator';
18
    public const PARAMETER_ENTITY_INSTANTIATOR_DEFAULT_CONNECTION_MODE         = 'entity_instantiator_default_connection_mode';
19
    public const PARAMETER_ENTITY_INSTANTIATOR_DEFAULT_CONNECTION_NAME         = 'entity_instantiator_default_connection_name';
20
    public const PARAMETER_ENTITY_INSTANTIATOR_CLASS_NAME                      = 'entity_instantiator_class_name';
21
    public const PARAMETER_ENTITY_INSTANTIATOR_EXTENDS                         = 'entity_instantiator_extends';
22
    public const PARAMETER_ENTITY_INSTANTIATOR_INDENTION                       = 'entity_instantiator_indention';
23
    public const PARAMETER_ENTITY_INSTANTIATOR_METHOD_NAME_PREFIX              = 'entity_instantiator_method_name_prefix';
24
    public const PARAMETER_ENTITY_INSTANTIATOR_NAMESPACE                       = 'entity_instantiator_namespace';
25
    public const PARAMETER_ENTITY_INSTANTIATOR_PATH_TO_OUTPUT                  = 'entity_instantiator_path_to_output';
26
    public const PARAMETER_ENTITY_INSTANTIATOR_USE_FULLY_QUALIFIED_NAME        = 'entity_instantiator_use_fully_qualified_name';
27
28
    /** @var array */
29
    protected $parameters = [
30
        self::PARAMETER_ENTITY_INSTANTIATOR_ADD_IT_TO_ENTITY_INSTANTIATOR   => 'true',
31
        self::PARAMETER_ENTITY_INSTANTIATOR_DEFAULT_CONNECTION_MODE         => null,
32
        self::PARAMETER_ENTITY_INSTANTIATOR_DEFAULT_CONNECTION_NAME         => null,
33
        self::PARAMETER_ENTITY_INSTANTIATOR_CLASS_NAME                      => 'DatabaseEntityInstantiator',
34
        self::PARAMETER_ENTITY_INSTANTIATOR_INDENTION                       => '    ',
35
        self::PARAMETER_ENTITY_INSTANTIATOR_METHOD_NAME_PREFIX              => null,
36
        self::PARAMETER_ENTITY_INSTANTIATOR_NAMESPACE                       => null,
37
        self::PARAMETER_ENTITY_INSTANTIATOR_PATH_TO_OUTPUT                  => 'data',
38
        self::PARAMETER_ENTITY_INSTANTIATOR_USE_FULLY_QUALIFIED_NAME        => 'false'
39
    ];
40
41
42
43
    /**
44
     * @param DataModelBuilder $builder
45
     * @return string
46
     * @throws InvalidArgumentException
47
     */
48
    public function queryMethods(
49
        $builder
50
    ) {
51
        $this->addQueryToGenerator($builder);
52
53
        return '';
54
    }
55
56
57
58
    /**
59
     * @param DataModelBuilder $builder
60
     * @return string
61
     * @throws InvalidArgumentException
62
     */
63
    public function objectMethods(
64
        $builder
65
    ) {
66
        $this->addObjectToGenerator($builder);
67
68
        return '';
69
    }
70
71
    /**
72
     * @param DataModelBuilder $builder
73
     * @throws InvalidArgumentException
74
     */
75
    public function addObjectToGenerator(
76
        DataModelBuilder $builder
77
    ): void {
78
        if ($this->addIt()) {
79
            $manager    = $this->getManager();
80
            $entity     = $this->buildEntityFromObject($builder);
81
            $manager->add($entity);
82
        }
83
    }
84
85
    /**
86
     * @param DataModelBuilder $builder
87
     * @throws InvalidArgumentException
88
     */
89
    public function addQueryToGenerator(
90
        DataModelBuilder $builder
91
    ): void {
92
        if ($this->addIt()) {
93
            $manager    = $this->getManager();
94
            $entity     = $this->buildEntityFromQuery($builder);
95
            $manager->add($entity);
96
        }
97
    }
98
99
    /**
100
     * @param DataModelBuilder $builder
101
     * @return ObjectEntity
102
     */
103
    private function buildEntityFromObject(
104
        DataModelBuilder $builder
105
    ) {
106
        $methodNamePrefix = $this->returnDatabaseNameIfMethodNamePrefixIsNotProvided($builder);
107
108
        return new ObjectEntity(
109
            $builder->getStubObjectBuilder()->getClassname(),
110
            $builder->getDatabase()->getName(),
111
            $builder->getStubObjectBuilder()->getFullyQualifiedClassname(),
112
            $methodNamePrefix
113
        );
114
    }
115
116
    /**
117
     * @param DataModelBuilder $builder
118
     * @return QueryEntity
119
     */
120
    private function buildEntityFromQuery(
121
        DataModelBuilder $builder
122
    ) {
123
        $methodNamePrefix = $this->returnDatabaseNameIfMethodNamePrefixIsNotProvided($builder);
124
125
        return new QueryEntity(
126
            $builder->getStubQueryBuilder()->getClassname(),
127
            $builder->getDatabase()->getName(),
128
            $builder->getStubQueryBuilder()->getFullyQualifiedClassname(),
129
            $methodNamePrefix
130
        );
131
    }
132
133
    /**
134
     * @param DataModelBuilder $builder
135
     * @return string
136
     */
137
    private function returnDatabaseNameIfMethodNamePrefixIsNotProvided(
138
        DataModelBuilder $builder
139
    ) {
140
        $methodNamePrefix = (is_null($this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_METHOD_NAME_PREFIX]))
141
            ? 'create' . ucfirst($builder->getDatabase()->getName())
142
            : $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_METHOD_NAME_PREFIX];
143
144
        return $methodNamePrefix;
145
    }
146
147
    /**
148
     * @return Manager
149
     * @throws InvalidArgumentException
150
     */
151
    private function getManager()
152
    {
153
        $manager = Manager::getInstance();
154
155
        if ($manager->isNotConfigured()) {
156
            $pathToOutput   = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_PATH_TO_OUTPUT];
157
            $isAbsolutePath = (strncmp($pathToOutput, DIRECTORY_SEPARATOR, strlen(DIRECTORY_SEPARATOR)) === 0);    //like /foo/bar
158
            $isResource     = (strpos($pathToOutput, '://') !== false);  //like vfs://
159
160
            $isAbsolutePathOrResource   = ($isAbsolutePath || $isResource);
161
162
            $absolutePathToOutput   = ($isAbsolutePathOrResource)
163
                ? $pathToOutput
164
                : getcwd() . (str_repeat(DIRECTORY_SEPARATOR . '..', 4)) . DIRECTORY_SEPARATOR . $pathToOutput;
165
            $className              = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_CLASS_NAME];
166
            $defaultConnectionMode  = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_DEFAULT_CONNECTION_MODE];
167
            $defaultConnectionName  = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_DEFAULT_CONNECTION_NAME];
168
            $extends                = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_EXTENDS];
169
            $indention              = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_INDENTION];
170
            $namespace              = $this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_NAMESPACE];
171
            $useFullyQualifiedName  = ($this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_USE_FULLY_QUALIFIED_NAME] === 'true');
172
173
            $manager->configure(
174
                $className,
175
                $indention,
176
                $absolutePathToOutput,
177
                $namespace,
178
                $extends,
179
                $defaultConnectionMode,
180
                $defaultConnectionName,
181
                $useFullyQualifiedName
182
            );
183
        }
184
185
        return $manager;
186
    }
187
188
    /**
189
     * @return bool
190
     */
191
    private function addIt()
192
    {
193
        return (isset($this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_ADD_IT_TO_ENTITY_INSTANTIATOR]))
194
            ? ($this->parameters[self::PARAMETER_ENTITY_INSTANTIATOR_ADD_IT_TO_ENTITY_INSTANTIATOR] === 'true')
195
            : false;
196
    }
197
}
198