Test Failed
Push — master ( befc15...123c13 )
by Jean-Christophe
18:33
created

DevRouterCacheTrait::getAllControllersFiles()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 1
c 1
b 0
f 0
dl 0
loc 2
ccs 1
cts 1
cp 1
rs 10
cc 1
nc 1
nop 2
crap 1
1
<?php
2
3
namespace Ubiquity\cache\traits;
4
5
use Ubiquity\cache\ClassUtils;
6
use Ubiquity\cache\parser\ControllerParser;
7
use Ubiquity\controllers\Startup;
8
use Ubiquity\controllers\di\DiManager;
9
use Ubiquity\utils\base\UArray;
10
use Ubiquity\exceptions\ParserException;
11
12
/**
13
 * Ubiquity\cache\traits$DevRouterCacheTrait
14
 * This class is part of Ubiquity
15
 *
16
 * @author jc
17
 * @version 1.0.14
18
 *
19
 */
20
trait DevRouterCacheTrait {
21
	
22
	abstract public static function getAnnotationsEngineInstance();
23
	
24
	private static function addControllerCache($classname) {
25
		$parser = new ControllerParser ( self::getAnnotationsEngineInstance () );
26
		try {
27
			$parser->parse ( $classname );
28
			return $parser->asArray ();
29
		} catch ( \Exception $e ) {
30
			// Nothing to do
31
		}
32
		return [ ];
33
	}
34
	
35 17
	private static function parseControllerFiles(&$config, $silent = false,$activeDomain=false) {
36 17
		$routes = [ 'rest' => [ ],'default' => [ ] ];
37 17
		if($activeDomain){
38 17
			$files=self::getControllersFiles($config,$silent);
39 17
		}else {
40 17
			$files = self::getAllControllersFiles($config, $silent);
41 17
		}
42 17
		$annotsEngine = self::getAnnotationsEngineInstance ();
43 17
		foreach ( $files as $file ) {
44
			if (is_file ( $file )) {
45 17
				$controller = ClassUtils::getClassFullNameFromFile ( $file );
46 17
				$parser = new ControllerParser ( $annotsEngine );
47 17
				$parser->setSilent($silent);
48 17
				try {
49
					$parser->parse ( $controller);
50
					$ret = $parser->asArray ();
51
					$key = ($parser->isRest ()) ? 'rest' : 'default';
52
					$routes [$key] = \array_merge ( $routes [$key], $ret );
53
				} catch ( \Exception $e ) {
54
					if (!$silent && $e instanceof ParserException) {
55
						throw $e;
56
					}
57 17
					// Nothing to do
58 17
				}
59 17
			}
60 17
		}
61 17
		self::sortByPriority ( $routes ['default'] );
62
		self::sortByPriority ( $routes ['rest'] );
63
		$routes ['rest-index'] = self::createIndex ( $routes ['rest'] );
64 17
		$routes ['default-index'] = self::createIndex ( $routes ['default'] );
65 17
		return $routes;
66
	}
67
	
68 17
	private static function hasCapturingGroup(string $expression): bool {
69 17
		return \preg_match ( "~\\\\.(*SKIP)(?!)|\((?(?=\?)\?(P?['<]\w+['>]))~", $expression )===1;
70
	}
71
	
72 17
	public static function getFirstPartIndex(string $element) {
73 17
		return \strtok ( \trim ( $element, '/' ), '/' );
74 17
	}
75 17
	
76 17
	protected static function createIndex(array $routes): array {
77 17
		$res = [ ];
78 17
		foreach ( $routes as $path => $route ) {
79
			if (self::hasCapturingGroup ( $path )) {
80
				$part = self::getFirstPartIndex ( $path );
81 17
				if ($part != null) {
82
					if($part===\trim($path,'/')){
83
						$part='*';
84
					}
85 17
					$res [$part] [] = $path;
86
				}
87
			}
88 17
		}
89 17
		return $res;
90 17
	}
91 17
	
92 17
	protected static function sortByPriority(&$array) {
93 17
		\uasort ( $array, function ($item1, $item2) {
94
			return UArray::getRecursive ( $item2, 'priority', 0 ) <=> UArray::getRecursive ( $item1, 'priority', 0 );
95 8
		} );
96 8
			UArray::removeRecursive ( $array, 'priority' );
97 8
	}
98 8
	
99 8
	protected static function initRouterCache(&$config, $silent = false) {
100 8
		$routes = self::parseControllerFiles ( $config, $silent );
101 8
		self::$cache->store ( 'controllers/routes.default', $routes ['default'], 'controllers' );
102 8
		self::$cache->store ( 'controllers/routes.rest', $routes ['rest'], 'controllers' );
103 8
		self::$cache->store ( 'controllers/routes.default-index', $routes ['default-index'], 'controllers' );
104
		self::$cache->store ( 'controllers/routes.rest-index', $routes ['rest-index'], 'controllers' );
105 8
		DiManager::init ( $config );
106
		if (! $silent) {
107 17
			echo "Router cache reset\n";
108 17
		}
109
	}
110
	
111 10
	public static function getControllersFiles(&$config, $silent = false) {
112 10
		return self::_getFiles ( $config, 'controllers', $silent );
113 10
	}
114 1
115
	public static function getAllControllersFiles(&$config, $silent = false) {
116 10
		return self::_getAllFiles ( $config, 'controllers', $silent );
117 10
	}
118
	
119 10
	public static function getControllers($subClass = "\\Ubiquity\\controllers\\Controller", $backslash = false, $includeSubclass = false, $includeAbstract = false) {
120
		$result = [ ];
121
		if ($includeSubclass) {
122
			$result [] = $subClass;
123 10
		}
124 10
		$config = Startup::getConfig ();
125 10
		$files = self::getControllersFiles ( $config, true );
126 10
		try {
127 10
			$restCtrls = self::getRestCache ();
128 10
		} catch ( \Exception $e ) {
129 10
			$restCtrls = [ ];
130
		}
131
		foreach ( $files as $file ) {
132
			if (\is_file ( $file )) {
133
				$controllerClass = ClassUtils::getClassFullNameFromFile ( $file, $backslash );
134 10
				if (\class_exists ( $controllerClass ) && isset ( $restCtrls [$controllerClass] ) === false) {
135
					$r = new \ReflectionClass ( $controllerClass );
136
					if ($r->isSubclassOf ( $subClass ) && ($includeAbstract || ! $r->isAbstract ())) {
137
						$result [] = $controllerClass;
138
					}
139
				}
140
			}
141
		}
142
		return $result;
143
	}
144
}
145
146