Переглянути джерело

Added getExtension() to entry level, and refactored internally to use this method in preference to protected vars holding Core Extensions

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@16966 44c647ce-9c0f-0410-b52a-842ac1e357ba
padraic 16 роки тому
батько
коміт
4f3f177e0e

+ 16 - 32
library/Zend/Feed/Reader/Entry/Atom.php

@@ -55,20 +55,6 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
     protected $_xpathQuery = '';
 
     /**
-     * Atom Extension object
-     *
-     * @var Zend_Feed_Reader_Extension_Atom_Entry
-     */
-    protected $_atom = null;
-
-    /**
-     * Thread Extension object
-     *
-     * @var Zend_Feed_Reader_Extension_Thread_Entry
-     */
-    protected $_thread = null;
-
-    /**
      * Constructor
      *
      * @param  DOMElement $entry
@@ -82,12 +68,12 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
 
         // Everyone by now should know XPath indices start from 1 not 0
         $this->_xpathQuery = '//atom:entry[' . ($this->_entryKey + 1) . ']';
-        $atomClass = Zend_Feed_Reader::getPluginLoader()->getClassName('Atom_Entry');
 
-        $this->_atom = new $atomClass($entry, $entryKey, $type);
+        $atomClass = Zend_Feed_Reader::getPluginLoader()->getClassName('Atom_Entry');
+        $this->_extensions['Atom_Entry'] = new $atomClass($entry, $entryKey, $type);
 
         $threadClass = Zend_Feed_Reader::getPluginLoader()->getClassName('Thread_Entry');
-        $this->_thread = new $threadClass($entry, $entryKey, $type);
+        $this->_extensions['Thread_Entry'] = new $threadClass($entry, $entryKey, $type);
     }
 
 	/**
@@ -118,7 +104,7 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
             return $this->_data['authors'];
         }
 
-        $people = $this->_atom->getAuthors();
+        $people = $this->getExtension('Atom')->getAuthors();
 
         $this->_data['authors'] = $people;
 
@@ -136,7 +122,7 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
             return $this->_data['content'];
         }
 
-        $content = $this->_atom->getContent();
+        $content = $this->getExtension('Atom')->getContent();
 
         $this->_data['content'] = $content;
 
@@ -154,7 +140,7 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
             return $this->_data['datecreated'];
         }
 
-        $dateCreated = $this->_atom->getDateCreated();
+        $dateCreated = $this->getExtension('Atom')->getDateCreated();
 
         $this->_data['datecreated'] = $dateCreated;
 
@@ -172,7 +158,7 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
             return $this->_data['datemodified'];
         }
 
-        $dateModified = $this->_atom->getDateModified();
+        $dateModified = $this->getExtension('Atom')->getDateModified();
 
         $this->_data['datemodified'] = $dateModified;
 
@@ -190,7 +176,7 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
             return $this->_data['description'];
         }
 
-        $description = $this->_atom->getDescription();
+        $description = $this->getExtension('Atom')->getDescription();
 
         $this->_data['description'] = $description;
 
@@ -208,7 +194,7 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
             return $this->_data['enclosure'];
         }
 
-        $enclosure = $this->_atom->getEnclosure();
+        $enclosure = $this->getExtension('Atom')->getEnclosure();
 
         $this->_data['enclosure'] = $enclosure;
 
@@ -226,7 +212,7 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
             return $this->_data['id'];
         }
 
-        $id = $this->_atom->getId();
+        $id = $this->getExtension('Atom')->getId();
 
         $this->_data['id'] = $id;
 
@@ -263,7 +249,7 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
             return $this->_data['links'];
         }
 
-        $links = $this->_atom->getLinks();
+        $links = $this->getExtension('Atom')->getLinks();
 
         $this->_data['links'] = $links;
 
@@ -291,7 +277,7 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
             return $this->_data['title'];
         }
 
-        $title = $this->_atom->getTitle();
+        $title = $this->getExtension('Atom')->getTitle();
 
         $this->_data['title'] = $title;
 
@@ -309,10 +295,10 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
             return $this->_data['commentcount'];
         }
 
-        $commentcount = $this->_thread->getCommentCount();
+        $commentcount = $this->getExtension('Thread')>getCommentCount();
 
         if (!$commentcount) {
-            $commentcount = $this->_atom->getCommentCount();
+            $commentcount = $this->getExtension('Atom')->getCommentCount();
         }
 
         $this->_data['commentcount'] = $commentcount;
@@ -331,7 +317,7 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
             return $this->_data['commentlink'];
         }
 
-        $commentlink = $this->_atom->getCommentLink();
+        $commentlink = $this->getExtension('Atom')->getCommentLink();
 
         $this->_data['commentlink'] = $commentlink;
 
@@ -349,7 +335,7 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
             return $this->_data['commentfeedlink'];
         }
 
-        $commentfeedlink = $this->_atom->getCommentFeedLink();
+        $commentfeedlink = $this->getExtension('Atom')->getCommentFeedLink();
 
         $this->_data['commentfeedlink'] = $commentfeedlink;
 
@@ -364,8 +350,6 @@ class Zend_Feed_Reader_Entry_Atom extends Zend_Feed_Reader_EntryAbstract impleme
     public function setXpath(DOMXPath $xpath)
     {
         parent::setXpath($xpath);
-        $this->_atom->setXpath($this->_xpath);
-        $this->_thread->setXpath($this->_xpath);
         foreach ($this->_extensions as $extension) {
             $extension->setXpath($this->_xpath);
         }

+ 27 - 74
library/Zend/Feed/Reader/Entry/Rss.php

@@ -77,47 +77,6 @@ require_once 'Zend/Date.php';
  */
 class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implements Zend_Feed_Reader_EntryInterface
 {
-    /**
-     * Dublin Core object
-     *
-     * @var Zend_Feed_Reader_Extension_DublinCore_Entry
-     */
-    protected $_dc = null;
-
-    /**
-     * Content Module object
-     *
-     * @var Zend_Feed_Reader_Extension_Content_Entry
-     */
-    protected $_content = null;
-
-    /**
-     * Atom Extension object
-     *
-     * @var Zend_Feed_Reader_Extension_Atom_Entry
-     */
-    protected $_atom = null;
-
-    /**
-     * WellFormedWeb Extension object
-     *
-     * @var Zend_Feed_Reader_Extension_WellFormedWeb_Entry
-     */
-    protected $_wfw = null;
-
-    /**
-     * Slash Extension object
-     *
-     * @var Zend_Feed_Reader_Extension_Slash_Entry
-     */
-    protected $_slash = null;
-
-    /**
-     * Atom Threaded Extension object
-     *
-     * @var Zend_Feed_Reader_Extension_Thread_Entry
-     */
-    protected $_thread = null;
 
     /**
      * XPath query for RDF
@@ -150,22 +109,22 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
         $pluginLoader = Zend_Feed_Reader::getPluginLoader();
 
         $dublinCoreClass = $pluginLoader->getClassName('DublinCore_Entry');
-        $this->_dc       = new $dublinCoreClass($entry, $entryKey, $type);
+        $this->_extensions['DublinCore_Entry'] = new $dublinCoreClass($entry, $entryKey, $type);
 
         $contentClass   = $pluginLoader->getClassName('Content_Entry');
-        $this->_content = new $contentClass($entry, $entryKey, $type);
+        $this->_extensions['Content_Entry'] = new $contentClass($entry, $entryKey, $type);
 
         $atomClass   = $pluginLoader->getClassName('Atom_Entry');
-        $this->_atom = new $atomClass($entry, $entryKey, $type);
+        $this->_extensions['Atom_Entry'] = new $atomClass($entry, $entryKey, $type);
 
         $wfwClass   = $pluginLoader->getClassName('WellFormedWeb_Entry');
-        $this->_wfw = new $wfwClass($entry, $entryKey, $type);
+        $this->_extensions['WellFormedWeb_Entry'] = new $wfwClass($entry, $entryKey, $type);
 
         $slashClass   = $pluginLoader->getClassName('Slash_Entry');
-        $this->_slash = new $slashClass($entry, $entryKey, $type);
+        $this->_extensions['Slash_Entry'] = new $slashClass($entry, $entryKey, $type);
 
         $threadClass   = $pluginLoader->getClassName('Thread_Entry');
-        $this->_thread = new $threadClass($entry, $entryKey, $type);
+        $this->_extensions['Thread_Entry'] = new $threadClass($entry, $entryKey, $type);
     }
 
     /**
@@ -229,11 +188,11 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
         }
 
         if (empty($authors)) {
-            $authors = $this->_dc->getAuthors();
+            $authors = $this->getExtension('DublinCore')->getAuthors();
         }
 
         if (empty($authors)) {
-            $authors = $this->_atom->getAuthors();
+            $authors = $this->getExtension('Atom')->getAuthors();
         }
 
         $this->_data['authors'] = $authors;
@@ -252,14 +211,14 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
             return $this->_data['content'];
         }
 
-        $content = $this->_content->getContent();
+        $content = $this->getExtension('Content')->getContent();
 
         if (!$content) {
             $content = $this->getDescription();
         }
 
         if (empty($content)) {
-            $content = $this->_atom->getContent();
+            $content = $this->getExtension('Atom')->getContent();
         }
 
         $this->_data['content'] = $content;
@@ -318,11 +277,11 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
         }
 
         if (!$date) {
-            $date = $this->_dc->getDate();
+            $date = $this->getExtension('DublinCore')->getDate();
         }
 
         if (!$date) {
-            $date = $this->_atom->getDateModified();
+            $date = $this->getExtension('Atom')->getDateModified();
         }
 
         if (!$date) {
@@ -356,11 +315,11 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
         }
 
         if (!$description) {
-            $description = $this->_dc->getDescription();
+            $description = $this->getExtension('DublinCore')->getDescription();
         }
 
         if (empty($description)) {
-            $description = $this->_atom->getDescription();
+            $description = $this->getExtension('Atom')->getDescription();
         }
 
         if (!$description) {
@@ -376,7 +335,7 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
 
     /**
      * Get the entry enclosure
-     *
+     * TODO: Is this supported by RSS? Could delegate to Atom Extension if not.
      * @return string
      */
     public function getEnclosure()
@@ -423,11 +382,11 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
         }
 
         if (!$id) {
-            $id = $this->_dc->getId();
+            $id = $this->getExtension('DublinCore')->getId();
         }
 
         if (empty($id)) {
-            $id = $this->_atom->getId();
+            $id = $this->getExtension('Atom')->getId();
         }
 
         if (!$id) {
@@ -485,7 +444,7 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
         }
 
         if (!$list->length) {
-            $links = $this->_atom->getLinks();
+            $links = $this->getExtension('Atom')->getLinks();
         } else {
             foreach ($list as $link) {
                 $links[] = $link->nodeValue;
@@ -529,11 +488,11 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
         }
 
         if (!$title) {
-            $title = $this->_dc->getTitle();
+            $title = $this->getExtension('DublinCore')->getTitle();
         }
 
         if (!$title) {
-            $title = $this->_atom->getTitle();
+            $title = $this->getExtension('Atom')->getTitle();
         }
 
         if (!$title) {
@@ -556,14 +515,14 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
             return $this->_data['commentcount'];
         }
 
-        $commentcount = $this->_slash->getCommentCount();
+        $commentcount = $this->getExtension('Slash')->getCommentCount();
 
         if (!$commentcount) {
-            $commentcount = $this->_thread->getCommentCount();
+            $commentcount = $this->getExtension('Thread')->getCommentCount();
         }
 
         if (!$commentcount) {
-            $commentcount = $this->_atom->getCommentCount();
+            $commentcount = $this->getExtension('Atom')->getCommentCount();
         }
 
         if (!$commentcount) {
@@ -595,7 +554,7 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
         }
 
         if (!$commentlink) {
-            $commentlink = $this->_atom->getCommentLink();
+            $commentlink = $this->getExtension('Atom')->getCommentLink();
         }
 
         if (!$commentlink) {
@@ -618,14 +577,14 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
             return $this->_data['commentfeedlink'];
         }
 
-        $commentfeedlink = $this->_wfw->getCommentFeedLink();
+        $commentfeedlink = $this->getExtension('WellFormedWeb')->getCommentFeedLink();
 
         if (!$commentfeedlink) {
-            $commentfeedlink = $this->_atom->getCommentFeedLink('rss');
+            $commentfeedlink = $this->getExtension('Atom')->getCommentFeedLink('rss');
         }
 
         if (!$commentfeedlink) {
-            $commentfeedlink = $this->_atom->getCommentFeedLink('rdf');
+            $commentfeedlink = $this->getExtension('Atom')->getCommentFeedLink('rdf');
         }
 
         if (!$commentfeedlink) {
@@ -645,12 +604,6 @@ class Zend_Feed_Reader_Entry_Rss extends Zend_Feed_Reader_EntryAbstract implemen
     public function setXpath(DOMXPath $xpath)
     {
         parent::setXpath($xpath);
-        $this->_dc->setXpath($this->_xpath);
-        $this->_content->setXpath($this->_xpath);
-        $this->_atom->setXpath($this->_xpath);
-        $this->_slash->setXpath($this->_xpath);
-        $this->_wfw->setXpath($this->_xpath);
-        $this->_thread->setXpath($this->_xpath);
         foreach ($this->_extensions as $extension) {
             $extension->setXpath($this->_xpath);
         }

+ 15 - 1
library/Zend/Feed/Reader/EntryAbstract.php

@@ -187,6 +187,20 @@ abstract class Zend_Feed_Reader_EntryAbstract
     }
 
     /**
+     * Return an Extension object with the matching name (postfixed with _Entry)
+     *
+     * @param string $name
+     * @return Zend_Feed_Reader_Extension_EntryAbstract
+     */
+    public function getExtension($name)
+    {
+        if (array_key_exists($name . '_Entry', $this->_extensions)) {
+            return $this->_extensions[$name . '_Entry'];
+        }
+        return null;
+    }
+
+    /**
      * Method overloading: call given method on first extension implementing it
      *
      * @param  string $method
@@ -220,7 +234,7 @@ abstract class Zend_Feed_Reader_EntryAbstract
                 continue;
             }
             $className = Zend_Feed_Reader::getPluginLoader()->getClassName($extension);
-            $this->_extensions[$className] = new $className(
+            $this->_extensions[$extension] = new $className(
                 $this->getElement(), $this->_entryKey, $this->_data['type']
             );
         }

+ 6 - 0
library/Zend/Feed/Reader/FeedAbstract.php

@@ -261,6 +261,12 @@ abstract class Zend_Feed_Reader_FeedAbstract implements Zend_Feed_Reader_FeedInt
         . 'does not exist and could not be located on a registered Extension');
     }
 
+    /**
+     * Return an Extension object with the matching name (postfixed with _Feed)
+     *
+     * @param string $name
+     * @return Zend_Feed_Reader_Extension_FeedAbstract
+     */
     public function getExtension($name)
     {
         if (array_key_exists($name . '_Feed', $this->_extensions)) {

+ 18 - 0
tests/Zend/Feed/Reader/Entry/CommonTest.php

@@ -65,5 +65,23 @@ class Zend_Feed_Reader_Entry_CommonTest extends PHPUnit_Framework_TestCase
         $this->assertEquals($entry->saveXml(), file_get_contents($this->_feedSamplePath.'/atom_rewrittenbydom.xml'));
     }
 
+    public function testGetsNamedExtension()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/atom.xml')
+        );
+        $entry = $feed->current();
+        $this->assertTrue($entry->getExtension('Atom') instanceof Zend_Feed_Reader_Extension_Atom_Entry);
+    }
+
+    public function testReturnsNullIfExtensionDoesNotExist()
+    {
+        $feed = Zend_Feed_Reader::importString(
+            file_get_contents($this->_feedSamplePath.'/atom.xml')
+        );
+        $entry = $feed->current();
+        $this->assertEquals(null, $entry->getExtension('Foo'));
+    }
+
 
 }