loadContainers($defaultContainer); } } /** * * @param array $containers */ private function loadContainers($containers) { if (! File::exists($containers)) { throw new \Exception("Invalid container path"); } foreach (glob("$containers/*.js") as $file) { if (! File::readable($file)) { throw new \Exception("Could not read container config: $file"); } if (is_dir($file)) { // support recursive loading of sub directories $this->loadContainers($file); } else { $this->loadFromFile($file); } } } /** * * @param string $file */ private function loadFromFile($file) { $contents = file_get_contents($file); $contents = $this->removeComments($contents); $config = json_decode($contents, true); if ($config == $contents) { throw new \Exception("Failed to json_decode the container configuration"); } if (! isset($config[$this->container_key][0])) { throw new \Exception("No gadgets.container value set for current container"); } $container = $config[$this->container_key][0]; $this->config[$container] = array(); foreach ($config as $key => $val) { $this->config[$container][$key] = $val; } } /** * @param string $str * @return string */ public function removeComments($str) { // remove /* */ style comments $str = preg_replace('@/\\*.*?\\*/@s', '', $str); // remove // style comments, but keep 'http://' 'https://' and '"//' // for example: "gadgets.uri.oauth.callbackTemplate" : "//%host%/gadgets/oauthcallback" $str = preg_replace('/(?config[$container]) && isset($this->config[$container][$name])) { $config = $this->config[$container][$name]; } if ($container != $this->default_container && isset($this->config[$this->default_container]) && isset($this->config[$this->default_container][$name])) { $config = $this->mergeConfig($this->config[$this->default_container][$name], $config); } return $config; } /** * Code sniplet borrowed from: http://nl.php.net/manual/en/function.array-merge-recursive.php#81409 * default array merge recursive doesn't overwrite values, but creates multiple elementents for that key, * which is not what we want here, we want array_merge like behavior * * @return array */ private function mergeConfig() // $array1, $array2, etc { $arrays = func_get_args(); $narrays = count($arrays); for ($i = 0; $i < $narrays; $i ++) { if (! is_array($arrays[$i])) { trigger_error('Argument #' . ($i + 1) . ' is not an array - trying to merge array with scalar! Returning null!', E_USER_WARNING); return null; } } $ret = $arrays[0]; for ($i = 1; $i < $narrays; $i ++) { foreach ($arrays[$i] as $key => $value) { if (((string)$key) === ((string)intval($key))) { // integer or string as integer key - append $ret[] = $value; } else { if (is_array($value) && isset($ret[$key])) { $ret[$key] = $this->mergeConfig($ret[$key], $value); } else { $ret[$key] = $value; } } } } return $ret; } }