You are viewing a plain text version of this content. The canonical link for it is here.
Posted to pluto-scm@portals.apache.org by ms...@apache.org on 2015/01/27 09:02:02 UTC

[18/19] portals-pluto git commit: Adapting portlet hub implementation to new URL / PRP formats

Adapting portlet hub implementation to new URL / PRP formats


Project: http://git-wip-us.apache.org/repos/asf/portals-pluto/repo
Commit: http://git-wip-us.apache.org/repos/asf/portals-pluto/commit/1b606b02
Tree: http://git-wip-us.apache.org/repos/asf/portals-pluto/tree/1b606b02
Diff: http://git-wip-us.apache.org/repos/asf/portals-pluto/diff/1b606b02

Branch: refs/heads/PortletHub
Commit: 1b606b024b2d6a0ffdddcb78d7b58c0a8f32083a
Parents: a26a529
Author: Scott Nicklous <ms...@apache.org>
Authored: Mon Jan 26 17:24:40 2015 +0100
Committer: Scott Nicklous <ms...@apache.org>
Committed: Mon Jan 26 17:24:40 2015 +0100

----------------------------------------------------------------------
 .../org/apache/pluto/driver/util/PageState.java |  73 ++++--
 pluto-portal/src/main/webapp/portletHubImpl.js  | 232 ++++++++++++-------
 2 files changed, 207 insertions(+), 98 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/1b606b02/pluto-portal-driver/src/main/java/org/apache/pluto/driver/util/PageState.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver/src/main/java/org/apache/pluto/driver/util/PageState.java b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/util/PageState.java
index 81391d2..f0f22d2 100644
--- a/pluto-portal-driver/src/main/java/org/apache/pluto/driver/util/PageState.java
+++ b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/util/PageState.java
@@ -43,6 +43,7 @@ import org.apache.pluto.driver.services.portal.PageConfig;
 import org.apache.pluto.driver.services.portal.PublicRenderParameterMapper;
 import org.apache.pluto.driver.url.PortalURL;
 import org.apache.pluto.driver.url.PortalURLParameter;
