/**
  * Query registered listeners.
  *
  * @param string $eventId
  * @param boolean|mixed $defaultResult
  * @param array|null $data
  * @return boolean|mixed
  */
 protected function queryListeners($eventId, $defaultResult = false, $data = null)
 {
     $eventManager = EventManager::getInstance();
     if (!$eventManager->hasListeners()) {
         return $defaultResult;
     }
     $event = new Event($eventId);
     if (isset($data)) {
         $event->data = $data;
     }
     $event->data[Event::SENDER] = $this;
     $eventManager->dispatch($event);
     return isset($event->data[Event::RESULT]) ? $event->data[Event::RESULT] : $defaultResult;
 }
 public function testOnDemandResolver()
 {
     $xrefDep1 = new Xref('file', '/dep1.json');
     $xrefDep1->setData(array('on-demand1' => '{{token1}}', 'on-demand2' => '{{token2}}'))->setResolved(true);
     $xrefMain = new Xref('file', '/main.json');
     $xrefMain->setData(array('include' => array('xref' => array('dep1' => array('type' => 'file', 'src' => '/dep1.json', 'resolve' => array(array('type' => 'on-demand', 'options' => array('token-prefix' => '{{', 'token-suffix' => '}}'), 'values' => array())))), 'main' => array('dep1'))))->setResolved(true);
     $treeCompiler = new TreeCompiler();
     $treeCompiler->getXrefs()->add($xrefDep1);
     $compiled = $treeCompiler->compileXref($xrefMain);
     $expected = array('on-demand1' => '{{token1}}', 'on-demand2' => '{{token2}}');
     $this->assertEquals($expected, $compiled);
     $this->onDemandTokenValues = array('token1' => 'ok1', 'token2' => 'ok2');
     $testListener = new TestEventListener(array($this, 'eventListenerCallback'));
     $eventManager = EventManager::getInstance();
     $eventManager->register($testListener);
     $this->assertTrue($eventManager->hasListeners());
     $compiled = $treeCompiler->compileXref($xrefMain);
     $expected = array('on-demand1' => 'ok1', 'on-demand2' => 'ok2');
     $this->assertEquals($expected, $compiled);
     $eventManager->remove($testListener);
     $this->assertFalse($eventManager->hasListeners());
 }
示例#3
0
 /**
  * Fetch the data from the specified location of the Xref.
  *
  * @param Xref $xref
  * @param boolean $force If true and Xref already fetched, force the resolver to fetch the data again.
  * @throws UnknownXrefTypeException
  * @throws XrefResolverFetchException
  * @throws \ConfigToken\TreeCompiler\XrefResolver\Exception\InvalidXrefTypeException
  * @throws \ConfigToken\TreeSerializer\Exception\UnknownContentTypeException
  * @throws \ConfigToken\TreeSerializer\Exception\UnknownFileExtensionException
  */
 public static function resolve(Xref $xref, $force = false)
 {
     if ($xref->isResolved() && !$force) {
         return;
     }
     static::matchType($xref);
     if (!$xref->hasLocation()) {
         throw new XrefResolverFetchException($xref);
     }
     $data = null;
     $httpCode = null;
     $contentType = null;
     $eventManager = EventManager::getInstance();
     if ($eventManager->hasListeners()) {
         $event = new Event(self::EVENT_ID_RESOLVE_URL);
         $event->data[self::EVENT_URL] = $xref->getLocation();
         $event->data[Event::RESULT] = false;
         $eventManager->dispatch($event);
         if (isset($event->data[Event::RESULT])) {
             if ($event->data[Event::RESULT] === true) {
                 $data = $event->data[self::EVENT_DATA];
                 $contentType = $event->data[self::EVENT_CONTENT_TYPE];
                 $httpCode = 200;
             } else {
                 if ($event->data[Event::RESULT] !== false) {
                     throw new XrefResolverFetchException($xref, sprintf('Got error message from listener: %s', $event->data[Event::RESULT]));
                 }
             }
         }
     }
     if (!isset($data)) {
         $ch = curl_init();
         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
         curl_setopt($ch, CURLOPT_URL, $xref->getLocation());
         curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
         curl_setopt($ch, CURLOPT_TIMEOUT, 15);
         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
         curl_setopt($ch, CURLOPT_HEADER, false);
         $data = curl_exec($ch);
         $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
         $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
         curl_close($ch);
     }
     if ($httpCode != 200) {
         throw new XrefResolverFetchException($xref, sprintf('Got response code %d', $httpCode));
     }
     if (TreeSerializerFactory::isRegisteredByContentType($contentType)) {
         $serializer = TreeSerializerFactory::getByContentType($contentType);
         $xref->setContentType($contentType);
     } else {
         $path = parse_url($xref->getLocation(), PHP_URL_PATH);
         $fileExtension = pathinfo($path, PATHINFO_EXTENSION);
         if (!TreeSerializerFactory::isRegisteredByFileExtension($fileExtension)) {
             throw new UnknownXrefTypeException(sprintf('Unable to find resolver for Xref content type "%s" or file extension "%s" for location "%s".', $contentType, $fileExtension, $xref->getLocation()));
         }
         $serializer = TreeSerializerFactory::getByFileExtension($fileExtension);
         $xref->setContentType($serializer::getContentType());
     }
     // TODO: catch exception, show xref location in error message
     $data = $serializer::deserialize($data);
     $xref->setData($data);
     $xref->setResolved(true);
 }