Program: 90617
Project: 90617
Buggy source:
/** 
 * This V2.0 method returns the private parameters for the given window ID. In the case of a render URL, it returns only the private render parameters. In the case of an action or resource URL, it returns the action or resource  parameters combined with the render parameters, with the action or resource parameters taking precedence. Note that the  latter circumstance will only occur with V3.0 portlets.
 * @param windowId
 * @return
 */
public Map<String,String[]> getPrivateParameterMap(String windowId){
  HashMap<String,String[]> parameters=new HashMap<String,String[]>();
  processParams();
  if (wid2Action.containsKey(windowId)) {
    for (    PortalURLParameter parm : wid2Action.get(windowId)) {
      parameters.put(parm.getName(),parm.getValues().clone());
    }
  }
 else   if (wid2Resource.containsKey(windowId)) {
    for (    PortalURLParameter parm : wid2Resource.get(windowId)) {
      parameters.put(parm.getName(),parm.getValues().clone());
    }
  }
  if (wid2Render.containsKey(windowId)) {
    for (    PortalURLParameter parm : wid2Render.get(windowId)) {
      if (parameters.containsKey(parm.getName())) {
        ArrayList<String> vals=new ArrayList<String>(Arrays.asList(parameters.get(parm.getName())));
        vals.addAll(Arrays.asList(parm.getValues()));
        parameters.put(parm.getName(),vals.toArray(new String[0]));
      }
 else {
        parameters.put(parm.getName(),parm.getValues().clone());
      }
    }
  }
  if (isDebug) {
    StringBuffer sb=new StringBuffer();
    sb.append("String_Node_Str");
    for (    String k : parameters.keySet()) {
      sb.append("String_Node_Str" + k + "String_Node_Str");
      String sep="String_Node_Str";
      for (      String v : parameters.get(k)) {
        sb.append(sep + v);
        sep="String_Node_Str";
      }
    }
    LOGGER.debug(sb.toString());
  }
  return parameters;
}

Fixed version (ground truth):
/** 
 * This V2.0 method returns the private parameters for the given window ID. In the case of a render URL, it returns only the private render parameters. In the case of an action or resource URL, it returns the action or resource  parameters combined with the render parameters, with the action or resource parameters taking precedence. Note that the  latter circumstance will only occur with V3.0 portlets.
 * @param windowId
 * @return
 */
public Map<String,String[]> getPrivateParameterMap(String windowId){
  HashMap<String,String[]> parameters=new HashMap<String,String[]>();
  processParams();
  boolean isV3=url.isVersion3(windowId);
  if (wid2Action.containsKey(windowId)) {
    for (    PortalURLParameter parm : wid2Action.get(windowId)) {
      parameters.put(parm.getName(),parm.getValues().clone());
    }
  }
 else   if (wid2Resource.containsKey(windowId)) {
    for (    PortalURLParameter parm : wid2Resource.get(windowId)) {
      parameters.put(parm.getName(),parm.getValues().clone());
    }
  }
  if (isV3 || !actionTypes.contains(url.getType())) {
    if (wid2Render.containsKey(windowId)) {
      for (      PortalURLParameter parm : wid2Render.get(windowId)) {
        if (parameters.containsKey(parm.getName())) {
          ArrayList<String> vals=new ArrayList<String>(Arrays.asList(parameters.get(parm.getName())));
          vals.addAll(Arrays.asList(parm.getValues()));
          parameters.put(parm.getName(),vals.toArray(new String[0]));
        }
 else {
          parameters.put(parm.getName(),parm.getValues().clone());
        }
      }
    }
  }
  if (isDebug) {
    StringBuffer sb=new StringBuffer();
    sb.append("String_Node_Str");
    for (    String k : parameters.keySet()) {
      sb.append("String_Node_Str" + k + "String_Node_Str");
      String sep="String_Node_Str";
      for (      String v : parameters.get(k)) {
        sb.append(sep + v);
        sep="String_Node_Str";
      }
    }
    LOGGER.debug(sb.toString());
  }
  return parameters;
}