Program: 90630
Project: 90630
Buggy source:
/** 
 * Converts a portal URL to a URL string.
 * @param portalURL  the portal URL to convert.
 * @return a URL string representing the portal URL.
 */
public String toString(PortalURL portalURL){
  StringBuilder buffer=new StringBuilder();
  String targetWindow=portalURL.getTargetWindow();
  portalURL.handleServletRequestParams();
  buffer.append(portalURL.getServletPath().startsWith("String_Node_Str") ? "String_Node_Str" : "String_Node_Str").append(portalURL.getServletPath());
  if (portalURL.getRenderPath() != null) {
    buffer.append(portalURL.getRenderPath());
  }
  ArrayList<String> pids=new ArrayList<String>();
  for (  String pid : portalURL.getPortletIds()) {
    pids.add(pid);
    buffer.append("String_Node_Str").append(PREFIX).append(PORTLET_ID);
    try {
      buffer.append(URLEncoder.encode(pid,"String_Node_Str"));
    }
 catch (    Exception e) {
      LOG.warn("String_Node_Str" + pid);
    }
    buffer.append(DELIM).append(String.valueOf(pids.indexOf(pid)));
  }
  if (portalURL.getType() == URLType.Resource) {
    int index=pids.indexOf(targetWindow);
    if (index < 0) {
      LOG.warn("String_Node_Str" + targetWindow);
    }
 else {
      buffer.append("String_Node_Str");
      buffer.append(PREFIX).append(RESOURCE).append(String.valueOf(index));
    }
  }
  if (portalURL.getType() == URLType.Render) {
    int index=pids.indexOf(targetWindow);
    if (index < 0) {
      LOG.warn("String_Node_Str" + targetWindow);
    }
 else {
      buffer.append("String_Node_Str");
      buffer.append(PREFIX).append(RENDER).append(String.valueOf(index));
    }
  }
  if (portalURL.getType() == URLType.Action) {
    int index=pids.indexOf(targetWindow);
    if (index < 0) {
      LOG.warn("String_Node_Str" + targetWindow);
    }
 else {
      buffer.append("String_Node_Str");
      buffer.append(PREFIX).append(ACTION).append(String.valueOf(index));
    }
  }
  String reswin=null;
  if (portalURL.getType() == URLType.Resource) {
    if (portalURL.getCacheability() != null) {
      buffer.append("String_Node_Str");
      buffer.append(PREFIX).append(CACHE_LEVEL).append(urlEncode(portalURL.getCacheability()));
    }
    if (portalURL.getResourceID() != null) {
      buffer.append("String_Node_Str");
      buffer.append(PREFIX).append(RESOURCE_ID).append(urlEncode(portalURL.getResourceID()));
    }
    if (portalURL.getCacheability().equals(ResourceURL.FULL)) {
      return buffer.toString();
    }
 else     if (portalURL.getCacheability().equals(ResourceURL.PORTLET)) {
      reswin=portalURL.getTargetWindow();
    }
  }
  for (  String pid : portalURL.getPortletModes().keySet()) {
    if (reswin != null && !reswin.equals(pid)) {
      continue;
    }
    int index=pids.indexOf(pid);
    PortletMode pm=portalURL.getPortletMode(pid);
    if (index < 0) {
      LOG.warn("String_Node_Str" + pid + "String_Node_Str"+ pm.toString());
      LOG.warn("String_Node_Str" + Arrays.toString(pids.toArray()));
    }
 else {
      buffer.append("String_Node_Str").append(PREFIX).append(PORTLET_MODE).append(String.valueOf(index)).append(DELIM).append(urlEncode(pm.toString()));
    }
  }
  for (  String pid : portalURL.getWindowStates().keySet()) {
    if (reswin != null && !reswin.equals(pid)) {
      continue;
    }
    int index=pids.indexOf(pid);
    WindowState ws=portalURL.getWindowState(pid);
    if (index < 0) {
      LOG.warn("String_Node_Str" + pid + "String_Node_Str"+ ws.toString());
    }
 else {
      buffer.append("String_Node_Str").append(PREFIX).append(WINDOW_STATE).append(String.valueOf(index)).append(DELIM).append(urlEncode(ws.toString()));
    }
  }
  for (  PortalURLParameter param : portalURL.getParameters()) {
    if (reswin != null && !reswin.equals(param.getWindowId())) {
      continue;
    }
    int index=pids.indexOf(param.getWindowId());
    if (index < 0) {
      LOG.warn("String_Node_Str" + param.getWindowId() + "String_Node_Str"+ param.getName());
      continue;
    }
    if (param.getName() != null && param.getValues() != null && param.getValues().length > 0) {
      String valueString=encodeMultiValues(param.getValues());
      if (valueString.length() > 0) {
        String ptype=RENDER_PARAM;
        if (param.getType().equals(PortalURLParameter.PARAM_TYPE_ACTION)) {
          ptype=ACTION_PARAM;
        }
 else         if (param.getType().equals(PortalURLParameter.PARAM_TYPE_RESOURCE)) {
          ptype=RESOURCE_PARAM;
        }
        buffer.append("String_Node_Str").append(PREFIX).append(ptype).append(String.valueOf(index)).append(DELIM).append(urlEncode(param.getName())).append(VALUE_DELIM).append(valueString);
      }
    }
  }
  PublicRenderParameterMapper mapper=portalURL.getPublicRenderParameterMapper();
  List<Integer> activeIndexes=mapper.getActiveIndexes();
  if (reswin != null) {
    List<PortalURLPublicParameter> pups=mapper.getPRPsForWindow(reswin,true);
    activeIndexes=new ArrayList<Integer>();
    for (    PortalURLPublicParameter pup : pups) {
      activeIndexes.add(mapper.getIndex(pup));
    }
  }
  for (  int i : activeIndexes) {
    String[] values=mapper.getValues(i);
    String valstr=encodeMultiValues(values);
    List<PortalURLPublicParameter> prplist=mapper.getPublicParameterGroup(i);
    if (prplist.size() > 0) {
      PortalURLPublicParameter prp=prplist.get(0);
      int index=pids.indexOf(prp.getWindowId());
      if (index >= 0) {
        buffer.append("String_Node_Str").append(PREFIX).append(PUBLIC_RENDER_PARAM).append(String.valueOf(index)).append(DELIM).append(String.valueOf(i)).append(DELIM).append(urlEncode(prp.getName())).append(valstr);
      }
 else {
        LOG.warn("String_Node_Str" + prp.toString());
      }
    }
  }
  return buffer.toString();
}

