//
// RemoteProxyAgentImpl.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.util.Vector;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.io.Serializable;
/**
RemoteProxyAgentImpl is the class for agents on proxy clients
*/
public class RemoteProxyAgentImpl extends UnicastRemoteObject
implements RemoteProxyAgent {
private RemoteClientDataImpl rcdi = null;
private boolean sent_node_agents = false;
private RemoteClientAgentImpl[] agents = null;
private RemoteClientAgentImpl focus_agent = null;
private RemoteAgentContact[] contacts = null;
private int[] resolutions = null;
private ConstantMap[] cmaps = null;
private ScalarMap[] maps = null;
private Control[] controls = null;
public RemoteProxyAgentImpl(RemoteClientDataImpl r) throws RemoteException {
rcdi = r;
}
public RemoteClientData getRemoteClientData() throws RemoteException {
return rcdi;
}
public void setResolutions(int[] rs) {
if (rs == null) return;
int n = rs.length;
resolutions = new int[n];
for (int i=0; i<n; i++) resolutions[i] = rs[i];
}
public Serializable[] prepareAction(boolean go, boolean initialize,
DataShadow shadow, ConstantMap[] cms,
ScalarMap[] ms, Control[] cos,
String name, long time_out)
throws VisADException, RemoteException {
cmaps = cms;
maps = ms;
controls = cos;
if (!sent_node_agents) {
// send agents to nodes if data changed
focus_agent = new RemoteClientAgentImpl(null, -1, time_out);
RemoteClusterData[] jvmTable = rcdi.getTable();
int nagents = jvmTable.length - 1;
agents = new RemoteClientAgentImpl[nagents];
contacts = new RemoteAgentContact[nagents];
for (int i=0; i<nagents; i++) {
agents[i] = new RemoteClientAgentImpl(focus_agent, i);
DefaultNodeRendererAgent node_agent =
new DefaultNodeRendererAgent(agents[i], name, cmaps);
contacts[i] = ((RemoteNodeData) jvmTable[i]).sendAgent(node_agent);
}
sent_node_agents = true;
}
Vector message = new Vector();
for (int i=0; i<maps.length; i++) {
message.addElement(maps[i]);
message.addElement(controls[i]);
}
Serializable[] responses =
focus_agent.broadcastWithResponses(message, contacts); // PROXY
// System.out.println("RemoteProxyAgentImpl.prepareAction messages received");
return responses;
}
public Serializable[] doTransform() throws VisADException, RemoteException {
if (rcdi == null) {
throw new DisplayException("Data is null");
}
int n = contacts.length;
Vector[] messages = new Vector[n];
if (resolutions == null || resolutions.length != n) {
resolutions = new int[n];
for (int i=0; i<n; i++) resolutions[i] = 1;
}
for (int i=0; i<n; i++) {
// String message = "transform";
messages[i] = new Vector();
messages[i].addElement("transform");
messages[i].addElement(new Integer(resolutions[i]));
int m = maps.length;
for (int j=0; j<m; j++) {
messages[i].addElement(maps[j]);
}
}
// responses are VisADGroups
Serializable[] responses =
focus_agent.broadcastWithResponses(messages, contacts);
// System.out.println("ProxyRendererJ3D.doTransform messages received");
return responses;
}
public Serializable[] computeRanges(Vector message)
throws VisADException, RemoteException {
Serializable[] responses =
focus_agent.broadcastWithResponses(message, contacts);
// System.out.println("RemoteProxyAgentImpl.computeRanges messages received");
return responses;
}
}