Author: chabotc
Date: Mon Mar 30 20:24:16 2009
New Revision: 760153

URL: http://svn.apache.org/viewvc?rev=760153&view=rev
Log:
Adds data-pipelining tag parsing to the spec parser, aliases methods like 
ViewerRequest and PeopleRequest are all normalized to os:DataRequest's with the 
proper method & type set. The resulting array is exported to the view record 
and can be used by the proxied content handler to do the actual data fetching

Modified:
    incubator/shindig/trunk/php/src/gadgets/GadgetSpecParser.php

Modified: incubator/shindig/trunk/php/src/gadgets/GadgetSpecParser.php
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/php/src/gadgets/GadgetSpecParser.php?rev=760153&r1=760152&r2=760153&view=diff
==============================================================================
--- incubator/shindig/trunk/php/src/gadgets/GadgetSpecParser.php (original)
+++ incubator/shindig/trunk/php/src/gadgets/GadgetSpecParser.php Mon Mar 30 
20:24:16 2009
@@ -75,17 +75,68 @@
       }
       foreach (explode(',', $viewNode->getAttribute('view')) as $view) {
         $view = trim($view);
+        $href = trim($viewNode->getAttribute('href'));
+        $type = trim(strtoupper($viewNode->getAttribute('type')));
+        $dataPipelining = array();
+        if (! empty($href) && $type == 'HTML') {
+          // a non empty href & type == 'HTML' means there might be 
data-pipelining tags in the content section
+          $dataPipelining = $this->parseDataPipelining($viewNode);
+        }
         if (isset($gadget->views[$view])) {
           $gadget->views[$view]['content'] .= $viewNode->nodeValue;
         } else {
-          $gadget->views[$view] = array('view' => $view, 'type' => 
strtoupper($viewNode->getAttribute('type')), 'href' => 
$viewNode->getAttribute('href'), 'preferedHeight' => 
$viewNode->getAttribute('prefered_height'),
-              'preferedWidth' => $viewNode->getAttribute('prefered_width'), 
'quirks' => $viewNode->getAttribute('quirks'), 'content' => 
$viewNode->nodeValue, 'authz' => $viewNode->getAttribute('authz'),
-              'oauthServiceName' => 
$viewNode->getAttribute('oauth_service_name'), 'oauthTokenName' => 
$viewNode->getAttribute('oauth_token_name'), 'oauthRequestToken' => 
$viewNode->getAttribute('oauth_request_token'),
-              'oauthRequestTokenSecret' => 
$viewNode->getAttribute('oauth_request_token_secret'), 'signOwner' => 
$viewNode->getAttribute('sign_owner'), 'signViewer' => 
$viewNode->getAttribute('sign_viewer'),
-              'refreshInterval' => 
$viewNode->getAttribute('refresh_interval'));
+          $gadget->views[$view] = array('view' => $view, 'type' => $type, 
'href' => $href, 'preferedHeight' => 
$viewNode->getAttribute('prefered_height'), 'preferedWidth' => 
$viewNode->getAttribute('prefered_width'),
+              'quirks' => $viewNode->getAttribute('quirks'), 'content' => 
$viewNode->nodeValue, 'authz' => $viewNode->getAttribute('authz'), 
'oauthServiceName' => $viewNode->getAttribute('oauth_service_name'),
+              'oauthTokenName' => $viewNode->getAttribute('oauth_token_name'), 
'oauthRequestToken' => $viewNode->getAttribute('oauth_request_token'), 
'oauthRequestTokenSecret' => 
$viewNode->getAttribute('oauth_request_token_secret'),
+              'signOwner' => $viewNode->getAttribute('sign_owner'), 
'signViewer' => $viewNode->getAttribute('sign_viewer'), 'refreshInterval' => 
$viewNode->getAttribute('refresh_interval'), 'dataPipelining' => 
$dataPipelining);
+        }
+      }
+    }
+  }
+
+  /**
+   * Parses the data-pipelining tags of a html/href view
+   *
+   * @param DOMNodeList $dataTags
+   */
+  private function parseDataPipelining(DOMElement &$viewNode) {
+    $dataTags = $viewNode->getElementsByTagName('*');
+    if ($dataTags->length > 0) {
+      $dataPipeliningTags = array();
+      foreach ($dataTags as $dataTag) {
+        $tag = array();
+        $tag['type'] = $dataTag->tagName;
+        $supportedDataAttributes = array('key', 'method', 'userId', 'groupId', 
'fields', 'startIndex', 'count', 'sortBy', 'sortOrder', 'filterBy', 'filterOp', 
'filterValue', 'activityIds', 'href', 'params');
+        foreach ($supportedDataAttributes as $dataAttribute) {
+          $val = $dataTag->getAttribute($dataAttribute);
+          if (! empty($val)) {
+            $tag[$dataAttribute] = $val;
+          }
+        }
+        // normalize the methods so that os:PeopleRequest becomes a 
os:DataRequest with a people.get method, and os:ViewerRequest becomes a 
people.get with a userId = @viewer & groupId = @self, this
+        // makes it a whole lot simpler to implement the actual data fetching 
in the renderer
+        switch ($tag['type']) {
+          case 'os:PeopleRequest':
+            $tag['type'] = 'os:DataRequest';
+            $tag['method'] = 'people.get';
+            break;
+          case 'os:ViewerRequest':
+          case 'os:OwnerRequest':
+            $tag['type'] = 'os:DataRequest';
+            $tag['method'] = 'people.get';
+            $tag['userId'] = $tag['type'] == 'osViewerRequest' ? '@viewer' : 
'@owner';
+            $tag['groupId'] = '@self';
+            break;
+          case 'os:ActivitiesRequest':
+            $tag['type'] = 'os:DataRequest';
+            $tag['method'] = 'activity.get';
+            break;
         }
+        $dataPipeliningTags[] = $tag;
       }
+      return $dataPipeliningTags;
     }
+    return null;
   }
 
   /**


Reply via email to