/*
 * 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.client.testing;

import com.google.gwt.editor.client.Editor;
import com.google.gwt.editor.client.EditorError;
import com.google.gwt.editor.client.EditorVisitor;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.requestfactory.client.RequestFactoryEditorDriver;
import com.google.gwt.requestfactory.shared.RequestContext;
import com.google.gwt.requestfactory.shared.RequestFactory;
import com.google.gwt.requestfactory.shared.Violation;

import java.util.Collections;
import java.util.List;

import javax.validation.ConstraintViolation;

/**
 * A no-op implementation of {@link RequestFactoryEditorDriver} that records its
 * inputs.
 *
 * <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>
 *
 * @param <P> the Proxy type being edited
 * @param <E> the Editor type
 */
@Deprecated
public class MockRequestFactoryEditorDriver<P, E extends Editor<P>> implements
    RequestFactoryEditorDriver<P, E> {
  private static final String[] EMPTY_STRING = new String[0];

  private EventBus eventBus;
  private E editor;
  private P proxy;
  private RequestContext saveRequest;
  private RequestFactory requestFactory;

  /**
   * A no-op method.
   */
  public void accept(EditorVisitor visitor) {
  }

  /**
   * Records its arguments.
   */
  public void display(P proxy) {
    this.proxy = proxy;
  }

  /**
   * Records its arguments.
   */
  public void edit(P proxy, RequestContext saveRequest) {
    this.proxy = proxy;
    this.saveRequest = saveRequest;
  }

  /**
   * Returns <code>null</code> or the last value recorded.
   */
  public RequestContext flush() {
    return saveRequest;
  }

  /**
   * Returns <code>null</code> or the last value recorded.
   */
  public E getEditor() {
    return editor;
  }

  /**
   * Returns an empty list.
   */
  public List<EditorError> getErrors() {
    return Collections.emptyList();
  }

  /**
   * Returns <code>null</code> or the last value recorded.
   */
  public EventBus getEventBus() {
    return eventBus;
  }

  /**
   * Returns a zero-length array.
   */
  public String[] getPaths() {
    return EMPTY_STRING;
  }

  /**
   * Returns <code>null</code> or the last value recorded.
   */
  public P getProxy() {
    return proxy;
  }

  /**
   * Returns <code>null</code> or the last value recorded.
   */
  public RequestFactory getRequestFactory() {
    return requestFactory;
  }

  /**
   * Returns <code>null</code> or the last value recorded.
   */
  public RequestContext getSaveRequest() {
    return saveRequest;
  }

  /**
   * Returns <code>false</code>.
   */
  public boolean hasErrors() {
    return false;
  }

  public void initialize(E editor) {
    initialize(null, editor);
  }

  /**
   * Records its arguments.
   */
  public void initialize(EventBus eventBus, RequestFactory requestFactory,
      E editor) {
    this.eventBus = eventBus;
    this.requestFactory = requestFactory;
    this.editor = editor;
  }

  public void initialize(RequestFactory requestFactory, E editor) {
    this.initialize(requestFactory.getEventBus(), requestFactory, editor);
  }

  /**
   * Returns {@code false}.
   */
  public boolean isDirty() {
    return false;
  }

  /**
   * A no-op method that always returns false.
   */
  public boolean setConstraintViolations(
      Iterable<ConstraintViolation<?>> violations) {
    return false;
  }

  /**
   * A no-op method that always returns false.
   */
  public boolean setViolations(Iterable<Violation> errors) {
    return false;
  }
}
