package com.yahoo.labs.samoa.topology;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2013 Yahoo! Inc.
 * %%
 * 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);
}
