/** * 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()); }
/** * 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); }