// Copyright (C) 2015 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.gerrit.audit;

import com.google.common.base.Preconditions;
import com.google.common.collect.ListMultimap;
import com.google.gerrit.extensions.restapi.RestResource;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.server.CurrentUser;
import javax.servlet.http.HttpServletRequest;

/** Extended audit event. Adds request, resource and view data to HttpAuditEvent. */
public class ExtendedHttpAuditEvent extends HttpAuditEvent {
  public final HttpServletRequest httpRequest;
  public final RestResource resource;
  public final RestView<? extends RestResource> view;

  /**
   * Creates a new audit event with results
   *
   * @param sessionId session id the event belongs to
   * @param who principal that has generated the event
   * @param httpRequest the HttpServletRequest
   * @param when time-stamp of when the event started
   * @param params parameters of the event
   * @param input input
   * @param status HTTP status
   * @param result result of the event
   * @param resource REST resource data
   * @param view view rendering object
   */
  public ExtendedHttpAuditEvent(
      String sessionId,
      CurrentUser who,
      HttpServletRequest httpRequest,
      long when,
      ListMultimap<String, ?> params,
      Object input,
      int status,
      Object result,
      RestResource resource,
      RestView<RestResource> view) {
    super(
        sessionId,
        who,
        httpRequest.getRequestURI(),
        when,
        params,
        httpRequest.getMethod(),
        input,
        status,
        result);
    this.httpRequest = Preconditions.checkNotNull(httpRequest);
    this.resource = resource;
    this.view = view;
  }
}
