Completed
Push — master ( 85b767...9f6cfb )
by Julien
02:49
created

AbstractElement::createElement()   C

Complexity

Conditions 7
Paths 18

Size

Total Lines 25
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 25
rs 6.7272
cc 7
eloc 12
nc 18
nop 2
1
<?php
2
3
/*
4
 * The MIT License
5
 *
6
 * Copyright 2016 Julien Fastré <[email protected]>.
7
 *
8
 * Permission is hereby granted, free of charge, to any person obtaining a copy
9
 * of this software and associated documentation files (the "Software"), to deal
10
 * in the Software without restriction, including without limitation the rights
11
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12
 * copies of the Software, and to permit persons to whom the Software is
13
 * furnished to do so, subject to the following conditions:
14
 *
15
 * The above copyright notice and this permission notice shall be included in
16
 * all copies or substantial portions of the Software.
17
 *
18
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24
 * THE SOFTWARE.
25
 */
26
27
namespace PHPHealth\CDA\Elements;
28
29
use PHPHealth\CDA\ClinicalDocument as CDA;
30
use PHPHealth\CDA\HasClassCode;
31
use PHPHealth\CDA\HasTypeCode;
32
33
/**
34
 *
35
 *
36
 * @author Julien Fastré <[email protected]>
37
 */
