-
Notifications
You must be signed in to change notification settings - Fork 0
/
Component.php
127 lines (114 loc) · 3.22 KB
/
Component.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
<?php
namespace ProgA\SystemDependecies;
class Component {
private $name;
private $dependencies;
private $dependents;
private $installed;
private $explicitInstall;
function __construct($name, $dependencyList)
{
$this->name = $name;
$this->setDependenciesList($dependencyList);
$this->installed = false;
$this->explicitInstall = false;
}
/**
* @return mixed
*/
public function getDependencies()
{
return $this->$dependencies;
}
/**
* @return mixed
*/
public function getDependents()
{
return $this->dependents;
}
/**
* @param mixed $dependencies
*/
public function setDependenciesList($dependencies)
{
foreach($dependencies as $dependency) {
$component = ComponentManager::getInstance()->getComponent($dependency);
$component->setDependent($this->getName());
}
$this->dependencies = $dependencies;
}
public function setDependent($dependent)
{
$this->dependents[$dependent] = $dependent;
}
/**
* @return mixed
*/
public function getName()
{
return $this->name;
}
/**
* @param mixed $name
*/
public function setName($name)
{
$this->name = $name;
}
public function isInstalled()
{
return $this->installed;
}
public function install($explicit = false)
{
if($this->isInstalled()) {
echo " {$this->getName()} is already installed.\n";
return;
}
/** @var Component $dependency */
foreach($this->dependencies as $dependency) {
/** @var Component $component */
$component = ComponentManager::getInstance()->getComponent($dependency);
if(!$component->isInstalled()) {
$component->install();
}
}
echo " Installing {$this->getName()}\n";
$this->installed = true;
if($explicit) {
$this->explicitInstall = true;
}
}
public function remove()
{
if(!$this->isInstalled()) {
echo " {$this->getName()} is not installed.\n";
return;
}
if(!empty($this->dependents)) {
/** @var Component $dependent */
foreach($this->dependents as $dependent) {
if(ComponentManager::getInstance()->getComponent($dependent)->isInstalled()) {
echo " {$this->getName()} is still needed.\n";
return;
}
}
}
echo " Removing {$this->getName()}\n";
$this->installed = false;
/** @var Component $dependency */
foreach($this->dependencies as $dependency) {
/** @var Component $component */
$component = ComponentManager::getInstance()->getComponent($dependency);
foreach($component->getDependents() as $dependent) {
if(ComponentManager::getInstance()->getComponent($dependent)->isInstalled()) {
return;
}
}
if(!$component->explicitInstall) {
$component->remove();
}
}
}
}