/*
 * 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.gearpump.streaming.dsl.task

import org.apache.gearpump.Message
import org.apache.gearpump.cluster.UserConfig
import org.apache.gearpump.streaming.Constants._
import org.apache.gearpump.streaming.dsl.plan.functions.SingleInputFunction
import org.apache.gearpump.streaming.task.{Task, TaskContext}

class TransformTask[IN, OUT](
    operator: Option[SingleInputFunction[IN, OUT]], taskContext: TaskContext,
    userConf: UserConfig) extends Task(taskContext, userConf) {

  def this(taskContext: TaskContext, userConf: UserConfig) = {
    this(userConf.getValue[SingleInputFunction[IN, OUT]](
      GEARPUMP_STREAMING_OPERATOR)(taskContext.system), taskContext, userConf)
  }

  override def onNext(msg: Message): Unit = {
    val time = msg.timestamp

    operator match {
      case Some(op) =>
        op.process(msg.msg.asInstanceOf[IN]).foreach { msg =>
          taskContext.output(new Message(msg, time))
        }
      case None =>
        taskContext.output(new Message(msg.msg, time))
    }
  }
}
