package com.yahoo.labs.samoa.examples;

/*
 * #%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 java.util.Random;

import com.yahoo.labs.samoa.core.ContentEvent;
import com.yahoo.labs.samoa.core.EntranceProcessor;
import com.yahoo.labs.samoa.core.Processor;

/**
 * Example {@link EntranceProcessor} that generates a stream of random integers.
 */
public class HelloWorldSourceProcessor implements EntranceProcessor {

  private static final long serialVersionUID = 6212296305865604747L;
  private Random rnd;
  private final long maxInst;
  private long count;

  public HelloWorldSourceProcessor(long maxInst) {
    this.maxInst = maxInst;
  }

  @Override
  public boolean process(ContentEvent event) {
    // do nothing, API will be refined further
    return false;
  }

  @Override
  public void onCreate(int id) {
    rnd = new Random(id);
  }

  @Override
  public Processor newProcessor(Processor p) {
    HelloWorldSourceProcessor hwsp = (HelloWorldSourceProcessor) p;
    return new HelloWorldSourceProcessor(hwsp.maxInst);
  }

  @Override
  public boolean isFinished() {
    return count >= maxInst;
  }

  @Override
  public boolean hasNext() {
    return count < maxInst;
  }

  @Override
  public ContentEvent nextEvent() {
    count++;
    return new HelloWorldContentEvent(rnd.nextInt(), false);
  }
}
