/**
   * @param query
   * @param request
   * @param response
   * @return
   * @throws ResponseException
   */
  @SuppressWarnings("rawtypes")
  @RequestMapping(value = "/{resource}", method = RequestMethod.GET)
  @ResponseBody
  public SimpleObject get(
      @PathVariable("resource") String resource,
      HttpServletRequest request,
      HttpServletResponse response)
      throws ResponseException {
    CrudResource res = (CrudResource) restService.getResourceByName(buildResourceName(resource));

    RequestContext context = RestUtil.getRequestContext(request, Representation.REF);

    @SuppressWarnings("unchecked")
    SearchHandler searchHandler =
        restService.getSearchHandler(buildResourceName(resource), request.getParameterMap());
    if (searchHandler != null) {
      return searchHandler.search(context).toSimpleObject();
    }

    Enumeration parameters = request.getParameterNames();
    while (parameters.hasMoreElements()) {
      if (!RestConstants.SPECIAL_REQUEST_PARAMETERS.contains(parameters.nextElement())) {
        if (res instanceof Searchable) {
          return ((Searchable) res).search(context);
        } else {
          throw new ResourceDoesNotSupportOperationException(
              res.getClass().getSimpleName() + " is not searchable");
        }
      }
    }

    if (res instanceof Listable) {
      return ((Listable) res).getAll(context);
    } else {
      throw new ResourceDoesNotSupportOperationException(
          res.getClass().getSimpleName() + " is not listable");
    }
  }