Class PrePy

  • Direct Known Subclasses:
    Py

    public class PrePy
    extends java.lang.Object
    This class is part of the Jython run-time system, and contains only "pre-Python" data and methods that may safely be used before the type system is ready. The Jython type system springs into existence in response to a program's first use of any PyObject, for example when creating the first interpreter. When preparing an application (from the command line options, say) for creation of the first interpreter, it useful to defer type system creation until pre-Python configuration is complete. See PEP 432 for further rationale.

    Creation of the type system may happen as a side effect of referring using (almost) any object from a class that statically refers to a PyObject, for example Py or PySystemState. The present class is intended to hold utility methods and configuration useful in the pre-Python phase.

    • Constructor Summary

      Constructors 
      Constructor Description
      PrePy()  
    • Method Summary

      All Methods Static Methods Concrete Methods 
      Modifier and Type Method Description
      static java.lang.String getCommandResult​(java.lang.String... command)
      Run a command as a sub-process and return as the result the first line of output that consists of more than white space.
      static java.lang.String getDefaultBinDir()
      Infers the usual Jython bin-dir from the position of the jar-file returned by getJarFileName() byr replacing the file name with "bin".
      static java.lang.String getDefaultExecutableName()
      Infers the usual Jython executable name from the position of the jar-file returned by getJarFileName() by replacing the file name with "bin/jython".
      static java.lang.String getJarFileName()
      Utility-method to obtain the name (including absolute path) of the currently used jython-jar-file.
      static java.lang.String getJarFileNameFromURL​(java.net.URL url)
      Return the path in the file system (as a string) of a JAR located by a URL.
      static java.util.logging.Level getLoggingLevel()
      Convenience function to get the effective level of Logger "org.python".
      static java.util.Properties getSystemProperties()
      Get the System properties if we are allowed to.
      static java.lang.String getSystemProperty​(java.lang.String key, java.lang.String defaultValue)
      Get a System property if it is defined, not null, and we are allowed to access it, otherwise return the given default.
      static boolean haveConsole()
      Return true iff the console is accessible through System.console().
      static void increaseLoggingLevel​(int n)
      Adjust the level of the Jython logger "org.python" using the traditional "verbosity" system: the bigger the number, the lower the logging threshold.
      static boolean isInteractive()
      Determine whether standard input is an interactive stream.
      static boolean isInteractive​(java.io.InputStream fp, java.lang.String filename)
      Check whether an input stream is interactive.
      static java.util.logging.Level levelFromVerbosity​(int verbosity)
      Translate from the traditional "verbosity" system to JUL Level.
      static void maybeWrite​(java.lang.String type, java.lang.String msg, int verbosity)
      Log a message at a specified level (if that level is not below the threshold).
      static java.util.logging.Level setLoggingLevel​(java.util.logging.Level newLevel)
      Set the level of the Jython logger "org.python" using the standard java.util.logging scale.
      static int verbosityFromLevel​(java.util.logging.Level level)
      Translate from JUL Level to equivalent in the traditional "verbosity" system.
      static void writeComment​(java.lang.String type, java.lang.String msg)
      Submit a message to logging at the severity level COMMENT.
      static void writeDebug​(java.lang.String type, java.lang.String msg)
      Submit a message to logging at the severity level DEBUG.
      static void writeError​(java.lang.String type, java.lang.String msg)
      Submit a message to logging at the severity level ERROR.
      static void writeMessage​(java.lang.String type, java.lang.String msg)
      Submit a message to logging at the severity level MESSAGE.
      static void writeWarning​(java.lang.String type, java.lang.String msg)
      Submit a message to logging at the severity level WARNING.
      • Methods inherited from class java.lang.Object

        equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • PrePy

        public PrePy()
    • Method Detail

      • levelFromVerbosity

        public static java.util.logging.Level levelFromVerbosity​(int verbosity)
        Translate from the traditional "verbosity" system to JUL Level. We allow Jython verbosity values beyond the conventional range, treating values <ERROR as ERROR (that is Level.SEVERE) and values >DEBUG (that is Level.FINE) as FINER, FINEST and ALL.
        Parameters:
        verbosity - any integer verbosity, where the runtime default MESSAGE = 1
        Returns:
        a corresponding level where the default MESSAGE produces Level.INFO.
      • verbosityFromLevel

        public static int verbosityFromLevel​(java.util.logging.Level level)
        Translate from JUL Level to equivalent in the traditional "verbosity" system. We return Jython verbosity values beyond the conventional range, enough to enumerate the Java standard levels (e.g FINER returns 4 and ALL returns 6 ).
        Parameters:
        level - java.util.logging.Level to translate.
        Returns:
        integer verbosity, where the runtime default INFO = 1
      • getLoggingLevel

        public static java.util.logging.Level getLoggingLevel()
        Convenience function to get the effective level of Logger "org.python".
      • setLoggingLevel

        public static java.util.logging.Level setLoggingLevel​(java.util.logging.Level newLevel)
        Set the level of the Jython logger "org.python" using the standard java.util.logging scale. For backward compatibility with the traditional "verbosity" system, make a corresponding setting of Options.verbose.
        Parameters:
        newLevel - to set
        Returns:
        previous logging level
      • increaseLoggingLevel

        public static void increaseLoggingLevel​(int n)
        Adjust the level of the Jython logger "org.python" using the traditional "verbosity" system: the bigger the number, the lower the logging threshold. This is primarily for the command-line Jython, where each "-v" increases the verbosity by one, on the java.util.logging scale.
        Parameters:
        n - increment on the scale 1=INFO, 2=CONFIG, 3=FINE, ...
      • maybeWrite

        public static void maybeWrite​(java.lang.String type,
                                      java.lang.String msg,
                                      int verbosity)
        Log a message at a specified level (if that level is not below the threshold).
      • writeError

        public static void writeError​(java.lang.String type,
                                      java.lang.String msg)
        Submit a message to logging at the severity level ERROR.
      • writeWarning

        public static void writeWarning​(java.lang.String type,
                                        java.lang.String msg)
        Submit a message to logging at the severity level WARNING.
      • writeMessage

        public static void writeMessage​(java.lang.String type,
                                        java.lang.String msg)
        Submit a message to logging at the severity level MESSAGE.
      • writeComment

        public static void writeComment​(java.lang.String type,
                                        java.lang.String msg)
        Submit a message to logging at the severity level COMMENT.
      • writeDebug

        public static void writeDebug​(java.lang.String type,
                                      java.lang.String msg)
        Submit a message to logging at the severity level DEBUG.
      • getSystemProperties

        public static java.util.Properties getSystemProperties()
        Get the System properties if we are allowed to. Configuration values set via -Dprop=value to the java command will be found here. If a security manager prevents access, we will return a new (empty) object instead.
        Returns:
        System properties or a new Properties object
      • getSystemProperty

        public static java.lang.String getSystemProperty​(java.lang.String key,
                                                         java.lang.String defaultValue)
        Get a System property if it is defined, not null, and we are allowed to access it, otherwise return the given default.
        Parameters:
        key - of the entry to return
        defaultValue - to return if null or disallowed
        Returns:
        property value or given default
      • isInteractive

        public static boolean isInteractive()
        Determine whether standard input is an interactive stream. If the Java system property python.launcher.tty is defined and equal to true or false, then that provides the result. This property is normally supplied by the launcher. In the absence of this certainty, we use haveConsole().
        Returns:
        true if (we think) standard input is an interactive stream
      • haveConsole

        public static boolean haveConsole()
        Return true iff the console is accessible through System.console().
      • isInteractive

        public static boolean isInteractive​(java.io.InputStream fp,
                                            java.lang.String filename)
        Check whether an input stream is interactive. This emulates CPython Py_FdIsInteractive within the constraints of pure Java. The input stream is considered ``interactive'' if either
        1. it is System.in and isInteractive() is true, or
        2. the -i flag was given (Options.interactive=true), and the filename associated with it is null or "<stdin>" or "???".
        Parameters:
        fp - stream (tested only for System.in)
        filename -
        Returns:
        true iff thought to be interactive
      • getDefaultExecutableName

        public static java.lang.String getDefaultExecutableName()
        Infers the usual Jython executable name from the position of the jar-file returned by getJarFileName() by replacing the file name with "bin/jython". This is intended as an easy fallback for cases where sys.executable is None due to direct launching via the java executable.

        Note that this does not necessarily return the actual executable, but instead infers the place where it is usually expected to be. Use sys.executable to get the actual executable (may be None.

        Returns:
        usual Jython-executable as absolute path
      • getDefaultBinDir

        public static java.lang.String getDefaultBinDir()
        Infers the usual Jython bin-dir from the position of the jar-file returned by getJarFileName() byr replacing the file name with "bin". This is intended as an easy fallback for cases where sys.executable is null due to direct launching via the java executable.

        Note that this does not necessarily return the actual bin-directory, but instead infers the place where it is usually expected to be.

        Returns:
        usual Jython bin-dir as absolute path
      • getJarFileName

        public static java.lang.String getJarFileName()
        Utility-method to obtain the name (including absolute path) of the currently used jython-jar-file. Usually this is jython.jar, but can also be jython-dev.jar or jython-standalone.jar or something custom.
        Returns:
        the full name of the jar file containing this class, null if not available.
      • getJarFileNameFromURL

        public static java.lang.String getJarFileNameFromURL​(java.net.URL url)
        Return the path in the file system (as a string) of a JAR located by a URL. Three protocols are supported, Java JAR-file protocol, and two JBoss protocols "vfs" and "vfszip".

        The JAR-file protocol URL, which must be a jar:file: reference to a contained element (that is, it has a "!/" part) is able to identify an actual JAR in a file system that may then be opened using jarFile = new JarFile(jarFileName). The path to the JAR is returned. If the JAR is accessed by another mechanism (http: say) this will fail.

        The JBoss URL must be a reference to exactly vfs:<JAR>/org/python/core/PySystemState.class, or the same thing using the vfszip: protocol, where <JAR> stands for the absolute path to the Jython JAR in VFS. There is no "!/" marker: in JBoss VFS a JAR is treated just like a directory and can no longer be opened as a JAR. The method essentially just swaps a VFS protocol for the Java file: protocol. The path returned will be correct only if this naive swap is valid.

        Parameters:
        url - into the JAR
        Returns:
        the file path or null in the event of a detectable error
      • getCommandResult

        public static java.lang.String getCommandResult​(java.lang.String... command)
        Run a command as a sub-process and return as the result the first line of output that consists of more than white space. It returns "" on any kind of error.
        Parameters:
        command - as strings (as for ProcessBuilder)
        Returns:
        the first line with content, or ""