Class ScriptManager

java.lang.Object
com.inductiveautomation.ignition.common.script.ScriptManager

public class ScriptManager extends Object
  • Field Details

  • Constructor Details

    • ScriptManager

      public ScriptManager(String contextName)
      Initializes ScriptManager without a path to 3rd party system Python modules. Use this constructor if asynchInit has already been called and the path initialized, as a second call will be ignored.
    • ScriptManager

      public ScriptManager(String contextName, String pathToExternalLibs)
  • Method Details

    • shutdown

      public void shutdown()
    • addStdOutStream

      public void addStdOutStream(OutputStream os)
    • removeStdOutStream

      public void removeStdOutStream(OutputStream os)
    • addStdErrStream

      public void addStdErrStream(OutputStream os)
    • removeStdErrStream

      public void removeStdErrStream(OutputStream os)
    • setContextName

      public void setContextName(String name)
      Resets this script manager's context name, which only affects logging
    • setState

      protected void setState()
      Sets the python thread state to our PySystemState
    • asynchInit

      public static void asynchInit(String pathToExternalLibs)
      Initialize the Jython System. If this is the first time that the system is initialized, Then it will be a somewhat lengthy processes, as the system package manager reads all system jars and caches them to a temp directory. This method allows the init method to safely be run in a background thread, because the constructor will wait for it to be done
    • asynchInit

      public static void asynchInit()
    • createUtf8PySystemState

      public static org.python.core.PySystemState createUtf8PySystemState(OutputStream stdOut, OutputStream stdErr)
      Initializes a PySystemState and sets the default encoding to utf-8. Also wraps the supplied output stream in a PyFile that has the encoding set to utf-8.
      Parameters:
      stdOut - the standard output stream
      stdErr - the standard error stream
      Returns:
      a new PySystemState
    • addScriptModule

      public void addScriptModule(String path, String moduleCode)
      Adds a script module on the given path (e.g. "app.foo" or "shared.mystuff"). Uses legacy Python21 scoping style.
    • addScriptModule

      public void addScriptModule(String path, String moduleCode, ScriptScopeStyle scopeStyle)
    • addScriptModule

      public void addScriptModule(String path, Class<?> javaFunctionClass)

      Expose all static methods of javaFunctionClass as scripting functions. Also exposes all static fields.

      These functions will be part of the auto-complete system, but will not have any documentation provided. To provide documentation as well use addScriptModule(String, Class, ScriptFunctionDocProvider).

      Parameters:
      path - The namespace to add these functions to i.e. "system.net".
      javaFunctionClass - The Class to search for static methods.
    • addScriptModule

      public void addScriptModule(String path, Class<?> javaFunctionClass, ScriptFunctionDocProvider docProvider)

      Expose all static methods of javaFunctionClass as scripting functions. Also exposes all static fields.

      Parameters:
      path - The namespace to add these functions to i.e. "system.net".
      javaFunctionClass - The Class to search for static methods.
      docProvider - A ScriptFunctionDocProvider that can produce documentation for use in the hints system.
    • addScriptModule

      public void addScriptModule(String path, Object obj)

      Expose all static and instance methods of obj as scripting functions. Also exposes all static fields.

      These functions will be part of the auto-complete system, but will not have any documentation provided. To provide documentation as well use addScriptModule(String, Class, ScriptFunctionDocProvider).

      Parameters:
      path - The namespace to add these functions to i.e. "system.net".
      obj - The Object to search for static methods.
    • addScriptModule

      public void addScriptModule(String path, Object obj, ScriptFunctionDocProvider docProvider)

      Expose all static and instance methods of obj as scripting functions. Also exposes all static fields.

      Parameters:
      path - The namespace to add these functions to i.e. "system.net".
      obj - The Object to search for static methods.
      docProvider - A ScriptFunctionDocProvider that can produce documentation for use in the hints system
    • addStaticFields

      public void addStaticFields(String path, Class<?> clazz)
      Adds all public static final fields defined by this class as python variables in the given path.
    • clearAppModule

      public void clearAppModule()
    • clearModule

      public void clearModule(String moduleName)
      Clears the given module's internal mapping
    • clearProjectScriptModules

      public void clearProjectScriptModules()
      Removes all project resource script modules
    • clearThirdPartyModules

      public void clearThirdPartyModules()
      Removes all modules that are not default to Ignition or have been added from project resources
    • createLocalsMap

      public org.python.core.PyStringMap createLocalsMap()
      Creates a new local namespace with the 'system', 'fpmi', ['app'], and project resource packages imported automatically.
    • getGlobals

      public org.python.core.PyStringMap getGlobals()
      Provides programmatic access to the global map
    • addGlobalVariable

      public void addGlobalVariable(String name, org.python.core.PyObject value)
    • runCode

      public void runCode(String code, org.python.core.PyObject locals, String filename) throws JythonExecException
      Compiles and then runs some python code with the given locals map. Uses Python21 style scoping (shared global namespace)
      Parameters:
      code - the python script
      locals - locals map
      filename - source file name
      Throws:
      JythonExecException - ex
      See Also:
    • runCode

      public void runCode(org.python.core.PyCode code, org.python.core.PyObject locals) throws JythonExecException
      Runs compiled python code with the given locals map. Uses Python21 style scoping (shared global namespace)
      Parameters:
      code - the compiled python code
      locals - locals map
      Throws:
      JythonExecException - ex
      See Also:
    • runCode

      public void runCode(String code, org.python.core.PyObject locals, org.python.core.PyObject globals, String filename) throws JythonExecException
      Compiles and then runs some python code with the given locals map and globals map. Uses Python21 or Python25 style scoping, depending on the supplied globals map.
      Parameters:
      code - the python script
      locals - locals map
      globals - globals map
      filename - source file name
      Throws:
      JythonExecException - ex
      See Also:
    • runCode

      public void runCode(org.python.core.PyCode code, org.python.core.PyObject locals, org.python.core.PyObject globals) throws JythonExecException
      Runs compiled python code with the given locals map and globals map.
      Parameters:
      code - the compiled python code
      locals - locals map
      globals - globals map. If null, Python21 style scoping is used (shared global namespace).
      Throws:
      JythonExecException - ex
    • configureScriptContext

      protected void configureScriptContext()
    • runFunction

      public org.python.core.PyObject runFunction(org.python.core.PyObject function, org.python.core.PyObject... arguments) throws JythonExecException
      Throws:
      JythonExecException
    • runFunction

      public org.python.core.PyObject runFunction(org.python.core.PyObject function, org.python.core.PyObject[] arguments, String[] keywords) throws JythonExecException
      Throws:
      JythonExecException
    • compileFunction

      public ScriptFunction compileFunction(String code) throws org.python.core.PyException, JythonExecException, ScriptManager.UndefinedFunctionException
      Compiles a function definition (normally generated through the Extension Function style scripting system), and returns a compiled function that can be used and reused. The function name will be extracted from the definition, so the code is expected to start with "def funcName(..."
      Throws:
      org.python.core.PyException - ex
      JythonExecException - ex
      ScriptManager.UndefinedFunctionException - ex
    • compileFunction

      public ScriptFunction compileFunction(String id, String functionName, String code) throws org.python.core.PyException, JythonExecException, ScriptManager.UndefinedFunctionException
      Overload of compileFunction that allows the caller to define the identifier used for the compiled object, and the method to extract from the code. This version is necessary if the code provided might define multiple functions.
      Throws:
      org.python.core.PyException - ex
      JythonExecException - ex
      ScriptManager.UndefinedFunctionException - ex
    • beginCompileTimer

      public com.codahale.metrics.Timer.Context beginCompileTimer()
      If you are gonig to call Py.compile_flags(String, String, CompileMode, CompilerFlags), you should associate the effort with your intended ScriptManager's timer metric.
    • getCompileTimer

      public com.codahale.metrics.Timer getCompileTimer()
    • getExecutionTimer

      public com.codahale.metrics.Timer getExecutionTimer()
    • setPaused

      public void setPaused(boolean paused)
      Sets the script manager to be 'paused'. When paused, scripts simply don't run at all.
    • getHintsMap

      public Map<String,List<ScriptFunctionHint>> getHintsMap()
      Maps the first element of hint path to the entire path, e.g.:

       "path" -> ["path.to.autocomplete", "path.for.somethingelse"]
       
      Returns:
      The hints map.
    • interrupt

      public static void interrupt(@Nonnull Long threadId)
    • getUUID

      public UUID getUUID()
      Returns:
      The UUID of this script manager, which can be used by other systems to determine if the script manager has recently been replaced (perhaps due to installing an updated module).
    • validatePackageName

      @Deprecated public boolean validatePackageName(String newName)
      Deprecated.
      Prefer ModuleLibrary's static validation methods - you can use getModules() to retrieve this manager's loaded modules to check against.
      Parameters:
      newName - the proposed new package name
      Returns:
      true if the package does not exist in the system modules, and thus can safely be used as a new package name without conflicts
    • getModules

      public org.python.core.PyStringMap getModules()
    • main

      public static void main(String[] args)
    • executingScripts

      public static Set<ScriptManager.ExecutionInfo> executingScripts()