From: <ha...@us...> - 2012-04-04 04:09:31
|
Revision: 16967 http://jmol.svn.sourceforge.net/jmol/?rev=16967&view=rev Author: hansonr Date: 2012-04-04 04:09:23 +0000 (Wed, 04 Apr 2012) Log Message: ----------- # new feature: headless flag -T <seconds> timeout delay for "exitJmol" # new feature: headless security fixes for running scripts Modified Paths: -------------- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java trunk/Jmol/src/org/jmol/viewer/ActionManager.java trunk/Jmol/src/org/jmol/viewer/FileManager.java trunk/Jmol/src/org/jmol/viewer/Viewer.java trunk/Jmol/src/org/openscience/jmol/app/JmolApp.java Added Paths: ----------- trunk/Jmol/src/org/jmol/viewer/TimeoutThread.java Modified: trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java =================================================================== --- trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2012-04-04 03:10:57 UTC (rev 16966) +++ trunk/Jmol/src/org/jmol/script/ScriptEvaluator.java 2012-04-04 04:09:23 UTC (rev 16967) @@ -13232,6 +13232,8 @@ String name = null; String script = null; int mSec = 0; + if (viewer.isHeadless()) + return; if (statementLength == index) { showString(viewer.showTimeout(null)); return; Modified: trunk/Jmol/src/org/jmol/viewer/ActionManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2012-04-04 03:10:57 UTC (rev 16966) +++ trunk/Jmol/src/org/jmol/viewer/ActionManager.java 2012-04-04 04:09:23 UTC (rev 16967) @@ -536,7 +536,6 @@ public void clear() { startHoverWatcher(false); - clearTimeouts(); if (predragBinding != null) binding = predragBinding; viewer.setPickingMode(null, PICKING_IDENTIFY); @@ -1471,133 +1470,6 @@ exitMeasurementMode(); } - Map<String, TimeoutThread> timeouts; - - public String showTimeout(String name) { - StringBuffer sb = new StringBuffer(); - if (timeouts != null) { - Iterator<TimeoutThread> e = timeouts.values().iterator(); - while (e.hasNext()) { - TimeoutThread t = e.next(); - if (name == null || t.name.equalsIgnoreCase(name)) - sb.append(t.toString()).append("\n"); - } - } - return (sb.length() > 0 ? sb.toString() : "<no timeouts set>"); - } - - public void clearTimeouts() { - if (timeouts == null) - return; - Iterator<TimeoutThread> e = timeouts.values().iterator(); - while (e.hasNext()) { - TimeoutThread t = e.next(); - if (!t.script.equals("exitJmol")) - t.interrupt(); - } - timeouts.clear(); - } - - public void setTimeout(String name, int mSec, String script) { - if (name == null) { - clearTimeouts(); - return; - } - if (timeouts == null) { - timeouts = new Hashtable<String, TimeoutThread>(); - } - if (mSec == 0) { - Thread t = timeouts.get(name); - if (t != null) { - t.interrupt(); - timeouts.remove(name); - } - return; - } - TimeoutThread t = timeouts.get(name); - if (t != null) { - t.set(mSec, script); - return; - } - t = new TimeoutThread(name, mSec, script); - timeouts.put(name, t); - t.start(); - } - - public void triggerTimeout(String name) { - TimeoutThread t; - if (timeouts == null || (t = timeouts.get(name)) == null) - return; - t.trigger(); - } - - private class TimeoutThread extends Thread { - String name; - private int ms; - private long targetTime; - private int status; - String script; - private boolean triggered = true; - - TimeoutThread(String name, int ms, String script) { - this.name = name; - set(ms, script); - } - - void set(int ms, String script) { - this.ms = ms; - targetTime = System.currentTimeMillis() + Math.abs(ms); - if (script != null) - this.script = script; - } - - void trigger() { - triggered = (ms < 0); - } - - @Override - public String toString() { - return "timeout name=" + name + " executions=" + status + " mSec=" + ms - + " secRemaining=" + (targetTime - System.currentTimeMillis())/1000f + " script=" + script + " thread=" + Thread.currentThread().getName(); - } - - @Override - public void run() { - if (script == null || script.length() == 0 || ms == 0) - return; - Thread.currentThread().setName("timeout " + name); - //if (true || Logger.debugging) - //Logger.info(toString()); - Thread.currentThread().setPriority(Thread.MIN_PRIORITY); - try { - while (true) { - Thread.sleep(26); - if (targetTime > System.currentTimeMillis()) - continue; - status++; - boolean looping = (ms < 0); - targetTime += Math.abs(ms); - if (timeouts.get(name) == null) - break; - if (!looping) - timeouts.remove(name); - if (triggered) { - triggered = false; - viewer.evalStringQuiet(script + (looping ? ";\ntimeout ID \"" + name + "\";" : "")); - } else { - } - if (!looping) - break; - } - } catch (InterruptedException ie) { - //Logger.info("Timeout " + this + " interrupted"); - } catch (Exception ie) { - Logger.info("Timeout " + name + " Exception: " + ie); - } - timeouts.remove(name); - } - } - public void hoverOn(int atomIndex) { viewer.hoverOn(atomIndex, Binding.getMouseAction(clickedCount, moved.modifiers)); } Modified: trunk/Jmol/src/org/jmol/viewer/FileManager.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/FileManager.java 2012-04-04 03:10:57 UTC (rev 16966) +++ trunk/Jmol/src/org/jmol/viewer/FileManager.java 2012-04-04 04:09:23 UTC (rev 16967) @@ -1029,7 +1029,7 @@ public String getFilePath(String name, boolean addUrlPrefix, boolean asShortName) { String[] names = classifyName(name, false); - return (names == null ? "" : asShortName ? names[1] + return (names == null || names.length == 1 ? "" : asShortName ? names[1] : addUrlPrefix ? names[2] : names[0] == null ? "" : names[0].replace('\\', '/')); Added: trunk/Jmol/src/org/jmol/viewer/TimeoutThread.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/TimeoutThread.java (rev 0) +++ trunk/Jmol/src/org/jmol/viewer/TimeoutThread.java 2012-04-04 04:09:23 UTC (rev 16967) @@ -0,0 +1,97 @@ +/* $RCSfile$ + * $Author$ + * $Date$ + * $Revision$ + * + * Copyright (C) 2011 The Jmol Development Team + * + * Contact: jmo...@li... + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +package org.jmol.viewer; + +import org.jmol.util.Logger; + +class TimeoutThread extends Thread { + String name; + private int ms; + private long targetTime; + private int status; + String script; + private boolean triggered = true; + private Viewer viewer; + + TimeoutThread(Viewer viewer, String name, int ms, String script) { + this.viewer = viewer; + this.name = name; + set(ms, script); + } + + void set(int ms, String script) { + this.ms = ms; + targetTime = System.currentTimeMillis() + Math.abs(ms); + if (script != null) + this.script = script; + } + + void trigger() { + triggered = (ms < 0); + } + + @Override + public String toString() { + return "timeout name=" + name + " executions=" + status + " mSec=" + ms + + " secRemaining=" + (targetTime - System.currentTimeMillis())/1000f + " script=" + script + " thread=" + Thread.currentThread().getName(); + } + + @Override + public void run() { + if (script == null || script.length() == 0 || ms == 0) + return; + Thread.currentThread().setName("timeout " + name); + //if (true || Logger.debugging) + //Logger.info(toString()); + Thread.currentThread().setPriority(Thread.MIN_PRIORITY); + try { + while (true) { + Thread.sleep(26); + if (targetTime > System.currentTimeMillis()) + continue; + status++; + boolean looping = (ms < 0); + targetTime += Math.abs(ms); + if (viewer.timeouts.get(name) == null) + break; + if (!looping) + viewer.timeouts.remove(name); + if (triggered) { + triggered = false; + viewer.evalStringQuiet(script + (looping ? ";\ntimeout ID \"" + name + "\";" : "")); + } else { + } + if (!looping) + break; + } + } catch (InterruptedException ie) { + //Logger.info("Timeout " + this + " interrupted"); + } catch (Exception ie) { + Logger.info("Timeout " + name + " Exception: " + ie); + } + viewer.timeouts.remove(name); + } +} \ No newline at end of file Modified: trunk/Jmol/src/org/jmol/viewer/Viewer.java =================================================================== --- trunk/Jmol/src/org/jmol/viewer/Viewer.java 2012-04-04 03:10:57 UTC (rev 16966) +++ trunk/Jmol/src/org/jmol/viewer/Viewer.java 2012-04-04 04:09:23 UTC (rev 16967) @@ -2693,6 +2693,7 @@ modelSet = modelManager.zap(); if (haveDisplay) { apiPlatform.clearMouse(); + clearTimeouts(); actionManager.clear(); } stateManager.clear(global); @@ -4538,6 +4539,19 @@ public void exitJmol() { if (isApplet) return; + if (headlessWriteCmd != null) { + try { + Object[] p = headlessWriteCmd; + if (isHeadless()) + createImage((String) p[0], (String) p[1], null, + ((Integer) p[2]).intValue(), + ((Integer) p[3]).intValue(), + ((Integer) p[4]).intValue()); + } catch (Exception e) { + // + } + } + Logger.debug("exitJmol -- exiting"); System.out.flush(); System.exit(0); @@ -7749,6 +7763,7 @@ JmolPopupInterface jmolpopup; private JmolPopupInterface modelkitPopup; private boolean haveHeadlessExitTimeout; + private Object[] headlessWriteCmd; @Override @@ -7845,23 +7860,14 @@ case 240: return (appConsole == null ? "" : appConsole.getText()); case 260: - try { - Object[] p = (Object[]) paramInfo; - if (isHeadless()) - createImage((String) p[0], (String) p[1], null, - ((Integer) p[2]).intValue(), - ((Integer) p[3]).intValue(), - ((Integer) p[4]).intValue()); - } catch (Exception e) { - // - } - exitJmol(); - break; + if (isHeadless()) + headlessWriteCmd = (Object[]) paramInfo; + return null; case 280: if (!isHeadless() || haveHeadlessExitTimeout) return null; // only one of these allowed haveHeadlessExitTimeout = true; - actionManager.setTimeout("" + Math.random(), + setTimeout("" + Math.random(), ((Integer) paramInfo).intValue(), "exitJmol"); return null; } @@ -8617,6 +8623,7 @@ @Override public Object createImage(String fileName, String type, Object text_or_bytes, int quality, int width, int height) { + System.out.println("createimage " + fileName + " " + type + " " + text_or_bytes + " " + quality + " " + width + " " + height); return createImage(fileName, type, text_or_bytes, quality, width, height, null, true); } @@ -8718,7 +8725,7 @@ } private String getFileNameFromDialog(String fileName, int quality) { - if (fileName == null || isKiosk || isHeadless()) + if (fileName == null || isKiosk) return null; boolean useDialog = (fileName.indexOf("?") == 0); if (useDialog) @@ -9236,24 +9243,6 @@ return (haveDisplay ? actionManager.getMouseInfo() : null); } - public void clearTimeout(String name) { - setTimeout(name, 0, null); - } - - public void setTimeout(String name, int mSec, String script) { - if (haveDisplay) - actionManager.setTimeout(name, mSec, script); - } - - public void triggerTimeout(String name) { - if (haveDisplay) - actionManager.triggerTimeout(name); - } - - public String showTimeout(String name) { - return (haveDisplay ? actionManager.showTimeout(name) : ""); - } - public int getFrontPlane() { return transformManager.getFrontPlane(); } @@ -10129,7 +10118,8 @@ shapeManager.getObjectMap(map, withDollar); } - Map<String, String[][]>htPdbBondInfo; + Map<String, String[][]>htPdbBondInfo; + public String[][] getPdbBondInfo(String group3) { if (htPdbBondInfo == null) htPdbBondInfo = new Hashtable<String, String[][]>(); @@ -10188,5 +10178,72 @@ public boolean isHeadless() { return apiPlatform.isHeadless(); } + + Map<String, TimeoutThread> timeouts; + public void clearTimeouts() { + if (timeouts == null) + return; + Iterator<TimeoutThread> e = timeouts.values().iterator(); + while (e.hasNext()) { + TimeoutThread t = e.next(); + if (!t.script.equals("exitJmol")) + t.interrupt(); + } + timeouts.clear(); + } + + public void setTimeout(String name, int mSec, String script) { + if (name == null) { + clearTimeouts(); + return; + } + if (timeouts == null) { + timeouts = new Hashtable<String, TimeoutThread>(); + } + if (mSec == 0) { + Thread t = timeouts.get(name); + if (t != null) { + t.interrupt(); + timeouts.remove(name); + } + return; + } + TimeoutThread t = timeouts.get(name); + if (t != null) { + t.set(mSec, script); + return; + } + t = new TimeoutThread(this, name, mSec, script); + timeouts.put(name, t); + t.start(); + } + + public void triggerTimeout(String name) { + TimeoutThread t; + if (!haveDisplay || timeouts == null || (t = timeouts.get(name)) == null) + return; + t.trigger(); + } + + public void clearTimeout(String name) { + setTimeout(name, 0, null); + } + + public String showTimeout(String name) { + if (!haveDisplay) + return ""; + StringBuffer sb = new StringBuffer(); + if (timeouts != null) { + Iterator<TimeoutThread> e = timeouts.values().iterator(); + while (e.hasNext()) { + TimeoutThread t = e.next(); + if (name == null || t.name.equalsIgnoreCase(name)) + sb.append(t.toString()).append("\n"); + } + } + return (sb.length() > 0 ? sb.toString() : "<no timeouts set>"); + } + + } Modified: trunk/Jmol/src/org/openscience/jmol/app/JmolApp.java =================================================================== --- trunk/Jmol/src/org/openscience/jmol/app/JmolApp.java 2012-04-04 03:10:57 UTC (rev 16966) +++ trunk/Jmol/src/org/openscience/jmol/app/JmolApp.java 2012-04-04 04:09:23 UTC (rev 16967) @@ -80,7 +80,7 @@ private String modelFilename; private String scriptFilename; private String script1 = ""; - private String script2; + private String script2 = ""; private boolean doExit; private Object headlessWriteCmd; private int headlessMaxTimeSec = 60; @@ -455,18 +455,20 @@ type_name += ":jpg"; int i = type_name.indexOf(":"); String type = type_name.substring(0, i).toUpperCase(); - type_name = " \"" + type_name.substring(i + 1) + "\""; + type_name = type_name.substring(i + 1).trim(); if (type.indexOf(" ") >= 0) { quality = Parser.parseInt(type.substring(type.indexOf(" ")).trim()); type.substring(0, type.indexOf(" ")); } - if (GraphicsEnvironment.isHeadless()) + if (GraphicsEnvironment.isHeadless()) { headlessWriteCmd = new Object[] { type_name, type, Integer.valueOf(quality), Integer.valueOf(width), Integer.valueOf(height) }; + + } else script2 += ";write image " + width + " " + height + " " + type + " " + quality + " " + Escape.escape(type_name); } @@ -490,8 +492,7 @@ commandOptions += "-n"; if (exitUponCompletion) { commandOptions += "-x"; - doExit = true; - script2 += "// " + commandOptions; + script2 += ";exitJmol // " + commandOptions; } } @@ -506,6 +507,9 @@ if (GraphicsEnvironment.isHeadless()) { // 60-second timeout for exit viewer.getProperty("DATA_API", "headlessMaxTime", Integer.valueOf(headlessMaxTimeSec * 1000)); + if (headlessWriteCmd != null) { + viewer.getProperty("DATA_API", "headlessImage", headlessWriteCmd); + } } // Open a file if one is given as an argument -- note, this CAN be a // script file @@ -557,11 +561,6 @@ splash.showStatus(GT._("Executing script 2...")); viewer.script(script2); } - if (headlessWriteCmd != null) { - if (!isSilent) - Logger.info("Executing writeCmd"); - viewer.getProperty("DATA_API", "headlessImage", headlessWriteCmd); - } if (doExit) System.exit(0); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |