package org.apache.samoa.apex.topology.impl;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2014 - 2016 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 java.io.Serializable;

import org.apache.samoa.core.ContentEvent;
import org.apache.samoa.core.EntranceProcessor;

import com.datatorrent.api.InputOperator;
import com.datatorrent.api.Context.OperatorContext;
import com.datatorrent.common.util.BaseOperator;
import com.esotericsoftware.kryo.DefaultSerializer;
import com.esotericsoftware.kryo.serializers.JavaSerializer;

/**
 * Apex Operator
 *
 */
@DefaultSerializer(JavaSerializer.class)
public class ApexInputOperator extends BaseOperator implements InputOperator, Serializable {

  private static final long DEFAULT_LIMIT = 2000;
  private long tuplesLimitPerWindow; // default
  private static final long serialVersionUID = 4255026962166445721L;
  private final EntranceProcessor entranceProcessor;
  private final DefaultOutputPortSerializable<ContentEvent> outputPort = new DefaultOutputPortSerializable<ContentEvent>();
  private transient int numTuples;

  public ApexInputOperator() {
    entranceProcessor = null;
  }

  ApexInputOperator(EntranceProcessor processor) {
    this.entranceProcessor = processor;
  }

  ApexStream createStream(String piId) {
    ApexStream stream = new ApexStream(piId);
    stream.outputPort = this.outputPort;
    return stream;
  }

  @Override
  public void setup(OperatorContext context) {
    this.entranceProcessor.onCreate(context.getId());
    if(tuplesLimitPerWindow == 0) {
      tuplesLimitPerWindow = DEFAULT_LIMIT;
    }
  }

  @Override
  public void beginWindow(long windowId) {
    super.beginWindow(windowId);
    numTuples = 0;
  }

  @Override
  public void emitTuples() {
    if (entranceProcessor.hasNext() && numTuples < tuplesLimitPerWindow) {
      outputPort.emit(entranceProcessor.nextEvent());
      numTuples++;
    }
  }

  public long getTuplesLimitPerWindow() {
    return tuplesLimitPerWindow;
  }

  public void setTuplesLimitPerWindow(long tuplesLimitPerWindow) {
    this.tuplesLimitPerWindow = tuplesLimitPerWindow;
  }
}
