Commit 43ecaf54 authored by beberlei's avatar beberlei

[2.0] DDC-374 - Implement and tested DriverChain Mapping Adapter

parent fcd623e8
...@@ -22,7 +22,8 @@ ...@@ -22,7 +22,8 @@
namespace Doctrine\ORM\Mapping\Driver; namespace Doctrine\ORM\Mapping\Driver;
use Doctrine\ORM\Mapping\Driver\Driver, use Doctrine\ORM\Mapping\Driver\Driver,
Doctrine\ORM\Mapping\ClassMetadataInfo; Doctrine\ORM\Mapping\ClassMetadataInfo,
Doctrine\ORM\Mapping\MappingException;
/** /**
* The DriverChain allows you to add multiple other mapping drivers for * The DriverChain allows you to add multiple other mapping drivers for
...@@ -44,6 +45,12 @@ class DriverChain implements Driver ...@@ -44,6 +45,12 @@ class DriverChain implements Driver
*/ */
private $_drivers = array(); private $_drivers = array();
/**
* Add a nested driver
*
* @param Driver $nestedDriver
* @param string $namespace
*/
public function addDriver(Driver $nestedDriver, $namespace) public function addDriver(Driver $nestedDriver, $namespace)
{ {
$this->_drivers[$namespace] = $nestedDriver; $this->_drivers[$namespace] = $nestedDriver;
...@@ -60,8 +67,11 @@ class DriverChain implements Driver ...@@ -60,8 +67,11 @@ class DriverChain implements Driver
foreach ($this->_drivers AS $namespace => $driver) { foreach ($this->_drivers AS $namespace => $driver) {
if (strpos($className, $namespace) === 0) { if (strpos($className, $namespace) === 0) {
$driver->loadMetadataForClass($className, $metadata); $driver->loadMetadataForClass($className, $metadata);
return;
} }
} }
throw MappingException::classIsNotAValidEntityOrMappedSuperClass($className);
} }
/** /**
...@@ -93,5 +103,7 @@ class DriverChain implements Driver ...@@ -93,5 +103,7 @@ class DriverChain implements Driver
return $driver->isTransient($className); return $driver->isTransient($className);
} }
} }
throw MappingException::classIsNotAValidEntityOrMappedSuperClass($className);
} }
} }
\ No newline at end of file
<?php
namespace Doctrine\Tests\ORM\Mapping;
use Doctrine\ORM\Mapping\Driver\Driver;
use Doctrine\ORM\Mapping\Driver\DriverChain;
require_once __DIR__ . '/../../TestInit.php';
class DriverChainTest extends \Doctrine\Tests\OrmTestCase
{
public function testDelegateToMatchingNamespaceDriver()
{
$className = 'Doctrine\Tests\ORM\Mapping\DriverChainEntity';
$classMetadata = new \Doctrine\ORM\Mapping\ClassMetadata($className);
$chain = new DriverChain();
$driver1 = $this->getMock('Doctrine\ORM\Mapping\Driver\Driver');
$driver1->expects($this->never())
->method('loadMetadataForClass');
$driver1->expectS($this->never())
->method('isTransient');
$driver2 = $this->getMock('Doctrine\ORM\Mapping\Driver\Driver');
$driver2->expects($this->at(0))
->method('loadMetadataForClass')
->with($this->equalTo($className), $this->equalTo($classMetadata));
$driver2->expects($this->at(1))
->method('isTransient')
->with($this->equalTo($className))
->will($this->returnValue( true ));
$chain->addDriver($driver1, 'Doctrine\Tests\Models\Company');
$chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping');
$chain->loadMetadataForClass($className, $classMetadata);
$this->assertTrue( $chain->isTransient($className) );
}
public function testLoadMetadata_NoDelegatorFound_ThrowsMappingException()
{
$className = 'Doctrine\Tests\ORM\Mapping\DriverChainEntity';
$classMetadata = new \Doctrine\ORM\Mapping\ClassMetadata($className);
$chain = new DriverChain();
$this->setExpectedException('Doctrine\ORM\Mapping\MappingException');
$chain->loadMetadataForClass($className, $classMetadata);
}
public function testIsTransient_NoDelegatorFound_ThrowsMappingException()
{
$className = 'Doctrine\Tests\ORM\Mapping\DriverChainEntity';
$classMetadata = new \Doctrine\ORM\Mapping\ClassMetadata($className);
$chain = new DriverChain();
$this->setExpectedException('Doctrine\ORM\Mapping\MappingException');
$chain->isTransient($className);
}
public function testGatherAllClassNames()
{
$className = 'Doctrine\Tests\ORM\Mapping\DriverChainEntity';
$classMetadata = new \Doctrine\ORM\Mapping\ClassMetadata($className);
$chain = new DriverChain();
$driver1 = $this->getMock('Doctrine\ORM\Mapping\Driver\Driver');
$driver1->expects($this->once())
->method('getAllClassNames')
->will($this->returnValue(array('Foo')));
$driver2 = $this->getMock('Doctrine\ORM\Mapping\Driver\Driver');
$driver2->expects($this->once())
->method('getAllClassNames')
->will($this->returnValue(array('Bar', 'Baz')));
$chain->addDriver($driver1, 'Doctrine\Tests\Models\Company');
$chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping');
$this->assertEquals(array('Foo', 'Bar', 'Baz'), $chain->getAllClassNames());
}
}
class DriverChainEntity
{
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment