/*
* 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.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import org.opensourcephysics.controls.XMLControl;
import org.opensourcephysics.controls.XMLControlElement;
/**
* This manages jobs and their associated objects and replies.
*
* @author Wolfgang Christian and Doug Brown
* @version 1.0
*/
public class JobManager {
// instance fields
Tool localTool; // the tool using this manager
Map<Job, Collection<Tool>> replies = new HashMap<Job, Collection<Tool>>(); // maps job to set of replyTo recipients
Map<Job, Collection<Object>> objects = new HashMap<Job, Collection<Object>>(); // maps job to set of objects
/**
* Constructs a job manager for a specified tool.
*
* @param tool the tool
*/
public JobManager(Tool tool) {
localTool = tool;
}
/**
* Logs a job and tool into the manager.
*
* @param job the job
* @param tool a tool interested in the job
*/
public void log(Job job, Tool tool) {
if(tool==null) {
return;
}
Collection<Tool> tools = replies.get(job);
if(tools==null) {
tools = new HashSet<Tool>();
replies.put(job, tools);
}
tools.add(tool);
}
/**
* Associates a job with the specified object.
*
* @param job the job
* @param obj the object
*/
public void associate(Job job, Object obj) {
if(obj==null) {
return;
}
Collection<Object> tags = objects.get(job);
if(tags==null) {
tags = new HashSet<Object>();
objects.put(job, tags);
}
tags.add(obj);
}
/**
* Gets the jobs associated with the specified object.
*
* @param obj the object
* @return an array of Jobs
*/
public Job[] getJobs(Object obj) {
Collection<Object> jobs = new ArrayList<Object>();
Iterator<Job> it = objects.keySet().iterator();
while(it.hasNext()) {
Object job = it.next();
Collection<?> tags = objects.get(job);
if(tags==null) {
return null;
}
if(tags.contains(obj)) {
jobs.add(job);
}
}
return jobs.toArray(new Job[0]);
}
/**
* Gets the objects associated with the specified job.
*
* @param job the job
* @return an array of objects
*/
public Object[] getObjects(Job job) {
Collection<?> tags = objects.get(job);
if(tags==null) {
return new Object[0];
}
return tags.toArray(new Object[0]);
}
/**
* Gets the tools interested in the specified object.
*
* @param obj the object
* @return a collection of tools
*/
public Collection<Tool> getTools(Object obj) {
Collection<Tool> tools = new HashSet<Tool>();
Job[] jobs = getJobs(obj);
for(int i = 0; i<jobs.length; i++) {
Collection<Tool> next = replies.get(jobs[i]);
if(next!=null) {
tools.addAll(next);
}
}
return tools;
}
/**
* Replies to tools interested in the specified object.
*
* @param obj the object
*/
public void sendReplies(Object obj) {
Job[] jobs = getJobs(obj);
XMLControl control = new XMLControlElement(obj);
String xml = control.toXML();
for(int i = 0; i<jobs.length; i++) {
try {
jobs[i].setXML(xml);
} catch(RemoteException ex) {
ex.printStackTrace();
}
sendReplies(jobs[i]);
}
}
/**
* Replies to tools interested in the specified job.
*
* @param job the job
*/
public void sendReplies(Job job) {
Collection<Tool> tools = replies.get(job);
if(tools==null) {
return;
}
Iterator<Tool> it = tools.iterator();
try {
while(it.hasNext()) {
Tool tool = it.next();
tool.send(job, localTool);
}
} catch(RemoteException ex) {
ex.printStackTrace();
}
}
}
/*
* 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
*/