@Override
  public AdminEventQuery resourceType(ResourceType... resourceTypes) {

    List<String> resourceTypeStrings = new LinkedList<String>();
    for (ResourceType e : resourceTypes) {
      resourceTypeStrings.add(e.toString());
    }
    query.put("resourceType", new BasicDBObject("$in", resourceTypeStrings));

    return this;
  }
  /**
   * Get admin events
   *
   * <p>Returns all admin events, or filters events based on URL query parameters listed here
   *
   * @param operationTypes
   * @param authRealm
   * @param authClient
   * @param authUser user id
   * @param authIpAddress
   * @param resourcePath
   * @param dateTo
   * @param dateFrom
   * @param firstResult
   * @param maxResults
   * @return
   */
  @Path("admin-events")
  @GET
  @NoCache
  @Produces(MediaType.APPLICATION_JSON)
  public List<AdminEventRepresentation> getEvents(
      @QueryParam("operationTypes") List<String> operationTypes,
      @QueryParam("authRealm") String authRealm,
      @QueryParam("authClient") String authClient,
      @QueryParam("authUser") String authUser,
      @QueryParam("authIpAddress") String authIpAddress,
      @QueryParam("resourcePath") String resourcePath,
      @QueryParam("dateFrom") String dateFrom,
      @QueryParam("dateTo") String dateTo,
      @QueryParam("first") Integer firstResult,
      @QueryParam("max") Integer maxResults,
      @QueryParam("resourceTypes") List<String> resourceTypes) {
    auth.init(RealmAuth.Resource.EVENTS).requireView();

    EventStoreProvider eventStore = session.getProvider(EventStoreProvider.class);
    AdminEventQuery query = eventStore.createAdminQuery().realm(realm.getId());
    ;

    if (authRealm != null) {
      query.authRealm(authRealm);
    }

    if (authClient != null) {
      query.authClient(authClient);
    }

    if (authUser != null) {
      query.authUser(authUser);
    }

    if (authIpAddress != null) {
      query.authIpAddress(authIpAddress);
    }

    if (resourcePath != null) {
      query.resourcePath(resourcePath);
    }

    if (operationTypes != null && !operationTypes.isEmpty()) {
      OperationType[] t = new OperationType[operationTypes.size()];
      for (int i = 0; i < t.length; i++) {
        t[i] = OperationType.valueOf(operationTypes.get(i));
      }
      query.operation(t);
    }

    if (resourceTypes != null && !resourceTypes.isEmpty()) {
      ResourceType[] t = new ResourceType[resourceTypes.size()];
      for (int i = 0; i < t.length; i++) {
        t[i] = ResourceType.valueOf(resourceTypes.get(i));
      }
      query.resourceType(t);
    }

    if (dateFrom != null) {
      SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
      Date from = null;
      try {
        from = df.parse(dateFrom);
      } catch (ParseException e) {
        throw new BadRequestException(
            "Invalid value for 'Date(From)', expected format is yyyy-MM-dd");
      }
      query.fromTime(from);
    }

    if (dateTo != null) {
      SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
      Date to = null;
      try {
        to = df.parse(dateTo);
      } catch (ParseException e) {
        throw new BadRequestException(
            "Invalid value for 'Date(To)', expected format is yyyy-MM-dd");
      }
      query.toTime(to);
    }

    if (firstResult != null) {
      query.firstResult(firstResult);
    }
    if (maxResults != null) {
      query.maxResults(maxResults);
    }

    return toAdminEventRep(query.getResultList());
  }