/*
* org.openmicroscopy.shoola.env.data.views.BatchCall
*
*------------------------------------------------------------------------------
* Copyright (C) 2006 University of Dundee. All rights reserved.
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*------------------------------------------------------------------------------
*/
package org.openmicroscopy.shoola.env.data.views;
//Java imports
//Third-party libraries
//Application-internal dependencies
import org.openmicroscopy.shoola.util.concur.tasks.MultiStepTask;
/**
* An asynchronous call to the data services.
* These kind of calls are usually aggregated in a {@link BatchCallTree} in
* order to perform multiple operations on (possibly) large portions of a
* view's data model in the background.
* <p>This class defines a component interface that allows for composition.
* Leaf <code>BatchCall</code>s can be composed into {@link CompositeBatchCall}s
* which, in turn, make up the internal nodes of a {@link BatchCallTree}.</p>
* <p>A leaf <code>BatchCall</code> is a concrete subclass that overrides the
* {@link #doCall() doCall} method to carry out some operation on the data
* services. Because we use the <code>util.concur</code> packages for
* asynchronous execution, asynchronous calls have to implement the
* {@link MultiStepTask} interface. So this class also works as an adapter to
* map said interface onto the {@link #doCall() doCall} method. For this reason
* , subclasses can decide to override the methods from {@link MultiStepTask} if
* they need to take advantage of the extra flexibility offered by the
* {@link MultiStepTask} interface.</p>
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @author <br>Andrea Falconi
* <a href="mailto:a.falconi@dundee.ac.uk">
* a.falconi@dundee.ac.uk</a>
* @version 2.2
* <small>
* (<b>Internal version:</b> $Revision$ $Date$)
* </small>
* @since OME2.2
*/
public abstract class BatchCall
implements MultiStepTask
{
/** A textual description of what this call does. */
private String description;
/**
* Tells whether or not this call has been completely performed.
* Latches to <code>true</code> after the first call to {@link #doStep()}
* which, in turns, invokes {@link #doCall()}. If a subclass decides
* to implement the {@link MultiStepTask} interface, this semantics is
* likely to require changes.
*/
protected boolean done;
/**
* Creates a new instance with no textual description.
*/
protected BatchCall() {}
/**
* Creates a new instance with the specified textual description.
*
* @param description A textual description of what this call does.
*/
protected BatchCall(String description) { this.description = description; }
/**
* Returns a textual description of what this call does.
*
* @return See above.
*/
String getDescription() { return description; }
/**
* Sets the call's description.
* This is a textual description of what this call does.
*
* @param d The description.
*/
void setDescription(String d) { description = d; }
/**
* Counts the children calls, if any.
* This method is for the benefit of {@link CompositeBatchCall} which
* overrides it to return the count of its children.
* A leaf <code>BatchCall</code> has to return <code>1</code> and so
* doesn't need to override this method.
*
* @return <code>1</code>.
*/
int countCalls() { return 1; }
/**
* Returns the leaf call that is currently processed by the execution
* algorithm visiting the call tree.
* This method is for the benefit of {@link CompositeBatchCall} which
* overrides it to return the currently processed child.
* A leaf <code>BatchCall</code> has to return <code>this</code> and so
* doesn't need to override this method.
*
* @return <code>this</code>.
*/
BatchCall getCurCall() { return this; }
/**
* A leaf <code>BatchCall</code> overrides this method to carry out
* some operation on the data services.
*
* @throws Exception If an error occurs.
*/
public void doCall() throws Exception {}
/**
* Forwards the call to the {@link #doCall() doCall} method.
* @see MultiStepTask#doStep()
*/
public Object doStep()
throws Exception
{
if (!done) doCall();
done = true;
return null;
}
/**
* Tells whether or not the {@link #doStep() doStep} method has been
* invoked.
* @see MultiStepTask#isDone()
*/
public boolean isDone() { return done; }
}