// Copyright 2011 Google Inc. All Rights Reserved.
//
// 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 adaptorlib;

import java.io.IOException;

/**
 * Interface for library-assisted polling incremental adaptors. This means that
 * the adaptor can provide incremental changes, must poll to notice changes,
 * and wants the adaptor library to help out.
 *
 * <p>If the adaptor has no <em>easy</em> way of determining repository changes,
 * then it should not implement this interface and let the GSA naturally find
 * changes. If the adaptor can use an event-based method of discovering changes,
 * it should use that method instead. If an adaptor doesn't want to relinguish
 * control to the frequency of the polling and other such details, then there is
 * no need to use this interface; simply manually using {@link java.util.Timer}
 * is appropriate for a adaptor to do if it wishes.
 *
 * <p>Implementing this interface does improve the ease of configuring the
 * adaptor for the user. Thus, adaptors are encouraged to implement this
 * interface if it is applicable.
 */
public interface PollingIncrementalAdaptor extends Adaptor {
  /**
   * Check for documents modified since the last call to the method. This method
   * is intended to provide little-effort updates to the GSA about recent
   * modifications. Providing updates here allows greatly decreasing the amount
   * of latency before the GSA notices a document was added/modified/deleted,
   * but nothing more. It does not need to be perfect since the GSA's recrawling
   * will notice modifications and deletions and {@link Adaptor#getDocIds} will
   * provide additions.
   *
   * <p>For the first invocation, implementations can simply provide a small
   * amount of very recent history (e.g., last five revisions or last hour of
   * modifications) or provide no history and just initialize data structures
   * for future invocations. Adaptors are always encouraged to not persist
   * state; providing recent history during the first invocation allows the
   * adaptor to handle upgrades, computer restarts, and power outages without
   * trouble and still provide low-latency for those time periods. If an hour is
   * too short a period of time, then feel free to send a day's worth of history
   * instead. However, remember that missing modifications here only increases
   * the amount of latency before the GSA notices the modification.
   *
   * @param pusher convenience reference to pusher
   */
  public void getModifiedDocIds(DocIdPusher pusher) throws IOException,
      InterruptedException;
}
