Program: 75182
Project: 75182
Buggy source:
/** 
 * builds URL for drillthrough action
 * @param action instance of the IAction instance
 * @param context the context for building the action string
 * @return a URL
 */
protected String buildDrillAction(IAction action,IReportContext context){
  if (action == null || context == null)   return null;
  String baseURL=null;
  Object renderContext=getRenderContext(context);
  if (renderContext instanceof HTMLRenderContext) {
    baseURL=((HTMLRenderContext)renderContext).getBaseURL();
  }
  if (renderContext instanceof PDFRenderContext) {
    baseURL=((PDFRenderContext)renderContext).getBaseURL();
  }
  if (baseURL == null)   baseURL=IBirtConstants.VIEWER_PREVIEW;
  StringBuffer link=new StringBuffer();
  String reportName=getReportName(context,action);
  if (reportName != null && !reportName.equals("String_Node_Str")) {
    link.append(baseURL);
    link.append(reportName.toLowerCase().endsWith("String_Node_Str") ? "String_Node_Str" : "String_Node_Str");
    try {
      link.append(URLEncoder.encode(reportName,ParameterAccessor.UTF_8_ENCODE));
    }
 catch (    UnsupportedEncodingException e1) {
    }
    String format=action.getFormat();
    if (format == null || format.length() == 0)     format=hostFormat;
    if (format != null && format.length() > 0) {
      link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_FORMAT,format));
    }
    if (action.getParameterBindings() != null) {
      Iterator paramsIte=action.getParameterBindings().entrySet().iterator();
      while (paramsIte.hasNext()) {
        Map.Entry entry=(Map.Entry)paramsIte.next();
        try {
          String key=(String)entry.getKey();
          Object valueObj=entry.getValue();
          if (valueObj != null) {
            String value=DataUtil.getDisplayValue(valueObj);
            link.append(ParameterAccessor.getQueryParameterString(URLEncoder.encode(key,ParameterAccessor.UTF_8_ENCODE),URLEncoder.encode(value,ParameterAccessor.UTF_8_ENCODE)));
          }
        }
 catch (        UnsupportedEncodingException e) {
        }
      }
      if (!reportName.toLowerCase().endsWith(ParameterAccessor.SUFFIX_REPORT_DOCUMENT) && baseURL.lastIndexOf(IBirtConstants.SERVLET_PATH_FRAMESET) > 0) {
        link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_OVERWRITE,String.valueOf(true)));
      }
    }
    if (locale != null) {
      link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_LOCALE,locale.toString()));
    }
    if (isRtl) {
      link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_RTL,String.valueOf(isRtl)));
    }
    link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_MASTERPAGE,String.valueOf(this.isMasterPageContent)));
    try {
      if (resourceFolder != null) {
        String res=URLEncoder.encode(resourceFolder,ParameterAccessor.UTF_8_ENCODE);
        link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_RESOURCE_FOLDER,res));
      }
    }
 catch (    UnsupportedEncodingException e) {
    }
    String bookmark=action.getBookmark();
    if (bookmark != null) {
      try {
        if (baseURL.lastIndexOf(IBirtConstants.SERVLET_PATH_PREVIEW) > 0 || IBirtConstants.PDF_RENDER_FORMAT.equalsIgnoreCase(format)) {
          link.append("String_Node_Str");
          if (!action.isBookmark() && reportName.toLowerCase().endsWith("String_Node_Str")) {
            InputOptions options=new InputOptions();
            options.setOption(InputOptions.OPT_LOCALE,locale);
            bookmark=BirtReportServiceFactory.getReportService().findTocByName(reportName,bookmark,options);
          }
        }
 else {
          link.append("String_Node_Str");
        }
        link.append(URLEncoder.encode(bookmark,ParameterAccessor.UTF_8_ENCODE));
      }
 catch (      UnsupportedEncodingException e) {
      }
    }
  }
  return link.toString();
}

Fixed version (ground truth):
/** 
 * builds URL for drillthrough action
 * @param action instance of the IAction instance
 * @param context the context for building the action string
 * @return a URL
 */
