Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package pt.webdetails.cda.utils;
  
  
  import  org.pentaho.reporting.engine.classic.core.MetaTableModel;
  import  org.pentaho.reporting.engine.classic.core.wizard.DataAttributes;
  import  org.pentaho.reporting.engine.classic.core.wizard.EmptyDataAttributes;
  import  org.pentaho.reporting.libraries.formula.DefaultFormulaContext;
 import  org.pentaho.reporting.libraries.formula.EvaluationException;
 import  org.pentaho.reporting.libraries.formula.Formula;
 import  org.pentaho.reporting.libraries.formula.parser.ParseException;
Todo: Document me!

Date: 08.02.2010 Time: 16:21:28

Author(s):
Thomas Morgner.
 
 public class CalculatedTableModel implements MetaTableModel
 {
   private class DataAccessFormulaContext extends DefaultFormulaContext
   {
     private int rowIndex;
     private boolean[] columnLocks;
 
     private DataAccessFormulaContext(final int rowIndex)
     {
       this. = rowIndex;
       this. = new boolean[.];
     }
 
     public int getRowIndex()
     {
       return ;
     }
 
     public void lock(final int calcColumnIndex)
     {
       if ([calcColumnIndex])
       {
         throw new IllegalStateException("Infinite loop while evaluating a formula");
       }
 
       [calcColumnIndex] = true;
     }
 
     public void unlock(final int calcColumnIndex)
     {
       [calcColumnIndex] = true;
     }
 
     public Object resolveReference(final Object name)
     {
       for (int column = 0; column < getColumnCount(); column++)
       {
         if (getColumnName(column).equals(name))
         {
           return getValueAt(column);
         }
       }
       return null;
     }
   }
 
   private MetaTableModel metaTableModel;
   private TableModel backend;
   private int backendColumnCount;
 
   public CalculatedTableModel(final TableModel backendfinal ColumnDefinition[] calculatedColumns)
   {
     if (backend == null)
     {
       throw new IllegalArgumentException("Attempting to create a calculated table model from null table.");
     }
     if (calculatedColumns == null)
     {
       throw new IllegalArgumentException("Null calculated columns.");
     }
     this. = backend;
     this. = backend.getColumnCount();
     this. = calculatedColumns.clone();
     if (backend instanceof MetaTableModel)
     {
       this. = (MetaTableModel) backend;
     }
   }
 
   public int getRowCount()
   {
     return .getRowCount();
   }
 
   public int getColumnCount()
   {
  }
  public String getColumnName(final int columnIndex)
  {
    if (columnIndex < )
    {
      return .getColumnName(columnIndex);
    }
    final int calculatedColumnIndex = columnIndex - ;
    return [calculatedColumnIndex].getName();
  }
  public Class<?> getColumnClass(final int columnIndex)
  {
    if (columnIndex < )
    {
      return .getColumnClass(columnIndex);
    }
    return Object.class;
  }
  public boolean isCellEditable(final int rowIndexfinal int columnIndex)
  {
    if (columnIndex < )
    {
      return .isCellEditable(rowIndexcolumnIndex);
    }
    return false;
  }
  protected Object getValueInternal(final int columnIndexfinal DataAccessFormulaContext context)
      throws ParseException, EvaluationException
  {
    if (columnIndex < )
    {
      return .getValueAt(context.getRowIndex(), columnIndex);
    }
    final int calcColumnIndex = columnIndex - ;
    try
    {
      context.lock(calcColumnIndex);
      final String formula = [calcColumnIndex].getFormula();
      final String formulaNamespace;
      final String formulaExpression;
      if (formula.length() > 0 && formula.charAt(0) == '=')
      {
        formulaNamespace = "report";
        formulaExpression = formula.substring(1);
      }
      else
      {
        final int separator = formula.indexOf(':');
        if (separator <= 0 || ((separator + 1) == formula.length()))
        {
          // error: invalid formula.
          formulaNamespace = null;
          formulaExpression = null;
        }
        else
        {
          formulaNamespace = formula.substring(0, separator);
          formulaExpression = formula.substring(separator + 1);
        }
      }
      final Formula formulaObject = new Formula(formulaExpression);
      formulaObject.initialize(context);
      return formulaObject.evaluate();
    }
    finally
    {
      context.unlock(calcColumnIndex);
    }
  }
  public Object getValueAt(final int rowIndexfinal int columnIndex)
  {
    if (columnIndex < )
    {
      return .getValueAt(rowIndexcolumnIndex);
    }
    try
    {
      final DataAccessFormulaContext formulaContext = new DataAccessFormulaContext(rowIndex);
      return getValueInternal(columnIndexformulaContext);
    }
    catch (Exception e)
    {
      throw new IllegalStateException(new CalculatedColumnException("Error in calculated column position (" + rowIndex + "," + columnIndex + ");",e));
    }
  }
  public void setValueAt(final Object aValuefinal int rowIndexfinal int columnIndex)
  {
    if (columnIndex < )
    {
      .setValueAt(aValuerowIndexcolumnIndex);
    }
  }
  public void addTableModelListener(final TableModelListener l)
  {
  }
  public void removeTableModelListener(final TableModelListener l)
  {
  }
  public DataAttributes getCellDataAttributes(final int rowfinal int columnIndex)
  {
    if ( == null)
    {
      return EmptyDataAttributes.INSTANCE;
    }
    if (columnIndex < )
    {
      return .getCellDataAttributes(rowcolumnIndex);
    }
    return EmptyDataAttributes.INSTANCE;
  }
  public boolean isCellDataAttributesSupported()
  {
    if ( == null)
    {
      return false;
    }
    return .isCellDataAttributesSupported();
  }
  public DataAttributes getColumnAttributes(final int columnIndex)
  {
    if ( == null)
    {
      return EmptyDataAttributes.INSTANCE;
    }
    if (columnIndex < )
    {
      return .getColumnAttributes(columnIndex);
    }
    return EmptyDataAttributes.INSTANCE;
  }
  public DataAttributes getTableAttributes()
  {
    if ( == null)
    {
      return EmptyDataAttributes.INSTANCE;
    }
    return .getTableAttributes();
  }
New to GrepCode? Check out our FAQ X