/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.yahoo.labs.samoa.topology.impl;

/*
 * #%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 com.yahoo.labs.samoa.topology.AbstractTopology;

public class SimpleTopology extends AbstractTopology {
  SimpleTopology(String name) {
    super(name);
  }

  public void run() {
    if (this.getEntranceProcessingItems() == null)
      throw new IllegalStateException("You need to set entrance PI before running the topology.");
    if (this.getEntranceProcessingItems().size() != 1)
      throw new IllegalStateException("SimpleTopology supports 1 entrance PI only. Number of entrance PIs is "
          + this.getEntranceProcessingItems().size());

    SimpleEntranceProcessingItem entrancePi = (SimpleEntranceProcessingItem) this.getEntranceProcessingItems()
        .toArray()[0];
    entrancePi.getProcessor().onCreate(0); // id=0 as it is not used in simple mode
    entrancePi.startSendingEvents();
  }
}
