/*
 * 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.web.bindery.requestfactory.shared;

/**
 * A simple entity used for testing. Has an int field and date field. Add other
 * data types as their support gets built in.
 */
@ProxyForName("com.google.web.bindery.requestfactory.server.SimpleBar")
public interface SimpleBarProxy extends EntityProxy {

  Boolean getFindFails();

  Boolean getUnpersisted();

  /*
   * NB: The lack of a getId() here is intentional, to ensure that the system
   * does not assume that the id property is available to the client.
   */

  String getUserName();

  void setFindFails(Boolean fails);

  void setUnpersisted(Boolean b);

  void setUserName(String userName);

  @Override
  EntityProxyId<SimpleBarProxy> stableId();
}
