package com.yahoo.labs.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);
}
