content: /**
   * 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 org.apache.aurora.scheduler.thrift;
  
  import com.google.common.collect.Lists;
  
  import org.apache.aurora.common.base.MorePreconditions;
  import org.apache.aurora.gen.Response;
  import org.apache.aurora.gen.ResponseCode;
  import org.apache.aurora.gen.ResponseDetail;
  import org.apache.aurora.gen.Result;
  
  import static org.apache.aurora.gen.ResponseCode.ERROR;
  import static org.apache.aurora.gen.ResponseCode.INVALID_REQUEST;
  import static org.apache.aurora.gen.ResponseCode.OK;
  
  /**
   * Utility class for constructing responses to API calls.
   */
  public final class Responses {
  
    private Responses() {
      // Utility class.
    }
  
    /**
     * Creates a new empty response.
     *
     * @return An empty response message.
     */
    public static Response empty() {
      return new Response().setDetails(Lists.newArrayList());
    }
  
    /**
     * Adds a human-friendly message to a response, usually to indicate a problem or deprecation
     * encountered while handling the request.
     *
     * @param response Response to augment.
     * @param message Message to include in the response.
     * @return {@code response} with {@code message} included.
     */
    public static Response addMessage(Response response, String message) {
      return appendMessage(response, MorePreconditions.checkNotBlank(message));
    }
  
    /**
     * Identical to {@link #addMessage(Response, String)} that also applies a response code.
     *
     * @param response Response to augment.
     * @param code Response code to include.
     * @param message Message to include in the response.
     * @return {@code response} with {@code message} included.
     * @see {@link #addMessage(Response, String)}
     */
    public static Response addMessage(Response response, ResponseCode code, String message) {
      return addMessage(response.setResponseCode(code), message);
    }
  
    /**
     * Identical to {@link #addMessage(Response, String)} that also applies a response code and
     * extracts a message from the provided {@link Throwable}.
     *
     * @param response Response to augment.
     * @param code Response code to include.
     * @param throwable {@link Throwable} to extract message from.
     * @return {@link #addMessage(Response, String)}
     */
    public static Response addMessage(Response response, ResponseCode code, Throwable throwable) {
      return appendMessage(response.setResponseCode(code), throwable.getMessage());
    }
  
    private static Response appendMessage(Response response, String message) {
      response.addToDetails(new ResponseDetail(message));
      return response;
    }
  
    /**
     * Creates an ERROR response that has a single associated error message.
     *
     * @param message The error message.
     * @return A response with an ERROR code set containing the message indicated.
     */
    public static Response error(String message) {
      return addMessage(empty(), ERROR, message);
    }
  
    /**
     * Creates an OK response that has no result entity.
     *
     * @return Ok response with an empty result.
     */
    public static Response ok()  {
      return empty().setResponseCode(OK);
    }
  
    static Response invalidRequest(String message) {
      return addMessage(empty(), INVALID_REQUEST, message);
    }
  
    static Response ok(Result result) {
      return ok().setResult(result);
    }
  
    static Response error(ResponseCode code, Throwable error) {
      return addMessage(empty(), code, error);
    }
  }
  