package org.apache.samoa.utils;

/*
 * #%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 org.apache.samoa.topology.IProcessingItem;

/**
 * Represents one destination for streams. It has the info of: the ProcessingItem, parallelismHint, and partitioning
 * scheme. Usage: - When ProcessingItem connects to a stream, it will pass a StreamDestination to the stream. - Stream
 * manages a set of StreamDestination. - Used in single-threaded and multi-threaded local mode.
 * 
 * @author Anh Thu Vu
 * 
 */
public class StreamDestination {
  private IProcessingItem pi;
  private int parallelism;
  private PartitioningScheme type;

  /*
   * Constructor
   */
  public StreamDestination(IProcessingItem pi, int parallelismHint, PartitioningScheme type) {
    this.pi = pi;
    this.parallelism = parallelismHint;
    this.type = type;
  }

  /*
   * Getters
   */
  public IProcessingItem getProcessingItem() {
    return this.pi;
  }

  public int getParallelism() {
    return this.parallelism;
  }

  public PartitioningScheme getPartitioningScheme() {
    return this.type;
  }

}
