/*
 * 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.
 */
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);
}
