public ActionForward search(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
      throws Exception {
    ReportTrackingLookupForm lookupForm = (ReportTrackingLookupForm) form;

    Lookupable kualiLookupable = lookupForm.getLookupable();
    if (kualiLookupable == null) {
      LOG.error("Lookupable is null.");
      throw new RuntimeException("Lookupable is null.");
    }

    // validate search parameters
    kualiLookupable.validateSearchParameters(lookupForm.getFields());

    if (lookupForm.isViewRawResults()) {
      return super.search(mapping, lookupForm, request, response);
    } else {
      LookupUtils.preProcessRangeFields(lookupForm.getFields());
      List<ReportTracking> groupedResults =
          getReportTrackingDao()
              .getResultsGroupedBy(
                  lookupForm.getFields(),
                  lookupForm.getGroupedByFields(),
                  lookupForm.getGroupedByDisplayFields());
      lookupForm.setGroupedByResults(groupedResults);
      return mapping.findForward(Constants.MAPPING_BASIC);
    }
  }
 public ActionForward getDetails(
     ActionMapping mapping,
     ActionForm form,
     HttpServletRequest request,
     HttpServletResponse response)
     throws Exception {
   ReportTrackingLookupForm lookupForm = (ReportTrackingLookupForm) form;
   LookupUtils.preProcessRangeFields(lookupForm.getFields());
   Map<String, String> allFields = new HashMap<String, String>(lookupForm.getFields());
   populateAggregateValues(
       lookupForm.getGroupedByResults().get(lookupForm.getGroupByResultIndex()),
       allFields,
       lookupForm.getGroupedByFields());
   List<ReportTracking> detailResults =
       getReportTrackingDao().getDetailResults(allFields, lookupForm.getDetailFields());
   lookupForm.setDetailResults(detailResults);
   return mapping.findForward("ajaxDetails");
 }