+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview 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 Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
package jalview.javascript;
+import jalview.bin.JalviewLite;
+
import java.net.URL;
import java.util.Vector;
-import netscape.javascript.JSException;
import netscape.javascript.JSObject;
-import jalview.bin.JalviewLite;
public class JSFunctionExec implements Runnable
{
- JalviewLite jvlite;
+ public JalviewLite jvlite;
public JSFunctionExec(JalviewLite applet)
{
jvlite = applet;
+
+ jsExecQueue = jvlite.getJsExecQueue();
+ jvlite.setExecutor(this);
}
- private static Vector jsExecQueue;
+ private Vector jsExecQueue;
- private static Thread executor = null;
+ private Thread executor = null;
- public static void stopQueue()
+ public void stopQueue()
{
if (jsExecQueue != null)
{
- Vector q = jsExecQueue;
- jsExecQueue = null;
- q.removeAllElements();
- executor.notify();
- executor = null;
+ Vector<JSFunctionExec> q = null;
+ synchronized (jsExecQueue)
+ {
+ q = jsExecQueue;
+ jsExecQueue = null;
+ }
+ if (q != null)
+ {
+ for (JSFunctionExec jx : q)
+ {
+ jx.jvlite = null;
+
+ }
+ q.removeAllElements();
+ synchronized (q)
+ {
+ q.notifyAll();
+ }
+ }
}
+ jvlite = null;
+ executor = null;
}
+ @Override
public void run()
{
while (jsExecQueue != null)
}
/**
- * execute a javascript callback asynchronously
+ * execute a javascript callback synchronously
*
* @param _listener
* @param objects
final Exception[] jsex = new Exception[1];
Runnable exec = new Runnable()
{
+ @Override
public void run()
{
try
{
System.err.println(jex);
}
- if (jex instanceof netscape.javascript.JSException)
+ if (jex instanceof netscape.javascript.JSException
+ && jvlite.jsfallbackEnabled)
{
- jsex[0] = (netscape.javascript.JSException) jex;
+ jsex[0] = jex;
if (jvlite.debug)
{
System.err.println("Falling back to javascript: url call");
}
- StringBuffer sb = new StringBuffer("javascript:" + _listener
- + "(");
+ StringBuffer sb = new StringBuffer(
+ "javascript:" + _listener + "(");
for (int i = 0; objects != null && i < objects.length; i++)
{
if (i > 0)
sb.append("\"");
// strip out nulls and complex objects that we can't pass this
// way.
- if (objects[i] != null
- && !(objects[i].getClass().getPackage().getName()
- .indexOf("jalview") == 0))
+ if (objects[i] != null && !(objects[i].getClass().getName()
+ .indexOf("jalview") == 0))
{
sb.append(objects[i].toString());
}
}
else
{
- jsex[0] = new Exception(jex);
+ jsex[0] = jex;
}
}
;
};
if (async)
{
- if (JSFunctionExec.executor == null)
+ if (executor == null)
{
- JSFunctionExec.jsExecQueue = new Vector();
- JSFunctionExec.executor = new Thread(new JSFunctionExec(jvlite));
+ executor = new Thread(new JSFunctionExec(jvlite));
executor.start();
}
synchronized (jsExecQueue)
}
else
{
+ // wat for executor to notify us if it's running.
exec.run();
if (jsex[0] != null)
{