/*
 * Copyright 2007 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.user.client.rpc;

/**
 * RemoteService used to test the use of enums over RPC.
 */
public interface EnumsTestService extends RemoteService {
  /**
   * Exception thrown when the enumeration state from the client makes it to the
   * server.
   */
  public class EnumStateModificationException extends SerializableException {
    public EnumStateModificationException() {
    }
    
    public EnumStateModificationException(String msg) {
      super(msg);
    }
  }
  
  /**
   * Simplest enum possible; no subtypes or enum constant specific state.
   */
  public enum Basic {
    A, B, C
  }

  /**
   * Enum that has no default constructor and includes state.
   */
  public enum Complex {
    A("X"), B("Y"), C("Z");

    public String value;

    Complex(String value) {
      this.value = value;
    }

    public String value() {
      return value;
    }
  }

  /**
   * Enum that has local subtypes.
   */
  public enum Subclassing {
    A {
      @Override
      public String value() {
        return "X";
      }
    },
    B {
      @Override
      public String value() {
        return "Y";
      }
    },
    C {
      @Override
      public String value() {
        return "Z";
      }
    };

    public abstract String value();
  }
  
  Basic echo(Basic value);
  Complex echo(Complex value) throws EnumStateModificationException;
  Subclassing echo(Subclassing value);
}
