package jas2.swingstudio;

import hepjas.analysis.*;
import hepjas.analysis.peer.*;
import jas2.job.*;
import jas2.jds.module.LocalDIM;
import jas2.jds.module.ModuleException;
import jas2.hist.Rebinnable1DHistogramData;
import java.io.*;
import java.util.*;
import java.lang.reflect.*;
import jas2.jds.interfaces.RemoteJobUpdate;
import jas2.util.tree.*;
import jas2.plugin.*;
import jas2.loader.*;
import java.util.zip.*;

import javax.swing.*;

public class LocalJob extends AbstractJob implements jas2.swingstudio.Job, AnalysisApplication, Serializable
{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	// Create a LocalJob without an open dataset
	public LocalJob(JASJob jasJob, String jobName)
	{
		super(jobName);
		m_jasJob = jasJob;
		m_progress = new DefaultBoundedRangeModel();
		m_app.setModel(m_progress);
		PeerSupport.setAnalysisApplication(this);
		setHepAnalysisJob(new hepjas.analysis.Job(jobName));
		m_jobName = jobName;
		setClassLoader(new LocalClassLoader());

		getTreeRoot().addNodeListener(new SimpleNodeListener()
		{
			public void treeChanged(TreeItem item)
			{
				//System.out.println("treeChanged "+item);
				if ((item.flags & TreeItem.DELETED) != 0) m_jasJob.deleteNode(item);
				else m_jasJob.addNode(item);
				m_jasJob.updateTree();
			}
		});
	}
	// Create a LocalJob which will have an initial dataset opened by a LocalDIM
	LocalJob(JASJob jasJob, String jobName, LocalDIM dim, String dataSource)
	{
		this(jasJob,jobName);
		m_DIM = dim;
		m_dataSource = dataSource;
	}
	public hepjas.analysis.Job currentJob()
	{
		return getHepAnalysisJob();
	}
	public JobPeer createJobPeer(String s, hepjas.analysis.Job job)
	{
		return new JobJob(this); 
	}
	public boolean open() throws ModuleException
	{
		if (m_DIM != null)
		{
			EventSource es = m_DIM.openDataSet(m_dataSource);
			if (es !=null) setEventSource(es);
         return true;
		}
      else return false;
	}
	public boolean isLoaded(String className)
	{
		return m_loaded.contains(className);
	}
	public void reopen(ObjectInputStream stream, JASJob jasJob) throws OpenJobException
	{
		m_app = JavaAnalysisStudio.getApp();
		if (m_DIM != null)
			m_DIM.setLocalJobBuilder(m_app.getLocalJobBuilder());
		setClassLoader(new LocalClassLoader());
		m_jasJob = jasJob;
		m_progress = new DefaultBoundedRangeModel();
		m_app.setModel(m_progress);
		PeerSupport.setAnalysisApplication(this);
		setHepAnalysisJob(new hepjas.analysis.Job(m_jobName));

		getTreeRoot().addNodeListener(new SimpleNodeListener()
		{
			public void treeChanged(TreeItem item)
			{
				if ((item.flags & TreeItem.DELETED) != 0) m_jasJob.deleteNode(item);
				else m_jasJob.addNode(item);
				m_jasJob.updateTree();
			}
		});

		Enumeration e = m_loaded.elements();
		try
		{	
			while (e.hasMoreElements())
			{
				String s = (String) e.nextElement();
				super.loadObject(s); // super.loadObject(String s) does not add s to m_loaded
					 // (Calling loadObject(s) causes infinite loop.)
			}
			if (m_DIM != null)
			{
				EventSource es = m_DIM.openDataSet(m_dataSource);
				if (es != null) setEventSource(es);
			}
			int pos;
			boolean atEnd;
			try 
			{
				pos = stream.readInt();
				atEnd = stream.readBoolean();
			}
			catch (EOFException x) // early versions did not contain this (pre PR2);
			{
				pos = 0;
				atEnd = false;
			}
			if (atEnd) go(0);
			else if (pos > 0) go(pos);
		}
		catch (Exception x)
		{
			throw new OpenJobException(x);
		}
	}
	public void save()
	{
	}
	public void loadObject(String s) throws LoaderException
	{
		// we expect super.loadObject() to do any cleanup before throwing an exception
		super.loadObject(s);
		// if no exception...
		m_loaded.addElement(s);
	}
	public Class loadClientClass(String className) throws ClassNotFoundException
	{
		return m_app.getExtensionLoader().loadClass(className);
	}
	
	public OutputStream getLogStream()
	{
		return m_app.getOutputStream("Log Messages");
	}
	public OutputStream getErrorStream()
	{
		return m_app.getOutputStream("Error Messages");
	}
	public void reload()
	{
		setClassLoader(new LocalClassLoader());
		super.unloadAll();
		Enumeration e = m_loaded.elements();
		try
		{
			while (e.hasMoreElements())
				super.loadObject( (String) e.nextElement() );
		}
		catch (LoaderException le)
		{
			m_app.error("Could not reload", le);
		}
	}
	public void unloadAll()
	{
		setClassLoader(new LocalClassLoader());
		super.unloadAll();
		m_loaded.removeAllElements();
	}
	public void sendMessage(String message)
	{
		JavaAnalysisStudio.getApp().setMessage(message);
	}
	protected void reportError(AnalysisException e)
	{
		JavaAnalysisStudio.getApp().error("Error running remote analysis (see Error Message window for details)");
	}
	public void notifyInfo()
	{
		m_jasJob.setCommandChanged();
		if (eventsTotal() > 0) m_maxEvents = eventsTotal();
		else m_maxEvents = 100; // Arbitrary
		m_progress.setMaximum(m_maxEvents);
		m_progress.setValue(eventsAnalyzed());

		if (!m_runListeners.isEmpty()) fireRunListeners(new RunEvent(this,isRunning() ? RunEvent.RUNSTARTED : RunEvent.RUNSTOPPED));
	}
	public void notifyInfo(int i)
	{
		int eventsAnalyzed = i;
		if (eventsAnalyzed > m_maxEvents)
		{
			m_maxEvents *= 3;
			m_progress.setMaximum(m_maxEvents);
		}
		m_progress.setValue(eventsAnalyzed);
	}
	public boolean isChanged()
	{
		return m_changes > 0;
	}
	public void addRunListener(RunListener listener)
	{
		m_runListeners.addElement(listener);
	}
	public void removeRunListener(RunListener listener)
	{
		m_runListeners.removeElement(listener);
	}
	private void fireRunListeners(RunEvent event)
	{
		Enumeration e = m_runListeners.elements();
		while (e.hasMoreElements())
			((RunListener) e.nextElement()).runStateChanged(event);
	}
	protected Thread createEventLoopThread(Runnable loop) // overriden by JDSJob
	{
		Thread t = super.createEventLoopThread(loop);
      t.setPriority(t.getPriority()-1); // decrease to avoid locking out GUI
      return t;
	}	
	private Vector m_runListeners = new Vector();
	private transient JavaAnalysisStudio m_app = JavaAnalysisStudio.getApp();
	private transient JASJob m_jasJob;
	private transient int m_maxEvents = 0;
	private transient BoundedRangeModel m_progress;
	private Vector m_loaded = new Vector();
	private int m_changes = 0; // What is this for? (It is never changes from zero.)
	private LocalDIM m_DIM;
	private String m_dataSource; // used as an argument for LocalDIM.openDataSet()
	private String m_dataSetName;// a descriptive name used in the treepackage jas2.swingstudio;
	private String m_jobName;
}

 

Ads help maintain this website.