Passed
Push — master ( 8abef8...fa066b )
by Alex
04:33
created

TSchemaType::isOK()   C

Complexity

Conditions 8
Paths 6

Size

Total Lines 24
Code Lines 16

Duplication

Lines 4
Ratio 16.67 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 4
loc 24
rs 5.7377
cc 8
eloc 16
nc 6
nop 1
1
<?php
2
3
namespace AlgoWeb\ODataMetadata\MetadataV3\edm;
4
5
use AlgoWeb\ODataMetadata\IsOK;
6
use AlgoWeb\ODataMetadata\MetadataV3\edm\Groups\GSchemaBodyElementsTrait;
7
use AlgoWeb\ODataMetadata\MetadataV3\edm\IsOKTraits\TNamespaceNameTrait;
8
use AlgoWeb\ODataMetadata\MetadataV3\edm\IsOKTraits\TSimpleIdentifierTrait;
9
use AlgoWeb\ODataMetadata\StringTraits\XSDTopLevelTrait;
10
11
/**
12
 * Class representing TSchemaType
13
 *
14
 *
15
 * XSD Type: TSchema
16
 */
17
class TSchemaType extends IsOK
18
{
19
    use GSchemaBodyElementsTrait, TSimpleIdentifierTrait, XSDTopLevelTrait, TNamespaceNameTrait {
20
        TSimpleIdentifierTrait::isNCName insteadof TNamespaceNameTrait;
21
        TSimpleIdentifierTrait::matchesRegexPattern insteadof TNamespaceNameTrait;
22
        TSimpleIdentifierTrait::isName insteadof TNamespaceNameTrait;
23
    }
24
    /**
25
     * @property string $namespace
26
     */
27
    private $namespace = null;
28
29
    /**
30
     * @property string $namespaceUri
31
     */
32
    private $namespaceUri = null;
33
34
    /**
35
     * @property string $alias
36
     */
37
    private $alias = null;
38
39
    /**
40
     * Gets as namespaceUri
41
     *
42
     * @return string
43
     */
44
    public function getNamespaceUri()
45
    {
46
        return $this->namespaceUri;
47
    }
48
49
    /**
50
     * Sets a new namespaceUri
51
     *
52
     * @param string $namespaceUri
53
     * @return self
54
     */
55
    public function setNamespaceUri($namespaceUri)
56
    {
57
        if (null != $namespaceUri && !$this->isURLValid($namespaceUri)) {
58
            $msg = "Namespace url must be a valid url";
59
            throw new \InvalidArgumentException($msg);
60
        }
61
        $this->namespaceUri = $namespaceUri;
62
        return $this;
63
    }
64
65
    /**
66
     * Gets as alias
67
     *
68
     * @return string
69
     */
70
    public function getAlias()
71
    {
72
        return $this->alias;
73
    }
74
75
    /**
76
     * Sets a new alias
77
     *
78
     * @param string $alias
79
     * @return self
80
     */
81
    public function setAlias($alias)
82
    {
83
        if (null != $alias && !$this->isTSimpleIdentifierValid($alias)) {
84
            $msg = "Alias must be a valid TSimpleIdentifier";
85
            throw new \InvalidArgumentException($msg);
86
        }
87
        $this->alias = $alias;
88
        return $this;
89
    }
90
91
    public function isOK(&$msg = null)
92
    {
93
        $entityCount = max(1, count($this->entityType));
94
        // done this way to enable die-roll to be mocked - don't know how to mock rand() directly
95
        if (1 < $entityCount * $this->getRand()) {
96
            return true;
97
        }
98
        if (!$this->isTNamespaceNameValid($this->namespace)) {
99
            $msg = "Namespace must be a valid TNamespaceName";
100
            return false;
101
        }
102
        if (null != $this->namespaceUri && !$this->isURLValid($this->namespaceUri)) {
103
            $msg = "Namespace url must be a valid url";
104
            return false;
105
        }
106 View Code Duplication
        if (null != $this->alias && !$this->isTSimpleIdentifierValid($this->alias)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
107
            $msg = "Alias must be a valid TSimpleIdentifier";
108
            return false;
109
        }
110
        if (!$this->isGSchemaBodyElementsValid($msg)) {
111
            return false;
112
        }
113
        return $this->isStructureOK($msg);
114
    }
115
116
    public function isStructureOK(&$msg = null)
117
    {
118
        $entityTypeNames = [];
119
        $associationNames = [];
120
        $navigationProperties = [];
121
        $associationSets = [];
122
        $namespaceLen = strlen($this->namespace);
123
        if (0 != $namespaceLen) {
124
            $namespaceLen++;
125
        }
126
127
        foreach ($this->getEntityType() as $entityType) {
128
            $entityTypeNames[] = $entityType->getName();
129
            foreach ($entityType->getNavigationProperty() as $navigationProperty) {
130
                $navigationProperties[
131
                substr($navigationProperty->getRelationship(), $namespaceLen)
132
                ][] = $navigationProperty;
133
            }
134
        }
135
136
        foreach ($this->association as $association) {
137
            $associationNames[$association->getName()] = $association->getEnd();
138
        }
139
        foreach ($this->getEntityContainer()[0]->getAssociationSet() as $associationSet) {
140
            $associationSets[substr($associationSet->getAssociation(), $namespaceLen)] = $associationSet->getEnd();
141
        }
142
143
144
        $entitySets = $this->getEntityContainer()[0]->getEntitySet();
145
        foreach ($entitySets as $eset) {
146
            $eSetType = $eset->getEntityType();
147
            /*if (substr($eSetType, 0, strlen($this->getNamespace())) != $this->getNamespace()) {
0 ignored issues
show
Unused Code Comprehensibility introduced by
62% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
148
                $msg = "Types for Entity Sets should have the namespace at the beginning " . __CLASS__;
149
                die($this->getNamespace());
150
                return false;
151
            }*/
152
            $eSetType = str_replace($this->getNamespace() . ".", "", $eSetType);
153
            if (!in_array($eSetType, $entityTypeNames)) {
154
                $msg = "entitySet Types should have a matching type name in entity Types";
155
                return false;
156
            }
157
        }
158
159
        // Check Associations to associationSets
160
        if (count($associationSets) != count($associationNames)) {
161
            $msg = "we have " . count($associationSets) . "association sets and " . count($associationNames)
162
                   . " associations, they should be the same";
163
        }
164
        if (count($associationNames) * 2 < count($navigationProperties)) {
165
            $msg = "we have too many navigation properties. should have no more then double the"
166
                   ." number of associations.";
167
        }
168
169
        foreach ($associationNames as $associationName => $associationEnds) {
170
            if (!array_key_exists($associationName, $associationSets)) {
171
                $msg = "association " . $associationName . " exists without matching associationSet";
172
                return false;
173
            }
174
175
            if (!array_key_exists($associationName, $navigationProperties)) {
176
                $msg = "association " . $associationName . " exists without matching Natvigation Property";
177
                return false;
178
            }
179
            $roles = [$associationEnds[0]->getRole(), $associationEnds[1]->getRole()];
180 View Code Duplication
            if (!in_array($associationSets[$associationName][0]->getRole(), $roles)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
181
                $msg = "association Set role " . $associationSets[$associationName][0]->getRole()
182
                       . "lacks a matching property in the attached association";
183
                return false;
184
            }
185 View Code Duplication
            if (!in_array($associationSets[$associationName][1]->getRole(), $roles)) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
186
                $msg = "association Set role " . $associationSets[$associationName][1]->getRole()
187
                       . "lacks a matching property in the attached association";
188
                return false;
189
            }
190
        }
191
        return true;
192
    }
193
194
    /**
195
     * Gets as namespace
196
     *
197
     * @return string
198
     */
199
    public function getNamespace()
200
    {
201
        return $this->namespace;
202
    }
203
204
    /**
205
     * Sets a new namespace
206
     *
207
     * @param string $namespace
208
     * @return self
209
     */
210
    public function setNamespace($namespace)
211
    {
212
        if (!$this->isTNamespaceNameValid($namespace)) {
213
            $msg = "Namespace must be a valid TNamespaceName";
214
            throw new \InvalidArgumentException($msg);
215
        }
216
        $this->namespace = $namespace;
217
        return $this;
218
    }
219
220
    protected function getRand()
221
    {
222
        return rand();
223
    }
224
}
225