/*
VisAD system for interactive analysis and visualization of numerical
data. Copyright (C) 1996 - 2017 Bill Hibbard, Curtis Rueden, Tom
Rink, Dave Glowacki, Steve Emmerson, Tom Whittaker, Don Murray, and
Tommy Jasmin.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA
$Id: DataNode.java,v 1.14 2009-03-02 23:35:46 curtis Exp $
*/
package visad.data;
import java.rmi.RemoteException;
import visad.Data;
import visad.FlatField;
import visad.TupleIface;
import visad.UnimplementedException;
import visad.VisADException;
/**
* Abstract class for adapting a VisAD data object to the "Visitor"
* design pattern. This class knows how to traverse an arbitrary VisAD
* data object.
*/
public abstract class
DataNode
{
/**
* Construct. Protected to ensure use of the create() factory method.
*/
protected
DataNode()
{
}
/**
* Factory method for creating an instance of the appropriate type.
*
* @param data The VisAD data object to be traversed.
* @return A DataNode that knows how to traverse the VisAD data object.
* @precondition <code>data</code> is non-null.
* @exception UnimplementedException A (soon to be implemented)
* method isn't implemented yet.
*/
public static DataNode
create(Data data)
throws UnimplementedException
{
DataNode node;
/*
* Watch the ordering in the following: the first match will be
* taken.
*/
if (data instanceof TupleIface)
node = new TupleNode((TupleIface)data);
else
if (data instanceof FlatField)
node = new FlatFieldNode((FlatField)data);
else
throw new UnimplementedException(
"VisAD data type not yet supported: " +
data.getClass().getName());
return node;
}
/**
* Accept a visitor and traverse the data object.
*
* @param visitor The object that will have it's <code>visit()</code>
* method called for each subcomponent of the VisAD data
* object.
* @return <code>visitor</code> for convenience.
* @precondition <code>visitor</code> is non-null.
* @postcondition <code>visitor</code> has visited the VisAD data object
* <code>data</code>.
* @exception UnimplementedException A (soon to be implemented)
* method isn't implemented yet.
* @exception BadFormException The VisAD data object doesn't "fit"
* the data model used by <code>visitor</code>.
* @exception VisADException Problem in core VisAD (probably
* couldn't create some VisAD object).
* @exception RemoteException Problem accessing the VisAD data
* object.
* @see visad.data.DataVisitor
*/
public abstract DataVisitor
accept(DataVisitor visitor)
throws UnimplementedException, BadFormException, VisADException,
RemoteException;
}
/**
* Concrete class for traversing a VisAD Tuple.
*/
class
TupleNode
extends DataNode
{
/**
* The VisAD Tuple
*/
protected final TupleIface tuple;
/**
* Construct from a VisAD Tuple.
*
* @param tuple The VisAD Tuple to be traversed.
* @precondition <code>tuple</code> is non-null.
*/
protected
TupleNode(TupleIface tuple)
{
this.tuple = tuple;
}
/**
* Accept a visitor and traverse the Tuple.
*
* @param visitor The object that will have it's <code>visit()</code>
* method called for each component of the VisAD
* Tuple.
* @precondition <code>visitor</code> is non-null.
* @postcondition <code>visitor</code> has visited <code>tuple</code>.
* @exception UnimplementedException A (soon to be implemented)
* method isn't implemented yet.
* @exception BadFormException The VisAD data object doesn't "fit"
* the data model used by <code>visitor</code>.
* @exception VisADException Problem in core VisAD (probably
* couldn't create some VisAD object).
* @see visad.data.DataVisitor
*/
public DataVisitor
accept(DataVisitor visitor)
throws UnimplementedException, BadFormException, VisADException,
RemoteException
{
if (visitor.visit(tuple))
{
int ncomp = tuple.getDimension();
for (int icomp = 0; icomp < ncomp; ++icomp)
DataNode.create(tuple.getComponent(icomp)).accept(visitor);
}
return visitor;
}
}
/**
* Concrete class for traversing a VisAD FlatField.
*/
class
FlatFieldNode
extends DataNode
{
/**
* The VisAD FlatField
*/
protected final FlatField field;
/**
* Construct from a VisAD FlatField.
*
* @param field The VisAD FlatField to be traversed.
* @precondition <code>field</code> is non-null.
*/
protected
FlatFieldNode(FlatField field)
{
this.field = field;
}
/**
* Accept a visitor and traverse the FlatField.
*
* @param visitor The object that will have it's <code>visit()</code>
* method called for each component of the VisAD
* FlatField.
* @precondition <code>visitor</code> is non-null.
* @postcondition <code>visitor</code> has visited <code>field</code>.
* @exception UnimplementedException A (soon to be implemented)
* method isn't implemented yet.
* @exception BadFormException The VisAD data object doesn't "fit"
* the data model used by <code>visitor</code>.
* @exception VisADException Problem in core VisAD (probably
* couldn't create some VisAD object).
* @see visad.data.DataVisitor
*/
public DataVisitor
accept(DataVisitor visitor)
throws UnimplementedException, BadFormException, VisADException,
RemoteException
{
visitor.visit(field);
return visitor;
}
}
// TODO: Add more types of DataNodes.