@GET
  public Spaces getSpaces(
      @PathParam("wikiName") String wikiName,
      @QueryParam("start") @DefaultValue("0") Integer start,
      @QueryParam("number") @DefaultValue("-1") Integer number)
      throws XWikiException, QueryException, ComponentLookupException {
    String database = Utils.getXWikiContext(componentManager).getDatabase();

    Spaces spaces = objectFactory.createSpaces();

    /* This try is just needed for executing the finally clause. */
    try {
      Utils.getXWikiContext(componentManager).setDatabase(wikiName);

      List<String> spaceNames =
          queryManager
              .getNamedQuery("getSpaces")
              .addFilter(componentManager.<QueryFilter>getInstance(QueryFilter.class, "hidden"))
              .setOffset(start)
              .setLimit(number)
              .execute();

      for (String spaceName : spaceNames) {
        String homeId = Utils.getPageId(wikiName, spaceName, "WebHome");
        Document home = null;

        XWiki xwikiApi = Utils.getXWikiApi(componentManager);
        if (xwikiApi.hasAccessLevel("view", homeId)) {
          if (xwikiApi.exists(homeId)) {
            home = Utils.getXWikiApi(componentManager).getDocument(homeId);
          }
          spaces
              .getSpaces()
              .add(
                  DomainObjectFactory.createSpace(
                      objectFactory, uriInfo.getBaseUri(), wikiName, spaceName, home));
        }
      }
    } finally {
      Utils.getXWikiContext(componentManager).setDatabase(database);
    }

    return spaces;
  }