// // RemoteClientTupleImpl.java // /* 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.cluster; import visad.*; import java.rmi.*; /** RemoteClientTupleImpl is the class for cluster client VisAD Tuple data objects.<P> */ public class RemoteClientTupleImpl extends RemoteClientDataImpl implements RemoteClientTuple { private Tuple adaptedTuple = null; private DataReferenceImpl adaptedTupleRef = null; private boolean allReal = false; /** must call setupClusterData after constructor to finish the "construction" */ public RemoteClientTupleImpl(Data[] datums) throws VisADException, RemoteException { super(); if (datums == null) { throw new ClusterException("datums cannot be null"); } int n = datums.length; if (n == 0) { throw new ClusterException("datums.length must be > 0"); } allReal = true; for (int i=0; i<n; i++) { if (!(datums[i] instanceof DataImpl || datums[i] instanceof RemoteClientDataImpl)) { throw new ClusterException("datums must be DataImpl " + "or RemoteClientDataImpl"); } if (!(datums[i] instanceof Real)) allReal = false; } if (allReal) { Real[] reals = new Real[n]; for (int i=0; i<n; i++) reals[i] = (Real) datums[i]; adaptedTuple = new RealTuple(reals); } else { adaptedTuple = new Tuple(datums, false); // no copy } // set this as parent for RemoteClientDataImpls boolean any_local = false; for (int i=0; i<n; i++) { if (datums[i] instanceof RemoteClientDataImpl) { ((RemoteClientDataImpl) datums[i]).setParent(this); } else { any_local = true; } } if (any_local) { // hack parent notify logic for non-RemoteClientDataImpl components adaptedTupleRef = new DataReferenceImpl("adaptedTupleRef"); adaptedTupleRef.setData(adaptedTuple); CellImpl adaptedTupleCell = new CellImpl() { public void doAction() throws VisADException, RemoteException { notifyReferences(); } }; adaptedTupleCell.addReference(adaptedTupleRef); } } public MathType getType() throws VisADException, RemoteException { return adaptedTuple.getType(); } public Real[] getRealComponents() throws VisADException, RemoteException { return adaptedTuple.getRealComponents(); } public int getDimension() throws RemoteException { return adaptedTuple.getDimension(); } public Data getComponent(int i) throws VisADException, RemoteException { return adaptedTuple.getComponent(i); } public boolean isMissing() throws RemoteException { return adaptedTuple.isMissing(); } public DataShadow computeRanges(ShadowType type, DataShadow shadow) throws VisADException, RemoteException { return adaptedTuple.computeRanges(type, shadow); } public DataShadow computeRanges(ShadowType type, int n) throws VisADException, RemoteException { return adaptedTuple.computeRanges(type, n); } public double[][] computeRanges(RealType[] reals) throws VisADException, RemoteException { return adaptedTuple.computeRanges(reals); } public Data adjustSamplingError(Data error, int error_mode) throws VisADException, RemoteException { return adaptedTuple.adjustSamplingError(error, error_mode); } public String longString() throws VisADException, RemoteException { return longString(""); } public String longString(String pre) throws VisADException, RemoteException { return pre + "RemoteClientTupleImpl"; } }