/*
* Open Source Physics software is free software as described near the bottom of this code file.
*
* For additional information and documentation on Open Source Physics please see:
* <http://www.opensourcephysics.org/>
*/
package org.opensourcephysics.tools;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import org.opensourcephysics.controls.OSPLog;
/**
* This is a Remote Tool implementation for osp data transfers via RMI.
*
* @author Wolfgang Christian and Doug Brown
* @version 1.0
*/
public class RemoteTool extends UnicastRemoteObject implements Tool {
private static final long serialVersionUID = 1L;
// instance fields
Tool child; // a Tool to handle forwarded jobs
Map<Job, Collection<Tool>> replies = new HashMap<Job, Collection<Tool>>(); // maps job to list of replyTo recipients
Map<Job, Job> jobs = new HashMap<Job, Job>(); // maps RemoteJob to LocalJob
/**
* Constructs a RemoteTool.
*
* @param tool a Tool to handle forwarded jobs
* @throws RemoteException if this cannot be constructed
*/
public RemoteTool(Tool tool) throws RemoteException {
super();
OSPLog.finest("Wrapping tool "+tool.getClass().getName()); //$NON-NLS-1$
child = tool;
}
/**
* Sends a job to this tool.
*
* @param job the job
* @param replyTo the tool interested in the job (may be null)
* @throws RemoteException
*/
public void send(Job job, Tool replyTo) throws RemoteException {
save(job, replyTo);
job = convert(job);
if(child.equals(replyTo)) { // job comes from child, so send replies
sendReplies(job);
} else { // forward job to child
forward(job);
}
}
// ____________________________ private methods _________________________________
/**
* Saves a tool for later replies.
*
* @param job the job
* @param tool the tool interested in the job (may be null)
*/
private void save(Job job, Tool tool) {
if((tool==null)||child.equals(tool)) {
return;
}
Collection<Tool> tools = replies.get(job);
if(tools==null) {
tools = new HashSet<Tool>();
replies.put(job, tools);
}
tools.add(tool);
}
/**
* Replies to tools interested in the specified job.
*
* @param job the job
*/
private void sendReplies(Job job) throws RemoteException {
Collection<?> tools = replies.get(job);
if(tools==null) {
return;
}
Iterator<?> it = tools.iterator();
while(it.hasNext()) {
Tool tool = (Tool) it.next();
tool.send(job, this);
}
}
/**
* Forwards a job to a child.
*
* @param job the job
*/
private void forward(Job job) throws RemoteException {
child.send(job, this);
}
/**
* Wraps a job for forwarding or unwraps it for replies.
*
* @param job the job to be converted
* @return the converted job
*/
private Job convert(Job job) throws RemoteException {
if(job instanceof LocalJob) {
Job remote = new RemoteJob(job);
jobs.put(remote, job);
return remote;
}
Object obj = jobs.get(job);
if(obj==null) {
return job;
}
return(Job) obj;
}
}
/*
* Open Source Physics software is free software; you can redistribute
* it and/or modify it under the terms of the GNU General Public License (GPL) as
* published by the Free Software Foundation; either version 2 of the License,
* or(at your option) any later version.
* Code that uses any portion of the code in the org.opensourcephysics package
* or any subpackage (subdirectory) of this package must must also be be released
* under the GNU GPL license.
*
* This software 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA
* or view the license online at http://www.gnu.org/copyleft/gpl.html
*
* Copyright (c) 2007 The Open Source Physics project
* http://www.opensourcephysics.org
*/