/*
 * Copyright 2010 Google Inc.
 *
 * 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.gwt.requestfactory.shared.messages;

import com.google.gwt.autobean.shared.AutoBean.PropertyName;

/**
 * Encapsulates a ServerFailure object.
 *
 * <p><span style='color:red'>RequestFactory has moved to
 * <code>com.google.web.bindery.requestfactory</code>.  This package will be
 * removed in a future version of GWT.</span></p>
 */
@Deprecated
public interface ServerFailureMessage {
  String EXCEPTION_TYPE = "X";
  String MESSAGE = "M";
  String STACK_TRACE = "S";
  String FATAL = "F";

  @PropertyName(EXCEPTION_TYPE)
  String getExceptionType();

  @PropertyName(MESSAGE)
  String getMessage();

  @PropertyName(STACK_TRACE)
  String getStackTrace();

  @PropertyName(FATAL)
  boolean isFatal();

  @PropertyName(EXCEPTION_TYPE)
  void setExceptionType(String exceptionType);

  @PropertyName(FATAL)
  void setFatal(boolean significant);

  @PropertyName(MESSAGE)
  void setMessage(String message);

  @PropertyName(STACK_TRACE)
  void setStackTrace(String stackTrace);
}
