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:01:56 UTC

[12/19] portals-pluto git commit: More work on URL encoding

More work on URL encoding


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

Branch: refs/heads/PortletHub
Commit: b9ee3adeb35aaa87325fa0ac6d20365b156799a6
Parents: b2c6887
Author: Scott Nicklous <ms...@apache.org>
Authored: Wed Jan 21 21:18:53 2015 +0100
Committer: Scott Nicklous <ms...@apache.org>
Committed: Wed Jan 21 21:18:53 2015 +0100

----------------------------------------------------------------------
 .../PublicRenderParameterServiceImpl.java       |   7 +-
 .../driver/url/impl/PortalURLParserImpl.java    | 103 ++++---
 .../portal/PublicRenderParameterMapperImpl.java | 291 -------------------
 .../PublicRenderParameterQNameMapper.java       | 291 +++++++++++++++++++
 .../portal/PublicRenderParameterService.java    |   2 +-
 5 files changed, 354 insertions(+), 340 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/b9ee3ade/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/impl/resource/PublicRenderParameterServiceImpl.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/impl/resource/PublicRenderParameterServiceImpl.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/impl/resource/PublicRenderParameterServiceImpl.java
index 74b56e5..39ae1a3 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/impl/resource/PublicRenderParameterServiceImpl.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/services/impl/resource/PublicRenderParameterServiceImpl.java
@@ -23,7 +23,8 @@ import java.util.logging.Logger;
 
 import org.apache.pluto.container.driver.PortletRegistryService;
 import org.apache.pluto.driver.services.portal.PageConfig;
-import org.apache.pluto.driver.services.portal.PublicRenderParameterMapperImpl;
+import org.apache.pluto.driver.services.portal.PublicRenderParameterMapper;
+import org.apache.pluto.driver.services.portal.PublicRenderParameterQNameMapper;
 import org.apache.pluto.driver.services.portal.PublicRenderParameterService;
 import org.apache.pluto.driver.services.portal.RenderConfigService;
 
@@ -51,10 +52,10 @@ public class PublicRenderParameterServiceImpl implements PublicRenderParameterSe
    /* (non-Javadoc)
     * @see org.apache.pluto.driver.services.portal.PublicRenderParameterService#getPRPMapper(java.lang.String)
     */