+import org.apache.pluto.driver.url.PortalURLPublicParameter;
 
 /**
  * @author Scott Nicklous
@@ -255,10 +256,12 @@ public class PageState {
     */
    public String toJSONString() {
       StringBuffer json = new StringBuffer(1024);
-      json.append("{\n");
+      json.append("{\"portlets\" : {\n");
       
       Collection<PortalURLParameter> pups = getParameters();
       Map<String, String[]> pubparms = getPublicParameters();
+      PublicRenderParameterMapper mapper = portalUrl.getPublicRenderParameterMapper();
+      int numGroups = mapper.getNumberOfGroups();
       
       boolean sep = false;
       for (String pid : getPortletIds()) {
@@ -287,25 +290,51 @@ public class PageState {
          
          // Add the public render parameter values for this portlet
          
-         Set<String> prpnames = getPRPNames(pid);
-         for (String prp : pubparms.keySet()) {
-            if (prpnames.contains(prp)) {
-               json.append(c1 + prp + "\" : [");
-               String c2 = "";
-               for (String val : (String[])pubparms.get(prp)) {
-                  json.append(c2 + " \"" + val + "\"");
-                  c2 = ",";
-               }
-               json.append("]");
-               c1 = ",\n            \"";
+         for (PortalURLPublicParameter prp : mapper.getPRPsForWindow(pid, true)) {
+            json.append(c1 + prp.getName() + "\" : [");
+            String c2 = "";
+            for (String val : prp.getValues()) {
+               json.append(c2 + " \"" + val + "\"");
+               c2 = ",";
             }
+            json.append("]");
+            c1 = ",\n            \"";
          }
+         
+//          Set<String> prpnames = getPRPNames(pid);
+//          for (String prp : pubparms.keySet()) {
+//             if (prpnames.contains(prp)) {
+//                json.append(c1 + prp + "\" : [");
+//                String c2 = "";
+//                for (String val : (String[])pubparms.get(prp)) {
+//                   json.append(c2 + " \"" + val + "\"");
+//                   c2 = ",";
+//                }
+//                json.append("]");
+//                c1 = ",\n            \"";
+//             }
+//          }
 
          json.append("         }, \n");
          json.append("         \"portletMode\" : \"" + getPortletMode(pid) + "\", \n");
          json.append("         \"windowState\" : \"" + getWindowState(pid) + "\"\n");
          json.append("      },\n");
-         json.append("      \"pubParms\" : [" + getPRPNamesAsString(pid) + "],\n");
+//          json.append("      \"pubParms\" : [" + getPRPNamesAsString(pid) + "],\n");
+         
+         json.append("      \"pubParms\" : {");
+         String c2 = "";
+         for (PortalURLPublicParameter prp : mapper.getPRPsForWindow(pid, false)) {
+            int group = mapper.getIndex(prp);
+            json.append(c2);
+            json.append("\"");
+            json.append(prp.getName());
+            json.append("\" : \"");
+            json.append(String.valueOf(group));
+            json.append("\"");
+            c2 = ", ";
+         }
+         json.append("},\n");
+         
          json.append("      \"allowedPM\" : [" + getPortletModesAsString(pid) + "],\n");
          json.append("      \"allowedWS\" : [" + getWindowStatesAsString(pid) + "],\n");
          json.append("      \"renderData\" : {\n");
@@ -316,7 +345,23 @@ public class PageState {
          json.append("   }");
       }
       
-      json.append("\n}");
+      json.append("\n},\n\"prpMap\" : {");
+      String sep1 = "";
+      for (int ii=0; ii < mapper.getNumberOfGroups(); ii++) {
+         json.append(sep1).append("\n   \"").append(String.valueOf(ii)).append("\" : {");
+         sep1 = ",";
+         String sep2 = "";
+         for (PortalURLPublicParameter prp : mapper.getPublicParameterGroup(ii)) {
+            json.append(sep2).append("\n      \"")
+                .append(getNameSpace(prp.getWindowId()))
+                .append("\" : \"")
+                .append(prp.getName()).append("\"");
+            sep2 = ", ";
+         }
+         json.append("   }");
+      }
+      json.append("\n}}");
+
       return json.toString();
    }
 }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/1b606b02/pluto-portal/src/main/webapp/portletHubImpl.js
----------------------------------------------------------------------
diff --git a/pluto-portal/src/main/webapp/portletHubImpl.js b/pluto-portal/src/main/webapp/portletHubImpl.js
index cf2817b..6027568 100644
--- a/pluto-portal/src/main/webapp/portletHubImpl.js
+++ b/pluto-portal/src/main/webapp/portletHubImpl.js
@@ -38,14 +38,16 @@ var portlet = portlet || {};
    var isInitialized = false,
 
    /**
-    * The object holding the portlet data for each portlet on the page.
-    * This an object indexed by portlet ID.
+    * The object holding the portlet data for each portlet on the page along with
+    * mapping information for public render paramters. 
+    * The portlet data is indexed by portlet ID.
     * @property   {PortletData} {string}  
     *    The object holds one portlet data object for each portlet. The string
     *    property name is the portlet ID.
+    * @property   {prpMap} {"<groupIndex>" : {"pid" : "<prpName>"}}  
     * @private
     */
-   pageState,
+   pageState = {},
    
    /**
     * Flag specifying whether history is to be processed (true if browser supports HTML5 session history APIs)
@@ -74,8 +76,8 @@ var portlet = portlet || {};
     */
    isValidId = function (pid) {
       var id;
-      for (id in pageState) {
-         if (pageState.hasOwnProperty(id)) {
+      for (id in pageState.portlets) {
+         if (pageState.portlets.hasOwnProperty(id)) {
             if (pid === id) {
                return true;
             }
@@ -89,8 +91,8 @@ var portlet = portlet || {};
     */
    getIds = function () {
       var id, ids = [];
-      for (id in pageState) {
-         if (pageState.hasOwnProperty(id)) {
+      for (id in pageState.portlets) {
+         if (pageState.portlets.hasOwnProperty(id)) {
             ids.push(id);
          }
       }
@@ -101,7 +103,7 @@ var portlet = portlet || {};
     * gets parameter value
     */
    getParmVal = function (pid, name) {
-      return pageState[pid].state.parameters[name];
+      return pageState.portlets[pid].state.parameters[name];
    },
 
    /**
@@ -147,7 +149,7 @@ var portlet = portlet || {};
    stateChanged = function (nstate, pid) {
       var ostate, pname, nparm, oparm, result = false;
       
-      ostate = pageState[pid].state;
+      ostate = pageState.portlets[pid].state;
       
       if (!nstate.portletMode || !nstate.windowState || !nstate.parameters) {
          throw new Error ("Error decoding state: " + nstate);
@@ -206,17 +208,19 @@ var portlet = portlet || {};
     * gets defeined PRPs for the portlet
     */
    getPRPNames = function (pid) {
-      return pageState[pid].pubParms;
+      return pageState.portlets[pid].pubParms;
    },
    
    /**
-    * function for checking if the parameter is private
+    * function for checking if the parameter is public
     */
    isPRP = function (pid, name) {
-      var ii, result = false;
-      for (ii = 0; ii < pageState[pid].pubParms.length; ii++) {
-         if (name === pageState[pid].pubParms[ii]) {
-            result = true;
+      var prp, result = false, prps = pageState.portlets[pid].pubParms;
+      for (prp in prps) {
+         if (prps.hasOwnProperty(prp)) {
+            if (name === prp) {
+               result = true;
+            }
          }
       }
       return result;
@@ -226,7 +230,7 @@ var portlet = portlet || {};
    /**
     * Gets the updated public parameters for the given portlet
     * ID and new portlet state.
-    * Returns an object whose properties are the names of the
+    * Returns an object whose properties are the gruop indexes of the
     * updated public parameters. The values are the new public
     * parameter values.
     *
@@ -236,12 +240,14 @@ var portlet = portlet || {};
     * @private
     */
    getUpdatedPRPs = function (pid, state) {
-      var prps = {}, ii = 0, prpNames = getPRPNames(pid), name;
+      var prps = {}, prpNames = getPRPNames(pid), name, group;
 
-      for (ii = 0; ii < prpNames.length; ii++) {
-         name = prpNames[ii];
-         if (isParmInStateEqual(pid, state, name) === false) {
-            prps[name] = state.parameters[name];
+      for (name in prpNames) {
+         if (prpNames.hasOwnProperty(name)) {
+            if (isParmInStateEqual(pid, state, name) === false) {
+               group = prpNames[name];
+               prps[group] = state.parameters[name];
+            }
          }
       }
 
@@ -279,14 +285,14 @@ var portlet = portlet || {};
     * Get allowed window states for portlet
     */
    getAllowedWS = function (pid) {
-      return pageState[pid].allowedWS.slice(0);
+      return pageState.portlets[pid].allowedWS.slice(0);
    },
    
    /**
     * Get allowed portlet modes for portlet
     */
    getAllowedPM = function (pid) {
-      return pageState[pid].allowedPM.slice(0);
+      return pageState.portlets[pid].allowedPM.slice(0);
    },
    
    
@@ -294,14 +300,14 @@ var portlet = portlet || {};
     * gets render data for the portlet
     */
    getRenderData = function (pid) {
-      return pageState[pid].renderData;
+      return pageState.portlets[pid].renderData;
    },
          
    /**
     * gets state for the portlet
     */
    getState = function (pid) {
-      return pageState[pid].state;
+      return pageState.portlets[pid].state;
    },
    
    /**
@@ -354,30 +360,53 @@ var portlet = portlet || {};
 
    AJAX_ACTION = "aa",              // new for portlet spec 3
    PARTIAL_ACTION = "pa",           // new for portlet spec 3
+   
+   pidMap = {},
+   
+   /**
+    * Set up the portlet ID mapping table for URL generation
+    */
+   getPidMap = function () {
+      var pid, pids = getIds(), ii, urlmap = "";
+      
+      pidMap = {};
+      for (ii = 0; ii < pids.length; ii++) {
+         pid = pids[ii];
+         pidMap[pid] = ii;
+         urlmap += "/" + PREFIX + PORTLET_ID;
+         urlmap += plutoEncode(pageState.portlets[pid].urlpid);
+         urlmap += DELIM + ii;
+      }
+      
+      return urlmap;
+   },
 
    
    /**
     * Helper for generating parameter strings for the URL
     */
-   genParmString = function (pid, name, type) {
-      var vals, jj, sep, str = "", wid = "";
-      vals = pageState[pid].state.parameters[name];
+   genParmString = function (pid, name, type, group) {
+      var vals, jj, sep, str = "", wid = "", grpstr = "";
+      vals = pageState.portlets[pid].state.parameters[name];
       
       // If encoding a render parameter, insert the pid in Pluto internal form 
       // as opposed to namespace form -
       
-      if (type === RENDER_PARAM) {
-         wid = plutoEncode(pageState[pid].urlpid);
+      if (type === RENDER_PARAM || type === PUBLIC_RENDER_PARAM) {
+         wid = pidMap[pid];
+      }
+      
+      if (type === PUBLIC_RENDER_PARAM) {
+         grpstr = DELIM + plutoEncode(group);
       }
       
       // If values are present, encode the multivalued parameter string
       
       if (vals) {
-         sep = "";
-         str += "/" + PREFIX + type + wid + DELIM + encodeURIComponent(name) + "/";
+         sep = VALUE_DELIM;
+         str += "/" + PREFIX + type + wid + grpstr + DELIM + encodeURIComponent(name);
          for (jj=0; jj < vals.length; jj++) {
             str += sep + encodeURIComponent(vals[jj]);
-            sep = VALUE_DELIM;
          }
       }
       return str;
@@ -388,9 +417,9 @@ var portlet = portlet || {};
     * Helper for generating portlet mode & window state strings for the URL
     */
    genPMWSString = function (pid) {
-      var pm = pageState[pid].state.portletMode, 
-          ws = pageState[pid].state.windowState, 
-          wid = plutoEncode(pageState[pid].urlpid), str = "";
+      var pm = pageState.portlets[pid].state.portletMode, 
+          ws = pageState.portlets[pid].state.windowState, 
+          wid = pidMap[pid], str = "";
 
       str += "/" + PREFIX + PORTLET_MODE + wid + DELIM + encodeURIComponent(pm);
       str += "/" + PREFIX + WINDOW_STATE + wid + DELIM + encodeURIComponent(ws);
@@ -413,7 +442,9 @@ var portlet = portlet || {};
    getUrl = function (type, pid, parms, cache) {
    
       var url = portlet.impl.getUrlBase(), ca = 'cacheLevelPage', parm, isAction = false,
-          sep = "", name, names, vals, ii, str, id, ids, tpid, prpstrings;
+          sep = "", name, names, vals, ii, str, id, ids, tpid, prpstrings, group;
+          
+      url += getPidMap();
        
       // If target portlet not defined for render URL, set it to null
       if ((type === "RENDER") && pid === undefined) {
@@ -425,7 +456,7 @@ var portlet = portlet || {};
       
       if (type === "RESOURCE") {
          // If generating resource URL, add resource window & cacheability
-         url += "/" + PREFIX + RESOURCE + plutoEncode(pageState[pid].urlpid);
+         url += "/" + PREFIX + RESOURCE + pidMap[pid];
          if (cache) {
             ca = cache;
          }
@@ -433,11 +464,11 @@ var portlet = portlet || {};
       } else if (type === "ACTION") {
          // Add Ajax Action window
          isAction = true;
-         url += "/" + PREFIX + AJAX_ACTION + plutoEncode(pageState[pid].urlpid);
+         url += "/" + PREFIX + AJAX_ACTION + pidMap[pid];
       } else if (type === "PARTIAL_ACTION") {
          // Add Partial Action window
          isAction = true;
-         url += "/" + PREFIX + PARTIAL_ACTION + plutoEncode(pageState[pid].urlpid);
+         url += "/" + PREFIX + PARTIAL_ACTION + pidMap[pid];
       }
       
       // Now add the state to the URL, taking into account cacheability if
@@ -455,7 +486,7 @@ var portlet = portlet || {};
                if (id !== pid) {  // only for non-target portlets
                   url += genPMWSString(id);  // portlet mode & window state
                   str = "";
-                  names = pageState[id].state.parameters;
+                  names = pageState.portlets[id].state.parameters;
                   for (name in names) {
                      // Public render parameters are encoded separately
                      if (names.hasOwnProperty(name) && !isPRP(id, name)) {
@@ -474,7 +505,7 @@ var portlet = portlet || {};
          if (!isAction && pid !== null) {
             url += genPMWSString(pid);  // portlet mode & window state
             str = "";
-            names = pageState[pid].state.parameters;
+            names = pageState.portlets[pid].state.parameters;
             for (name in names) {
                // Public render parameters are encoded separately
                if (names.hasOwnProperty(name) && !isPRP(pid, name)) {
@@ -488,26 +519,41 @@ var portlet = portlet || {};
 
          str = "";
          prpstrings = {};
-         for (tpid in pageState) {
-            if (pageState.hasOwnProperty(tpid)) {               
-               names = pageState[tpid].pubParms;
-               for (ii=0; ii < names.length; ii++) {
-                  name = names[ii];
-                  // only need to add parameter once, since it is shared
-                  if (!prpstrings.hasOwnProperty(name)) {
-                     prpstrings[name] = genParmString(tpid, name, PUBLIC_RENDER_PARAM);
-                     str += prpstrings[name];
+         for (group in pageState.prpMap) {
+            if (pageState.prpMap.hasOwnProperty(group)) {
+               for (tpid in pageState.prpMap[group]) {
+                  if (pageState.prpMap[group].hasOwnProperty(tpid)) {
+                     name = pageState.prpMap[group][tpid];
+                     // only need to add parameter once, since it is shared
+                     if (!prpstrings.hasOwnProperty(name)) {
+                        prpstrings[name] = genParmString(tpid, name, PUBLIC_RENDER_PARAM, group);
+                        str += prpstrings[name];
+                     }
                   }
                }
             }
          }
+         
+//          for (tpid in pageState.portlets) {
+//             if (pageState.portlets.hasOwnProperty(tpid)) {               
+//                names = pageState.portlets[tpid].pubParms;
+//                for (ii=0; ii < names.length; ii++) {
+//                   name = names[ii];
+//                   // only need to add parameter once, since it is shared
+//                   if (!prpstrings.hasOwnProperty(name)) {
+//                      prpstrings[name] = genParmString(tpid, name, PUBLIC_RENDER_PARAM);
+//                      str += prpstrings[name];
+//                   }
+//                }
+//             }
+//          }
          url += str;
 
       }
 
       // Encode resource or action parameters as query string
       if (parms) {
-         str = "?"; sep = "";
+         str = ""; sep = "?";
          for (parm in parms) {
             if (parms.hasOwnProperty(parm)) {
                vals = parms[parm];
@@ -534,7 +580,7 @@ var portlet = portlet || {};
    updateHistory = function (replace) {
       if (doHistory) {
          getUrl('RENDER', null, {}).then(function (url) {
-            var token = JSON.stringify(pageState);
+            var token = JSON.stringify(pageState.portlets);
             console.log("Updating history. URL =" + url + ", token length =" + token.length 
                + ", token 30 chars =" + token.substring(0,30));
             if (replace) {
@@ -552,45 +598,61 @@ var portlet = portlet || {};
     * taking into account the public render parameters.
     */
    setState = function (pid, state) {
-      var pids, prps = getUpdatedPRPs(pid, state), prp, ii, tpid, upids = [], newVal, oldVal, prpNames;
+      var prps = getUpdatedPRPs(pid, state), group, tpid, upids = [], newVal, prpName, groupMap;
          
-      // For each updated PRP for the
+      // For each updated PRP group for the
       // initiating portlet, update that PRP in the other portlets.
-      for (prp in prps) {
-         if (prps.hasOwnProperty(prp)) {
+      for (group in prps) {
+         if (prps.hasOwnProperty(group)) {
       
-            newVal = prps[prp];
+            newVal = prps[group];
             
-            // process each portlet ID
-            pids = getIds();
-            for (ii = 0; ii < pids.length; ii++) {
-               tpid = pids[ii];
-               
-               // don't update for initiating portlet. that's done after the loop
-               if (tpid !== pid) {
-            
-                  oldVal = getParmVal(tpid, prp);
-                  prpNames = getPRPNames(tpid);
-                  
-                  // check for public parameter and if the value has changed
-                  if ((prpNames.indexOf(prp) >= 0) && 
-                      (_isParmEqual(oldVal, newVal) === false)) {
+            // access the PRP map to get the affected portlets
+            groupMap = pageState.prpMap[group];
+            for (tpid in groupMap) {
+               if (groupMap.hasOwnProperty(tpid) && (tpid !== pid)) {
+                  prpName = groupMap[tpid];
                   
-                     if (newVal === undefined) {
-                        delete pageState[tpid].state.parameters[prp];
-                     } else {
-                        pageState[tpid].state.parameters[prp] = newVal.slice(0);
-                     }
-                     upids.push(tpid);
-                     
+                  if (newVal === undefined) {
+                     delete pageState.portlets[tpid].state.parameters[prpName];
+                  } else {
+                     pageState.portlets[tpid].state.parameters[prpName] = newVal.slice(0);
                   }
+                  upids.push(tpid);
+                  
                }
             }
+            
+            // process each portlet ID
+//             pids = getIds();
+//             for (ii = 0; ii < pids.length; ii++) {
+//                tpid = pids[ii];
+//                
+//                // don't update for initiating portlet. that's done after the loop
+//                if (tpid !== pid) {
+//             
+//                   oldVal = getParmVal(tpid, prp);
+//                   prpNames = getPRPNames(tpid);
+//                   
+//                   // check for public parameter and if the value has changed
+//                   if ((prpNames.indexOf(prp) >= 0) && 
+//                       (_isParmEqual(oldVal, newVal) === false)) {
+//                   
+//                      if (newVal === undefined) {
+//                         delete pageState.portlets[tpid].state.parameters[prp];
+//                      } else {
+//                         pageState.portlets[tpid].state.parameters[prp] = newVal.slice(0);
+//                      }
+//                      upids.push(tpid);
+//                      
+//                   }
+//                }
+//             }
          }
       }
       
       // update state for the initiating portlet
-      pageState[pid].state = state;
+      pageState.portlets[pid].state = state;
       upids.push(pid);
       
       updateHistory();
@@ -619,13 +681,15 @@ var portlet = portlet || {};
    // state has changed as compared to the current page state.
    decodeUpdateString = function (ustr) {
       var states = {}, ostate, nstate, pid, ps, npids = 0, cpids = 0;
+      
+      console.log("Decoding string: >>" + ustr + "<<");
 
       ps = JSON.parse(ustr);
-      for (pid in ps) {
+      for (pid in ps.portlets) {
          if (ps.hasOwnProperty(pid)) {
             npids++;
-            nstate = ps[pid].state;
-            ostate = pageState[pid].state;
+            nstate = ps.portlets[pid].state;
+            ostate = pageState.portlets[pid].state;
             
             if (!nstate || !ostate) {
                throw new Error ("Invalid update string. ostate=" + ostate + ", nstate=" + nstate);
@@ -661,7 +725,7 @@ var portlet = portlet || {};
       for (tpid in states) {
          if (states.hasOwnProperty(tpid)) {
             state = states[tpid];
-            pageState[tpid].state = state;
+            pageState.portlets[tpid].state = state;
             upids.push(tpid);
             stateUpdated = true;
          }