Class Loader

java.lang.Object
uk.ac.starlink.util.Loader

public class Loader extends Object
Provides utilities associated with loading resources.
Author:
Mark Taylor (Starlink)
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final String
    Name of the file in the user's home directory from which properties are loaded.
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static void
    Checks that the JRE contains classes that you'd expect it to.
    static void
    Checks the reported vendor for this J2SE.
    static <T> T
    getClassInstance(String classSpec, Class<T> type)
    Attempts to obtain an instance of a class with a given name which is an instance of a given type.
    static <T> List<T>
    getClassInstances(String[] defaultNames, String propertyName, Class<T> type)
    Returns a list of class instances got from a combination of a default list of classnames and the name of a property which may contain a colon-separated list of other classnames.
    static <T> List<T>
    getClassInstances(String propertyName, Class<T> type)
    Attempts to obtain instances of a class from a colon-separated list of classnames in a named system property.
    static File
    Returns the name of the file from which properties will be loaded by this class.
    static boolean
    Tests whether the JVM appears to be 64-bit or not.
    static void
    Loads a native library given its name.
    static void
    Ensures that the user's customised properties have been loaded; these are read once from the file returned by the getPropertiesFile() method and incorporated into the System properties.
    static void
    Sets a system property to a given value unless it has already been set.
    static void
    setHttpAgent(String productTokens)
    Configures the "http.agent" system property.
    static File
    Returns the location of the main Starlink java directory which contains the lib, bin, etc, source directories and others.
    static void
    Unless it's been set already, sets the value of the apple.laf.useScreenMenuBar system property to true.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • PROPERTIES_FILE

      public static final String PROPERTIES_FILE
      Name of the file in the user's home directory from which properties are loaded.
      See Also:
  • Constructor Details

    • Loader

      public Loader()
  • Method Details

    • starjavaDirectory

      public static File starjavaDirectory()
      Returns the location of the main Starlink java directory which contains the lib, bin, etc, source directories and others. It gets this by working out what jar file this class has been loaded from - there may be circumstances under which this doesn't work? but it's a best guess.

      If for some reason the directory cannot be located, null is returned.

      Returns:
      the top level starlink java directory, or null if it can't be found
    • loadLibrary

      public static void loadLibrary(String libname) throws SecurityException, UnsatisfiedLinkError
      Loads a native library given its name. If it is not found on java.library.path, the architecture-specific lib directory in the installed Starlink system is searched.
      Parameters:
      libname - the name of the library (not including system-specifics such as 'lib' or '.so')
      Throws:
      SecurityException - if a security manager exists and its checkLink method doesn't allow loading of the specified dynamic library
      UnsatisfiedLinkError - if the library does not exist
      See Also:
    • getPropertiesFile

      public static File getPropertiesFile() throws SecurityException
      Returns the name of the file from which properties will be loaded by this class.
      Returns:
      a file called PROPERTIES_FILE in the directory given by the System property "user.home".
      Throws:
      SecurityException
    • loadProperties

      public static void loadProperties()
      Ensures that the user's customised properties have been loaded; these are read once from the file returned by the getPropertiesFile() method and incorporated into the System properties. Calling this method after the first time has no effect.
      See Also:
    • getClassInstance

      public static <T> T getClassInstance(String classSpec, Class<T> type)
      Attempts to obtain an instance of a class with a given name which is an instance of a given type. If className is null or empty, null is returned directly. Otherwise, if the class className can be found using the default class loader, and if it is assignable from type, and if it has a no-arg constructor, an instance of it is constructed and returned. Otherwise, null is returned, and a message may be written through the logging system.

      A bean configuration parenthesis may be optionally appended, as per BeanConfig.

      Parameters:
      classSpec - name of the class to instantiate
      type - class which the instantiated class must be assignable from
      Returns:
      new className instance, or null
    • getClassInstances

      public static <T> List<T> getClassInstances(String propertyName, Class<T> type)
      Attempts to obtain instances of a class from a colon-separated list of classnames in a named system property. If the named property does not exists or contains no strings, an empty list is returned. Otherwise, getClassInstance(java.lang.String, java.lang.Class<T>) is called on each colon-separated element of the property value, and if there is a non-null return, it is added to the return list. For colon-separated elements which do not correspond to usable classes, a message may be written through the logging system.
      Parameters:
      propertyName - name of a system property containing colon-separated classnames
      type - class which instantiated classes must be assignable from
      Returns:
      list of new type instances (may be empty, but not null)
    • getClassInstances

      public static <T> List<T> getClassInstances(String[] defaultNames, String propertyName, Class<T> type)
      Returns a list of class instances got from a combination of a default list of classnames and the name of a property which may contain a colon-separated list of other classnames. The strings in each case must name classes which implement type and which have no-arg constructors.
      Parameters:
      defaultNames - array of string
    • is64Bit

      public static boolean is64Bit()
      Tests whether the JVM appears to be 64-bit or not. Not guaranteed reliable.
      Returns:
      true if the JVM appears to be running in 64 bits (if false, presumably it's 32 bits)
    • setDefaultProperty

      public static void setDefaultProperty(String key, String value)
      Sets a system property to a given value unless it has already been set. If it has a prior value, that is undisturbed. Potential security exceptions are caught and dealt with.
      Parameters:
      key - property name
      value - suggested property value
    • tweakGuiForMac

      public static void tweakGuiForMac()
      Unless it's been set already, sets the value of the apple.laf.useScreenMenuBar system property to true. This has the effect on Macintosh displays of causing menus to appear at the top of the screen rather than the top of the windows they belong in. This doesn't work on Dialog windows. Setting this property has no effect on non-Mac platforms. Probably(?) this call must be made before starting up the GUI (haven't got a Mac to hand, can't test it).
    • setHttpAgent

      public static void setHttpAgent(String productTokens)
      Configures the "http.agent" system property. This sets the value of the "User-Agent" request header in outgoing HTTP requests. It is good practice to set this to identify the running application, so that external web servers can see who is using their services. If this property is not set, the User-Agent header will probably just report that it's Java. In the event that the http.agent property is already set on entry, there is no effect.

      According to RFC2616 sections 14.43 and 3.8, this string should be a whitespace-separated sequence of product tokens. A product token is of the form product-name/product-version.

      This method must be called before the current JVM has opened any HTTP connections to have an effect.

      Parameters:
      productTokens - one or more (whitespace-separated) name/version application identifiers
      See Also:
    • checkJ2se

      public static void checkJ2se() throws ClassNotFoundException
      Checks that the JRE contains classes that you'd expect it to. This is chiefly useful for bailing out if we find ourself running in Gnu GCJ, which in at least some early versions is rather incomplete. In the case that J2SE classes are missing, an exception will be thrown. The text of this exception will be a user-friendly message about what has gone wrong.
      Throws:
      ClassNotFoundException - in case of a defective JRE
    • checkJ2seVendor

      public static void checkJ2seVendor()
      Checks the reported vendor for this J2SE. Depending on what is found, logging messages may be written. In particular, if it looks like GNU a warning-level message is emitted.