/** * Generate a list of route details from the route details file. The route * builder implements inheritance among route detail specifications. Since * all route details from the file share the same namespace the are all * added to the route map. This allows alias routes to be found by the * framework. * * @param string $key * @return MvcRouteHandlerInterface */ public static function buildRouteDetails($key) { $reader = self::$reader; if (!$reader) { $finder = new FileFinder(AF_LIB_PATH, false); $reader = new FileReader($finder); self::$reader = $reader; } $namespace = self::getNamespace($key); /* * 404 is used as the error code because the fault handler will * catch this and use a 404 http reponse for any thing that is not * commandline and exit with 404 for commandline */ if (false === $namespace) { $err = "could not resolve namespace for route key -({$key})"; throw new RunTimeException($err, 404); } /* * grap the route detail file form disk and use the route * build to create a list of routes from its specifications */ $path = NamespaceParser::parseNs($namespace); $file = self::getRouteDetailFilename(); $path = "{$path}/{$file}"; $data = $reader->import($path, true); $routes = RouteBuilder::buildRoutes($data); if (empty($routes)) { return false; } /* * Make alias routes visible to the framework */ $routeKeys = array_keys($routes); foreach ($routeKeys as $routeKey) { if (!self::isRoute($routeKey)) { self::addRoute($routeKey, $namespace); } } return $routes; }
/** * @param string $vendorFile * @return array */ public function discoverPackageTree($path) { $isBasePath = true; if ('/' === $path[0]) { $isBasePath = false; } $finder = new FileFinder('resource', $isBasePath); $fileReader = new FileReader($finder); $packages = array(); $topDir = new RecursiveDirectoryIterator($finder->getPath($path)); $fileReader->setFileFinder(new FileFinder(null, false)); foreach (new RecursiveIteratorIterator($topDir) as $file) { if ('json' !== $file->getExtension()) { continue; } $data = $fileReader->decodeJsonAt($file->getPathName(), true); if (null === $data) { $info = $file->getPathInfo(); $dir = $info->getFileName(); $err = "error parsing the manfiest json file for -({$dir}): "; $err .= "{$fileReader->getLastJsonError()}"; throw new RunTimeException($err); } if (!isset($data['name'])) { $pathName = $file->getPathName(); $err = 'every resource pkg must have a -(name) property '; $err .= "file: -({$pathName})"; throw new DomainException($err); } $name = $data['name']; if (!is_string($name) || empty($name)) { $err = "property -(name) must be a none empty string "; $err .= "-({$file->getPathInfo()->getFileName()})"; throw new RunTimeException($err); } if (!isset($data['type'])) { $err = 'every resource pkg must have a -(type) property '; $err .= "defined: none found for -({$name})"; throw new DomainException($err); } $type = $data['type']; if (!is_string($type) || empty($type)) { $err = "appfuel resource -({$name}) json must have a type "; $err .= "property as which is a non empty string "; throw new DomainException($err); } if (isset($packages[$type][$name])) { $info = $file->getPathInfo(); $err = "can not build tree -({$type}, {$name}) is already "; $err .= "defined -({$info->getPathName()})"; throw new RunTimeException($err); } $packages[$type][$name] = $data; } return $packages; }
/** * @return null */ public static function loadTree() { $file = self::getTreeFile(); $finder = self::loadFileFinder(); $finder->setRootPath($file); $reader = new FileReader($finder); $data = $reader->decodeJsonAt(); if (empty($data)) { $err = "could not load resource tree or tree is empty "; $err .= "-({$finder->getPath()})"; throw new RunTimeException($err); } ResourceTree::setTree($data); /* * we want to reuse the finder so set the root back to the base path */ $finder->setRootPath(''); }