Changeset 796

Show
Ignore:
Timestamp:
08/10/07 11:05:31 (1 year ago)
Author:
mikey
Message:

fixed best mapping algorithm

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/main/php/net/stubbles/php/serializer/stubPHPSerializer.php

    r777 r796  
    9494        } 
    9595         
    96         $nqClassName = get_class($object); 
    9796        $fqClassName = (($object instanceof stubObject) ? ($object->getClassName()) : (get_class($object))); 
    9897        // Check the mapping-cache for an entry for this object's class 
     
    104103        // tree of the object's class to the class being handled by the mapping. 
    105104        $cinfo = array(); 
    106         foreach (array_keys($this->mappings) as $token) { 
    107             $refClass     = $this->mappings[$token]->getHandledClass(); 
     105        $class = (($object instanceof stubObject) ? ($object->getClass()) : (new stubReflectionObject($object))); 
     106        foreach ($this->mappings as $mapping) { 
     107            $refClass     = $mapping->getHandledClass(); 
    108108            $refClassName = $refClass->getName(); 
    109109            if (($object instanceof $refClassName) === false) { 
     
    111111            } 
    112112             
    113             $distance = 0; 
     113            $distance    = 0; 
     114            $objectClass = $class; 
    114115            do { 
    115116                // check for direct match 
    116                 if ($refClass->getName() != $nqClassName) { 
     117                if ($refClass->getName() != $objectClass->getName()) { 
    117118                    $distance++; 
    118119                } 
    119                  
    120                 // check if this class is the parent class, if yes do 
    121                 // not continue to search for deeper parent classes 
    122                 if (get_parent_class($object) == $refClass->getName()) { 
    123                     break; 
    124                 } 
    125             } while (0 < $distance && false !== ($refClass = $refClass->getParentClass())); 
     120            } while (0 < $distance && null !== ($objectClass = $objectClass->getParentClass())); 
    126121             
    127122            // register distance to object's class in cinfo 
    128             $cinfo[$distance] = $this->mappings[$token]
     123            $cinfo[$distance] = $mapping
    129124     
    130125            if (isset($cinfo[0]) == true) { 
  • trunk/src/test/php/net/stubbles/php/serializer/stubPHPSerializerTestCase.php

    r776 r796  
    1111interface TestSerializedMapping0 { } 
    1212class TestSerializedMapping1 implements TestSerializedMapping0 { } 
    13 interface TestSerializedMapping3 { } 
    14 class TestSerializedMapping2 extends TestSerializedMapping1 implements TestSerializedMapping3 { } 
    15 class TestSerializedMapping4 extends TestSerializedMapping2 implements TestSerializedMapping3 { } 
     13class TestSerializedMapping2 extends TestSerializedMapping1 { } 
     14class TestSerializedMapping4 extends TestSerializedMapping2 { } 
     15class TestSerializedMapping5 extends TestSerializedMapping4 { } 
    1616/** 
    1717 * Tests for net.stubbles.php.serializer.stubPHPSerializer. 
     
    168168        $mockMapping2->setReturnValue('getHandledClass', new ReflectionClass('TestSerializedMapping2')); 
    169169        $mockMapping2->setReturnValue('serialize', 'BAZ:dummy'); 
    170         $mockMapping3 = new MockstubPHPSerializerMapping(); 
    171         $mockMapping3->setReturnValue('getToken', 'X'); 
    172         $mockMapping3->setReturnValue('getHandledClass', new ReflectionClass('TestSerializedMapping3')); 
    173         $mockMapping3->setReturnValue('serialize', 'X:dummy'); 
    174170         
    175171        // both must be serialized with the FOO mapping, because both are 
     
    179175        $this->assertEqual('FOO:dummy', $this->serializer->serialize(new TestSerializedMapping2())); 
    180176        $this->assertEqual('FOO:dummy', $this->serializer->serialize(new TestSerializedMapping4())); 
     177        $this->assertEqual('FOO:dummy', $this->serializer->serialize(new TestSerializedMapping5())); 
    181178         
    182179        // both must be serialized with the BAR mapping, because both are 
     
    186183        $this->assertEqual('BAR:dummy', $this->serializer->serialize(new TestSerializedMapping2())); 
    187184        $this->assertEqual('BAR:dummy', $this->serializer->serialize(new TestSerializedMapping4())); 
     185        $this->assertEqual('BAR:dummy', $this->serializer->serialize(new TestSerializedMapping5())); 
    188186         
    189187        // add more concrete mapping for BAZ. TestSerializedMapping1 must still 
     
    194192        $this->assertEqual('BAZ:dummy', $this->serializer->serialize(new TestSerializedMapping2())); 
    195193        $this->assertEqual('BAZ:dummy', $this->serializer->serialize(new TestSerializedMapping4())); 
    196          
    197         // concrete mapping for classes implementing interface TestSerializedMapping3 
    198         $this->serializer->addMapping($mockMapping3); 
    199         $this->assertEqual('BAR:dummy', $this->serializer->serialize(new TestSerializedMapping1())); 
    200         $this->assertEqual('BAZ:dummy', $this->serializer->serialize(new TestSerializedMapping2())); 
    201         $this->assertEqual('X:dummy', $this->serializer->serialize(new TestSerializedMapping4())); 
     194        $this->assertEqual('BAZ:dummy', $this->serializer->serialize(new TestSerializedMapping5())); 
    202195    } 
    203196}