protected String buildDrillAction(IAction action,IReportContext context){
  if (action == null || context == null)   return null;
  String baseURL=null;
  Object renderContext=getRenderContext(context);
  if (renderContext instanceof HTMLRenderContext) {
    baseURL=((HTMLRenderContext)renderContext).getBaseURL();
  }
  if (renderContext instanceof PDFRenderContext) {
    baseURL=((PDFRenderContext)renderContext).getBaseURL();
  }
  if (baseURL == null)   baseURL=IBirtConstants.VIEWER_PREVIEW;
  StringBuffer link=new StringBuffer();
  String reportName=getReportName(context,action);
  if (reportName != null && !reportName.equals("String_Node_Str")) {
    link.append(baseURL);
    link.append(reportName.toLowerCase().endsWith("String_Node_Str") ? "String_Node_Str" : "String_Node_Str");
    try {
      link.append(URLEncoder.encode(reportName,ParameterAccessor.UTF_8_ENCODE));
    }
 catch (    UnsupportedEncodingException e1) {
    }
    String format=action.getFormat();
    if (format == null || format.length() == 0)     format=hostFormat;
    if (format != null && format.length() > 0) {
      link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_FORMAT,format));
    }
    if (action.getParameterBindings() != null) {
      Iterator paramsIte=action.getParameterBindings().entrySet().iterator();
      while (paramsIte.hasNext()) {
        Map.Entry entry=(Map.Entry)paramsIte.next();
        try {
          String key=(String)entry.getKey();
          Object valueObj=entry.getValue();
          if (valueObj != null) {
            String value=DataUtil.getDisplayValue(valueObj);
            link.append(ParameterAccessor.getQueryParameterString(URLEncoder.encode(key,ParameterAccessor.UTF_8_ENCODE),URLEncoder.encode(value,ParameterAccessor.UTF_8_ENCODE)));
          }
        }
 catch (        UnsupportedEncodingException e) {
        }
      }
      if (!reportName.toLowerCase().endsWith(ParameterAccessor.SUFFIX_REPORT_DOCUMENT) && baseURL.lastIndexOf(IBirtConstants.SERVLET_PATH_FRAMESET) > 0) {
        link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_OVERWRITE,String.valueOf(true)));
      }
    }
    if (locale != null) {
      link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_LOCALE,locale.toString()));
    }
    if (isRtl) {
      link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_RTL,String.valueOf(isRtl)));
    }
    link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_MASTERPAGE,String.valueOf(this.isMasterPageContent)));
    try {
      if (resourceFolder != null) {
        String res=URLEncoder.encode(resourceFolder,ParameterAccessor.UTF_8_ENCODE);
        link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_RESOURCE_FOLDER,res));
      }
    }
 catch (    UnsupportedEncodingException e) {
    }
    String bookmark=action.getBookmark();
    if (bookmark != null) {
      try {
        if (baseURL.lastIndexOf(IBirtConstants.SERVLET_PATH_PREVIEW) > 0 || IBirtConstants.PDF_RENDER_FORMAT.equalsIgnoreCase(format)) {
          link.append("String_Node_Str");
          if (!action.isBookmark() && reportName.toLowerCase().endsWith("String_Node_Str")) {
            InputOptions options=new InputOptions();
            options.setOption(InputOptions.OPT_LOCALE,locale);
            bookmark=BirtReportServiceFactory.getReportService().findTocByName(reportName,bookmark,options);
          }
          link.append(URLEncoder.encode(bookmark,ParameterAccessor.UTF_8_ENCODE));
        }
 else {
          bookmark=URLEncoder.encode(bookmark,ParameterAccessor.UTF_8_ENCODE);
          link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_BOOKMARK,bookmark));
          if (!action.isBookmark())           link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_ISTOC,"String_Node_Str"));
        }
      }
 catch (      UnsupportedEncodingException e) {
      }
    }
  }
  return link.toString();
}