Package org.pentaho.reporting.libraries.formula.typing.sequence

Source Code of org.pentaho.reporting.libraries.formula.typing.sequence.RecursiveSequence

package org.pentaho.reporting.libraries.formula.typing.sequence;

import java.util.Collection;
import java.util.LinkedList;

import org.pentaho.reporting.libraries.formula.EvaluationException;
import org.pentaho.reporting.libraries.formula.FormulaContext;
import org.pentaho.reporting.libraries.formula.LibFormulaErrorValue;
import org.pentaho.reporting.libraries.formula.lvalues.LValue;
import org.pentaho.reporting.libraries.formula.typing.ArrayCallback;
import org.pentaho.reporting.libraries.formula.typing.Sequence;

public class RecursiveSequence implements Sequence
{
  private LinkedList<Object> stack;
  private FormulaContext context;

  public RecursiveSequence(final Object object,
                           final FormulaContext context)
  {
    this.context = context;
    this.stack = new LinkedList<Object>();
    this.stack.push(object);
  }

  public boolean hasNext() throws EvaluationException
  {
    if (stack.isEmpty())
    {
      return false;
    }
    final Object o = stack.pop();
    if (o instanceof Object[])
    {
      final Object[] array = (Object[]) o;
      final RawArraySequence s = new RawArraySequence(array);
      stack.push(s);
      return hasNext();
    }
    else if (o instanceof Collection)
    {
      final Collection array = (Collection) o;
      final RawArraySequence s = new RawArraySequence(array);
      stack.push(s);
      return hasNext();
    }
    else if (o instanceof ArrayCallback)
    {
      final ArrayCallback array = (ArrayCallback) o;
      final AnySequence s = new AnySequence(array, context);
      stack.push(s);
      return hasNext();
    }
    else if (o instanceof Sequence)
    {
      final Sequence s = (Sequence) o;
      if (s.hasNext())
      {
        final Object object = s.next();
        stack.push(s);
        stack.push(object);
      }
      return hasNext();
    }

    stack.push(o);
    return true;
  }

  public Object next() throws EvaluationException
  {
    final Object o = stack.pop();
    if (o instanceof Sequence)
    {
      final Sequence sequence = (Sequence) o;
      return sequence.next();
    }
    return (o);
  }

  public LValue nextRawValue() throws EvaluationException
  {
    throw EvaluationException.getInstance(LibFormulaErrorValue.ERROR_UNEXPECTED_VALUE);
  }
}
TOP

Related Classes of org.pentaho.reporting.libraries.formula.typing.sequence.RecursiveSequence

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.