38
abstract class AbstractElement implements \PHPHealth\CDA\ElementInterface
39
{
40
    /**
41
     * get the element tag name
42
     *
43
     * @return string
44
     */
45
    abstract protected function getElementTag();
46
    
47
    /**
48
     * create an element with the tag given by self::getElementTag and
49
     * apply this element to datatype given by $properties
50
     *
51
     * @param \DOMDocument $doc
52
     * @param string[] $properties the name of the properties to apply on element
53
     * @return \DOMElement
54
     */
55
    protected function createElement(\DOMDocument $doc, array $properties = array())
56
    {
57
        /* @var $el DOMElement */
58
        $el = $doc->createElement(CDA::NS_CDA.$this->getElementTag());
59
        
60
        if ($this instanceof HasClassCode) {
61
            if (! empty($this->getClassCode())) {
0 ignored issues
show
Bug introduced by
It seems like you code against a specific sub-type and not the parent class PHPHealth\CDA\Elements\AbstractElement as the method getClassCode() does only exist in the following sub-classes of PHPHealth\CDA\Elements\AbstractElement: PHPHealth\CDA\RIM\Entity\AssignedPerson, PHPHealth\CDA\RIM\Entity\Entity, PHPHealth\CDA\RIM\Entity\LivingSubject, PHPHealth\CDA\RIM\Entity\Organization, PHPHealth\CDA\RIM\Entity\Patient, PHPHealth\CDA\RIM\Entity\Person, PHPHealth\CDA\RIM\Entity...edCustodianOrganization, PHPHealth\CDA\RIM\Role\AssignedAuthor, PHPHealth\CDA\RIM\Role\AssignedCustodian, PHPHealth\CDA\RIM\Role\PatientRole, PHPHealth\CDA\RIM\Role\Role. Maybe you want to instanceof check for one of these explicitly?

Let’s take a look at an example:

abstract class User
{
    /** @return string */
    abstract public function getPassword();
}

class MyUser extends User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different sub-classes of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the parent class:

    abstract class User
    {
        /** @return string */
        abstract public function getPassword();
    
        /** @return string */
        abstract public function getDisplayName();
    }
    
Loading history...
62
                $el->setAttribute(CDA::NS_CDA.'classCode', $this->getClassCode());
0 ignored issues
show
Bug introduced by
It seems like you code against a specific sub-type and not the parent class PHPHealth\CDA\Elements\AbstractElement as the method getClassCode() does only exist in the following sub-classes of PHPHealth\CDA\Elements\AbstractElement: PHPHealth\CDA\RIM\Entity\AssignedPerson, PHPHealth\CDA\RIM\Entity\Entity, PHPHealth\CDA\RIM\Entity\LivingSubject, PHPHealth\CDA\RIM\Entity\Organization, PHPHealth\CDA\RIM\Entity\Patient, PHPHealth\CDA\RIM\Entity\Person, PHPHealth\CDA\RIM\Entity...edCustodianOrganization, PHPHealth\CDA\RIM\Role\AssignedAuthor, PHPHealth\CDA\RIM\Role\AssignedCustodian, PHPHealth\CDA\RIM\Role\PatientRole, PHPHealth\CDA\RIM\Role\Role. Maybe you want to instanceof check for one of these explicitly?

Let’s take a look at an example:

abstract class User
{
    /** @return string */
    abstract public function getPassword();
}

class MyUser extends User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different sub-classes of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the parent class:

    abstract class User
    {
        /** @return string */
        abstract public function getPassword();
    
        /** @return string */
        abstract public function getDisplayName();
    }
    
Loading history...
63
            }
64
        }
65
        
66
        if ($this instanceof HasTypeCode) {
67
            if (! empty($this->getTypeCode())) {
0 ignored issues
show
Bug introduced by
It seems like you code against a specific sub-type and not the parent class PHPHealth\CDA\Elements\AbstractElement as the method getTypeCode() does only exist in the following sub-classes of PHPHealth\CDA\Elements\AbstractElement: PHPHealth\CDA\RIM\Participation\Author, PHPHealth\CDA\RIM\Participation\Custodian, PHPHealth\CDA\RIM\Participation\Participation, PHPHealth\CDA\RIM\Participation\RecordTarget. Maybe you want to instanceof check for one of these explicitly?

Let’s take a look at an example:

abstract class User
{
    /** @return string */
    abstract public function getPassword();
}

class MyUser extends User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different sub-classes of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the parent class:

    abstract class User
    {
        /** @return string */
        abstract public function getPassword();
    
        /** @return string */
        abstract public function getDisplayName();
    }
    
Loading history...
68
                $el->setAttribute(CDA::NS_CDA.'typeCode', $this->getTypeCode());
0 ignored issues
show
Bug introduced by
It seems like you code against a specific sub-type and not the parent class PHPHealth\CDA\Elements\AbstractElement as the method getTypeCode() does only exist in the following sub-classes of PHPHealth\CDA\Elements\AbstractElement: PHPHealth\CDA\RIM\Participation\Author, PHPHealth\CDA\RIM\Participation\Custodian, PHPHealth\CDA\RIM\Participation\Participation, PHPHealth\CDA\RIM\Participation\RecordTarget. Maybe you want to instanceof check for one of these explicitly?

Let’s take a look at an example:

abstract class User
{
    /** @return string */
    abstract public function getPassword();
}

class MyUser extends User
{
    public function getPassword()
    {
        // return something
    }

    public function getDisplayName()
    {
        // return some name.
    }
}

class AuthSystem
{
    public function authenticate(User $user)
    {
        $this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
        // do something.
    }
}

In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different sub-classes of User which does not have a getDisplayName() method, the code will break.

Available Fixes

  1. Change the type-hint for the parameter:

    class AuthSystem
    {
        public function authenticate(MyUser $user) { /* ... */ }
    }
    
  2. Add an additional type-check:

    class AuthSystem
    {
        public function authenticate(User $user)
        {
            if ($user instanceof MyUser) {
                $this->logger->info(/** ... */);
            }
    
            // or alternatively
            if ( ! $user instanceof MyUser) {
                throw new \LogicException(
                    '$user must be an instance of MyUser, '
                   .'other instances are not supported.'
                );
            }
    
        }
    }
    
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types inside the if block in such a case.
  1. Add the method to the parent class:

    abstract class User
    {
        /** @return string */
        abstract public function getPassword();
    
        /** @return string */
        abstract public function getDisplayName();
    }
    
Loading history...
69
            }
70
        }
71
        
72
        if (count($properties) > 0) {
73
            foreach ($properties as $property) {
74
                $this->{$property}->setValueToElement($el);
75
            }
76
        }
77
        
78
        return $el;
79
    }
80
}
81