/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.hadoop.ozone.container.common.states;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * State Interface that allows tasks to maintain states.
 */
public interface DatanodeState<T> {
  /**
   * Called before entering this state.
   */
  void onEnter();

  /**
   * Called After exiting this state.
   */
  void onExit();

  /**
   * Executes one or more tasks that is needed by this state.
   *
   * @param executor -  ExecutorService
   */
  void execute(ExecutorService executor);

  /**
   * Wait for execute to finish.
   *
   * @param time - Time
   * @param timeUnit - Unit of time.
   * @throws InterruptedException
   * @throws ExecutionException
   * @throws TimeoutException
   */
  T await(long time, TimeUnit timeUnit)
      throws InterruptedException, ExecutionException, TimeoutException;

}
