package org.apache.samoa.core;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2014 - 2015 Apache Software Foundation
 * %%
 * 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.
 * #L%
 */

import java.io.Serializable;

import com.github.javacliparser.Configurable;

/**
 * An EntranceProcessor is a specific kind of processor dedicated to providing events to inject in the topology. It can
 * be connected to a single output stream.
 */
public interface EntranceProcessor extends Serializable, Configurable, Processor {

  /**
   * Initializes the Processor. This method is called once after the topology is set up and before any call to the
   * {@link nextTuple} method.
   * 
   * @param the
   *          identifier of the processor.
   */
  public void onCreate(int id);

  /**
   * Checks whether the source stream is finished/exhausted.
   */
  public boolean isFinished();

  /**
   * Checks whether a new event is ready to be processed.
   * 
   * @return true if the EntranceProcessor is ready to provide the next event, false otherwise.
   */
  public boolean hasNext();

  /**
   * Provides the next tuple to be processed by the topology. This method is the entry point for external events into
   * the topology.
   * 
   * @return the next event to be processed.
   */
  public ContentEvent nextEvent();

}
