package org.apache.samoa.topology;

/*
 * #%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%
 */

public interface Topology {
  /*
   * Name
   */
  /**
   * Get the topology's name
   * 
   * @return the name of the topology
   */
  public String getTopologyName();

  /**
   * Set the topology's name
   * 
   * @param topologyName
   *          the name of the topology
   */
  public void setTopologyName(String topologyName);

  /*
   * Entrance Processing Items
   */
  /**
   * Add an EntranceProcessingItem to this topology
   * 
   * @param epi
   *          the EntranceProcessingItem to be added
   */
  void addEntranceProcessingItem(EntranceProcessingItem epi);

  /*
   * Processing Items
   */
  /**
   * Add a ProcessingItem to this topology with default parallelism level (i.e. 1)
   * 
   * @param procItem
   *          the ProcessingItem to be added
   */
  void addProcessingItem(IProcessingItem procItem);

  /**
   * Add a ProcessingItem to this topology with an associated parallelism level
   * 
   * @param procItem
   *          the ProcessingItem to be added
   * @param parallelismHint
   *          the parallelism level
   */
  void addProcessingItem(IProcessingItem procItem, int parallelismHint);

  /*
   * Streams
   */
  /**
   * 
   * @param stream
   */
  void addStream(Stream stream);
}
