Completed
Push — 2.0 ( 143803...4e64fa )
by grégoire
08:42 queued 04:22
created

ClientHolder   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 120
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Importance

Changes 4
Bugs 0 Features 1
Metric Value
wmc 12
lcom 1
cbo 1
dl 0
loc 120
c 4
b 0
f 1
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A has() 0 4 1
A get() 0 4 2
A shutdown() 0 18 4
A add() 0 6 1
A getAllFor() 0 8 2
A clear() 0 9 2
1
<?php
2
/*
3
 * This file is part of the Pomm's Foundation package.
4
 *
5
 * (c) 2014 - 2015 Grégoire HUBERT <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
namespace PommProject\Foundation\Client;
11
12
use PommProject\Foundation\Exception\PommException;
13
14
/**
15
 * ClientHolder
16
 *
17
 * Session clients are stored in this holder.
18
 *
19
 * @package   Pomm
20
 * @copyright 2014 - 2015 Grégoire HUBERT
21
 * @author    Grégoire HUBERT
22
 * @license   X11 {@link http://opensource.org/licenses/mit-license.php}
23
 */
24
class ClientHolder
25
{
26
    protected $clients = [];
27
28
    /**
29
     * add
30
     *
31
     * Add a new client or replace existing one.
32
     *
33
     * @access public
34
     * @param  ClientInterface $client
35
     * @return ClientHolder    $this
36
     */
37
    public function add(ClientInterface $client)
38
    {
39
        $this->clients[$client->getClientType()][$client->getClientIdentifier()] = $client;
40
41
        return $this;
42
    }
43
44
    /**
45
     * has
46
     *
47
     * Tell if a client is in the pool or not.
48
     *
49
     * @access public
50
     * @param  string $type
51
     * @param  string $name
52
     * @return bool
53
     */
54
    public function has($type, $name)
55
    {
56
        return (bool) isset($this->clients[$type][$name]);
57
    }
58
59
    /**
60
     * get
61
     *
62
     * Return a client by its name or null if no client exist for that name.
63
     *
64
     * @access public
65
     * @param  string          $type
66
     * @param  string          $name
67
     * @return ClientInterface
68
     */
69
    public function get($type, $name)
70
    {
71
        return isset($this->clients[$type][$name]) ? $this->clients[$type][$name] : null;
72
    }
73
74
    /**
75
     * getAllFor
76
     *
77
     * Return all clients for a given type.
78
     *
79
     * @access public
80
     * @param  string $type
81
     * @return array
82
     */
83
    public function getAllFor($type)
84
    {
85
        if (!isset($this->clients[$type])) {
86
            return [];
87
        }
88
89
        return $this->clients[$type];
90
    }
91
92
    /**
93
     * clear
94
     *
95
     * Call shutdown and remove a client from the pool. If the client does not
96
     * exist, nothing is done.
97
     *
98
     * @access public
99
     * @param  string       $type
100
     * @param  string       $name
101
     * @return ClientHolder $this
102
     */
103
    public function clear($type, $name)
104
    {
105
        if (isset($this->clients[$type][$name])) {
106
            $this->clients[$type][$name]->shutdown();
107
            unset($this->clients[$type][$name]);
108
        }
109
110
        return $this;
111
    }
112
113
    /**
114
     * shutdown
115
     *
116
     * Call shutdown for all registered clients and unset the clients so they
117
     * can be cleaned by GC. It would have been better by far to use a
118
     * RecursiveArrayIterator to do this but it is not possible in PHP using
119
     * built'in iterators hence the double foreach recursion.
120
     * see http://fr2.php.net/manual/en/class.recursivearrayiterator.php#106519
121
     *
122
     * @access public
123
     * @return array exceptions caught during the shutdown
124
     */
125
    public function shutdown()
126
    {
127
        $exceptions = [];
128
129
        foreach ($this->clients as $type => $names) {
130
            foreach ($names as $name => $client) {
131
                try {
132
                    $client->shutdown();
133
                } catch (PommException $e) {
134
                    $exceptions[] = $e;
135
                }
136
            }
137
        }
138
139
        $this->clients = [];
140
141
        return $exceptions;
142
    }
143
}
144