Program: 72698
Project: 72698
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;
  baseURL=checkBaseURLWithExtractPattern(action,baseURL);
  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 (isContainExtractInfo(action)) {
      try {
        link.append(ParameterAccessor.PARAMETER_SEPARATOR);
        link.append(action.getActionString());
      }
 catch (      Exception e) {
      }
    }
    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) {
            Object[] values;
            if (valueObj instanceof Object[]) {
              values=(Object[])valueObj;
            }
 else {
              values=new Object[1];
              values[0]=valueObj;
            }
            for (int i=0; i < values.length; i++) {
              String value=DataUtil.getDisplayValue(values[i]);
              if (value != null) {
                link.append(ParameterAccessor.getQueryParameterString(URLEncoder.encode(key,ParameterAccessor.UTF_8_ENCODE),URLEncoder.encode(value,ParameterAccessor.UTF_8_ENCODE)));
              }
 else {
                link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_ISNULL,URLEncoder.encode(key,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)));
    }
    if (svg != null) {
      link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_SVG,String.valueOf(svg.booleanValue())));
    }
    if (isDesigner != null) {
      link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_DESIGNER,String.valueOf(isDesigner)));
    }
    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();
}

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;
  boolean isExtractPattern=isContainExtractInfo(action);
  if (isExtractPattern)   baseURL=createBaseURLWithExtractPattern(baseURL);
  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 (isContainExtractInfo(action)) {
      try {
        link.append(ParameterAccessor.PARAMETER_SEPARATOR);
        link.append(action.getActionString());
      }
 catch (      Exception e) {
      }
    }
    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) {
            Object[] values;
            if (valueObj instanceof Object[]) {
              values=(Object[])valueObj;
            }
 else {
              values=new Object[1];
              values[0]=valueObj;
            }
            for (int i=0; i < values.length; i++) {
              String value=DataUtil.getDisplayValue(values[i]);
              if (value != null) {
                link.append(ParameterAccessor.getQueryParameterString(URLEncoder.encode(key,ParameterAccessor.UTF_8_ENCODE),URLEncoder.encode(value,ParameterAccessor.UTF_8_ENCODE)));
              }
 else {
                link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_ISNULL,URLEncoder.encode(key,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)));
    }
    if (svg != null) {
      link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_SVG,String.valueOf(svg.booleanValue())));
    }
    if (isDesigner != null) {
      link.append(ParameterAccessor.getQueryParameterString(ParameterAccessor.PARAM_DESIGNER,String.valueOf(isDesigner)));
    }
    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();
}