package com.yahoo.labs.samoa.learners.clusterers;

/*
 * #%L
 * SAMOA
 * %%
 * Copyright (C) 2013 Yahoo! Inc.
 * %%
 * 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 net.jcip.annotations.Immutable;

import com.yahoo.labs.samoa.core.ContentEvent;
import com.yahoo.labs.samoa.instances.Instance;

/**
 * The Class ClusteringContentEvent.
 */
@Immutable
final public class ClusteringContentEvent implements ContentEvent {

  private static final long serialVersionUID = -7746983521296618922L;
  private Instance instance;
  private boolean isLast = false;
  private String key;
  private boolean isSample;

  public ClusteringContentEvent() {
    // Necessary for kryo serializer
  }

  /**
   * Instantiates a new clustering event.
   * 
   * @param index
   *          the index
   * @param instance
   *          the instance
   */
  public ClusteringContentEvent(long index, Instance instance) {
    /*
     * if (instance != null) { this.instance = new
     * SerializableInstance(instance); }
     */
    this.instance = instance;
    this.setKey(Long.toString(index));
  }

  @Override
  public String getKey() {
    return this.key;
  }

  @Override
  public void setKey(String str) {
    this.key = str;
  }

  @Override
  public boolean isLastEvent() {
    return this.isLast;
  }

  public void setLast(boolean isLast) {
    this.isLast = isLast;
  }

  public Instance getInstance() {
    return this.instance;
  }

  public boolean isSample() {
    return isSample;
  }

  public void setSample(boolean b) {
    this.isSample = b;
  }
}
