/*
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
*/
package visad.data;
import visad.*;
public abstract class BaseDataProcessor
implements DataProcessor
{
/**
* Write the <tt>Data</tt> object using the most appropriate
* {@link visad.data.DataProcessor DataProcessor} method.
*/
public void process(DataImpl di, Object token)
throws VisADException
{
MathType mt = di.getType();
boolean done = false;
if (mt instanceof ScalarType) {
try {
if (mt instanceof TextType) {
Text t = (Text )di;
processText((TextType )t.getType(), t.getValue(), t.isMissing(), t,
token);
done = true;
} else if (mt instanceof RealType) {
Real r = (Real )di;
processReal((RealType )r.getType(), r.getValue(), r.getUnit(),
r.getError(), r, token);
done = true;
}
} catch (UnimplementedException ue) {
}
} else if (mt instanceof TupleType) {
TupleType tt = (TupleType )mt;
Tuple ti = (Tuple )di;
Data[] comps = ti.getComponents();
if (tt instanceof RealTupleType) {
RealTuple rti = (RealTuple )ti;
RealTupleType rtt = (RealTupleType )tt;
if (comps != null) {
Real[] reals = new Real[comps.length];
for (int i = 0; i < comps.length; i++) {
reals[i] = (Real )comps[i];
}
try {
processRealTuple(rtt, reals, rti.getCoordinateSystem(), rti,
token);
done = true;
} catch (UnimplementedException ue) {
}
}
}
if (!done) {
try {
processTuple(tt, comps, ti, token);
done = true;
} catch (UnimplementedException ue) {
}
}
} else if (mt instanceof SetType) {
SetType st = (SetType )mt;
try {
if (di instanceof SampledSet) {
processSampledSet(st, (SampledSet )di, token);
done = true;
} else if (di instanceof SimpleSet) {
processSimpleSet(st, (SimpleSet )di, token);
done = true;
}
} catch (UnimplementedException ue) {
}
} else if (mt instanceof FunctionType) {
FunctionType ft = (FunctionType )mt;
try {
if (di instanceof FlatField) {
FlatField ff = (FlatField )di;
CoordinateSystem cs = null;
CoordinateSystem[] rangeCS = null;
if (ft.getReal()) {
cs = ff.getRangeCoordinateSystem()[0];
} else {
MathType rt = ft.getRange();
final int dim = ((TupleType )ft.getRange()).getDimension();
rangeCS = new CoordinateSystem[dim];
for (int i = 0; i < dim; i++) {
rangeCS[i] = ff.getRangeCoordinateSystem(i)[0];
}
}
processFlatField(ft, ff.getDomainSet(), cs, rangeCS,
ff.getRangeSets(), ff.getDefaultRangeUnits(), ff,
token);
done = true;
} else if (di instanceof FieldImpl) {
FieldImpl fi = (FieldImpl )di;
processFieldImpl(ft, fi.getDomainSet(), fi, token);
done = true;
}
} catch (UnimplementedException ue) {
}
}
if (!done) {
try {
processUnknownData(di, token);
} catch (UnimplementedException ue) {
throw new UnimplementedException("Couldn't process " +
di.getClass().getName() +
" in " + getClass().getName());
}
}
}
public abstract void processDoubleSet(SetType type, CoordinateSystem cs,
Unit[] units, DoubleSet set,
Object token)
throws VisADException;
public abstract void processFieldImpl(FunctionType type, Set set,
FieldImpl fld, Object token)
throws VisADException;
public abstract void processFlatField(FunctionType type, Set domainSet,
CoordinateSystem cs,
CoordinateSystem[] rangeCS,
Set[] rangeSets, Unit[] units,
FlatField fld, Object token)
throws VisADException;
public abstract void processFloatSet(SetType type, CoordinateSystem cs,
Unit[] units, FloatSet set,
Object token)
throws VisADException;
public abstract void processGridded1DDoubleSet(SetType type,
double[][] samples,
int[] lengths,
CoordinateSystem cs,
Unit[] units,
ErrorEstimate[] errors,
Gridded1DDoubleSet set,
Object token)
throws VisADException;
public abstract void processGridded2DDoubleSet(SetType type,
double[][] samples,
int[] lengths,
CoordinateSystem cs,
Unit[] units,
ErrorEstimate[] errors,
Gridded2DDoubleSet set,
Object token)
throws VisADException;
public abstract void processGridded3DDoubleSet(SetType type,
double[][] samples,
int[] lengths,
CoordinateSystem cs,
Unit[] units,
ErrorEstimate[] errors,
Gridded3DDoubleSet set,
Object token)
throws VisADException;
public abstract void processGridded1DSet(SetType type, float[][] samples,
int[] lengths, CoordinateSystem cs,
Unit[] units,
ErrorEstimate[] errors,
Gridded1DSet set, Object token)
throws VisADException;
private void processGridded1DSet(SetType st, Gridded1DSet set, Object token)
throws VisADException
{
int[] lengths = set.getLengths();
CoordinateSystem cs = set.getCoordinateSystem();
Unit[] units = set.getSetUnits();
ErrorEstimate[] errors = set.getSetErrors();
boolean done = false;
try {
if (set instanceof Gridded1DDoubleSet) {
Gridded1DDoubleSet dset = (Gridded1DDoubleSet )set;
processGridded1DDoubleSet(st, dset.getDoubles(), lengths, cs, units,
errors, dset, token);
done = true;
} else if (set instanceof Integer1DSet) {
processInteger1DSet(st, lengths, cs, units, errors,
(Integer1DSet )set, token);
done = true;
} else if (set instanceof Linear1DSet) {
Linear1DSet lset = (Linear1DSet )set;
double[] firsts = new double[] { lset.getFirst() };
double[] lasts = new double[] { lset.getLast() };
processLinear1DSet(st, firsts, lasts, lengths, cs, units, errors,
lset, token);
done = true;
}
} catch (UnimplementedException ue) {
}
if (!done) {
processGridded1DSet(st, set.getSamples(), set.getLengths(),
set.getCoordinateSystem(), set.getSetUnits(),
set.getSetErrors(), set, token);
}
}
public abstract void processGridded2DSet(SetType type, float[][] samples,
int[] lengths, CoordinateSystem cs,
Unit[] units,
ErrorEstimate[] errors,
Gridded2DSet set, Object token)
throws VisADException;
private void processGridded2DSet(SetType st, Gridded2DSet set, Object token)
throws VisADException
{
int[] lengths = set.getLengths();
CoordinateSystem cs = set.getCoordinateSystem();
Unit[] units = set.getSetUnits();
ErrorEstimate[] errors = set.getSetErrors();
boolean done = false;
try {
if (set instanceof Gridded2DDoubleSet) {
Gridded2DDoubleSet dset = (Gridded2DDoubleSet )set;
processGridded2DDoubleSet(st, dset.getDoubles(), lengths, cs, units,
errors, dset, token);
done = true;
} else if (set instanceof Integer2DSet) {
processInteger2DSet(st, lengths, cs, units, errors,
(Integer2DSet )set, token);
done = true;
} else if (set instanceof Linear2DSet) {
Linear2DSet lset = (Linear2DSet )set;
double[] firsts = new double[2];
double[] lasts = new double[2];
for (int i = 0; i < 2; i++) {
Linear1DSet tmpSet = lset.getLinear1DComponent(i);
firsts[i] = tmpSet.getFirst();
lasts[i] = tmpSet.getLast();
}
if (lset instanceof LinearLatLonSet) {
processLinearLatLonSet(st, firsts, lasts, lengths, cs, units,
errors, (LinearLatLonSet )lset, token);
} else {
processLinear2DSet(st, firsts, lasts, lengths, cs, units, errors,
lset, token);
}
done = true;
}
} catch (UnimplementedException ue) {
}
if (!done) {
processGridded2DSet(st, set.getSamples(), set.getLengths(),
set.getCoordinateSystem(), set.getSetUnits(),
set.getSetErrors(), set, token);
}
}
public abstract void processGridded3DSet(SetType type, float[][] samples,
int[] lengths, CoordinateSystem cs,
Unit[] units,
ErrorEstimate[] errors,
Gridded3DSet set, Object token)
throws VisADException;
private void processGridded3DSet(SetType st, Gridded3DSet set, Object token)
throws VisADException
{
int[] lengths = set.getLengths();
CoordinateSystem cs = set.getCoordinateSystem();
Unit[] units = set.getSetUnits();
ErrorEstimate[] errors = set.getSetErrors();
boolean done = false;
try {
if (set instanceof Gridded3DDoubleSet) {
Gridded3DDoubleSet dset = (Gridded3DDoubleSet )set;
processGridded3DDoubleSet(st, dset.getDoubles(), lengths, cs, units,
errors, dset, token);
done = true;
} else if (set instanceof Integer3DSet) {
processInteger3DSet(st, lengths, cs, units, errors,
(Integer3DSet )set, token);
done = true;
} else if (set instanceof Linear3DSet) {
Linear3DSet lset = (Linear3DSet )set;
double[] firsts = new double[3];
double[] lasts = new double[3];
for (int i = 0; i < 3; i++) {
Linear1DSet tmpSet = lset.getLinear1DComponent(i);
firsts[i] = tmpSet.getFirst();
lasts[i] = tmpSet.getLast();
}
processLinear3DSet(st, firsts, lasts, lengths, cs, units, errors,
lset, token);
done = true;
}
} catch (UnimplementedException ue) {
}
if (!done) {
processGridded3DSet(st, set.getSamples(), set.getLengths(),
set.getCoordinateSystem(), set.getSetUnits(),
set.getSetErrors(), set, token);
}
}
public abstract void processGriddedSet(SetType type, float[][] samples,
int[] lengths, CoordinateSystem cs,
Unit[] units, ErrorEstimate[] errors,
GriddedSet set, Object token)
throws VisADException;
private void processGriddedSet(SetType st, GriddedSet set, Object token)
throws VisADException
{
boolean done = false;
try {
if (set instanceof Gridded1DSet) {
processGridded1DSet(st, (Gridded1DSet )set, token);
done = true;
} else if (set instanceof Gridded2DSet) {
processGridded2DSet(st, (Gridded2DSet )set, token);
done = true;
} else if (set instanceof Gridded3DSet) {
processGridded3DSet(st, (Gridded3DSet )set, token);
done = true;
} else if (set instanceof LinearNDSet) {
processLinearNDSet(st, (LinearNDSet )set, token);
done = true;
}
} catch (UnimplementedException ue) {
}
if (!done) {
processGriddedSet(st, set.getSamples(), set.getLengths(),
set.getCoordinateSystem(), set.getSetUnits(),
set.getSetErrors(), set, token);
}
}
public abstract void processInteger1DSet(SetType type, int[] lengths,
CoordinateSystem cs, Unit[] units,
ErrorEstimate[] errors,
Integer1DSet set, Object token)
throws VisADException;
public abstract void processInteger2DSet(SetType type, int[] lengths,
CoordinateSystem cs, Unit[] units,
ErrorEstimate[] errors,
Integer2DSet set, Object token)
throws VisADException;
public abstract void processInteger3DSet(SetType type, int[] lengths,
CoordinateSystem cs, Unit[] units,
ErrorEstimate[] errors,
Integer3DSet set, Object token)
throws VisADException;
public abstract void processIntegerNDSet(SetType type, int[] lengths,
CoordinateSystem cs, Unit[] units,
ErrorEstimate[] errors,
IntegerNDSet set, Object token)
throws VisADException;
public abstract void processIrregular1DSet(SetType type, float[][] samples,
CoordinateSystem cs,
Unit[] units,
ErrorEstimate[] errors,
Irregular1DSet set, Object token)
throws VisADException;
public abstract void processIrregular2DSet(SetType type, float[][] samples,
CoordinateSystem cs,
Unit[] units,
ErrorEstimate[] errors,
Delaunay delaunay,
Irregular2DSet set, Object token)
throws VisADException;
public abstract void processIrregular3DSet(SetType type, float[][] samples,
CoordinateSystem cs,
Unit[] units,
ErrorEstimate[] errors,
Delaunay delaunay,
Irregular3DSet set, Object token)
throws VisADException;
public abstract void processIrregularSet(SetType type, float[][] samples,
CoordinateSystem cs, Unit[] units,
ErrorEstimate[] errors,
Delaunay delaunay,
IrregularSet set, Object token)
throws VisADException;
private void processIrregularSet(SetType st, IrregularSet set, Object token)
throws VisADException
{
float[][] samples = set.getSamples();
CoordinateSystem cs = set.getCoordinateSystem();
Unit[] units = set.getSetUnits();
ErrorEstimate[] errors = set.getSetErrors();
boolean done = false;
try {
if (set instanceof Irregular1DSet) {
processIrregular1DSet(st, samples, cs, units, errors,
(Irregular1DSet )set, token);
done = true;
} else if (set instanceof Irregular2DSet) {
processIrregular2DSet(st, samples, cs, units, errors, set.Delan,
(Irregular2DSet )set, token);
done = true;
} else if (set instanceof Irregular3DSet) {
processIrregular3DSet(st, samples, cs, units, errors, set.Delan,
(Irregular3DSet )set, token);
done = true;
}
} catch (UnimplementedException ue) {
}
if (!done) {
processIrregularSet(st, samples, cs, units, errors, set.Delan, set,
token);
}
}
public abstract void processLinear1DSet(SetType type, double[] firsts,
double[] lasts, int[] lengths,
CoordinateSystem cs, Unit[] units,
ErrorEstimate[] errors,
Linear1DSet set, Object token)
throws VisADException;
public void processLinear1DSet(SetType st, Linear1DSet set, Object token)
throws VisADException
{
processLinear1DSet(st, new double[] { set.getFirst() },
new double[] { set.getLast() }, set.getLengths(),
set.getCoordinateSystem(), set.getSetUnits(),
set.getSetErrors(), set, token);
}
public abstract void processLinear2DSet(SetType type, double[] firsts,
double[] lasts, int[] lengths,
CoordinateSystem cs, Unit[] units,
ErrorEstimate[] errors,
Linear2DSet set, Object token)
throws VisADException;
public abstract void processLinear3DSet(SetType type, double[] firsts,
double[] lasts, int[] lengths,
CoordinateSystem cs, Unit[] units,
ErrorEstimate[] errors,
Linear3DSet set, Object token)
throws VisADException;
public abstract void processLinearLatLonSet(SetType type, double[] firsts,
double[] lasts, int[] lengths,
CoordinateSystem cs,
Unit[] units,
ErrorEstimate[] errors,
LinearLatLonSet set,
Object token)
throws VisADException;
public abstract void processLinearNDSet(SetType type, double[] firsts,
double[] lasts, int[] lengths,
CoordinateSystem cs, Unit[] units,
ErrorEstimate[] errors,
LinearNDSet set, Object token)
throws VisADException;
private void processLinearNDSet(SetType st, LinearNDSet set, Object token)
throws VisADException
{
boolean done = false;
try {
if (set instanceof IntegerNDSet) {
processIntegerNDSet(st, set.getLengths(), set.getCoordinateSystem(),
set.getSetUnits(), set.getSetErrors(),
(IntegerNDSet )set, token);
done = true;
}
} catch (UnimplementedException ue) {
}
if (!done) {
processLinearNDSet(st, set.getFirsts(), set.getLasts(),
set.getLengths(), set.getCoordinateSystem(),
set.getSetUnits(), set.getSetErrors(), set, token);
}
}
public abstract void processList1DSet(SetType type, float[] list,
CoordinateSystem cs, Unit[] units,
List1DSet set, Object token)
throws VisADException;
public abstract void processProductSet(SetType type, SampledSet[] sets,
CoordinateSystem cs, Unit[] units,
ErrorEstimate[] errors,
ProductSet set, Object token)
throws VisADException;
public abstract void processReal(RealType type, double value, Unit unit,
ErrorEstimate error, Real real,
Object token)
throws VisADException;
public abstract void processRealTuple(RealTupleType type, Real[] components,
CoordinateSystem cs, RealTuple rt,
Object token)
throws VisADException;
public abstract void processSampledSet(SetType st, int manifold_dimension,
CoordinateSystem cs, Unit[] units,
ErrorEstimate[] errors,
SampledSet set, Object token)
throws VisADException;
private void processSampledSet(SetType st, SampledSet set, Object token)
throws VisADException
{
boolean done = false;
try {
if (set instanceof GriddedSet) {
processGriddedSet(st, (GriddedSet )set, token);
done = true;
} else if (set instanceof IrregularSet) {
processIrregularSet(st, (IrregularSet )set, token);
done = true;
} else if (set instanceof ProductSet) {
ProductSet ps = (ProductSet )set;
processProductSet(st, ps.getSets(), ps.getCoordinateSystem(),
ps.getSetUnits(), ps.getSetErrors(), ps, token);
done = true;
} else if (set instanceof SingletonSet) {
SingletonSet ss = (SingletonSet )set;
processSingletonSet(ss.getData(), ss.getCoordinateSystem(),
ss.getSetUnits(), ss.getSetErrors(), ss, token);
done = true;
} else if (set instanceof UnionSet) {
UnionSet us = (UnionSet )set;
processUnionSet(st, us.getSets(), us, token);
done = true;
}
} catch (UnimplementedException ue) {
}
if (!done) {
processSampledSet(st, set.getManifoldDimension(),
set.getCoordinateSystem(), set.getSetUnits(),
set.getSetErrors(), set, token);
}
}
public abstract void processSimpleSet(SetType st, int manifold_dimension,
CoordinateSystem cs, Unit[] units,
ErrorEstimate[] errors, SimpleSet set,
Object token)
throws VisADException;
private void processSimpleSet(SetType st, SimpleSet set, Object token)
throws VisADException
{
boolean done = false;
try {
if (set instanceof DoubleSet) {
DoubleSet ds = (DoubleSet )set;
processDoubleSet(st, ds.getCoordinateSystem(), ds.getSetUnits(), ds,
token);
done = true;
} else if (set instanceof FloatSet) {
FloatSet fs = (FloatSet )set;
processFloatSet(st, fs.getCoordinateSystem(), fs.getSetUnits(), fs,
token);
done = true;
} else if (set instanceof List1DSet) {
List1DSet ls = (List1DSet )set;
float[][] samples = ls.getSamples();
processList1DSet(st, samples[0], ls.getCoordinateSystem(),
ls.getSetUnits(), ls, token);
done = true;
}
} catch (UnimplementedException ue) {
}
if (!done) {
processSimpleSet(st, set.getManifoldDimension(),
set.getCoordinateSystem(), set.getSetUnits(),
set.getSetErrors(), set, token);
}
}
public abstract void processSingletonSet(RealTuple sample,
CoordinateSystem cs, Unit[] units,
ErrorEstimate[] errors,
SingletonSet set, Object token)
throws VisADException;
public abstract void processText(TextType type, String value,
boolean missing, Text text, Object token)
throws VisADException;
public abstract void processTuple(TupleType type, Data[] components, Tuple t,
Object token)
throws VisADException;
public abstract void processUnionSet(SetType type, SampledSet[] sets,
UnionSet set, Object token)
throws VisADException;
public abstract void processUnknownData(DataImpl data, Object token)
throws VisADException;
}