Changeset 727

Show
Ignore:
Timestamp:
06/10/07 12:28:26 (1 year ago)
Author:
schst
Message:

Implemented request #65: Different strategies for XMLSerializer

Files:

Legend:

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

    r717 r727  
    2727     * Option to define the root tag of the serialized document 
    2828     */ 
    29     const OPT_ROOT_TAG    = 1; 
     29    const OPT_ROOT_TAG    = 'root-tag'; 
     30 
     31    /** 
     32     * Option to define the strategy 
     33     */ 
     34    const OPT_STRATEGY    = 'strategy'; 
     35 
     36    /** 
     37     * Do not export any properties or methods 
     38     */ 
     39    const STRATEGY_NONE = 0; 
     40 
     41    /** 
     42     * export only public properties 
     43     */ 
     44    const STRATEGY_PROPS = 1; 
     45 
     46    /** 
     47     * export only public methods 
     48     */ 
     49    const STRATEGY_METHODS = 2; 
     50 
     51    /** 
     52     * export public properties and methods 
     53     */ 
     54    const STRATEGY_ALL = 3; 
    3055 
    3156    /** 
     
    3661    private $defaultOpts = array( 
    3762                      self::OPT_ROOT_TAG    => null, 
     63                      self::OPT_STRATEGY    => self::STRATEGY_ALL 
    3864                    ); 
    3965 
     
    5682        // set the currently used options 
    5783        $this->opts = array_merge($this->defaultOpts, $opts); 
    58  
    5984        $this->serializeDispatcher($data, $xmlWriter, ((isset($this->opts[self::OPT_ROOT_TAG]) == true) ? ($this->opts[self::OPT_ROOT_TAG]) : (null))); 
    6085    } 
     
    111136     * @param stubXMLStreamWriter $xmlWriter 
    112137     * @param string 
     138     * @todo  fetch a strategy from the annotation 
     139     * @todo  Refactor this method into smaller methods for improved readability 
    113140     */ 
    114141    protected function serializeObject($object, stubXMLStreamWriter $xmlWriter, $tagName) { 
     
    125152 
    126153        $xmlWriter->writeStartElement($tagName); 
     154 
     155        $strategy = $this->opts[self::OPT_STRATEGY]; 
    127156 
    128157        // export props 
     
    155184                $xmlWriter->writeAttribute($xmlAttribute->getAttributeName(), (string)$propValue); 
    156185                continue; 
    157             } 
    158             if ($property->hasAnnotation('XMLFragment')) { 
     186            } elseif ($property->hasAnnotation('XMLFragment')) { 
    159187                $xmlFragment = $property->getAnnotation('XMLFragment'); 
    160188                $tagName = $xmlFragment->getTagName(); 
     
    167195                } 
    168196                continue; 
    169             } 
    170             if ($property->hasAnnotation('XMLTag')) { 
     197            } elseif ($property->hasAnnotation('XMLTag')) { 
    171198                $xmlTag = $property->getAnnotation('XMLTag'); 
    172199                $tagName = $xmlTag->getTagName(); 
     
    179206                    } 
    180207                } else { 
     208                    if (($strategy & self::STRATEGY_PROPS) === 0) { 
     209                        continue; 
     210                    } 
    181211                    $tagName = $property->getName(); 
    182212                } 
    183213                $elementName = null; 
    184214            } 
    185  
    186215            if (is_array($propValue)) { 
    187216                $this->serializeArray($propValue, $xmlWriter, $tagName, $elementName); 
     
    217246            } 
    218247 
    219  
    220248            $returnValue = $method->invoke($object); 
    221249            if ($method->hasAnnotation('XMLAttribute') && $method->hasAnnotation('XMLTag')) { 
     
    229257                $xmlWriter->writeAttribute($xmlAttribute->getAttributeName(), (string)$returnValue); 
    230258                continue; 
    231             } 
    232             if ($method->hasAnnotation('XMLFragment')) { 
     259            } elseif ($method->hasAnnotation('XMLFragment')) { 
    233260                $xmlFragment = $method->getAnnotation('XMLFragment'); 
    234261                $tagName = $xmlFragment->getTagName(); 
     
    241268                } 
    242269                continue; 
    243             } 
    244             if ($method->hasAnnotation('XMLTag')) { 
     270            } elseif ($method->hasAnnotation('XMLTag')) { 
    245271                $xmlTag = $method->getAnnotation('XMLTag'); 
    246272                $tagName = $xmlTag->getTagName(); 
     
    253279                    } 
    254280                } else { 
     281                    if (($strategy & self::STRATEGY_METHODS) === 0) { 
     282                        continue; 
     283                    } 
    255284                    $tagName = $method->getName(); 
    256285                } 
  • trunk/src/test/php/net/stubbles/xml/stubXMLSerializerTestCase.php

    r718 r727  
    66 * @package     stubbles 
    77 * @subpackage  xml_test 
     8 * @todo        Split this into smaller test cases 
    89 */ 
    910stubClassLoader::load('net.stubbles.xml.stubDomXMLStreamWriter', 
     
    431432 
    432433    /** 
    433      * Test serializing an object with a method matcher 
    434      */ 
    435     public function testObjectDefault() { 
    436         $writer = new stubDomXMLStreamWriter(); 
     434     * Test serializing an object without annotations and different stragies 
     435     * 
     436     * @todo Implement tests for mixing annotations with strategies 
     437     */ 
     438    public function testDefaultObjectStrategies() { 
    437439        $obj = new XMLSerializerDefaultObj(); 
     440 
     441        // No strategy 
     442        $writer = new stubDomXMLStreamWriter(); 
    438443        $this->serializer->serialize($obj, $writer); 
    439444        $this->assertEqual('<?xml version="1.0" encoding="ISO-8859-1"?>' . "\n" . '<XMLSerializerDefaultObj><foo>foo</foo><getBar>bar</getBar></XMLSerializerDefaultObj>', $writer->asXML()); 
     445 
     446        // STRATEGY_ALL 
     447        $writer = new stubDomXMLStreamWriter(); 
     448        $this->serializer->serialize($obj, $writer, array(stubXMLSerializer::OPT_STRATEGY => stubXMLSerializer::STRATEGY_ALL)); 
     449        $this->assertEqual('<?xml version="1.0" encoding="ISO-8859-1"?>' . "\n" . '<XMLSerializerDefaultObj><foo>foo</foo><getBar>bar</getBar></XMLSerializerDefaultObj>', $writer->asXML()); 
     450 
     451        // STRATEGY_NONE 
     452        $writer = new stubDomXMLStreamWriter(); 
     453        $this->serializer->serialize($obj, $writer, array(stubXMLSerializer::OPT_STRATEGY => stubXMLSerializer::STRATEGY_NONE)); 
     454        $this->assertEqual('<?xml version="1.0" encoding="ISO-8859-1"?>' . "\n" . '<XMLSerializerDefaultObj/>', $writer->asXML()); 
     455 
     456        // STRATEGY_PROPS 
     457        $writer = new stubDomXMLStreamWriter(); 
     458        $this->serializer->serialize($obj, $writer, array(stubXMLSerializer::OPT_STRATEGY => stubXMLSerializer::STRATEGY_PROPS)); 
     459        $this->assertEqual('<?xml version="1.0" encoding="ISO-8859-1"?>' . "\n" . '<XMLSerializerDefaultObj><foo>foo</foo></XMLSerializerDefaultObj>', $writer->asXML()); 
     460 
     461        // STRATEGY_METHODS 
     462        $writer = new stubDomXMLStreamWriter(); 
     463        $this->serializer->serialize($obj, $writer, array(stubXMLSerializer::OPT_STRATEGY => stubXMLSerializer::STRATEGY_METHODS)); 
     464        $this->assertEqual('<?xml version="1.0" encoding="ISO-8859-1"?>' . "\n" . '<XMLSerializerDefaultObj><getBar>bar</getBar></XMLSerializerDefaultObj>', $writer->asXML()); 
    440465    } 
    441466}