protected function createAndCache($what)
 {
     if (null !== $this->{$what}) {
         return $this->{$what};
     }
     $cacheClass = $this->options["{$what}_cache_class"];
     if (null === $this->options['cache_dir'] || null === $cacheClass) {
         return $this->{$what} = new $this->options["{$what}_class"]($this->getRouteCollection(), $this->context);
     }
     $cache = new ExpirableConfigCache($this->options['cache_dir'] . '/' . $cacheClass . '.php', $this->options['debug'], $this->metaQuery->getLastTouched());
     if (!$cache->isFresh()) {
         $cs = new CriticalSection();
         $cs->setLogger($this->logger);
         $self = $this;
         $cs->execute(__FILE__, function () use($what, $self, $cache) {
             if (!$cache->isFresh()) {
                 $self->dumpIntoCache($cache, $what);
             } else {
                 $self->debug("Cache has been refreshed while we were waiting.");
             }
         });
     }
     if (!class_exists($cacheClass)) {
         require $cache->getPath();
     }
     return $this->{$what} = new $cacheClass($this->context);
 }
 protected function loadCatalogue($locale)
 {
     // Schauen, ob die Cache-Datei älter als wfd_meta.last_touched ist
     foreach ($this->getCacheFiles($locale) as $cacheFile) {
         if (filemtime($cacheFile) < $this->metaQuery->getLastTouched()) {
             @unlink($cacheFile);
         }
     }
     parent::loadCatalogue($locale);
 }
 protected function configure(MetaQuery $metaQuery)
 {
     try {
         if (!$this->tables && !$this->tableIdConstants && !$this->entities) {
             throw new \RuntimeException(get_class($this) . ' wurde weder mit Tabellennamen, Tabellen-Ids oder Entitätsnamen konfiguriert.');
         }
         if ($this->tables) {
             $metaQuery->addTable($this->tables);
         }
         if ($this->tableIdConstants) {
             $metaQuery->addTable(array_map(function ($x) {
                 return constant($x);
             }, $this->tableIdConstants));
         }
         if ($this->entities) {
             $metaQuery->addEntityClasses($this->entities);
         }
     } catch (\Exception $e) {
         throw new \RuntimeException("Exception während der Konfiguration von MetaQuery durch " . get_class($this), 0, $e);
     }
 }
 public function getTree()
 {
     if (!$this->_tree) {
         $cache = new ExpirableConfigCache($this->cacheFile, $this->debug, $this->metaQuery->getLastTouched());
         $_watch = $this->startTiming('Checking whether the cache is fresh');
         $fresh = $cache->isFresh();
         $this->stopTiming($_watch);
         if (!$fresh) {
             $cs = new \Webfactory\Bundle\WfdMetaBundle\Util\CriticalSection();
             $cs->setLogger($this->logger);
             $_watch = $this->startTiming('Critical section');
             $self = $this;
             $cs->execute(__FILE__, function () use($self, $cache) {
                 if (!$cache->isFresh()) {
                     $self->debug("Building the tree");
                     $self->buildTreeCache($cache);
                     $self->debug("Finished building the tree");
                 } else {
                     $self->debug("Had to wait for the cache to be initialized by another process");
                 }
             });
             $this->stopTiming($_watch);
         }
         if (!$this->_tree) {
             $this->debug("Loading the cached tree");
             $_watch = $this->startTiming('Loading a cached tree');
             $this->_tree = (require $cache);
             $this->stopTiming($_watch);
             $this->debug("Finished loading the cached tree");
         }
         if ($this->eventDispatcher) {
             $this->eventDispatcher->dispatch('webfactory_navigation.tree_initialized', new TreeInitializedEvent($this->_tree));
         }
     }
     return $this->_tree;
 }