/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

package org.apache.heron.eco.definition;

public class ComponentStream {

  private String id;

  private String toComponent;

  private String fromComponent;

  private String streamName;

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public Object getToComponent() {
    return toComponent;
  }

  public void setToComponent(String toComponent) {
    this.toComponent = toComponent;
  }

  public String getFromComponent() {
    return fromComponent;
  }

  public void setFromComponent(String fromComponent) {
    this.fromComponent = fromComponent;
  }

  public String getStreamName() {
    return streamName;
  }

  public void setStreamName(String streamName) {
    this.streamName = streamName;
  }

  @Override
  public String toString() {
    return "ComponentStream{"
        + "toComponent='" + toComponent + '\''
        + ", fromComponent='" + fromComponent
        + '\''
        + ", streamName='" + streamName + '\''
        + '}';
  }
}
