Issue #2307: Remove calls to PythonScript constructor without ClassLoader

argument, fix IscMosaic.

Change-Id: Iff29b2790fd1c6d5f5b829f6b35ff31829cdc907

Former-commit-id: 85609a4bf9072ae41dbafbc1b874efbcd5bd21a4
This commit is contained in:
David Gillingham 2013-09-05 15:22:05 -05:00
parent b856f454ff
commit e526e7a82c
25 changed files with 273 additions and 445 deletions

View file

@ -55,6 +55,7 @@ import com.raytheon.uf.common.status.UFStatus.Priority;
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* Dec 11, 2009 njensen Initial creation * Dec 11, 2009 njensen Initial creation
* Jun 22, 2011 9897 ryu allow new GFE config and send notification * Jun 22, 2011 9897 ryu allow new GFE config and send notification
* Sep 05, 2013 #2307 dgilling Use better PythonScript constructor.
* *
* </pre> * </pre>
* *
@ -85,7 +86,7 @@ public class PythonPreferenceStore implements IPreferenceStore,
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void loadConfiguration(String configName) { public void loadConfiguration(String configName) {
IPathManager pathMgr = PathManagerFactory.getPathManager(); IPathManager pathMgr = PathManagerFactory.getPathManager();
String utilityDir = pathMgr.getFile( String utilityDir = pathMgr.getFile(
pathMgr.getContext(LocalizationType.CAVE_STATIC, pathMgr.getContext(LocalizationType.CAVE_STATIC,
@ -100,7 +101,8 @@ public class PythonPreferenceStore implements IPreferenceStore,
try { try {
py = new PythonScript( py = new PythonScript(
utilityDir + File.separator + "loadConfig.py", utilityDir + File.separator + "loadConfig.py",
PyUtil.buildJepIncludePath(configPath, vtecPath)); PyUtil.buildJepIncludePath(configPath, vtecPath), this
.getClass().getClassLoader());
} catch (JepException e) { } catch (JepException e) {
statusHandler.handle(Priority.CRITICAL, statusHandler.handle(Priority.CRITICAL,
"Unable to load GFE config", e); "Unable to load GFE config", e);
@ -116,7 +118,8 @@ public class PythonPreferenceStore implements IPreferenceStore,
"Unable to load baseline GFE config", e); "Unable to load baseline GFE config", e);
} }
//Map<String, Object> originalSelectedConfiguration = selectedConfiguration; // Map<String, Object> originalSelectedConfiguration =
// selectedConfiguration;
args.put("configName", configName); args.put("configName", configName);
try { try {
selectedConfiguration = (Map<String, Object>) py.execute( selectedConfiguration = (Map<String, Object>) py.execute(
@ -156,7 +159,8 @@ public class PythonPreferenceStore implements IPreferenceStore,
} }
@Override @Override
public void addConfigurationChangeListener(IConfigurationChangeListener listener) { public void addConfigurationChangeListener(
IConfigurationChangeListener listener) {
this.configurationChangeListeners.add(listener); this.configurationChangeListeners.add(listener);
} }
@ -191,6 +195,7 @@ public class PythonPreferenceStore implements IPreferenceStore,
for (final IPropertyChangeListener listener : this.propertyChangeListeners) { for (final IPropertyChangeListener listener : this.propertyChangeListeners) {
SafeRunnable.run(new SafeRunnable(JFaceResources SafeRunnable.run(new SafeRunnable(JFaceResources
.getString("PreferenceStore.changeError")) { //$NON-NLS-1$ .getString("PreferenceStore.changeError")) { //$NON-NLS-1$
@Override
public void run() { public void run() {
listener.propertyChange(pe); listener.propertyChange(pe);
} }
@ -203,6 +208,7 @@ public class PythonPreferenceStore implements IPreferenceStore,
for (final IConfigurationChangeListener listener : this.configurationChangeListeners) { for (final IConfigurationChangeListener listener : this.configurationChangeListeners) {
SafeRunnable.run(new SafeRunnable(JFaceResources SafeRunnable.run(new SafeRunnable(JFaceResources
.getString("PreferenceStore.changeError")) { //$NON-NLS-1$ .getString("PreferenceStore.changeError")) { //$NON-NLS-1$
@Override
public void run() { public void run() {
listener.configurationChanged(config); listener.configurationChanged(config);
} }
@ -433,9 +439,11 @@ public class PythonPreferenceStore implements IPreferenceStore,
} }
@Override @Override
public void removeConfigurationChangeListener(IConfigurationChangeListener listener) { public void removeConfigurationChangeListener(
IConfigurationChangeListener listener) {
this.configurationChangeListeners.remove(listener); this.configurationChangeListeners.remove(listener);
} }
/* /*
* (non-Javadoc) * (non-Javadoc)
* *

View file

@ -97,6 +97,7 @@ import com.raytheon.viz.gfe.textformatter.TextProductManager;
* 04/24/2013 1936 dgilling Move initialization of TextProductMgr * 04/24/2013 1936 dgilling Move initialization of TextProductMgr
* to GFE startup. * to GFE startup.
* 08/27/2013 2302 randerso Code cleanup for AutoSaveJob * 08/27/2013 2302 randerso Code cleanup for AutoSaveJob
* 09/05/2013 2307 dgilling Use better PythonScript constructor.
* *
* </pre> * </pre>
* *
@ -570,7 +571,7 @@ public class DataManager {
.getFile( .getFile(
pathMgr.getContext(LocalizationType.COMMON_STATIC, pathMgr.getContext(LocalizationType.COMMON_STATIC,
LocalizationLevel.BASE), "python") LocalizationLevel.BASE), "python")
.getPath())); .getPath()), this.getClass().getClassLoader());
Map<String, Object> args = new HashMap<String, Object>(); Map<String, Object> args = new HashMap<String, Object>();
args.put("str", response.get(1)); args.put("str", response.get(1));
Map<String, ?> obj = (Map<String, ?>) script.execute("unPickle", Map<String, ?> obj = (Map<String, ?>) script.execute("unPickle",

View file

@ -223,7 +223,8 @@ public class CombinationsFileUtil {
map.put("comboName", comboName); map.put("comboName", comboName);
PythonScript python = null; PythonScript python = null;
try { try {
python = new PythonScript(scriptPath, comboPath); python = new PythonScript(scriptPath, comboPath,
CombinationsFileUtil.class.getClassLoader());
Object com = python.execute("getCombinations", map); Object com = python.execute("getCombinations", map);
combos = (List<List<String>>) com; combos = (List<List<String>>) com;
} catch (JepException e) { } catch (JepException e) {

View file

@ -89,6 +89,7 @@ import com.raytheon.viz.pointdata.rsc.PlotResourceData;
* Jun 29, 2009 2538 jsanchez Implemented pointdata. * Jun 29, 2009 2538 jsanchez Implemented pointdata.
* Aug 09, 2012 1085 jkorman Corrected data construction. * Aug 09, 2012 1085 jkorman Corrected data construction.
* Sep 05, 2013 2316 bsteffen Unify pirep and ncpirep. * Sep 05, 2013 2316 bsteffen Unify pirep and ncpirep.
* Sep 05, 2013 2307 dgilling Use better PythonScript constructor.
* *
* </pre> * </pre>
* *
@ -460,11 +461,13 @@ public class PlotModelFactory2 {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (int i = 0; i < childNodes.getLength(); i++) { for (int i = 0; i < childNodes.getLength(); i++) {
Node child = childNodes.item(i); Node child = childNodes.item(i);
if (Node.TEXT_NODE == child.getNodeType()) if (Node.TEXT_NODE == child.getNodeType()) {
sb.append(((Text) child).getData()); sb.append(((Text) child).getData());
}
} }
if (sb.length() > 0) if (sb.length() > 0) {
scriptInfo.scriptText = sb.toString(); scriptInfo.scriptText = sb.toString();
}
sampleScriptInfo = new ScriptInfo(); sampleScriptInfo = new ScriptInfo();
sampleScriptInfo.plotDelegateName = scriptInfo.plotDelegateName; sampleScriptInfo.plotDelegateName = scriptInfo.plotDelegateName;
@ -599,8 +602,9 @@ public class PlotModelFactory2 {
Object result = script.executePlotDelegateMethod("isValid", Object result = script.executePlotDelegateMethod("isValid",
"rec", stationData); "rec", stationData);
if (result instanceof Boolean if (result instanceof Boolean
&& !((Boolean) result).booleanValue()) && !((Boolean) result).booleanValue()) {
return null; return null;
}
} catch (JepException e) { } catch (JepException e) {
statusHandler.handle(Priority.PROBLEM, statusHandler.handle(Priority.PROBLEM,
e.getLocalizedMessage(), e); e.getLocalizedMessage(), e);
@ -1272,9 +1276,9 @@ public class PlotModelFactory2 {
public PlotPythonScript getScript() throws JepException { public PlotPythonScript getScript() throws JepException {
if (script != null) { if (script != null) {
if (Thread.currentThread() == scriptThread) if (Thread.currentThread() == scriptThread) {
return script; return script;
else { } else {
statusHandler.handle(Priority.ERROR, statusHandler.handle(Priority.ERROR,
"Plot model scripting was not properly disposed."); "Plot model scripting was not properly disposed.");
script = null; script = null;
@ -1290,8 +1294,9 @@ public class PlotModelFactory2 {
public void disposeScript() throws JepException { public void disposeScript() throws JepException {
if (script != null) { if (script != null) {
try { try {
if (Thread.currentThread() == scriptThread) if (Thread.currentThread() == scriptThread) {
script.dispose(); script.dispose();
}
} finally { } finally {
script = null; script = null;
scriptThread = null; scriptThread = null;
@ -1312,8 +1317,9 @@ public class PlotModelFactory2 {
StringBuilder includePath = new StringBuilder(); StringBuilder includePath = new StringBuilder();
for (LocalizationLevel ll : keys) { for (LocalizationLevel ll : keys) {
LocalizationFile lf = map.get(ll); LocalizationFile lf = map.get(ll);
if (includePath.length() > 0) if (includePath.length() > 0) {
includePath.append(File.pathSeparator); includePath.append(File.pathSeparator);
}
includePath.append(lf.getFile().getAbsolutePath()); includePath.append(lf.getFile().getAbsolutePath());
} }
@ -1322,8 +1328,9 @@ public class PlotModelFactory2 {
+ "PlotModelInterface.py"); + "PlotModelInterface.py");
script = new PlotPythonScript(baseFile.getAbsolutePath(), script = new PlotPythonScript(baseFile.getAbsolutePath(),
includePath.toString(), plotDelegateName); includePath.toString(), plotDelegateName);
if (scriptText != null) if (scriptText != null) {
script.evaluate(scriptText); script.evaluate(scriptText);
}
script.executePlotDelegateMethod("init", "plotModelFactory", script.executePlotDelegateMethod("init", "plotModelFactory",
PlotModelFactory2.this); PlotModelFactory2.this);
return script; return script;
@ -1338,7 +1345,8 @@ public class PlotModelFactory2 {
public PlotPythonScript(String filePath, String anIncludePath, public PlotPythonScript(String filePath, String anIncludePath,
String plotDelegateName) throws JepException { String plotDelegateName) throws JepException {
super(filePath, anIncludePath); super(filePath, anIncludePath, PlotPythonScript.class
.getClassLoader());
jep.eval("def " jep.eval("def "
+ CHEAT_RUN + CHEAT_RUN
+ "(text):\n return eval(compile(text,'string','exec'),globals(),globals())"); + "(text):\n return eval(compile(text,'string','exec'),globals(),globals())");
@ -1359,8 +1367,9 @@ public class PlotModelFactory2 {
map.put(argName, argValue); map.put(argName, argValue);
} }
return execute(methodName, plotDelegateName, map); return execute(methodName, plotDelegateName, map);
} else } else {
return null; return null;
}
} }
} }

View file

@ -60,6 +60,7 @@ import com.raytheon.uf.common.util.FileUtil;
* 07/14/09 1995 bphillip Initial creation * 07/14/09 1995 bphillip Initial creation
* Mar 14, 2013 1794 djohnson FileUtil.listFiles now returns List. * Mar 14, 2013 1794 djohnson FileUtil.listFiles now returns List.
* 06/13/13 2044 randerso Refactored to use IFPServer * 06/13/13 2044 randerso Refactored to use IFPServer
* Sep 05, 2013 2307 dgilling Use better PythonScript constructor.
* *
* </pre> * </pre>
* *
@ -132,7 +133,8 @@ public class GfeIRT extends Thread {
GfePyIncludeUtil.getCommonPythonIncludePath(), GfePyIncludeUtil.getCommonPythonIncludePath(),
GfePyIncludeUtil.getIscScriptsIncludePath(), GfePyIncludeUtil.getIscScriptsIncludePath(),
GfePyIncludeUtil.getGfeConfigIncludePath(siteID)); GfePyIncludeUtil.getGfeConfigIncludePath(siteID));
script = new PythonScript(scriptFile, includePath); script = new PythonScript(scriptFile, includePath, this.getClass()
.getClassLoader());
Map<String, Object> args = new HashMap<String, Object>(); Map<String, Object> args = new HashMap<String, Object>();
GridLocation domain = config.dbDomain(); GridLocation domain = config.dbDomain();

View file

@ -35,6 +35,7 @@ import com.raytheon.uf.common.python.PythonScript;
* Date Ticket# Engineer Description * Date Ticket# Engineer Description
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* Oct 25, 2011 dgilling Initial creation * Oct 25, 2011 dgilling Initial creation
* Sep 05, 2013 #2307 dgilling Use better PythonScript constructor.
* *
* </pre> * </pre>
* *
@ -53,7 +54,7 @@ public class IscSendScript extends PythonScript {
*/ */
public IscSendScript(String aFilePath, String anIncludePath) public IscSendScript(String aFilePath, String anIncludePath)
throws JepException { throws JepException {
super(aFilePath, anIncludePath); super(aFilePath, anIncludePath, IscSendScript.class.getClassLoader());
} }
public Object execute(Map<String, Object> args) throws JepException { public Object execute(Map<String, Object> args) throws JepException {

View file

@ -44,6 +44,7 @@ import com.raytheon.uf.common.python.PythonScript;
* Date Ticket# Engineer Description * Date Ticket# Engineer Description
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* Jul 26, 2011 bphillip Initial creation * Jul 26, 2011 bphillip Initial creation
* Sep 05, 2013 #2307 dgilling Use better PythonScript constructor.
* *
* </pre> * </pre>
* *
@ -77,7 +78,8 @@ public class LogPurger {
PythonScript script = siteScriptMap.get(siteID); PythonScript script = siteScriptMap.get(siteID);
if (script == null) { if (script == null) {
script = new PythonScript(scriptFile, includePath); script = new PythonScript(scriptFile, includePath, this
.getClass().getClassLoader());
siteScriptMap.put(siteID, script); siteScriptMap.put(siteID, script);
} }
Map<String, Object> args = new HashMap<String, Object>(); Map<String, Object> args = new HashMap<String, Object>();

View file

@ -52,6 +52,7 @@ import com.raytheon.uf.common.serialization.comm.IRequestHandler;
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* 07/06/09 1995 bphillip Initial port * 07/06/09 1995 bphillip Initial port
* 09/22/09 3058 rjpeter Converted to IRequestHandler * 09/22/09 3058 rjpeter Converted to IRequestHandler
* 09/05/13 2307 dgilling Use better PythonScript constructor.
* </pre> * </pre>
* *
* @author bphillip * @author bphillip
@ -80,7 +81,8 @@ public class IscCreateDomainDictHandler implements
.getCommonPythonIncludePath(), GfePyIncludeUtil .getCommonPythonIncludePath(), GfePyIncludeUtil
.getIscScriptsIncludePath(), GfePyIncludeUtil .getIscScriptsIncludePath(), GfePyIncludeUtil
.getGfeConfigIncludePath(request.getSiteID())); .getGfeConfigIncludePath(request.getSiteID()));
script = new PythonScript(scriptFile, includePath); script = new PythonScript(scriptFile, includePath, this.getClass()
.getClassLoader());
Map<String, Object> args = new HashMap<String, Object>(); Map<String, Object> args = new HashMap<String, Object>();
args.put("xml", request.getXml()); args.put("xml", request.getXml());
Object obj = script.execute("createDomainDict", args); Object obj = script.execute("createDomainDict", args);

View file

@ -49,6 +49,7 @@ import com.raytheon.uf.common.serialization.comm.IRequestHandler;
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* 08/21/09 1995 bphillip Initial port * 08/21/09 1995 bphillip Initial port
* 09/22/09 3058 rjpeter Converted to IRequestHandler * 09/22/09 3058 rjpeter Converted to IRequestHandler
* 09/05/13 2307 dgilling Use better PythonScript constructor.
* </pre> * </pre>
* *
* @author bphillip * @author bphillip
@ -75,7 +76,8 @@ public class IscGetRequestXmlHandler implements
.getCommonPythonIncludePath(), GfePyIncludeUtil .getCommonPythonIncludePath(), GfePyIncludeUtil
.getIscScriptsIncludePath(), GfePyIncludeUtil .getIscScriptsIncludePath(), GfePyIncludeUtil
.getGfeConfigIncludePath(request.getSiteID())); .getGfeConfigIncludePath(request.getSiteID()));
script = new PythonScript(scriptFile, includePath); script = new PythonScript(scriptFile, includePath, this.getClass()
.getClassLoader());
Map<String, Object> args = new HashMap<String, Object>(); Map<String, Object> args = new HashMap<String, Object>();
args.put("xml", request.getXml()); args.put("xml", request.getXml());
args.put("selectedServers", request.getSelectedServers()); args.put("selectedServers", request.getSelectedServers());

View file

@ -61,6 +61,8 @@ import com.raytheon.uf.common.util.FileUtil;
* 08/21/09 1995 bphillip Initial port * 08/21/09 1995 bphillip Initial port
* 09/22/09 3058 rjpeter Converted to IRequestHandler * 09/22/09 3058 rjpeter Converted to IRequestHandler
* 03/07/13 1759 dgilling Refactor to not use GfeScript. * 03/07/13 1759 dgilling Refactor to not use GfeScript.
* 09/05/13 2307 dgilling Use better PythonScript constructor.
*
* </pre> * </pre>
* *
* @author bphillip * @author bphillip
@ -132,7 +134,8 @@ public class IscMakeRequestHandler implements IRequestHandler<IscMakeRequest> {
try { try {
PythonScript script = null; PythonScript script = null;
try { try {
script = new PythonScript(scriptPath, includePath); script = new PythonScript(scriptPath, includePath,
IscMakeRequestHandler.class.getClassLoader());
try { try {
script.execute(METHOD_NAME, args); script.execute(METHOD_NAME, args);
} catch (JepException e) { } catch (JepException e) {

View file

@ -57,6 +57,7 @@ import com.raytheon.uf.common.serialization.comm.IRequestHandler;
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* 07/06/09 1995 bphillip Initial port * 07/06/09 1995 bphillip Initial port
* 09/22/09 3058 rjpeter Converted to IRequestHandler * 09/22/09 3058 rjpeter Converted to IRequestHandler
* 09/05/13 2307 dgilling Use better PythonScript constructor.
* </pre> * </pre>
* *
* @author bphillip * @author bphillip
@ -140,7 +141,8 @@ public class IscRequestQueryHandler implements
GfePyIncludeUtil.getCommonPythonIncludePath(), GfePyIncludeUtil.getCommonPythonIncludePath(),
GfePyIncludeUtil.getIscScriptsIncludePath(), GfePyIncludeUtil.getIscScriptsIncludePath(),
GfePyIncludeUtil.getGfeConfigIncludePath(siteID)); GfePyIncludeUtil.getGfeConfigIncludePath(siteID));
script = new PythonScript(scriptFile, includePath); script = new PythonScript(scriptFile, includePath, this.getClass()
.getClassLoader());
Map<String, Object> args = new HashMap<String, Object>(); Map<String, Object> args = new HashMap<String, Object>();
args.put("ancfURL", ancf); args.put("ancfURL", ancf);
args.put("bncfURL", bncf); args.put("bncfURL", bncf);
@ -168,7 +170,8 @@ public class IscRequestQueryHandler implements
GfePyIncludeUtil.getCommonPythonIncludePath(), GfePyIncludeUtil.getCommonPythonIncludePath(),
GfePyIncludeUtil.getIscScriptsIncludePath(), GfePyIncludeUtil.getIscScriptsIncludePath(),
GfePyIncludeUtil.getGfeConfigIncludePath(siteID)); GfePyIncludeUtil.getGfeConfigIncludePath(siteID));
script = new PythonScript(scriptFile, includePath); script = new PythonScript(scriptFile, includePath, this.getClass()
.getClassLoader());
Map<String, Object> args = new HashMap<String, Object>(); Map<String, Object> args = new HashMap<String, Object>();
args.put("xml", xml); args.put("xml", xml);
domainDict = script.execute("createDomainDict", args); domainDict = script.execute("createDomainDict", args);

View file

@ -55,6 +55,7 @@ import com.raytheon.uf.common.util.FileUtil;
* Mar 07, 2013 1759 dgilling Refactored to remove dependency * Mar 07, 2013 1759 dgilling Refactored to remove dependency
* on GfeScriptExecutor. * on GfeScriptExecutor.
* Jun 13, 2013 #2044 randerso Refactored to use IFPServer * Jun 13, 2013 #2044 randerso Refactored to use IFPServer
* Sep 05, 2013 #2307 dgilling Use better PythonScript constructor.
* *
* </pre> * </pre>
* *
@ -96,7 +97,8 @@ public class PurgeGfeGridsRequestHandler implements
String includePath = PyUtil.buildJepIncludePath( String includePath = PyUtil.buildJepIncludePath(
GfePyIncludeUtil.getCommonPythonIncludePath(), GfePyIncludeUtil.getCommonPythonIncludePath(),
GfePyIncludeUtil.getIscScriptsIncludePath()); GfePyIncludeUtil.getIscScriptsIncludePath());
script = new PythonScript(scriptPath, includePath); script = new PythonScript(scriptPath, includePath, this.getClass()
.getClassLoader());
try { try {
Map<String, Object> args = new HashMap<String, Object>(); Map<String, Object> args = new HashMap<String, Object>();
args.put("databaseID", request.getDatabaseID().toString()); args.put("databaseID", request.getDatabaseID().toString());

View file

@ -39,7 +39,6 @@ from com.raytheon.uf.common.time import TimeRange
from com.vividsolutions.jts.geom import Coordinate from com.vividsolutions.jts.geom import Coordinate
from java.awt import Point from java.awt import Point
from com.raytheon.edex.plugin.gfe.server import GridParmManager
from com.raytheon.edex.plugin.gfe.config import IFPServerConfigManager from com.raytheon.edex.plugin.gfe.config import IFPServerConfigManager
from com.raytheon.edex.plugin.gfe.smartinit import IFPDB from com.raytheon.edex.plugin.gfe.smartinit import IFPDB
from com.raytheon.uf.common.dataplugin.gfe import GridDataHistory from com.raytheon.uf.common.dataplugin.gfe import GridDataHistory
@ -82,6 +81,7 @@ from com.raytheon.uf.edex.database.cluster import ClusterTask
# 05/23/13 1759 dgilling Remove unnecessary imports. # 05/23/13 1759 dgilling Remove unnecessary imports.
# 06/05/13 2063 dgilling Change __siteInDbGrid() to # 06/05/13 2063 dgilling Change __siteInDbGrid() to
# call IFPWE.history() like A1. # call IFPWE.history() like A1.
# 09/05/13 2307 dgilling Fix breakage caused by #2044.
# #
# #
@ -565,7 +565,7 @@ class IscMosaic:
grid = self.__validateAdjustWeatherKeys(grid, grid = self.__validateAdjustWeatherKeys(grid,
self.__parmName, tr) self.__parmName, tr)
grid = self.__remap(self.__dbwe.getParmid(), grid, inGeoDict, inFillV) grid = self.__remap(self.__dbwe, grid, inGeoDict, inFillV)
# if rate parm, then may need to adjust the values # if rate parm, then may need to adjust the values
if self.__rateParm and inTimes[i] != tr: if self.__rateParm and inTimes[i] != tr:
@ -1068,13 +1068,12 @@ class IscMosaic:
return grid.astype(numpy.float32) return grid.astype(numpy.float32)
def __remap(self, pid, grid, inGeoDict, inFillV): def __remap(self, we, grid, inGeoDict, inFillV):
gpi = we.getGpi()
gpi = GridParmManager.getGridParmInfo(pid).getPayload()
gridType = gpi.getGridType().toString() gridType = gpi.getGridType().toString()
gs = self.__decodeGridSlice(pid, grid, TimeRange()) gs = self.__decodeGridSlice(we, grid, TimeRange())
pd = self.__decodeProj(inGeoDict) pd = self.__decodeProj(inGeoDict)
fill = inFillV fill = inFillV
@ -1104,9 +1103,10 @@ class IscMosaic:
newGrid = mapper.remap(gs.getDiscreteGrid(), fill, fill) newGrid = mapper.remap(gs.getDiscreteGrid(), fill, fill)
return (newGrid.__numpy__[0], grid[1]) return (newGrid.__numpy__[0], grid[1])
def __decodeGridSlice(self, pid, value, tr, history=None): def __decodeGridSlice(self, we, value, tr, history=None):
pid = we.getParmid()
gpi = we.getGpi()
gpi = GridParmManager.getGridParmInfo(pid).getPayload()
gridType = gpi.getGridType().toString() gridType = gpi.getGridType().toString()
hist = ArrayList() hist = ArrayList()

View file

@ -32,7 +32,9 @@ import jep.JepException;
* SOFTWARE HISTORY * SOFTWARE HISTORY
* Date Ticket# Engineer Description * Date Ticket# Engineer Description
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* Dec 7, 2009 njensen Initial creation * Dec 07, 2009 njensen Initial creation
* Sep 05, 2013 #2307 dgilling Remove constructor without explicit
* ClassLoader.
* *
* </pre> * </pre>
* *
@ -49,22 +51,6 @@ public abstract class PythonInterpreter {
protected Jep jep; protected Jep jep;
/**
* Constructor
*
* @param aFilePath
* the path to the python script
* @param anIncludePath
* the python include path, with multiple directories being
* separated by :
* @throws JepException
*/
public PythonInterpreter(String aFilePath, String anIncludePath)
throws JepException {
jep = new Jep(false, anIncludePath);
initializeJep(aFilePath, null);
}
/** /**
* Constructor * Constructor
* *

View file

@ -1,156 +0,0 @@
/**
* This software was developed and / or modified by Raytheon Company,
* pursuant to Contract DG133W-05-CQ-1067 with the US Government.
*
* U.S. EXPORT CONTROLLED TECHNICAL DATA
* This software product contains export-restricted data whose
* export/transfer/disclosure is restricted by U.S. law. Dissemination
* to non-U.S. persons whether in the United States or abroad requires
* an export license or other authorization.
*
* Contractor Name: Raytheon Company
* Contractor Address: 6825 Pine Street, Suite 340
* Mail Stop B8
* Omaha, NE 68106
* 402.291.0100
*
* See the AWIPS II Master Rights File ("Master Rights File.pdf") for
* further licensing information.
**/
package com.raytheon.uf.common.python;
import java.util.List;
import java.util.Map;
import jep.JepException;
/**
* TODO Add Description
*
* <pre>
* SOFTWARE HISTORY
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Jul 25, 2008 wdougherty Initial creation
* </pre>
*
* @author wdougherty
* @version 1.0
*/
@Deprecated
public class PythonMapScript extends PythonScript {
public PythonMapScript(String filePath, String anIncludePath,
ClassLoader classLoader, List<String> preEvals) throws JepException {
super(filePath, anIncludePath, classLoader, preEvals);
}
public PythonMapScript(String filePath, String anIncludePath,
ClassLoader classLoader) throws JepException {
super(filePath, anIncludePath, classLoader);
}
public PythonMapScript(String script, String includePath)
throws JepException {
super(script, includePath);
}
/**
* Set Python variables in the current script from argmap. For each item in
* the map, see if its value is a string beginning with "::". If it is not,
* create a python variable in this test script whose name is the same as
* the key, and assign it a value equal to the key's value.
*
* @param argmap
* a map of argument names to values
* @throws JepException
* if Jep chokes on the generated code.
*/
public void setArgs(Map<String, Object> argmap) throws JepException {
Object val;
for (String arg : argmap.keySet()) {
if (arg.startsWith("::")) {
continue;
}
val = argmap.get(arg);
evaluateArgument(arg, val);
}
}
/**
* Execute a method in a script. This is basically the same as the execute()
* method of the base PythonScript class, except that it takes a Map of
* argument names to values instead of twin arrays, and it has special
* handling when the key is a String beginning with "::". The purpose of the
* special handling is to allow complicated objects such as tuples and
* arrays to be created in the script with eval() and then used as
* parameters.
*
* @param methodName
* The name of a method to execute.
* @param instanceName
* The name of a class or module within which the method can be
* found.
* @param argmap
* Maps argument names to argument values. Argument names
* beginning with "::" are interpreted as defining variables
* which have already been declared in the script.
* @return The Object produced by executing the method, which may be null.
* @throws JepException
* if Jep chokes on the scripted code.
*/
@Override
public Object execute(String methodName, String instanceName,
Map<String, Object> argmap) throws JepException {
setArgs(argmap);
StringBuilder sb = new StringBuilder();
sb.append(PythonScript.RESULT);
sb.append(" = ");
if (instanceName != null) {
sb.append(instanceName).append(".");
}
sb.append(methodName).append("(");
// add method parameters
String ref;
String sep = "";
for (String arg : argmap.keySet()) {
if ("self".equals(arg)) {
continue;
}
if (arg.startsWith("::")) {
ref = (String) argmap.get(arg);
arg = arg.substring(2);
} else {
ref = arg;
}
sb.append(sep);
sb.append(arg).append("=").append(ref);
sep = ",";
}
sb.append(")");
// run the method
jep.eval(sb.toString());
// get the result
return getExecutionResult();
}
/**
* Interpret an arbitrary Python expression in the script. This is just a
* wrapper around the eval() method of the Jep instance of PythonScript.
*
* @param pythonExpr
* Python expression to interpret.
* @return true if the expression can be interpreted, false otherwise
* (though usually a JepException is thrown).
* @throws JepException
* if Jepp chokes on the expression.
*/
public boolean evaluate(String pythonExpr) throws JepException {
return jep.eval(pythonExpr);
}
}

View file

@ -57,6 +57,8 @@ import jep.JepException;
* Sep 18, 2009 2899 njensen Added cProfile support * Sep 18, 2009 2899 njensen Added cProfile support
* Dec 7, 2009 3310 njensen Separated some functionality up to PythonInterpreter * Dec 7, 2009 3310 njensen Separated some functionality up to PythonInterpreter
* Jun 26, 2012 #776 dgilling Fix leaking of global names. * Jun 26, 2012 #776 dgilling Fix leaking of global names.
* Sep 05, 2013 #2307 dgilling Remove constructor without explicit
* ClassLoader.
* *
* </pre> * </pre>
* *
@ -70,21 +72,6 @@ public class PythonScript extends PythonInterpreter {
protected boolean profile = false; protected boolean profile = false;
/**
* Constructor
*
* @param aFilePath
* the path to the python script
* @param anIncludePath
* the python include path, with multiple directories being
* separated by :
* @throws JepException
*/
public PythonScript(String aFilePath, String anIncludePath)
throws JepException {
super(aFilePath, anIncludePath);
}
/** /**
* Constructor * Constructor
* *

View file

@ -34,11 +34,27 @@ import com.raytheon.uf.common.python.PythonScript;
* through invariant ScriptRequest objects in a concurrent queue. Output from * through invariant ScriptRequest objects in a concurrent queue. Output from
* the scripts is through a concurrent Map based on the id from the * the scripts is through a concurrent Map based on the id from the
* ScriptRequest. * ScriptRequest.
* * <p>
* Why? Currently there are problems when a python script that includes pupynere * Why? Currently there are problems when a python script that includes numpy is
* is disposed of in edex such as leaked memory and errors reloading the library * disposed of in edex such as leaked memory and errors reloading the library
* again. * again.
* <p>
* Instead of using this class it is recommended that developers instead use
* {@link PythonJobCoordinator#newInstance(AbstractPythonScriptFactory<S>)}
* instead to provide multi-threaded Python execution to their code.
*
* <pre>
*
* SOFTWARE HISTORY
*
* Date Ticket# Engineer Description
* ------------ ---------- ----------- --------------------------
* Sep 05, 2013 #2307 dgilling Use better PythonScript constructor,
* mark as Deprecated.
*
* </pre>
*/ */
@Deprecated
public class PythonScriptManager { public class PythonScriptManager {
private static final Object NullScriptResult = new Object(); private static final Object NullScriptResult = new Object();
@ -104,7 +120,8 @@ public class PythonScriptManager {
public void run() { public void run() {
PythonScript script; PythonScript script;
try { try {
script = new PythonScript(scriptPath, pythonIncludePath); script = new PythonScript(scriptPath, pythonIncludePath,
this.getClass().getClassLoader());
} catch (JepException e1) { } catch (JepException e1) {
throw new RuntimeException("Failed to initialize script: " throw new RuntimeException("Failed to initialize script: "
+ scriptPath); + scriptPath);

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<classpath> <classpath>
<classpathentry excluding="*HILOTest.java*|com/raytheon/viz/gfe/core/parm/TestParm.java|com/raytheon/viz/gfe/core/parm/TestParmManager.java|com/raytheon/viz/gfe/ui/runtimeui/TestHazardUtils.java|com/raytheon/viz/gfe/ui/runtimeui/TestSmartScript.java|gov/noaa/nws/ncep/gempak/parameters/colorbar/CLRBARTest.java|gov/noaa/nws/ncep/gempak/parameters/line/LineDataStringParserTest.java" kind="src" path="unit"/> <classpathentry excluding="*HILOTest.java*|com/raytheon/viz/gfe/core/parm/TestParm.java|com/raytheon/viz/gfe/core/parm/TestParmManager.java|com/raytheon/viz/gfe/ui/runtimeui/TestHazardUtils.java|gov/noaa/nws/ncep/gempak/parameters/colorbar/CLRBARTest.java|gov/noaa/nws/ncep/gempak/parameters/line/LineDataStringParserTest.java" kind="src" path="unit"/>
<classpathentry kind="src" path="deploy"/> <classpathentry kind="src" path="deploy"/>
<classpathentry kind="src" path="resources"/> <classpathentry kind="src" path="resources"/>
<classpathentry kind="src" path="integration"/> <classpathentry kind="src" path="integration"/>

View file

@ -5,6 +5,11 @@
<projects> <projects>
</projects> </projects>
<buildSpec> <buildSpec>
<buildCommand>
<name>org.python.pydev.PyDevBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand> <buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name> <name>org.eclipse.jdt.core.javabuilder</name>
<arguments> <arguments>
@ -13,5 +18,6 @@
</buildSpec> </buildSpec>
<natures> <natures>
<nature>org.eclipse.jdt.core.javanature</nature> <nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.python.pydev.pythonNature</nature>
</natures> </natures>
</projectDescription> </projectDescription>

7
tests/.pydevproject Normal file
View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?eclipse-pydev version="1.0"?>
<pydev_project>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.7</pydev_property>
</pydev_project>

View file

@ -34,23 +34,36 @@ idxKL = ["<None>", "one", "two", "three"]
discreteGrid = (idxA, idxKL) discreteGrid = (idxA, idxKL)
from com.raytheon.uf.common.dataplugin.gfe.grid import Grid2DByte from com.raytheon.uf.common.dataplugin.gfe.grid import Grid2DByte
from com.raytheon.viz.gfe.ui.runtimeui import TestSmartScript
numpyByteArray = np.ones((3,3), dtype=np.byte) numpyByteArray = np.ones((3,3), dtype=np.byte)
dimx = 3 dimx = 3
dimy = 3 dimy = 3
def testGetGridShape(): def testGetGridShape(dataMgr):
smartScript = SmartScript.SmartScript(dataMgr)
valueExpected = (145, 145) valueExpected = (145, 145)
valueObtained = smartScript.getGridShape() valueObtained = smartScript.getGridShape()
if not valueExpected==valueObtained: if not valueExpected==valueObtained:
print "valueObtained =", valueObtained print "valueObtained =", valueObtained
return (valueExpected==valueObtained) return (valueExpected==valueObtained)
def testGetGridInfo(model, element, level, timeRange, mostRecentModel=0): def testGetGridInfo(dataMgr, model, element, level, timeRange, mostRecentModel=0):
smartScript = SmartScript.SmartScript(dataMgr)
rtnInfo = smartScript.getGridInfo(model, element, level, timeRange, mostRecentModel) rtnInfo = smartScript.getGridInfo(model, element, level, timeRange, mostRecentModel)
if rtnInfo is not None: if rtnInfo is not None:
gridTime = rtnInfo[0].gridTime() gridTime = rtnInfo[0].gridTime()
if gridTime is None: if gridTime is None:
raise RuntimeError, "gridTime is None" raise RuntimeError, "gridTime is None"
return True return True
def testSortUglyStr(dataMgr, uglyStr):
smartScript = SmartScript.SmartScript(dataMgr)
return smartScript.sortUglyStr(uglyStr)
def testGetIndex(dataMgr, keyList, uglyStr):
smartScript = SmartScript.SmartScript(dataMgr)
return smartScript.getIndex(uglyStr, keyList)
def getParm(dataMgr, model, element, level):
smartScript = SmartScript.SmartScript(dataMgr)
return smartScript.getParm(model, element, level)

View file

@ -42,6 +42,7 @@ import com.raytheon.uf.common.util.FileUtil;
* Oct 23, 2012 1286 djohnson Change to find more localization files. * Oct 23, 2012 1286 djohnson Change to find more localization files.
* Jan 16, 2013 1487 djohnson Avoid adding new localization files to baseline utility directories. * Jan 16, 2013 1487 djohnson Avoid adding new localization files to baseline utility directories.
* May 31, 2013 1650 djohnson Fix incorrect merge from vlab branch. * May 31, 2013 1650 djohnson Fix incorrect merge from vlab branch.
* Sep 05, 2013 2307 dgilling Better handling of directories in getPath().
* *
* </pre> * </pre>
* *
@ -104,7 +105,6 @@ public class TestPathManager extends PathManager {
*/ */
@Override @Override
public File getPath(LocalizationContext context, String fileName) { public File getPath(LocalizationContext context, String fileName) {
File foundFile = null; File foundFile = null;
List<File> utilityDirs = getUtilityDirs(); List<File> utilityDirs = getUtilityDirs();
@ -120,27 +120,42 @@ public class TestPathManager extends PathManager {
// if needed // if needed
} }
final int length = utilityDirs.size(); for (File utilityDir : utilityDirs) {
for (int i = 0; i < length; i++) { File baseDir = new File(utilityDir, context.toPath());
File baseDir = new File(utilityDirs.get(i), context.toPath()); File toFind = new File(baseDir, fileName);
File file = new File(baseDir, fileName); if (toFind.exists()) {
// If it's the final check or if a file exists if (!toFind.getAbsolutePath().startsWith(
if (i == (length - 1) || file.exists()) { savedLocalizationFileDir.getAbsolutePath())) {
foundFile = file; foundFile = createTestIsolatedVersionOfLocalizationFile(
context, fileName, toFind);
} else {
foundFile = toFind;
}
}
// if we found an actual file, we can be reasonably sure there's
// only one file in the whole project with that name and can
// stop looking. However, if we found a directory there may be
// multiple plugins contributing to that directory and we have
// to search the whole collection of directories to be sure
// we've got all files that belong in that dir.
if (toFind.isFile()) {
break; break;
} }
} }
if (foundFile == null if (foundFile != null) {
|| foundFile.getAbsolutePath().startsWith(
savedLocalizationFileDir.getAbsolutePath())) {
return foundFile; return foundFile;
} else {
// Have to create a default File and the previous revision's
// behavior was just to use the last File in utilityDirs. This
// ensures that the path desired gets created as empty.
return createTestIsolatedVersionOfLocalizationFile(context,
fileName,
new File(utilityDirs.get(utilityDirs.size() - 1),
fileName));
} }
File savedFile = createTestIsolatedVersionOfLocalizationFile(
context, fileName, foundFile);
return savedFile;
} }
/** /**

View file

@ -19,16 +19,23 @@
**/ **/
package com.raytheon.viz.gfe.ui.runtimeui; package com.raytheon.viz.gfe.ui.runtimeui;
import static org.junit.Assert.assertTrue;
import java.io.File; import java.io.File;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import jep.JepException; import jep.JepException;
import junit.framework.TestCase;
import org.junit.Ignore; import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import com.raytheon.uf.common.dataplugin.gfe.python.GfePyIncludeUtil;
import com.raytheon.uf.common.localization.PathManagerFactoryTest;
import com.raytheon.uf.common.python.PyUtil;
import com.raytheon.uf.common.python.PythonScript; import com.raytheon.uf.common.python.PythonScript;
import com.raytheon.uf.common.time.TimeRange; import com.raytheon.uf.common.time.TimeRange;
@ -39,65 +46,51 @@ import com.raytheon.uf.common.time.TimeRange;
* SOFTWARE HISTORY * SOFTWARE HISTORY
* Date Ticket# Engineer Description * Date Ticket# Engineer Description
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* Aug 1, 2008 wdougherty Initial creation * Aug 01, 2008 wdougherty Initial creation
* Sep 05, 2013 #2307 dgilling Fix test case.
* </pre> * </pre>
* *
* @author wdougherty * @author wdougherty
* @version 1.0 * @version 1.0
*/ */
// TODO fix? public class TestAbsTime {
@Ignore
public class TestAbsTime extends TestCase {
protected static final String testScriptName = "ROOT/build/static/common/cave/etc/gfe/userPython/tests/TestAbsTime.py"; private static final File SCRIPT_FILE = new File(
"./python/gfe/TestAbsTime.py");
protected static final String smartScriptPath = "ROOT/build/static/common/cave/etc/gfe/userPython/utilities" private PythonScript testScript = null;
+ ":ROOT/build"
+ ":ROOT/AWIPSEdex/opt/utility/common_static/base/python/gfe"
+ ":ROOT/AWIPSEdex/opt/utility/common_static/base/python"
+ ":ROOT/AWIPSEdex/extensions/plugin-gfe/src";
PythonScript testScript; @BeforeClass
public static void setUpBeforeClass() throws Exception {
PathManagerFactoryTest.initLocalization();
}
/* @Before
* (non-Javadoc)
*
* @see junit.framework.TestCase#setUp()
*/
@Override
public void setUp() throws Exception { public void setUp() throws Exception {
String includePath = PyUtil.buildJepIncludePath(
GfePyIncludeUtil.getCommonPythonIncludePath(),
GfePyIncludeUtil.getCommonGfeIncludePath(),
GfePyIncludeUtil.getUtilitiesIncludePath());
try { try {
// Set up an interpreter that can run Python with Java classes. testScript = new PythonScript(SCRIPT_FILE.getPath(), includePath,
// Hopefully, using user.home will make this portable to any this.getClass().getClassLoader());
// developer.
String root = System.getProperty("user.home") + File.separator
+ "workspace";
testScript = new PythonScript(testScriptName.replaceAll("ROOT",
root), smartScriptPath.replaceAll("ROOT", root));
} catch (JepException e) { } catch (JepException e) {
throw new Exception(e); throw new Exception(e);
} }
} }
/* @After
* (non-Javadoc) public void tearDown() throws Exception {
* if (testScript != null) {
* @see junit.framework.TestCase#tearDown() testScript.dispose();
*/ }
@Override
public void tearDown() {
// Free any resources the previous interpreter used.
testScript.dispose();
} }
/** @Test
* @throws Exception
*/
public void testAbsTimeZero() throws Exception { public void testAbsTimeZero() throws Exception {
Map<String, Object> emptyMap = new HashMap<String, Object>(); Map<String, Object> emptyMap = Collections.emptyMap();
try { try {
Date now = new Date(); Date now = new Date();
// AbsTime truncates to the nearest second. Wait one second // AbsTime truncates to the nearest second. Wait one second

View file

@ -19,22 +19,33 @@
**/ **/
package com.raytheon.viz.gfe.ui.runtimeui; package com.raytheon.viz.gfe.ui.runtimeui;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File; import java.io.File;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import jep.JepException; import jep.JepException;
import junit.framework.TestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import com.raytheon.uf.common.python.PythonMapScript; import com.raytheon.uf.common.dataplugin.gfe.python.GfePyIncludeUtil;
import com.raytheon.uf.common.localization.PathManagerFactoryTest;
import com.raytheon.uf.common.python.PyUtil;
import com.raytheon.uf.common.python.PythonScript;
import com.raytheon.uf.common.time.TimeRange; import com.raytheon.uf.common.time.TimeRange;
import com.raytheon.viz.gfe.Activator;
import com.raytheon.viz.gfe.core.DataManager; import com.raytheon.viz.gfe.core.DataManager;
import com.raytheon.viz.gfe.core.FakeDataManager; import com.raytheon.viz.gfe.core.FakeDataManager;
import com.raytheon.viz.gfe.core.internal.AbstractParmManager; import com.raytheon.viz.gfe.core.IParmManager;
import com.raytheon.viz.gfe.core.internal.MockParmManager; import com.raytheon.viz.gfe.core.internal.MockParmManager;
import com.raytheon.viz.gfe.core.parm.Parm; import com.raytheon.viz.gfe.core.parm.Parm;
import com.raytheon.viz.gfe.core.parm.Parm.CreateFromScratchMode; import com.raytheon.viz.gfe.core.parm.Parm.CreateFromScratchMode;
@ -46,145 +57,66 @@ import com.raytheon.viz.gfe.core.parm.Parm.CreateFromScratchMode;
* SOFTWARE HISTORY * SOFTWARE HISTORY
* Date Ticket# Engineer Description * Date Ticket# Engineer Description
* ------------ ---------- ----------- -------------------------- * ------------ ---------- ----------- --------------------------
* Jul 24, 2008 wdougherty Initial creation * Jul 24, 2008 wdougherty Initial creation
* Sep 05, 2013 #2307 dgilling Code cleanup
* </pre> * </pre>
* *
* @author wdougherty * @author wdougherty
* @version 1.0 * @version 1.0
*/ */
public class TestSmartScript extends TestCase { @Ignore
// FIXME: This test case is currently broken because of a NullPOinterException
// in AbstractSpatialDisplayManager
// Activator.getDefault() is returning null at the moment.
public class TestSmartScript {
protected static final String testScriptName = "ROOT/build/static/common/cave/etc/gfe/userPython/tests/TestSmartScript.py"; private static final String SCRIPT_FILE_PATH = new File(
"./python/gfe/TestSmartScript.py").getPath();
protected static final String smartScriptPath = "ROOT/build/static/common/cave/etc/gfe/userPython/utilities" private PythonScript testScript = null;
+ ":ROOT/build"
+ ":ROOT/AWIPSEdex/opt/utility/common_static/base/python/gfe"
+ ":ROOT/AWIPSEdex/opt/utility/common_static/base/python"
+ ":ROOT/AWIPSEdex/extensions/plugin-gfe/src";
/** private DataManager dataMgr;
* A PythonScript. All PythonScript's constructors are protected, so we have
* to create this subclass in order to obtain an instance. While we're at
* it, create a modified execute() method and a helper method for setting
* groups of script variables.
*
*/
PythonMapScript testScript; @BeforeClass
public static void setUpBeforeClass() throws Exception {
PathManagerFactoryTest.initLocalization();
}
Map<String, Object> argmap; @Before
/*
* (non-Javadoc)
*
* @see junit.framework.TestCase#setUp()
*/
@Override
public void setUp() throws Exception { public void setUp() throws Exception {
FakeDataManager fakeDataMgr = new FakeDataManager();
IParmManager pm = new MockParmManager(fakeDataMgr);
fakeDataMgr.setParmManager(pm);
dataMgr = fakeDataMgr;
String includePath = PyUtil.buildJepIncludePath(
GfePyIncludeUtil.getCommonPythonIncludePath(),
GfePyIncludeUtil.getCommonGfeIncludePath(),
GfePyIncludeUtil.getUtilitiesIncludePath());
try { try {
// Create a DataManager to pass to the SmartScript constructor. testScript = new PythonScript(SCRIPT_FILE_PATH, includePath, this
DataManager dataManager = null; .getClass().getClassLoader());
Activator activator = Activator.getDefault();
if (activator == null) {
FakeDataManager fakeDataManager = new FakeDataManager();
AbstractParmManager pm = new MockParmManager(fakeDataManager);
fakeDataManager.setParmManager(pm);
dataManager = fakeDataManager;
} else {
dataManager = DataManager.getInstance(null);
}
// Set up an interpreter that can run Python with Java classes.
// Hopefully, using user.home will make this portable to any
// developer.
String root = System.getProperty("user.home") + File.separator
+ "workspace";
ClassLoader classLoader = dataManager.getClass().getClassLoader();
testScript = new PythonMapScript(testScriptName.replaceAll("ROOT",
root), smartScriptPath.replaceAll("ROOT", root),
classLoader);
// Put the data manager in the interpreter
Map<String, Object> setupMap = new HashMap<String, Object>();
setupMap.put("dataManager", dataManager);
testScript.setArgs(setupMap);
// Create a SmartScript instance for use by the tests.
boolean evalResult;
evalResult = testScript
.evaluate("smartScript = SmartScript.SmartScript(dataManager)");
// If eval somehow failed without throwing a JepException, fail.
assertTrue(evalResult);
// Create an argmap to pass parameters in.
argmap = new HashMap<String, Object>();
} catch (JepException e) { } catch (JepException e) {
throw new Exception(e); throw new Exception(e);
} }
} }
/* @After
* (non-Javadoc) public void tearDown() throws Exception {
* if (testScript != null) {
* @see junit.framework.TestCase#tearDown() testScript.dispose();
*/
@Override
public void tearDown() {
// Free any resources the previous interpreter used.
testScript.dispose();
}
/**
* Test the createGrid method of SmartScript.py when creating a discrete
* grid.
*
* NOTE: This test currently throws an exception because one of the objects
* supplied by MockParmManager always has a grid type of "SCALAR", which
* leads to a ClassCastException in the grid cycler when SmartScript passes
* a byte grid and keys to the grid cycler. If the code in the grid cycler
* is hacked to force the grid type to "DISCRETE" for the test, it completes
* successfully.
*/
@Test
public void testCreateGridDiscrete() throws Exception {
argmap.put("model", "Fcst");
argmap.put("element", "hazXXX1234");
argmap.put("elementType", "DISCRETE");
argmap.put("timeRange", new TimeRange(new Date(), 10 * 3600 * 1000L));
argmap.put("descriptiveName", "Discrete Test Grid");
argmap.put("::timeConstraints", "tcTuple");
argmap.put("units", "");
argmap.put("::discreteKeys", "dkList");
argmap.put("discreteOverlap", Boolean.FALSE);
argmap.put("discreteAuxDataLength", Integer.valueOf(4));
argmap.put("defaultColorTable", "YesNo");
argmap.put("::numericGrid", "discreteGrid");
Object obj = null;
try {
if (!testScript.evaluate("tcTuple = (1000, 1200, 600)")) {
throw new Exception("eval(\"tcTuple... failed.");
}
if (!testScript
.evaluate("dkList = ['One', ('Singular', 'Sensation')]")) {
throw new Exception("eval(\"dklist = ... failed.");
}
obj = testScript.execute("createGrid", "smartScript", argmap);
} catch (JepException e) {
throw new Exception(e);
} }
} }
/**
* @throws Exception
*/
@Test @Test
public void testSortUglyStr() throws Exception { public void testSortUglyStr() throws Exception {
Map<String, Object> argmap = new HashMap<String, Object>(2, 1.0f);
argmap.put("uglyStr", "I^AM^THE^CAPTAIN^OF^PINAFORE"); argmap.put("uglyStr", "I^AM^THE^CAPTAIN^OF^PINAFORE");
argmap.put("dataMgr", dataMgr);
String outstr = null; String outstr = null;
try { try {
outstr = (String) testScript.execute("sortUglyStr", "smartScript", outstr = (String) testScript.execute("testSortUglyStr", null,
argmap); argmap);
} catch (JepException e) { } catch (JepException e) {
throw new Exception(e); throw new Exception(e);
@ -194,43 +126,34 @@ public class TestSmartScript extends TestCase {
@Test @Test
public void testGetIndex() throws Exception { public void testGetIndex() throws Exception {
Map<String, Object> argmap = new HashMap<String, Object>(3, 1.0f);
argmap.put("dataMgr", dataMgr);
String key1 = "Twas^Brillig^and^the^slithy^toves"; String key1 = "Twas^Brillig^and^the^slithy^toves";
String key2 = "Did^gyre^and^gimbol^in^the^wabe"; String key2 = "Did^gyre^and^gimbol^in^the^wabe";
String key3 = "Twas^Brillig^and"; String key3 = "Twas^Brillig^and";
String key4 = "and^slithy^the^toves^Brillig^Twas"; String key4 = "and^slithy^the^toves^Brillig^Twas";
List<String> keyList = Arrays.asList(key1, key2, key3, key4);
argmap.put("keyList", keyList);
Integer outInt = null; for (int i = 0; i < keyList.size(); i++) {
try { Integer outInt = null;
testScript.evaluate("keyList = []"); argmap.put("uglyStr", keyList.get(i));
argmap.put("::keys", "keyList"); try {
argmap.put("uglyStr", key1); outInt = (Integer) testScript.execute("testGetIndex", null,
outInt = (Integer) testScript.execute("getIndex", "smartScript", argmap);
argmap); assertEquals("key" + (i + 1), i, outInt.intValue());
assertEquals("key1", 0, outInt.intValue()); } catch (JepException e) {
throw new Exception(e);
argmap.put("uglyStr", key2); }
outInt = (Integer) testScript.execute("getIndex", "smartScript",
argmap);
assertEquals("key2", 1, outInt.intValue());
argmap.put("uglyStr", key3);
outInt = (Integer) testScript.execute("getIndex", "smartScript",
argmap);
assertEquals("key3", 2, outInt.intValue());
argmap.put("uglyStr", key4);
outInt = (Integer) testScript.execute("getIndex", "smartScript",
argmap);
assertEquals("key4", 0, outInt.intValue());
} catch (JepException e) {
throw new Exception(e);
} }
} }
@Test @Test
public void testGetGridShape() throws Exception { public void testGetGridShape() throws Exception {
try { try {
Map<String, Object> argmap = new HashMap<String, Object>(1, 1.0f);
argmap.put("dataMgr", dataMgr);
Boolean testResult = (Boolean) testScript.execute( Boolean testResult = (Boolean) testScript.execute(
"testGetGridShape", null, argmap); "testGetGridShape", null, argmap);
assertTrue("Tuples should match", testResult); assertTrue("Tuples should match", testResult);
@ -241,16 +164,18 @@ public class TestSmartScript extends TestCase {
@Test @Test
public void testGetGridInfo() throws Exception { public void testGetGridInfo() throws Exception {
Map<String, Object> argmap = new HashMap<String, Object>(5, 1.0f);
argmap.put("dataMgr", dataMgr);
argmap.put("model", "Fcst"); argmap.put("model", "Fcst");
argmap.put("element", "Hazards"); argmap.put("element", "Hazards");
argmap.put("level", "SFC"); argmap.put("level", "SFC");
Parm parm = null; Parm parm = null;
try { try {
parm = (Parm) testScript.execute("getParm", "smartScript", argmap); parm = (Parm) testScript.execute("getParm", null, argmap);
} catch (JepException e1) { } catch (JepException e) {
throw new Exception(e1); throw new Exception(e);
} }
assertNotNull("Retrieved Hazards_SFC parm.", parm);
TimeRange tr = new TimeRange(new Date(), 1000L); TimeRange tr = new TimeRange(new Date(), 1000L);
boolean created = parm.createFromScratchTR(tr, boolean created = parm.createFromScratchTR(tr,
@ -272,6 +197,5 @@ public class TestSmartScript extends TestCase {
} catch (JepException e) { } catch (JepException e) {
throw new Exception(e); throw new Exception(e);
} }
} }
} }