Fixed version (ground truth):
/** 
 * Converts a portal URL to a URL string.
 * @param portalURL  the portal URL to convert.
 * @return a URL string representing the portal URL.
 */
public String toString(PortalURL portalURL){
  StringBuilder buffer=new StringBuilder();
  String targetWindow=portalURL.getTargetWindow();
  portalURL.handleServletRequestParams();
  buffer.append(portalURL.getServletPath().startsWith("String_Node_Str") ? "String_Node_Str" : "String_Node_Str").append(portalURL.getServletPath());
  if (portalURL.getRenderPath() != null) {
    buffer.append(portalURL.getRenderPath());
  }
  ArrayList<String> pids=new ArrayList<String>();
  for (  String pid : portalURL.getPortletIds()) {
    pids.add(pid);
    buffer.append("String_Node_Str").append(PREFIX).append(PORTLET_ID);
    try {
      buffer.append(URLEncoder.encode(pid,"String_Node_Str"));
    }
 catch (    Exception e) {
      LOG.warn("String_Node_Str" + pid);
    }
    buffer.append(DELIM).append(String.valueOf(pids.indexOf(pid)));
  }
  if (portalURL.getType() == URLType.Resource) {
    int index=pids.indexOf(targetWindow);
    if (index < 0) {
      LOG.warn("String_Node_Str" + targetWindow);
    }
 else {
      buffer.append("String_Node_Str");
      buffer.append(PREFIX).append(RESOURCE).append(String.valueOf(index));
    }
  }
  if (portalURL.getType() == URLType.Render) {
    int index=pids.indexOf(targetWindow);
    if (index < 0) {
      LOG.warn("String_Node_Str" + targetWindow);
    }
 else {
      buffer.append("String_Node_Str");
      buffer.append(PREFIX).append(RENDER).append(String.valueOf(index));
    }
  }
  if (portalURL.getType() == URLType.Action) {
    int index=pids.indexOf(targetWindow);
    if (index < 0) {
      LOG.warn("String_Node_Str" + targetWindow);
    }
 else {
      buffer.append("String_Node_Str");
      buffer.append(PREFIX).append(ACTION).append(String.valueOf(index));
    }
  }
  String reswin=null;
  if (portalURL.getType() == URLType.Resource) {
    if (portalURL.getCacheability() != null) {
      buffer.append("String_Node_Str");
      buffer.append(PREFIX).append(CACHE_LEVEL).append(urlEncode(portalURL.getCacheability()));
    }
    if (portalURL.getResourceID() != null) {
      buffer.append("String_Node_Str");
      buffer.append(PREFIX).append(RESOURCE_ID).append(urlEncode(portalURL.getResourceID()));
    }
    if (portalURL.getCacheability().equals(ResourceURL.FULL)) {
      return buffer.toString();
    }
 else     if (portalURL.getCacheability().equals(ResourceURL.PORTLET)) {
      reswin=portalURL.getTargetWindow();
    }
  }
  for (  String pid : portalURL.getPortletModes().keySet()) {
    if (reswin != null && !reswin.equals(pid)) {
      continue;
    }
    int index=pids.indexOf(pid);
    PortletMode pm=portalURL.getPortletMode(pid);
    if (index < 0) {
      LOG.warn("String_Node_Str" + pid + "String_Node_Str"+ pm.toString());
      LOG.warn("String_Node_Str" + Arrays.toString(pids.toArray()));
    }
 else {
      buffer.append("String_Node_Str").append(PREFIX).append(PORTLET_MODE).append(String.valueOf(index)).append(DELIM).append(urlEncode(pm.toString()));
    }
  }
  for (  String pid : portalURL.getWindowStates().keySet()) {
    if (reswin != null && !reswin.equals(pid)) {
      continue;
    }
    int index=pids.indexOf(pid);
    WindowState ws=portalURL.getWindowState(pid);
    if (index < 0) {
      LOG.warn("String_Node_Str" + pid + "String_Node_Str"+ ws.toString());
    }
 else {
      buffer.append("String_Node_Str").append(PREFIX).append(WINDOW_STATE).append(String.valueOf(index)).append(DELIM).append(urlEncode(ws.toString()));
    }
  }
  for (  PortalURLParameter param : portalURL.getParameters()) {
    if (reswin != null && !reswin.equals(param.getWindowId())) {
      continue;
    }
    int index=pids.indexOf(param.getWindowId());
    if (index < 0) {
      LOG.warn("String_Node_Str" + param.getWindowId() + "String_Node_Str"+ param.getName());
      continue;
    }
    if (param.getName() != null && param.getValues() != null && param.getValues().length > 0) {
      String valueString=encodeMultiValues(param.getValues());
      if (valueString.length() > 0) {
        String ptype=RENDER_PARAM;
        if (param.getType().equals(PortalURLParameter.PARAM_TYPE_ACTION)) {
          ptype=ACTION_PARAM;
        }
 else         if (param.getType().equals(PortalURLParameter.PARAM_TYPE_RESOURCE)) {
          ptype=RESOURCE_PARAM;
        }
        buffer.append("String_Node_Str").append(PREFIX).append(ptype).append(String.valueOf(index)).append(DELIM).append(urlEncode(param.getName())).append(VALUE_DELIM).append(valueString);
      }
    }
  }
  PublicRenderParameterMapper mapper=portalURL.getPublicRenderParameterMapper();
  List<Integer> activeIndexes=mapper.getActiveIndexes();
  if (reswin != null) {
    List<PortalURLPublicParameter> pups=mapper.getPRPsForWindow(reswin,true);
    activeIndexes=new ArrayList<Integer>();
    for (    PortalURLPublicParameter pup : pups) {
      activeIndexes.add(mapper.getIndex(pup));
    }
  }
  for (  int i : activeIndexes) {
    String[] values=mapper.getValues(i);
    String valstr=encodeMultiValues(values);
    List<PortalURLPublicParameter> prplist=mapper.getPublicParameterGroup(i);
    if (prplist.size() > 0) {
      PortalURLPublicParameter prp=prplist.get(0);
      int index=pids.indexOf(prp.getWindowId());
      if (index >= 0) {
        buffer.append("String_Node_Str").append(PREFIX).append(PUBLIC_RENDER_PARAM).append(String.valueOf(index)).append(DELIM).append(String.valueOf(i)).append(DELIM).append(urlEncode(prp.getName())).append(VALUE_DELIM).append(valstr);
      }
 else {
        LOG.warn("String_Node_Str" + prp.toString());
      }
    }
  }
  return buffer.toString();
}