/**
  * {@inheritDoc}
  */
 public function processAction(Request $request)
 {
     $controllers = $this->getCatalogContentControllers($request);
     $controller = null;
     if (null == ($catalogRequestId = $request->query->get('catalogRequestId'))) {
         if (0 < count($controllers)) {
             $controller = $controllers[0];
             $catalogRequestId = $controller->getCatalogRequestId();
             $this->get('logger')->debug('defaulting to controller : ' . get_class($controller));
         }
     } else {
         // let's see if we have a controller for this...
         $definition = Toolbox::className($catalogRequestId . 'Controller');
         $controller = Beans::getBean($definition);
         $this->get('logger')->debug('delegating to controller : ' . get_class($controller));
     }
     // check authorization as we'll need the follow up redirect point to the catalog URL, not a tab url
     $authorized = $this->container->get('sacsManager')->authorize($request, $request->getRequestId(), $this->getUser(), false);
     if (null == $controller || !$authorized) {
         // no controller found
         return parent::processAction($request);
     }
     // fake requestId
     $requestId = $request->getRequestId();
     $request->setRequestId($catalogRequestId);
     // processAction
     $catalogViewContent = null;
     try {
         $catalogContentView = $controller->processAction($request);
         $catalogContentView->setLayout(null);
         $catalogViewContent = $catalogContentView->generate($request);
     } catch (Exception $e) {
         $catalogViewContent = null;
     }
     // restore for normal processing
     $request->setRequestId($requestId);
     // now do the normal thing
     $view = parent::processAction($request);
     // add catalog content view to be used in catalog view template
     $view->setVariable('catalogRequestId', $catalogRequestId);
     $view->setVariable('catalogViewContent', $catalogViewContent);
     $view->setVariable('controllers', $controllers);
     return $view;
 }
 /**
  * Build status map.
  *
  * @return array Plugin status map.
  */
 protected function buildStatusMap()
 {
     // this could be merged, but it seems simpler to avoid more nesting...
     $pathIdMap = array();
     foreach ($this->pluginDirs as $basePath) {
         if (file_exists($basePath) && is_dir($basePath)) {
             $pathIdMap[$basePath] = array();
             foreach (new \DirectoryIterator($basePath) as $filename => $fileInfo) {
                 if ($fileInfo->isDir() && !$fileInfo->isDot() && file_exists($fileInfo->getPathname() . '/plugin.yaml')) {
                     $id = $fileInfo->getFilename();
                     $pathIdMap[$basePath][] = array('id' => $fileInfo->getFilename(), 'pluginDir' => $fileInfo->getPathname());
                 }
             }
         }
     }
     $statusMap = array();
     foreach ($pathIdMap as $basePath => $pathInfo) {
         foreach ($pathInfo as $info) {
             $id = $info['id'];
             $pluginDir = $info['pluginDir'];
             $pluginClass = Toolbox::className($id);
             $pluginClasses = array();
             $pluginClasses[] = sprintf(Plugins::PLUGIN_BASE_NAMESPACE . '\\%s\\%sPlugin', $id, $pluginClass);
             $pluginClasses[] = $this->defaultPluginClass;
             foreach ($pluginClasses as $pluginClass) {
                 if (class_exists($pluginClass)) {
                     break;
                 }
                 $pluginClass = null;
             }
             if ($pluginClass && class_exists($pluginClass)) {
                 $config = array();
                 $pluginConfig = $pluginDir . '/plugin.yaml';
                 $config = Yaml::parse($pluginConfig);
                 // add some stuff
                 $config['meta']['id'] = $id;
                 $config['meta']['pluginDir'] = $pluginDir;
                 $config['meta']['class'] = $pluginClass;
                 // final adjustments
                 $statusMap[$id] = $this->pluginOptionsLoader->load($id, $config);
             }
         }
     }
     return $statusMap;
 }