package net.sf.jasperreports.engine.base;

import java.io.Serializable;
import net.sf.jasperreports.engine.JRDatasetRun;
import net.sf.jasperreports.engine.JRElementDataset;
import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JRGroup;
import net.sf.jasperreports.engine.JRRuntimeException;

public abstract class JRBaseElementDataset implements JRElementDataset, Serializable {
  private static final long serialVersionUID = 10200L;
  
  protected byte resetType = 1;
  
  protected byte incrementType = 5;
  
  protected JRGroup resetGroup = null;
  
  protected JRGroup incrementGroup = null;
  
  protected JRDatasetRun datasetRun;
  
  protected JRExpression incrementWhenExpression;
  
  protected JRBaseElementDataset() {}
  
  protected JRBaseElementDataset(JRElementDataset dataset) {
    if (dataset != null) {
      this.resetType = dataset.getResetType();
      this.incrementType = dataset.getIncrementType();
      this.resetGroup = dataset.getResetGroup();
      this.incrementGroup = dataset.getIncrementGroup();
      this.datasetRun = dataset.getDatasetRun();
      this.incrementWhenExpression = dataset.getIncrementWhenExpression();
    } 
  }
  
  protected JRBaseElementDataset(JRElementDataset dataset, JRBaseObjectFactory factory) {
    factory.put(dataset, this);
    this.resetType = dataset.getResetType();
    this.incrementType = dataset.getIncrementType();
    this.resetGroup = factory.getGroup(dataset.getResetGroup());
    this.incrementGroup = factory.getGroup(dataset.getIncrementGroup());
    this.datasetRun = factory.getDatasetRun(dataset.getDatasetRun());
    this.incrementWhenExpression = factory.getExpression(dataset.getIncrementWhenExpression());
  }
  
  public byte getResetType() {
    return this.resetType;
  }
  
  public byte getIncrementType() {
    return this.incrementType;
  }
  
  public JRGroup getResetGroup() {
    return this.resetGroup;
  }
  
  public JRGroup getIncrementGroup() {
    return this.incrementGroup;
  }
  
  public JRDatasetRun getDatasetRun() {
    return this.datasetRun;
  }
  
  public JRExpression getIncrementWhenExpression() {
    return this.incrementWhenExpression;
  }
  
  public Object clone() {
    JRBaseElementDataset clone = null;
    try {
      clone = (JRBaseElementDataset)super.clone();
    } catch (CloneNotSupportedException e) {
      throw new JRRuntimeException(e);
    } 
    if (this.incrementWhenExpression != null)
      clone.incrementWhenExpression = (JRExpression)this.incrementWhenExpression.clone(); 
    if (this.datasetRun != null)
      clone.datasetRun = (JRDatasetRun)this.datasetRun.clone(); 
    return clone;
  }
}