-   public PublicRenderParameterMapperImpl getPRPMapper(String page) {
+   public PublicRenderParameterMapper getPRPMapper(String page) {
       LOGGER.fine("Getting PRP mapper for page = " + page);
       PageConfig paco = reco.getPage(page);
-      PublicRenderParameterMapperImpl prpm = new PublicRenderParameterMapperImpl(paco, pore);
+      PublicRenderParameterMapper prpm = new PublicRenderParameterQNameMapper(paco, pore);
       return prpm;
    }
 

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/b9ee3ade/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/PortalURLParserImpl.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/PortalURLParserImpl.java b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/PortalURLParserImpl.java
index e872b01..ca8406a 100644
--- a/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/PortalURLParserImpl.java
+++ b/pluto-portal-driver-impl/src/main/java/org/apache/pluto/driver/url/impl/PortalURLParserImpl.java
@@ -34,7 +34,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.pluto.driver.AttributeKeys;
 import org.apache.pluto.driver.config.DriverConfiguration;
-import org.apache.pluto.driver.services.portal.PublicRenderParameterMapperImpl;
+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.PortalURLParser;
@@ -168,31 +168,68 @@ public class PortalURLParserImpl implements PortalURLParser {
 
       ServletContext sc = request.getServletContext();
       DriverConfiguration dc = (DriverConfiguration) sc.getAttribute(AttributeKeys.DRIVER_CONFIG);
-      PublicRenderParameterMapperImpl prpm = dc.getPublicRenderParameterService()
+      PublicRenderParameterMapper prpm = dc.getPublicRenderParameterService()
             .getPRPMapper(renderPath.toString());
       portalURL.setPublicRenderParameterMapper(prpm);
       portalURL.setPortletIds(dc.getPageConfig(renderPath.toString()).getPortletIds());
       
-      // Tokenize the rest and process the tokens
       ArrayList<String> portletIds = new ArrayList<String>();
-      String[] tokens = pathInfo.split("/" + PREFIX);
-      for (String t : tokens) {
-         String type, val;
-         if (t.length() < 3) {
-            LOG.warn("Token " + t + " is too short!! ");
-            continue;
-         } else {
-            type = t.substring(0, 2);
-            val = t.substring(2);
-         }
 
-         if (type.equals(PORTLET_ID)) {
-            String[] decoded = decodeControlParameter(PREFIX + PORTLET_ID + val);
-            portletIds.add(Integer.parseInt(decoded[1]), decoded[0]);
-         } else {
-            LOG.debug("Found " + portletIds.size() + " IDs: " + Arrays.toString(portletIds.toArray()));
-            break;
-         }
+      // Tokenize the rest and process the tokens
+      if (pathInfo.length() > 2) {
+         String[] tokens = pathInfo.split("/" + PREFIX);
+         for (String t : tokens) {
+            
+            String type, val;
+            if (t.length() < 3) {
+               LOG.warn("Token " + t + " is too short!! ");
+               continue;
+            } else {
+               type = t.substring(0, 2);
+               val = t.substring(2);
+            }
+
+            // Get the portlet IDs & reference numbers
+            if (type.equals(PORTLET_ID)) {
+               String[] decoded = decodeControlParameter(PREFIX + PORTLET_ID + val);
+               portletIds.add(Integer.parseInt(decoded[1]), decoded[0]);
+            } 
+            
+            // Resource window definition: portalURL.setResourceWindow().
+            else if (type.equals(RESOURCE)) {
+               portalURL.setResourceWindow(decodeCharacters(val.split(DELIM)[0]));
+            }
+            
+            // Action window definition: portalURL.setActionWindow().
+            else if (type.equals(ACTION)) {
+               portalURL.setActionWindow(decodeCharacters(val.split(DELIM)[0]));
+            }
+            
+            // Action window definition: portalURL.setActionWindow().
+            else if (type.equals(AJAX_ACTION)) {
+               portalURL.setAjaxActionWindow(decodeCharacters(val.split(DELIM)[0]));
+            }
+            
+            // Action window definition: portalURL.setActionWindow().
+            else if (type.equals(PARTIAL_ACTION)) {
+               portalURL.setPartialActionWindow(decodeCharacters(val.split(DELIM)[0]));
+            }
+            
+            // Cacheability definition: portalURL.setCacheability().
+            else if (type.equals(CACHE_LEVEL)) {
+               portalURL.setCacheability(decodeCharacters(val.split(DELIM)[0]));
+            }
+            
+            // ResourceID definition: portalURL.setResourceID().
+            else if (type.equals(RESOURCE_ID)) {
+               portalURL.setResourceID(decodeCharacters(val.split(DELIM)[0]));
+            }
+
+          }
+      }
+
+      if (LOG.isDebugEnabled()) {
+         LOG.debug("Found " + portletIds.size() + " IDs: " + Arrays.toString(portletIds.toArray()));
       }
 
       // Now parse the remaining portion of the URL, of any.
@@ -201,32 +238,8 @@ public class PortalURLParserImpl implements PortalURLParser {
 
          String token = st.nextToken();
 
-         //        	 Resource window definition: portalURL.setResourceWindow().
-         if (token.startsWith(PREFIX + RESOURCE)) {
-            portalURL.setResourceWindow(decodeControlParameter(token)[0]);
-         }
-         // Action window definition: portalURL.setActionWindow().
-         else if (token.startsWith(PREFIX + ACTION)) {
-            portalURL.setActionWindow(decodeControlParameter(token)[0]);
-         }
-         // Action window definition: portalURL.setActionWindow().
-         else if (token.startsWith(PREFIX + AJAX_ACTION)) {
-            portalURL.setAjaxActionWindow(decodeControlParameter(token)[0]);
-         }
-         // Action window definition: portalURL.setActionWindow().
-         else if (token.startsWith(PREFIX + PARTIAL_ACTION)) {
-            portalURL.setPartialActionWindow(decodeControlParameter(token)[0]);
-         }
-         // Cacheability definition: portalURL.setCacheability().
-         else if (token.startsWith(PREFIX + CACHE_LEVEL)) {
-            portalURL.setCacheability(decodeControlParameter(token)[0]);
-         }
-         // ResourceID definition: portalURL.setResourceID().
-         else if (token.startsWith(PREFIX + RESOURCE_ID)) {
-            portalURL.setResourceID(decodeControlParameter(token)[0]);
-         }
          // Window state definition: portalURL.setWindowState().
-         else if (token.startsWith(PREFIX + WINDOW_STATE)) {
+         if (token.startsWith(PREFIX + WINDOW_STATE)) {
             String[] decoded = decodeControlParameter(token);
             portalURL.setWindowState(decoded[0], new WindowState(decoded[1]));
          }

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/b9ee3ade/pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/PublicRenderParameterMapperImpl.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/PublicRenderParameterMapperImpl.java b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/PublicRenderParameterMapperImpl.java
deleted file mode 100644
index 9e4afb3..0000000
--- a/pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/PublicRenderParameterMapperImpl.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-
-
-package org.apache.pluto.driver.services.portal;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.xml.namespace.QName;
-
-import org.apache.pluto.driver.url.PortalURLPublicParameter;
-import org.apache.pluto.container.driver.PortletRegistryService;
-import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
-import org.apache.pluto.container.om.portlet.PortletDefinition;
-import org.apache.pluto.container.om.portlet.PublicRenderParameter;
-
-/**
- * Provides public render parameter mappings for a given page.
- * This mapper maps public render parameters on the basis of Qnames. 
- * If two PRPs have the same QName, they are considered to refer to the same 
- * public render parameter. The mapping is limited to the current page.
- * 
- * @author msnicklous
- * @since  16/01/2015
- */
-public class PublicRenderParameterMapperImpl implements PublicRenderParameterMapper {
-   private final Logger LOGGER = LoggerFactory.getLogger(PublicRenderParameterMapperImpl.class);
- 
-   // Set of all public render parameters on the page
-   private final ArrayList<PortalURLPublicParameter> prpList = new ArrayList<PortalURLPublicParameter>();
-   
-   // Maps the PRP QName to a set of public render parameters
-   private final Map<QName, List<PortalURLPublicParameter>> qn2PRP =
-                     new HashMap<QName, List<PortalURLPublicParameter>>();
-
-   private final ArrayList<QName> qnList = new ArrayList<QName>();
-   
-   public PublicRenderParameterMapperImpl(PageConfig paco, PortletRegistryService pore) {
-      
-      Collection<String> pids = paco.getPortletIds();
-      LOGGER.debug("Setting up the PRP mapper. There are " + pids.size() + " portlets to process.");
-
-      StringBuilder dbgstr = new StringBuilder(1024);
-      boolean isDebug = LOGGER.isDebugEnabled();
-      for (String pid : pids) {
-         if (isDebug) {
-            dbgstr.append("\n  Processing portlet id = " + pid);
-         }
-         
-         PortletWindowConfig pwc = null;
-         PortletApplicationDefinition pad = null;
-         PortletDefinition pd = null;
-         
-         pwc = PortletWindowConfig.fromId(pid);
-         String cxtpa = pwc.getContextPath();
-         String portletName = pwc.getPortletName();
-         
-         try {
-            pad = pore.getPortletApplication(cxtpa);
-            pd = pore.getPortlet(cxtpa, portletName);
-
-            if (isDebug) {
-               dbgstr.append("\n    For context: " + cxtpa + ", App name is " 
-                     + pad.getName() + ", portlet name is " + pd.getPortletName());
-            }
-            
-            Collection<String> prpIds = pd.getSupportedPublicRenderParameters();
-            if (prpIds != null && prpIds.size() > 0) {
-               Collection<? extends PublicRenderParameter> prpDefs = pad.getPublicRenderParameters();
-               String namespace = pad.getDefaultNamespace();
-               for (String prpId : prpIds) {
-                  Iterator<? extends PublicRenderParameter> i = prpDefs.iterator();
-                  QName qn = null;
-                  while (qn == null && i.hasNext()) {
-                     PublicRenderParameter prpDef = i.next();
-                     if (prpDef.getIdentifier().equals(prpId)) {
-                        qn = prpDef.getQName();
-                        if (qn == null) {
-                           // If qname is null, build a qnamme from the name & namespace fields
-                           String name = prpDef.getName();
-                           if (name == null) {
-                              LOGGER.error("Problem with PRP definition: Both QName and Nqme are null.");
-                           } else {
-                              qn = new QName(namespace, name);
-                           }
-                        }
-                     }
-                  }
-                  if (qn == null) {
-                     LOGGER.error("Problem with PRP definition: Both QName could not be obtained.");
-                  } else {
-                     PortalURLPublicParameter pupp = new PortalURLPublicParameter(pid, prpId, qn);
-                     
-                     // Add to set of all PRPs for page
-                     prpList.add(pupp);
-
-                     // Add PRP to the QName to PRP mapping
-                     if (qn2PRP.containsKey(qn)) {
-                        qn2PRP.get(qn).add(pupp);
-                     } else {
-                        List<PortalURLPublicParameter> s = new ArrayList<PortalURLPublicParameter>();
-                        s.add(pupp);
-                        qn2PRP.put(qn, s);
-                        qnList.add(qn);
-                     }
-                     
-                     if (isDebug) {
-                        dbgstr.append("\n      Added PRP for window = " + pid + " QName = " + qn.toString()
-                              + ", ID = " + prpId);
-                     }
-                  }
-               }
-            }
-            
-         } catch (Exception e) {
-            if (pad == null) {
-               LOGGER.error("Could not get portlet app for: " + cxtpa);
-            } else {
-               LOGGER.error("Could not get portlet definition for: " + portletName);
-            }
-         }
-      }
-      if (isDebug) {
-         dbgstr.append("\nOn page " + paco.getName() + " there are " + prpList.size()
-               + " PRPs divided into " + qnList.size() + " groups with sizes: ");
-         String prefix = "";
-         for (List<PortalURLPublicParameter> lp : qn2PRP.values()) {
-            dbgstr.append(prefix + lp.size());
-            prefix = ", ";
-         }
-         LOGGER.debug(dbgstr.toString());
-      }
-   }
-   
-   /**
-    * Private constructor for cloning
-    */
-   private PublicRenderParameterMapperImpl() {
-   }
-
-   
-   public List<PortalURLPublicParameter> getPublicParameterGroup(int index) {
-      List<PortalURLPublicParameter> oprps = new ArrayList<PortalURLPublicParameter>();
-      QName qn = qnList.get(index);
-      for (PortalURLPublicParameter prp : qn2PRP.get(qn)) {
-         PortalURLPublicParameter p = prp.clone();
-         String[] vals = (prp.getValues() == null) ? null : prp.getValues().clone();
-         p.setValues(vals);
-         oprps.add(p);
-      }
-      if (LOGGER.isDebugEnabled()) {
-         LOGGER.debug("For index: " + index + ", QName = " + qn + ", group size = "
-                + oprps.size());
-      }
-      return oprps;
-   }
-
-   public int getNumberOfGroups() {
-      return qnList.size();
-   }
-
-   public int getIndex(PortalURLPublicParameter prp) {
-      int ind =  qnList.indexOf(prp.getQName());
-      if (ind < 0) {
-         LOGGER.warn("PRP Qname " + prp.getQName() + " not found in " + qnList.toString());
-      }
-      return ind;
-   }
-
-   public int getIndex(String windowId, String identifier) {
-      PortalURLPublicParameter tmpPRP = new PortalURLPublicParameter(windowId, identifier, null);
-      int ind = prpList.indexOf(tmpPRP);
-      if (ind < 0) {
-         LOGGER.warn("Public render parameter with window ID = " + windowId + ", ID = " + identifier + " could not be found.");
-      } else {
-         QName qn = prpList.get(ind).getQName();
-         ind = qnList.indexOf(qn);
-      }
-      return ind;
-   }
-
-   public int getIndex(QName qname) {
-      return qnList.indexOf(qname);
-   }
-
-   public void setValues(int index, String[] values) {
-      List<PortalURLPublicParameter> oprps = qn2PRP.get(qnList.get(index));
-      for (PortalURLPublicParameter prp : oprps) {
-         prp.setValues(values.clone());
-      }
-   }
-
-   public String[] getValues(int index) {
-      List<PortalURLPublicParameter> oprps = qn2PRP.get(qnList.get(index));
-      return oprps.get(0).getValues().clone();
-   }
-
-   public void setRemoved(int index, boolean removed) {
-      List<PortalURLPublicParameter> oprps = qn2PRP.get(qnList.get(index));
-      for (PortalURLPublicParameter prp : oprps) {
-         prp.setRemoved(removed);
-      }
-   }
-
-   public boolean getRemoved(int index) {
-      List<PortalURLPublicParameter> oprps = qn2PRP.get(qnList.get(index));
-      return oprps.get(0).isRemoved();
-   }
-
-   public List<Integer> getActiveIndexes() {
-      ArrayList<Integer> inds = new ArrayList<Integer>();
-      for (QName qn : qnList) {
-         List<PortalURLPublicParameter> oprps = qn2PRP.get(qn);
-         if (!oprps.get(0).isRemoved()) {
-            inds.add(qnList.indexOf(qn));
-         }
-      }
-      return inds; 
-   }
-   
-   public PublicRenderParameterMapperImpl clone() {
-      PublicRenderParameterMapperImpl prpm = new PublicRenderParameterMapperImpl();
-      // Note that the QNames don't need to be cloned, as the internal fields are set thru constructor and cannot be changed.
-      StringBuilder dbgstr = new StringBuilder("Cloning QNames: ");
-      String prefix = "";
-      for (QName qn : qnList) {
-         prpm.qnList.add(qn);
-         prpm.qn2PRP.put(qn, new ArrayList<PortalURLPublicParameter>());
-         dbgstr.append(prefix + qn.toString());
-         prefix = ", ";
-      }
-      dbgstr.append(" / window IDs: ");
-      prefix = "";
-      for (PortalURLPublicParameter prp : prpList) {
-         prpm.prpList.add(prp);
-         prpm.qn2PRP.get(prp.getQName()).add(prp.clone());
-         dbgstr.append(prefix + prp.getWindowId());
-         prefix = ", ";
-      }
-      if (LOGGER.isDebugEnabled()) {
-         LOGGER.debug(dbgstr.toString());
-      }
-      return prpm;
-   }
-
-   public List<PortalURLPublicParameter> getPRPsForWindow(String wid, boolean onlyActive) {
-      ArrayList<PortalURLPublicParameter> prps = new ArrayList<PortalURLPublicParameter>();
-      StringBuilder dbgstr = new StringBuilder("Names: ");
-      String prefix = "";
-      for (int ii = 0; ii < qnList.size(); ii++) {
-         for (PortalURLPublicParameter prp : qn2PRP.get(qnList.get(ii))) {
-            if (prp.getWindowId().equals(wid)) {
-               if ((onlyActive && !prp.isRemoved()) || !onlyActive) {
-                  prps.add(prp);
-                  dbgstr.append(prefix + prp.getName());
-                  prefix = ", ";
-               }
-               break;
-            }
-         }
-      }
-      if (LOGGER.isDebugEnabled()) {
-         LOGGER.debug("For window " + wid + " there are " + prps.size() + " parameters. " + dbgstr.toString());
-      }
-      return prps;
-   }
-
-}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/b9ee3ade/pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/PublicRenderParameterQNameMapper.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/PublicRenderParameterQNameMapper.java b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/PublicRenderParameterQNameMapper.java
new file mode 100644
index 0000000..c4fb4c1
--- /dev/null
+++ b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/PublicRenderParameterQNameMapper.java
@@ -0,0 +1,291 @@
+/*  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+
+
+package org.apache.pluto.driver.services.portal;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.xml.namespace.QName;
+
+import org.apache.pluto.driver.url.PortalURLPublicParameter;
+import org.apache.pluto.container.driver.PortletRegistryService;
+import org.apache.pluto.container.om.portlet.PortletApplicationDefinition;
+import org.apache.pluto.container.om.portlet.PortletDefinition;
+import org.apache.pluto.container.om.portlet.PublicRenderParameter;
+
+/**
+ * Provides public render parameter mappings for a given page.
+ * This mapper maps public render parameters on the basis of Qnames. 
+ * If two PRPs have the same QName, they are considered to refer to the same 
+ * public render parameter. The mapping is limited to the current page.
+ * 
+ * @author msnicklous
+ * @since  16/01/2015
+ */
+public class PublicRenderParameterQNameMapper implements PublicRenderParameterMapper {
+   private final Logger LOGGER = LoggerFactory.getLogger(PublicRenderParameterQNameMapper.class);
+ 
+   // Set of all public render parameters on the page
+   private final ArrayList<PortalURLPublicParameter> prpList = new ArrayList<PortalURLPublicParameter>();
+   
+   // Maps the PRP QName to a set of public render parameters
+   private final Map<QName, List<PortalURLPublicParameter>> qn2PRP =
+                     new HashMap<QName, List<PortalURLPublicParameter>>();
+
+   private final ArrayList<QName> qnList = new ArrayList<QName>();
+   
+   public PublicRenderParameterQNameMapper(PageConfig paco, PortletRegistryService pore) {
+      
+      Collection<String> pids = paco.getPortletIds();
+      LOGGER.debug("Setting up the PRP mapper. There are " + pids.size() + " portlets to process.");
+
+      StringBuilder dbgstr = new StringBuilder(1024);
+      boolean isDebug = LOGGER.isDebugEnabled();
+      for (String pid : pids) {
+         if (isDebug) {
+            dbgstr.append("\n  Processing portlet id = " + pid);
+         }
+         
+         PortletWindowConfig pwc = null;
+         PortletApplicationDefinition pad = null;
+         PortletDefinition pd = null;
+         
+         pwc = PortletWindowConfig.fromId(pid);
+         String cxtpa = pwc.getContextPath();
+         String portletName = pwc.getPortletName();
+         
+         try {
+            pad = pore.getPortletApplication(cxtpa);
+            pd = pore.getPortlet(cxtpa, portletName);
+
+            if (isDebug) {
+               dbgstr.append("\n    For context: " + cxtpa + ", App name is " 
+                     + pad.getName() + ", portlet name is " + pd.getPortletName());
+            }
+            
+            Collection<String> prpIds = pd.getSupportedPublicRenderParameters();
+            if (prpIds != null && prpIds.size() > 0) {
+               Collection<? extends PublicRenderParameter> prpDefs = pad.getPublicRenderParameters();
+               String namespace = pad.getDefaultNamespace();
+               for (String prpId : prpIds) {
+                  Iterator<? extends PublicRenderParameter> i = prpDefs.iterator();
+                  QName qn = null;
+                  while (qn == null && i.hasNext()) {
+                     PublicRenderParameter prpDef = i.next();
+                     if (prpDef.getIdentifier().equals(prpId)) {
+                        qn = prpDef.getQName();
+                        if (qn == null) {
+                           // If qname is null, build a qnamme from the name & namespace fields
+                           String name = prpDef.getName();
+                           if (name == null) {
+                              LOGGER.error("Problem with PRP definition: Both QName and Nqme are null.");
+                           } else {
+                              qn = new QName(namespace, name);
+                           }
+                        }
+                     }
+                  }
+                  if (qn == null) {
+                     LOGGER.error("Problem with PRP definition: Both QName could not be obtained.");
+                  } else {
+                     PortalURLPublicParameter pupp = new PortalURLPublicParameter(pid, prpId, qn);
+                     
+                     // Add to set of all PRPs for page
+                     prpList.add(pupp);
+
+                     // Add PRP to the QName to PRP mapping
+                     if (qn2PRP.containsKey(qn)) {
+                        qn2PRP.get(qn).add(pupp);
+                     } else {
+                        List<PortalURLPublicParameter> s = new ArrayList<PortalURLPublicParameter>();
+                        s.add(pupp);
+                        qn2PRP.put(qn, s);
+                        qnList.add(qn);
+                     }
+                     
+                     if (isDebug) {
+                        dbgstr.append("\n      Added PRP for window = " + pid + " QName = " + qn.toString()
+                              + ", ID = " + prpId);
+                     }
+                  }
+               }
+            }
+            
+         } catch (Exception e) {
+            if (pad == null) {
+               LOGGER.error("Could not get portlet app for: " + cxtpa);
+            } else {
+               LOGGER.error("Could not get portlet definition for: " + portletName);
+            }
+         }
+      }
+      if (isDebug) {
+         dbgstr.append("\nOn page " + paco.getName() + " there are " + prpList.size()
+               + " PRPs divided into " + qnList.size() + " groups with sizes: ");
+         String prefix = "";
+         for (List<PortalURLPublicParameter> lp : qn2PRP.values()) {
+            dbgstr.append(prefix + lp.size());
+            prefix = ", ";
+         }
+         LOGGER.debug(dbgstr.toString());
+      }
+   }
+   
+   /**
+    * Private constructor for cloning
+    */
+   private PublicRenderParameterQNameMapper() {
+   }
+
+   
+   public List<PortalURLPublicParameter> getPublicParameterGroup(int index) {
+      List<PortalURLPublicParameter> oprps = new ArrayList<PortalURLPublicParameter>();
+      QName qn = qnList.get(index);
+      for (PortalURLPublicParameter prp : qn2PRP.get(qn)) {
+         PortalURLPublicParameter p = prp.clone();
+         String[] vals = (prp.getValues() == null) ? null : prp.getValues().clone();
+         p.setValues(vals);
+         oprps.add(p);
+      }
+      if (LOGGER.isDebugEnabled()) {
+         LOGGER.debug("For index: " + index + ", QName = " + qn + ", group size = "
+                + oprps.size());
+      }
+      return oprps;
+   }
+
+   public int getNumberOfGroups() {
+      return qnList.size();
+   }
+
+   public int getIndex(PortalURLPublicParameter prp) {
+      int ind =  qnList.indexOf(prp.getQName());
+      if (ind < 0) {
+         LOGGER.warn("PRP Qname " + prp.getQName() + " not found in " + qnList.toString());
+      }
+      return ind;
+   }
+
+   public int getIndex(String windowId, String identifier) {
+      PortalURLPublicParameter tmpPRP = new PortalURLPublicParameter(windowId, identifier, null);
+      int ind = prpList.indexOf(tmpPRP);
+      if (ind < 0) {
+         LOGGER.warn("Public render parameter with window ID = " + windowId + ", ID = " + identifier + " could not be found.");
+      } else {
+         QName qn = prpList.get(ind).getQName();
+         ind = qnList.indexOf(qn);
+      }
+      return ind;
+   }
+
+   public int getIndex(QName qname) {
+      return qnList.indexOf(qname);
+   }
+
+   public void setValues(int index, String[] values) {
+      List<PortalURLPublicParameter> oprps = qn2PRP.get(qnList.get(index));
+      for (PortalURLPublicParameter prp : oprps) {
+         prp.setValues(values.clone());
+      }
+   }
+
+   public String[] getValues(int index) {
+      List<PortalURLPublicParameter> oprps = qn2PRP.get(qnList.get(index));
+      return oprps.get(0).getValues().clone();
+   }
+
+   public void setRemoved(int index, boolean removed) {
+      List<PortalURLPublicParameter> oprps = qn2PRP.get(qnList.get(index));
+      for (PortalURLPublicParameter prp : oprps) {
+         prp.setRemoved(removed);
+      }
+   }
+
+   public boolean getRemoved(int index) {
+      List<PortalURLPublicParameter> oprps = qn2PRP.get(qnList.get(index));
+      return oprps.get(0).isRemoved();
+   }
+
+   public List<Integer> getActiveIndexes() {
+      ArrayList<Integer> inds = new ArrayList<Integer>();
+      for (QName qn : qnList) {
+         List<PortalURLPublicParameter> oprps = qn2PRP.get(qn);
+         if (!oprps.get(0).isRemoved()) {
+            inds.add(qnList.indexOf(qn));
+         }
+      }
+      return inds; 
+   }
+   
+   public PublicRenderParameterQNameMapper clone() {
+      PublicRenderParameterQNameMapper prpm = new PublicRenderParameterQNameMapper();
+      // Note that the QNames don't need to be cloned, as the internal fields are set thru constructor and cannot be changed.
+      StringBuilder dbgstr = new StringBuilder("Cloning QNames: ");
+      String prefix = "";
+      for (QName qn : qnList) {
+         prpm.qnList.add(qn);
+         prpm.qn2PRP.put(qn, new ArrayList<PortalURLPublicParameter>());
+         dbgstr.append(prefix + qn.toString());
+         prefix = ", ";
+      }
+      dbgstr.append(" / window IDs: ");
+      prefix = "";
+      for (PortalURLPublicParameter prp : prpList) {
+         prpm.prpList.add(prp);
+         prpm.qn2PRP.get(prp.getQName()).add(prp.clone());
+         dbgstr.append(prefix + prp.getWindowId());
+         prefix = ", ";
+      }
+      if (LOGGER.isDebugEnabled()) {
+         LOGGER.debug(dbgstr.toString());
+      }
+      return prpm;
+   }
+
+   public List<PortalURLPublicParameter> getPRPsForWindow(String wid, boolean onlyActive) {
+      ArrayList<PortalURLPublicParameter> prps = new ArrayList<PortalURLPublicParameter>();
+      StringBuilder dbgstr = new StringBuilder("Names: ");
+      String prefix = "";
+      for (int ii = 0; ii < qnList.size(); ii++) {
+         for (PortalURLPublicParameter prp : qn2PRP.get(qnList.get(ii))) {
+            if (prp.getWindowId().equals(wid)) {
+               if ((onlyActive && !prp.isRemoved()) || !onlyActive) {
+                  prps.add(prp);
+                  dbgstr.append(prefix + prp.getName());
+                  prefix = ", ";
+               }
+               break;
+            }
+         }
+      }
+      if (LOGGER.isDebugEnabled()) {
+         LOGGER.debug("For window " + wid + " there are " + prps.size() + " parameters. " + dbgstr.toString());
+      }
+      return prps;
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/portals-pluto/blob/b9ee3ade/pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/PublicRenderParameterService.java
----------------------------------------------------------------------
diff --git a/pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/PublicRenderParameterService.java b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/PublicRenderParameterService.java
index 3dd10bf..3ad2fd4 100644
--- a/pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/PublicRenderParameterService.java
+++ b/pluto-portal-driver/src/main/java/org/apache/pluto/driver/services/portal/PublicRenderParameterService.java
@@ -36,5 +36,5 @@ public interface PublicRenderParameterService {
     * @param page    Page name
     * @return        A PRP mapper for the page
     */
-   public PublicRenderParameterMapperImpl getPRPMapper(String page);
+   public PublicRenderParameterMapper getPRPMapper(String page);
 }