/**
 * 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.streamlet.impl.streamlets;

import java.util.List;
import java.util.Set;

import org.apache.heron.api.topology.TopologyBuilder;
import org.apache.heron.streamlet.impl.StreamletImpl;

/**
 * StreamletShadow is a special kind of StreamletImpl object:
 * - It is still an StreamletImpl therefore it supports all Streamlet functions like filter()
 * and map(), and can be the parent object of other StreamletImpl objects. Therefore,
 * from API point of view, it can be used in the same way as a normal StreamletImpl object.
 * - However it is just an shadow object of a real StreamletImpl object and it doesn't
 * represent a node in the topology DAG. Therefore it can not be a child of another StreamletImpl
 * object. As the result, the shadow object is clonable, and it is fine to create multiple
 * StreamletShadow objects pointing to the same StreamletImpl object and have different properties.
 *
 * A StreamletShadow object can be used to decorate the real Streamletimpl object. This is
 * important for children StreamletImpl objects to consume output data from the same parent in
 * different ways, such as selecting different stream.
 *
 * Usage:
 * To create a shadow object that selecting "test" stream from an existing StreamletImpl
 * object(stream):
 *
 * StreamletImpl shadow = new StreamletShadow(stream) {
 *   @Override
 *   public String getStreamId() {
 *     return "test";
 *   }
 * }
 *
 */
public class StreamletShadow<R> extends StreamletImpl<R> {
  private StreamletImpl<R> real;

  public StreamletShadow(StreamletImpl<R> real) {
    this.real = real;
  }

  public StreamletImpl<R> getReal() {
    return real;
  }

  /**
   * Gets the stream id of this Streamlet.
   * @return the stream id of this Streamlet
   */
  @Override
  public String getStreamId() {
    return real.getStreamId();
  }

  /*
   * Functions accessible by child objects need to be overriden (forwarding the call to
   * the real object since shadow object shouldn't have them)
   */
  @Override
  public StreamletShadow<R> setName(String sName) {
    real.setName(sName);
    return this;
  }

  @Override
  public String getName() {
    return real.getName();
  }

  @Override
  public StreamletShadow<R> setNumPartitions(int numPartitions) {
    real.setNumPartitions(numPartitions);
    return this;
  }

  @Override
  public int getNumPartitions() {
    return real.getNumPartitions();
  }

  /*
   * Functions related to topology building need to be overriden.
   */
  @Override
  public <T> void addChild(StreamletImpl<T> child) {
    real.addChild(child);
  }

  /**
   * Gets all the children of this streamlet.
   * Children of a streamlet are streamlets that are resulting from transformations of elements of
   * this and potentially other streamlets.
   * @return The kid streamlets
   */
  @Override
  public List<StreamletImpl<?>> getChildren() {
    return real.getChildren();
  }

  @Override
  public void build(TopologyBuilder bldr, Set<String> stageNames) {
    throw new UnsupportedOperationException("build() in StreamletShadow should NOT be invoked");
  }

  @Override
  public boolean doBuild(TopologyBuilder bldr, Set<String> stageNames) {
    throw new UnsupportedOperationException("build() in StreamletShadow should NOT be invoked");
  }
}
