AbstractElement   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 47
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 0

Importance

Changes 0
Metric Value
wmc 8
lcom 0
cbo 0
dl 0
loc 47
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
getElementTag() 0 1 ?
C createElement() 0 29 8
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
use PHPHealth\CDA\HasMoodCodeInterface;
33
34
/**
35
 *
36
 *
37
 * @author Julien Fastré <[email protected]>
38
 */
39
abstract class AbstractElement implements \PHPHealth\CDA\ElementInterface
40
{
41
    /**
42
     * get the element tag name
43
     *
44
     * @return string
45
     */
46
    abstract protected function getElementTag();
47
    
48
    /**
49
     * create an element with the tag given by self::getElementTag and
50
     * apply this element to datatype given by $properties
51
     *
52
     * @param \DOMDocument $doc
53
     * @param string[] $properties the name of the properties to apply on element
54
     * @return \DOMElement
55
     */
56
    protected function createElement(\DOMDocument $doc, array $properties = array())
57
    {
58
        /* @var $el DOMElement */
59
        $el = $doc->createElement(CDA::NS_CDA.$this->getElementTag());
60
        
61
        if ($this instanceof HasClassCode) {
62
            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\Component\SingleComponent\Section, PHPHealth\CDA\RIM\Act\Act, PHPHealth\CDA\RIM\Act\Observation, PHPHealth\CDA\RIM\Act\SubstanceAdministration, PHPHealth\CDA\RIM\Entity\AssignedPerson, PHPHealth\CDA\RIM\Entity\DrugOrMaterial, PHPHealth\CDA\RIM\Entity\Entity, PHPHealth\CDA\RIM\Entity\LivingSubject, PHPHealth\CDA\RIM\Entity\ManufacturedLabeledDrug, 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\ManufacturedProduct, 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
                $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\Component\SingleComponent\Section, PHPHealth\CDA\RIM\Act\Act, PHPHealth\CDA\RIM\Act\Observation, PHPHealth\CDA\RIM\Act\SubstanceAdministration, PHPHealth\CDA\RIM\Entity\AssignedPerson, PHPHealth\CDA\RIM\Entity\DrugOrMaterial, PHPHealth\CDA\RIM\Entity\Entity, PHPHealth\CDA\RIM\Entity\LivingSubject, PHPHealth\CDA\RIM\Entity\ManufacturedLabeledDrug, 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\ManufacturedProduct, 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...
64
            }
65
        }
66
        
67
        if ($this instanceof HasTypeCode) {
68
            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\Elements\Entry, PHPHealth\CDA\RIM\Participation\Author, PHPHealth\CDA\RIM\Participation\Consumable, 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
                $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\Elements\Entry, PHPHealth\CDA\RIM\Participation\Author, PHPHealth\CDA\RIM\Participation\Consumable, 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...
70
            }
71
        }
72
        
73
        if ($this instanceof HasMoodCodeInterface) {
74
            $el->setAttribute(CDA::NS_CDA.'moodCode', $this->getMoodCode());
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 getMoodCode() does only exist in the following sub-classes of PHPHealth\CDA\Elements\AbstractElement: PHPHealth\CDA\RIM\Act\Act, PHPHealth\CDA\RIM\Act\Observation, PHPHealth\CDA\RIM\Act\SubstanceAdministration. 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...
75
        }
76
        
77
        if (count($properties) > 0) {
78
            foreach ($properties as $property) {
79
                $this->{$property}->setValueToElement($el, $doc);
80
            }
81
        }
82
        
83
        return $el;
84
    }
85
}
86