001    /**
002     * ========================================
003     * JFreeReport : a free Java report library
004     * ========================================
005     *
006     * Project Info:  http://reporting.pentaho.org/
007     *
008     * (C) Copyright 2000-2007, by Object Refinery Limited, Pentaho Corporation and Contributors.
009     *
010     * This library is free software; you can redistribute it and/or modify it under the terms
011     * of the GNU Lesser General Public License as published by the Free Software Foundation;
012     * either version 2.1 of the License, or (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015     * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016     * See the GNU Lesser General Public License for more details.
017     *
018     * You should have received a copy of the GNU Lesser General Public License along with this
019     * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020     * Boston, MA 02111-1307, USA.
021     *
022     * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023     * in the United States and other countries.]
024     *
025     * ------------
026     * $Id: FlowControlOperation.java 3525 2007-10-16 11:43:48Z tmorgner $
027     * ------------
028     * (C) Copyright 2000-2005, by Object Refinery Limited.
029     * (C) Copyright 2005-2007, by Pentaho Corporation.
030     */
031    package org.jfree.report.flow;
032    
033    /**
034     * These objects define, how the iteration over the report definition affects
035     * the data source.
036     *
037     * @author Thomas Morgner
038     */
039    public class FlowControlOperation
040    {
041      /**
042       * Stores the current datarow state for a later recall. Markpoints from different
043       * sources can be nested. Marking does not change the user datasource.
044       */
045      public static final FlowControlOperation MARK =
046              new FlowControlOperation("mark");
047      /**
048       * Requests that the datasource should be moved to the next row. An advance
049       * operation does not change the current cursor position. The cursor is not
050       * moved until a 'COMMIT' operation has been reached.
051       *
052       * Repeatable sections will perform an auto-commit based on the group in which
053       * they are in.
054       */
055      public static final FlowControlOperation ADVANCE =
056              new FlowControlOperation("advance");
057      /** Recalls a marked position. */
058      public static final FlowControlOperation RECALL =
059              new FlowControlOperation("recall");
060    
061      /** Do nothing. */
062      public static final FlowControlOperation NO_OP =
063              new FlowControlOperation("no-op");
064    
065      /**
066       * Finishes (and closes) the currently open context. If the last mark has been
067       * closed, the datasource is also closed.
068       * <p/>
069       * If all datasources have been closes, the empty datasource is used. This
070       * datasource cannot be closed (closing has no effect on it).
071       */
072      public static final FlowControlOperation DONE =
073              new FlowControlOperation("done");
074    
075    
076      private final String myName; // for debug only
077    
078      /**
079       * A commit checks for an pending advance request and commites that request
080       * by moving the cursor of the currend datarow forward by one row.
081       */
082      public static final FlowControlOperation COMMIT =
083              new FlowControlOperation("commit");
084    
085      protected FlowControlOperation(final String name)
086      {
087        if (name == null)
088        {
089          throw new NullPointerException();
090        }
091        myName = name;
092      }
093    
094      public String toString()
095      {
096        return myName;
097      }
098    
099      public boolean equals(final Object o)
100      {
101        if (this == o)
102        {
103          return true;
104        }
105        if (o == null || getClass() != o.getClass())
106        {
107          return false;
108        }
109    
110        final FlowControlOperation that = (FlowControlOperation) o;
111    
112        return myName.equals(that.myName);
113      }
114    
115      public int hashCode()
116      {
117        return myName.hashCode();
118      }
119    }