// // RemoteNodeTupleImpl.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.*; /** RemoteNodeTupleImpl is the class for cluster client VisAD Tuple data objects.<P> */ public class RemoteNodeTupleImpl extends RemoteNodeDataImpl implements RemoteNodeTuple { private Tuple adaptedTuple = null; private DataReferenceImpl adaptedTupleRef = null; /** must call setupClusterData after constructor to finish the "construction" */ public RemoteNodeTupleImpl(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"); } for (int i=0; i<n; i++) { if (!(datums[i] instanceof DataImpl || datums[i] instanceof RemoteNodeDataImpl)) { throw new ClusterException("datums must be DataImpl " + "or RemoteNodeDataImpl"); } } adaptedTuple = new Tuple(datums, false); // no copy // set this as parent for RemoteNodeDataImpls boolean any_local = false; for (int i=0; i<n; i++) { if (datums[i] instanceof RemoteNodeDataImpl) { ((RemoteNodeDataImpl) datums[i]).setParent(this); } else { any_local = true; } } if (any_local) { // hack parent notify logic for non-RemoteNodeDataImpl 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 + "RemoteNodeTupleImpl"; } }