@RequestMapping(
      value = "",
      method = {RequestMethod.GET, RequestMethod.POST})
  public void handleOAI(
      @RequestParam(value = VERB, defaultValue = EMPTY_STRING) String verbName,
      @RequestParam(value = IDENTIFIER, required = false) String identifier,
      @RequestParam(value = METADATA_PREFIX, defaultValue = EMPTY_STRING) String metadataPrefix,
      @RequestParam(value = FROM, required = false) String from,
      @RequestParam(value = UNTIL, required = false) String until,
      @RequestParam(value = SET, required = false) String set,
      @RequestParam(value = RESUMPTION_TOKEN, required = false) String resumptionToken,
      HttpServletRequest request,
      HttpServletResponse response)
      throws IOException, ConnectException, SolrServerException, TransformerConfigurationException {

    Verb theVerb;

    try {
      theVerb = Verb.valueOf(verbName);
    } catch (NullPointerException e) {
      theVerb = Verb.Identify;
    } catch (IllegalArgumentException e) {
      theVerb = Verb.Identify;
    }

    SolrQuery query = new SolrQuery();
    query.set("echoParams", "all");

    if (clientXsltHandler == null) {
      query.set("tr", String.format(xsltPath, verbName));
    }

    query.set(VERB, verbName);
    query.set("requestStr", request.getRequestURL().toString());
    query.setQuery("*:*");

    Locale locale = Locale.getDefault();

    for (String errorType : errorTypes) {
      addErrorQuery(errorType, query, locale);
    }

    switch (theVerb) {
      case ListIdentifiers:
        query.setFields(collectionIdField, datestampField, setIdField);
        // No Break, extra constraint adding to below query constraints

      case ListRecords:
      case GetRecord:
        query.set("collectionIdField", collectionIdField);
        query.set("datestampField", datestampField);

        for (String filter : filterQueries) {
          query.addFilterQuery(filter);
        }

        if (metadataPrefix != null) {
          query.set(METADATA_PREFIX, metadataPrefix);
        }

        break;
    }

    switch (theVerb) {
      case Identify:
      case ListMetadataFormats:
        query.setRows(0);
        break;

      case GetRecord:
        query.setRows(0);

        if (identifier != null) {
          query.set(IDENTIFIER, identifier);

          if (identifier.startsWith(identifierPrefix)) {
            String collStr = identifier.substring(identifierPrefix.length());
            try {
              // This is to ensure that collId is a valid number
              query.setQuery(collectionIdField + ":" + Integer.parseInt(collStr));
              query.setRows(1);
            } catch (NumberFormatException n) {
              // just skip setting query, solr will detect missing collection since there
              // are 0 rows
            }
          }
        }
        break;

      case ListIdentifiers:
      case ListRecords:
        query.set(IDENTIFIER, identifierPrefix);

        if (resumptionToken != null) {
          processResumptionToken(query, resumptionToken);
          from = query.get(FROM, null);
          until = query.get(UNTIL, null);
        } else {
          query.setRows(numResultsToDisplay);

          if (from != null) {
            query.set(FROM, from);
          }

          if (until != null) {
            query.set(UNTIL, until);
          }
        }

        if (datestampField != null) {
          processDateRange(query, from, until);
        }

        if (setIdField != null) {
          query.set("setIdField", setIdField);

          if (set != null) {
            if (setPrefix != null) {
              if (set.startsWith(setPrefix + ":")) {
                set = set.substring(setPrefix.length() + 1);
              } else {
                query.setRows(0);
              }
            }

            query.set(SET, set);

            try {
              // This is to ensure that set is a number
              query.addFilterQuery(setIdField + ":" + Integer.parseInt(set));
            } catch (NumberFormatException n) {
              query.setRows(0);
            }
          }
        }

        if (setPrefix != null) {
          query.set("setPrefix", setPrefix);
        }
        break;

      case ListSets:
        query.set("setIdField", setIdField);
        query.set("setNameField", setNameField);
        query.set("setDescField", setDescField);
        query.set("setPrefix", setPrefix);
        query.set(RESUMPTION_TOKEN, resumptionToken);
        query.setFields(setIdField, setNameField, setDescField);
        query.setRows(numResultsToDisplay);

        for (String setQuery : setQueries) {
          query.addFilterQuery(setQuery);
        }

        if (resumptionToken != null) {
          processResumptionToken(query, resumptionToken);
        }
        break;
    }

    response.setContentType("text/xml");

    ResponseParser parser = null;

    if (clientXsltHandler != null) {
      parser = clientXsltHandler.newParserInstance(response);
    } else {
      parser = new PassThroughSolrResponseParser(response);
    }

    System.out.println("Solr Query: " + query.toString());

    CustomSolrQueryRequest req = new CustomSolrQueryRequest(query, parser);

    if (solrServer == null) {
      solrServer = new CommonsHttpSolrServer(solrServerUrl);
    }

    req.process(solrServer);
  }