All Downloads are FREE. Search and download functionalities are using the official Maven repository.

gate.Gate Maven / Gradle / Ivy

/*
 *  Gate.java
 *
 *  Copyright (c) 1995-2012, The University of Sheffield. See the file
 *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
 *
 *  This file is part of GATE (see http://gate.ac.uk/), and is free
 *  software, licenced under the GNU Library General Public License,
 *  Version 2, June 1991 (in the distribution as file licence.html,
 *  and also available at http://gate.ac.uk/gate/licence.html).
 *
 *  Hamish Cunningham, 31/07/98
 *
 *  $Id: Gate.java 20194 2017-02-23 10:27:13Z markagreenwood $
 */

package gate;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.EventListener;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import gate.util.*;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;

import gate.config.ConfigDataProcessor;
import gate.creole.CreoleRegisterImpl;
import gate.creole.Plugin;
import gate.creole.ResourceData;
import gate.event.CreoleListener;
import gate.gui.creole.manager.PluginUpdateManager;
import org.eclipse.aether.util.version.GenericVersionScheme;
import org.eclipse.aether.version.InvalidVersionSpecificationException;
import org.eclipse.aether.version.Version;

/**
 * The class is responsible for initialising the GATE libraries, and providing
 * access to singleton utility objects, such as the GATE class loader, CREOLE
 * register and so on.
 */
public class Gate implements GateConstants {

  /** A logger to use instead of sending messages to Out or Err **/
  protected static final Logger log = Logger.getLogger(Gate.class);

  /**
   * The default StringBuffer size, it seems that we need longer string than the
   * StringBuffer class default because of the high number of buffer expansions
   */
  public static final int STRINGBUFFER_SIZE = 1024;

  /**
   * The default size to be used for Hashtable, HashMap and HashSet. The defualt
   * is 11 and it leads to big memory usage. Having a default load factor of
   * 0.75, table of size 4 can take 3 elements before being re-hashed - a values
   * that seems to be optimal for most of the cases.
   */
  public static final int HASH_STH_SIZE = 4;

  

  /** The GATE URI used to interpret custom GATE tags */
  public static final String URI = "http://www.gate.ac.uk";

  /** Minimum version of JDK we support */
  protected static final String MIN_JDK_VERSION = "1.8";

  /**
   * Feature name that should be used to set if the benchmarking logging should
   * be enabled or disabled.
   */
  protected static final String ENABLE_BENCHMARKING_FEATURE_NAME =
    "gate.enable.benchmark";


  /**
   * The version of GATE that is currently running, as a string.
   */
  public static final String VERSION_STRING;

  /**
   * The build number of the running GATE (i.e. the Git revision
   * from which it was compiled).
   */
  public static final String BUILD;

  /**
   * The version of GATE that is currently running.
   */
  public static final Version VERSION;

  // find out the version and build numbers
  static {

    // we can't have the possibility of assigning to a final variable twice so
    // we put the details into a temp variable and then once we are happy assign
    // it to the static final variable
    String temp;

    BufferedReader reader = null;

    // find out the version number
    try {
      InputStream ver = Files.getGateResourceAsStream("version.txt");
      if (ver==null) {
        throw new IOException();
      }
      reader = new BomStrippingInputStreamReader(ver, "UTF-8");
      temp = reader.readLine();
    } catch(IOException ioe) {
      temp = "VERSION UNKNOWN";
    } finally {
      IOUtils.closeQuietly(reader);
    }

    VERSION_STRING = temp;

    // find out the build number
    try{
      InputStream build = Files.getGateResourceAsStream("build.txt");
      if (build==null) {
        throw new IOException();
      }
      reader = new BomStrippingInputStreamReader(build, "UTF-8");
      temp = reader.readLine();
    } catch(IOException ioe) {
      temp = "0000";
    } finally {
      IOUtils.closeQuietly(reader);
    }

    BUILD = temp;

    Version tmpGateVersion = null;
    try {
      tmpGateVersion = new GenericVersionScheme().parseVersion(VERSION_STRING);
    } catch(InvalidVersionSpecificationException e) {
      // TODO Auto-generated catch block
      log.error("Unable to parse GATE version number");
    }
    VERSION = tmpGateVersion;
  }

  /** Is true if GATE is to be run in a sandbox **/
  private static boolean sandboxed = true;

  /**
   * Find out if GATE is to be run in a sandbox or not. If true then
   * GATE will not attempt to load any local configuration information during
   * Initialisation making it possible to use GATE from within unsigned
   * applets and web start applications.
   * @return true if GATE is to be run in a sandbox, false otherwise
   */
  public static boolean isSandboxed() {
    return sandboxed;
  }

  /**
   * Method to tell GATE if it is being run inside a JVM sandbox. If true then
   * GATE will not attempt to load any local configuration information during
   * Initialisation making it possible to use GATE from within unsigned
   * applets and web start applications.
   * @param sandboxed true if GATE is to be run in a sandbox, false otherwise
   */
  public static void runInSandbox(boolean sandboxed) {
    if (initFinished)
      throw new IllegalStateException("Sandbox status cannot be changed after GATE has been initialised!");

    Gate.sandboxed = sandboxed;
  }

  /** Get the minimum supported version of the JDK */
  public static String getMinJdkVersion() {
    return MIN_JDK_VERSION;
  }

  /**
   * Initialisation - must be called by all clients before using any other parts
   * of the library. Also initialises the CREOLE register and reads config data (gate.xml
   * files).
   *
   * @see #initCreoleRegister
   */
  public static void init() throws GateException {
    // init local paths
    if (!sandboxed) initLocalPaths();

    // check if benchmarking should be enabled or disabled
    if(System.getProperty(ENABLE_BENCHMARKING_FEATURE_NAME) != null
      && System.getProperty(ENABLE_BENCHMARKING_FEATURE_NAME).equalsIgnoreCase(
        "true")) {
      Benchmark.setBenchmarkingEnabled(true);
    }

    // builtin creole dir
    if(builtinCreoleDir == null) {
      String builtinCreoleDirPropertyValue =
        System.getProperty(BUILTIN_CREOLE_DIR_PROPERTY_NAME);
      if(builtinCreoleDirPropertyValue == null) {
        // default to /gate/resources/creole in gate.jar
        builtinCreoleDir = Files.getGateResource("/creole/");
      }
      else {
        String builtinCreoleDirPath = builtinCreoleDirPropertyValue;
        // add a slash onto the end of the path if it doesn't have one already -
        // a creole directory URL should always end with a forward slash
        if(!builtinCreoleDirPath.endsWith("/")) {
          builtinCreoleDirPath += "/";
        }
        try {
          builtinCreoleDir = new URL(builtinCreoleDirPath);
        }
        catch(MalformedURLException mue) {
          // couldn't parse as a File either, so throw an exception
          throw new GateRuntimeException(BUILTIN_CREOLE_DIR_PROPERTY_NAME
            + " value \"" + builtinCreoleDirPropertyValue + "\" could"
            + " not be parsed as either a URL or a file path.");
        }
        log.info("Using " + builtinCreoleDir + " as built-in CREOLE"
          + " directory URL");
      }
    }

    // initialise the symbols generator
    lastSym = 0;

    // create class loader and creole register if they're null
    if(classLoader == null)
      classLoader = new GateClassLoader("Top-Level GATE ClassLoader", Gate.class.getClassLoader());
    if(creoleRegister == null) creoleRegister = new CreoleRegisterImpl();
    if(knownPlugins == null) knownPlugins = new HashSet();
    if(autoloadPlugins == null) autoloadPlugins = new ArrayList();
    //if(pluginData == null) pluginData = new HashSet();
    // init the creole register
    initCreoleRegister();
    // init the data store register
    initDataStoreRegister();

    // read gate.xml files; this must come before creole register
    // initialisation in order for the CREOLE-DIR elements to have and effect
    if (!sandboxed) initConfigData();

    if (!sandboxed) initCreoleRepositories();
    // the creoleRegister acts as a proxy for datastore related events
    dataStoreRegister.addCreoleListener(creoleRegister);

    // some of the events are actually fired by the {@link gate.Factory}
    Factory.addCreoleListener(creoleRegister);

    // check we have a useable JDK
    if(System.getProperty("java.version").compareTo(MIN_JDK_VERSION) < 0) { throw new GateException(
      "GATE requires JDK " + MIN_JDK_VERSION + " or newer"); }

    initFinished = true;
  } // init()

  /** Have we successfully run {@link #init()} before? */
  public static boolean isInitialised() { return initFinished; }

  /** Records initialisation status. */
  protected static boolean initFinished = false;

  /**
   * Initialises the paths to local files of interest like the GATE home, the
   * installed plugins home and site and user configuration files.
   */
  protected static void initLocalPaths() {
    // GATE Home
	  //TODO check if we need any of this now we don't have a GATE home
    /*if(gateHome == null) {
      String gateHomeStr = System.getProperty(GATE_HOME_PROPERTY_NAME);
      if(gateHomeStr != null && gateHomeStr.length() > 0) {
        gateHome = new File(gateHomeStr);
      }
      // if failed, try to guess
      if(gateHome == null || !gateHome.exists()) {
        log.warn("GATE home system property (\"" + GATE_HOME_PROPERTY_NAME
          + "\") not set.\nAttempting to guess...");
        URL gateURL =
          Thread.currentThread().getContextClassLoader().getResource(
            "gate/Gate.class");
        try {
          if(gateURL.getProtocol().equals("jar")) {
            // running from gate.jar
            String gateURLStr = gateURL.getFile();
            File gateJarFile =
              new File(
                new URI(gateURLStr.substring(0, gateURLStr.indexOf('!'))));
            gateHome = gateJarFile.getParentFile().getParentFile();
          }
          else if(gateURL.getProtocol().equals("file")) {
            // running from classes directory
            File gateClassFile = Files.fileFromURL(gateURL);
            gateHome =
              gateClassFile.getParentFile().getParentFile().getParentFile();
          }
          log.warn("Using \"" + gateHome.getCanonicalPath()
            + "\" as GATE Home.\nIf this is not correct please set it manually"
            + " using the -D" + GATE_HOME_PROPERTY_NAME
            + " option in your start-up script");
        }
        catch(Throwable thr) {
          throw new GateRuntimeException(
            "Cannot guess GATE Home. Pease set it manually!", thr);
        }
      }
    }
    log.info("Using " + gateHome.toString() + " as GATE home");

    // Plugins home
    if(pluginsHome == null) {
      String pluginsHomeStr = System.getProperty(PLUGINS_HOME_PROPERTY_NAME);
      if(pluginsHomeStr != null && pluginsHomeStr.length() > 0) {
        File homeFile = new File(pluginsHomeStr);
        if(homeFile.exists() && homeFile.isDirectory()) {
          pluginsHome = homeFile;
        }
      }
      // if not set, use the GATE Home as a base directory
      if(pluginsHome == null) {
        File homeFile = new File(gateHome, PLUGINS);
        if(homeFile.exists() && homeFile.isDirectory()) {
          pluginsHome = homeFile;
        }
      }
      // if still not set, throw exception
      if(pluginsHome == null) { throw new GateRuntimeException(
        "Could not infer installed plug-ins home!\n"
          + "Please set it manually using the -D" + PLUGINS_HOME_PROPERTY_NAME
          + " option in your start-up script."); }
    }
    log.info("Using " + pluginsHome.toString()
      + " as installed plug-ins directory.");

    // site config
    if(siteConfigFile == null) {
      String siteConfigStr = System.getProperty(SITE_CONFIG_PROPERTY_NAME);
      if(siteConfigStr != null && siteConfigStr.length() > 0) {
        File configFile = new File(siteConfigStr);
        if(configFile.exists()) siteConfigFile = configFile;
      }
      // if not set, use GATE home as base directory
      if(siteConfigFile == null) {
        File configFile = new File(gateHome, GATE_DOT_XML);
        if(configFile.exists()) siteConfigFile = configFile;
      }
      // if still not set, throw exception
      if(siteConfigFile == null) { throw new GateRuntimeException(
        "Could not locate the site configuration file!\n"
          + "Please create it at "
          + new File(gateHome, GATE_DOT_XML).toString()
          + " or point to an existing one using the -D"
          + SITE_CONFIG_PROPERTY_NAME + " option in your start-up script!"); }
    }
    log.info("Using " + siteConfigFile.toString()
      + " as site configuration file.");*/

    // user config
    if(userConfigFile == null) {
      String userConfigStr = System.getProperty(USER_CONFIG_PROPERTY_NAME);
      if(userConfigStr != null && userConfigStr.length() > 0) {
        userConfigFile = new File(userConfigStr);
      } else {
        userConfigFile = new File(getDefaultUserConfigFileName());
      }
    }
    log.info("Using " + userConfigFile + " as user configuration file");

    // user session
    if(userSessionFile == null) {
      String userSessionStr =
        System.getProperty(GATE_USER_SESSION_PROPERTY_NAME);
      if(userSessionStr != null && userSessionStr.length() > 0) {
        userSessionFile = new File(userSessionStr);
      }
      else {
        userSessionFile = new File(getDefaultUserSessionFileName());
      }
    }// if(userSessionFile == null)
    log.info("Using " + userSessionFile + " as user session file");
  }

  /**
   * Loads the CREOLE repositories (aka plugins) that the user has selected for
   * automatic loading. Loads the information about known plugins in memory.
   */
  protected static void initCreoleRepositories() {
    // the logic is:
    // get the list of know plugins from gate.xml
    // add all the installed plugins (if pluginsHome has been explicitly set)
    // get the list of loadable plugins
    // load loadable plugins

    Pattern mavenPluginPattern = Pattern.compile("\\[(.*?):(.*?):(.*?)]");

    // process the known plugins list
    String knownPluginsPath =
      (String)getUserConfig().get(KNOWN_PLUGIN_PATH_KEY);
    if(knownPluginsPath != null) {
      knownPluginsPath = knownPluginsPath.trim();
    }
    if(knownPluginsPath != null && knownPluginsPath.length() > 0) {
      StringTokenizer strTok =
        new StringTokenizer(knownPluginsPath, ";", false);
      while(strTok.hasMoreTokens()) {
        String aKnownPluginPath = strTok.nextToken().trim();
        Matcher m = mavenPluginPattern.matcher(aKnownPluginPath);
        if(m.matches()) {
          // Maven coordinates [group:artifact:version]
          addKnownPlugin(new Plugin.Maven(m.group(1), m.group(2), m.group(3)));
        } else {
          // assume it's a URL to a directory plugin
          try {
            URL aPluginURL = new URL(aKnownPluginPath);
            addKnownPlugin(new Plugin.Directory(aPluginURL));
          } catch(MalformedURLException mue) {
            log.error("Plugin error: " + aKnownPluginPath + " is an invalid URL!");
          }
        }
      }
    }

    if(pluginsHome != null) {
      // add all the installed plugins (note pluginsHome will only be set
      // if there has been an explicit call to setPluginsHome, it is now
      // null by default)
      File[] dirs = pluginsHome.listFiles();
      for(int i = 0; i < dirs.length; i++) {
        File creoleFile = new File(dirs[i], "creole.xml");
        if(creoleFile.exists()) {
          try {
            URL pluginURL = dirs[i].toURI().toURL();
            addKnownPlugin(new Plugin.Directory(pluginURL));
          } catch(MalformedURLException mue) {
            // this should never happen
            throw new GateRuntimeException(mue);
          }
        }
      }
    }
    
    // process the autoload plugins
    String pluginPath = getUserConfig().getString(AUTOLOAD_PLUGIN_PATH_KEY);
    // can be overridden by system property
    String prop = System.getProperty(AUTOLOAD_PLUGIN_PATH_PROPERTY_NAME);
    if(prop != null && prop.length() > 0) pluginPath = prop;

    if(pluginPath != null) {
      pluginPath = pluginPath.trim();
    }
    if(pluginPath == null || pluginPath.length() == 0) {
      // no plugin to load stop here
      return;
    }

    // load all loadable plugins
    StringTokenizer strTok = new StringTokenizer(pluginPath, ";", false);
    while(strTok.hasMoreTokens()) {
      String aDir = strTok.nextToken().trim();
      Matcher m = mavenPluginPattern.matcher(aDir);
      if(m.matches()) {
        // Maven coordinates [group:artifact:version]
        addAutoloadPlugin(new Plugin.Maven(m.group(1), m.group(2), m.group(3)));
      } else {
        // assume it's a URL to a directory plugin
        try {
          URL aPluginURL = new URL(aDir);
          Plugin plugin = new Plugin.Directory(aPluginURL);
          addAutoloadPlugin(plugin);
        } catch(MalformedURLException mue) {
          log.error("Cannot load " + aDir + " CREOLE repository.", mue);
        }
      }
      try {
        Iterator loadPluginsIter = getAutoloadPlugins().iterator();
        while(loadPluginsIter.hasNext()) {
          getCreoleRegister().registerPlugin(loadPluginsIter.next());
        }
      }
      catch(GateException ge) {
        log.error("Cannot load " + aDir + " CREOLE repository.",ge);
      }
    }
  }

  /** Initialise the CREOLE register. */
  public static void initCreoleRegister() throws GateException {

    /*
     * We'll have to think about this. Right now it points to the creole inside
     * the jar/classpath so it's the same as registerBuiltins
     */
    creoleRegister.registerBuiltins();
  }

  /** Initialise the DataStore register. */
  public static void initDataStoreRegister() {
    dataStoreRegister = new DataStoreRegister();
  } // initDataStoreRegister()

  /**
   * Reads config data (gate.xml files). There are three sorts of
   * these files:
   * 
    *
  • The builtin file from GATE's resources - this is read first. *
  • A site-wide init file given as a command-line argument or as a * gate.config property - this is read second. *
  • The user's file from their home directory - this is read last. *
* Settings from files read after some settings have already been made will * simply overwrite the previous settings. */ public static void initConfigData() throws GateException { ConfigDataProcessor configProcessor = new ConfigDataProcessor(); URL configURL; // parse the site configuration file if (siteConfigFile != null && siteConfigFile.exists()) { //TODO should we set this to something sensible when we init paths now there is no gate home? try { configURL = siteConfigFile.toURI().toURL(); } catch(MalformedURLException mue) { // this should never happen throw new GateRuntimeException(mue); } try { InputStream configStream = new FileInputStream(siteConfigFile); configProcessor.parseConfigFile(configStream, configURL); } catch(IOException e) { throw new GateException("Couldn't open site configuration file: " + configURL + " " + e); } } // parse the user configuration data if present if(userConfigFile != null && userConfigFile.exists()) { try { configURL = userConfigFile.toURI().toURL(); } catch(MalformedURLException mue) { // this should never happen throw new GateRuntimeException(mue); } try { InputStream configStream = new FileInputStream(userConfigFile); configProcessor.parseConfigFile(configStream, configURL); } catch(IOException e) { throw new GateException("Couldn't open user configuration file: " + configURL + " " + e); } } // remember the init-time config options originalUserConfig.putAll(userConfig); } // initConfigData() /** * Flag controlling whether we should try to access the net, e.g. when setting * up a base URL. */ private static boolean netConnected = false; private static int lastSym; /** * A list of names of classes that implement {@link gate.creole.ir.IREngine} * that will be used as information retrieval engines. */ private static Set registeredIREngines = new HashSet(); /** * Registers a new IR engine. The class named should implement * {@link gate.creole.ir.IREngine} and be accessible via the GATE class * loader. * * @param className * the fully qualified name of the class to be registered * @throws GateException * if the class does not implement the * {@link gate.creole.ir.IREngine} interface. * @throws ClassNotFoundException * if the named class cannot be found. */ public static void registerIREngine(String className) throws GateException, ClassNotFoundException { Class aClass = Class.forName(className, true, Gate.getClassLoader()); if(gate.creole.ir.IREngine.class.isAssignableFrom(aClass)) { registeredIREngines.add(className); } else { throw new GateException(className + " does not implement the " + gate.creole.ir.IREngine.class.getName() + " interface!"); } } /** * Unregisters a previously registered IR engine. * * @param className * the name of the class to be removed from the list of registered IR * engines. * @return true if the class was found and removed. */ public static boolean unregisterIREngine(String className) { return registeredIREngines.remove(className); } /** * Gets the set of registered IR engines. * * @return an unmodifiable {@link java.util.Set} value. */ public static Set getRegisteredIREngines() { return Collections.unmodifiableSet(registeredIREngines); } /** * Gets the GATE home location. * * @return a File value. */ public static File getGateHome() { return gateHome; } /** * Checks whether a particular class is a Gate defined type */ public static boolean isGateType(String classname) { boolean res = getCreoleRegister().containsKey(classname); if(!res) { try { Class aClass = Class.forName(classname, true, Gate.getClassLoader()); res = Resource.class.isAssignableFrom(aClass); } catch(ClassNotFoundException cnfe) { return false; } } return res; } /** Returns the value for the HIDDEN attribute of a feature map */ static public boolean getHiddenAttribute(FeatureMap fm) { if(fm == null) return false; Object value = fm.get(HIDDEN_FEATURE_KEY); return value != null && value instanceof String && ((String)value).equals("true"); } /** Sets the value for the HIDDEN attribute of a feature map */ static public void setHiddenAttribute(FeatureMap fm, boolean hidden) { if(hidden) { fm.put(HIDDEN_FEATURE_KEY, "true"); } else { fm.remove(HIDDEN_FEATURE_KEY); } } /** * Registers a {@link gate.event.CreoleListener} with the Gate system */ public static synchronized void addCreoleListener(CreoleListener l) { creoleRegister.addCreoleListener(l); } // addCreoleListener /** * Class loader used e.g. for loading CREOLE modules, of compiling JAPE rule * RHSs. */ private static GateClassLoader classLoader = null; /** Get the GATE class loader. */ public static GateClassLoader getClassLoader() { return classLoader; } /** The CREOLE register. */ private static CreoleRegister creoleRegister = null; /** Get the CREOLE register. */ public static CreoleRegister getCreoleRegister() { return creoleRegister; } /** The DataStore register */ private static DataStoreRegister dataStoreRegister = null; /** * The current executable under execution. */ private static gate.Executable currentExecutable; /** Get the DataStore register. */ public static DataStoreRegister getDataStoreRegister() { return dataStoreRegister; } // getDataStoreRegister /** * Sets the {@link Executable} currently under execution. At a given time * there can be only one executable set. After the executable has finished its * execution this value should be set back to null. An attempt to set the * executable while this value is not null will result in the method call * waiting until the old executable is set to null. */ public synchronized static void setExecutable(gate.Executable executable) { if(executable == null) currentExecutable = executable; else { while(getExecutable() != null) { try { Thread.sleep(200); } catch(InterruptedException ie) { throw new GateRuntimeException(ie.toString()); } } currentExecutable = executable; } } // setExecutable /** * Returns the curently set executable. * * @see #setExecutable(gate.Executable) */ public synchronized static gate.Executable getExecutable() { return currentExecutable; } // getExecutable /** * Returns a new unique string */ public synchronized static String genSym() { StringBuffer buff = new StringBuffer(Integer.toHexString(lastSym++).toUpperCase()); for(int i = buff.length(); i <= 4; i++) buff.insert(0, '0'); return buff.toString(); } // genSym /** GATE development environment configuration data (stored in gate.xml). */ private static OptionsMap userConfig = new OptionsMap(); /** * This map stores the init-time config data in case we need it later. GATE * development environment configuration data (stored in gate.xml). */ private static OptionsMap originalUserConfig = new OptionsMap(); /** Name of the XML element for GATE development environment config data. */ private static String userConfigElement = "GATECONFIG"; /** * Gate the name of the XML element for GATE development environment config * data. */ public static String getUserConfigElement() { return userConfigElement; } /** * Get the site config file (generally set during command-line processing or * as a gate.config property). If the config is null, this method * checks the gate.config property and uses it if non-null. */ public static File getSiteConfigFile() { if(siteConfigFile == null) { String gateConfigProperty = System.getProperty(GATE_CONFIG_PROPERTY); if(gateConfigProperty != null) siteConfigFile = new File(gateConfigProperty); } return siteConfigFile; } // getSiteConfigFile /** Set the site config file (e.g. during command-line processing). */ public static void setSiteConfigFile(File siteConfigFile) { Gate.siteConfigFile = siteConfigFile; } // setSiteConfigFile /** Shorthand for local newline */ private static String nl = Strings.getNl(); /** An empty config data file. */ private static String emptyConfigFile = "" + nl + "" + nl + "" + nl + "" + nl + "" + nl + "<" + userConfigElement + "/>" + nl + "" + nl + "" + nl; /** * Get an empty config file. NOTE: this method is intended only for * use by the test suite. */ public static String getEmptyConfigFile() { return emptyConfigFile; } /** * Get the GATE development environment configuration data (initialised from * gate.xml). */ public static OptionsMap getUserConfig() { return userConfig; } /** * Get the original, initialisation-time, GATE development environment * configuration data (initialised from gate.xml). */ public static OptionsMap getOriginalUserConfig() { return originalUserConfig; } // getOriginalUserConfig /** * Update the GATE development environment configuration data in the user's * gate.xml file (create one if it doesn't exist). */ public static void writeUserConfig() throws GateException { //if we are running in a sandbox then don't try and write anything if (sandboxed) return; String pluginsHomeStr = null; if(pluginsHome != null) { try { pluginsHomeStr = pluginsHome.getCanonicalPath(); } catch(IOException ioe) { throw new GateRuntimeException( "Problem while locating the plug-ins home!", ioe); } } // update the values for knownPluginPath String knownPluginPath = ""; Set defaultPlugins = PluginUpdateManager.getDefaultPlugins(); Iterator pluginIter = getKnownPlugins().iterator(); while(pluginIter.hasNext()) { Plugin aPlugin = pluginIter.next(); String pluginStr = null; if(aPlugin instanceof Plugin.Maven) { Plugin.Maven mavenPlugin = (Plugin.Maven)aPlugin; if(!defaultPlugins.contains(aPlugin)) { pluginStr = "[" + mavenPlugin.getGroup() + ":" + mavenPlugin.getArtifact() + ":" + mavenPlugin.getVersion() + "]"; } } else if(aPlugin instanceof Plugin.Directory) { URL aPluginURL = aPlugin.getBaseURL(); // do not save installed plug-ins - they get loaded automatically if(aPluginURL.getProtocol().equals("file")) { File pluginDirectory = Files.fileFromURL(aPluginURL); try { if(pluginsHomeStr != null && pluginDirectory.getCanonicalPath().startsWith(pluginsHomeStr)) continue; } catch(IOException ioe) { throw new GateRuntimeException("Problem while locating the plug-in" + aPluginURL.toString(), ioe); } } pluginStr = aPluginURL.toExternalForm(); } // no else - we don't save other types of plugin if(pluginStr != null) { if(knownPluginPath.length() > 0) knownPluginPath += ";"; knownPluginPath += pluginStr; } } getUserConfig().put(KNOWN_PLUGIN_PATH_KEY, knownPluginPath); // update the autoload plugin list String loadPluginPath = ""; pluginIter = getAutoloadPlugins().iterator(); while(pluginIter.hasNext()) { Plugin aPlugin = pluginIter.next(); String pluginStr = null; if(aPlugin instanceof Plugin.Maven) { Plugin.Maven mavenPlugin = (Plugin.Maven)aPlugin; pluginStr = "[" + mavenPlugin.getGroup() + ":" + mavenPlugin.getArtifact() + ":" + mavenPlugin.getVersion() + "]"; } else { pluginStr = aPlugin.getBaseURL().toExternalForm(); } if(loadPluginPath.length() > 0) loadPluginPath += ";"; loadPluginPath += pluginStr; } getUserConfig().put(AUTOLOAD_PLUGIN_PATH_KEY, loadPluginPath); // the user's config file // String configFileName = getUserConfigFileName(); // File configFile = new File(configFileName); File configFile = getUserConfigFile(); // create if not there, then update try { // if the file doesn't exist, create one with an empty GATECONFIG if(!configFile.exists()) { FileOutputStream fos = new FileOutputStream(configFile); OutputStreamWriter writer = new OutputStreamWriter(fos, "UTF-8"); writer.write(emptyConfigFile); writer.close(); } // update the config element of the file Files.updateXmlElement(configFile, userConfigElement, userConfig.getStringMap()); } catch(IOException e) { throw new GateException("problem writing user " + GATE_DOT_XML + ": " + nl + e.toString()); } } // writeUserConfig /** * Get the default path to the user's config file, which is used unless an * alternative name has been specified via system properties or * {@link #setUserConfigFile}. * * @return the default user config file path. */ public static String getDefaultUserConfigFileName() { String filePrefix = ""; if(runningOnUnix()) filePrefix = "."; String userConfigName = System.getProperty("user.home") + Strings.getFileSep() + filePrefix + GATE_DOT_XML; return userConfigName; } // getDefaultUserConfigFileName /** * Get the default path to the user's session file, which is used unless an * alternative name has been specified via system properties or * {@link #setUserSessionFile(File)} * * @return the default user session file path. */ public static String getDefaultUserSessionFileName() { String filePrefix = ""; if(runningOnUnix()) filePrefix = "."; String userSessionName = System.getProperty("user.home") + Strings.getFileSep() + filePrefix + GATE_DOT_SER; return userSessionName; } // getUserSessionFileName /** * This method tries to guess if we are on a UNIX system. It does this by * checking the value of System.getProperty("file.separator"); if * this is "/" it concludes we are on UNIX. This is obviously not a very * good idea in the general case, so nothing much should be made to depend on * this method (e.g. just naming of config file .gate.xml as * opposed to gate.xml). */ public static boolean runningOnUnix() { return Strings.getFileSep().equals("/"); } // runningOnUnix /** * This method tries to guess if we are on a Mac OS X system. It does this * by checking the value of System.getProperty("os.name"). Note * that if this method returns true, {@link #runningOnUnix()} will also * return true (i.e. Mac is considered a Unix platform) but the reverse is * not necessarily the case. */ public static boolean runningOnMac() { return System.getProperty("os.name").toLowerCase().startsWith("mac os x"); } /** * Returns the list of CREOLE directories the system knows about (either * pre-installed plugins in the plugins directory or CREOLE directories that * have previously been loaded manually). * * @return a {@link List} of {@link URL}s. */ public static Set getKnownPlugins() { Set plugins = new HashSet(); plugins.addAll(knownPlugins); plugins.addAll(PluginUpdateManager.getDefaultPlugins()); return plugins; } /** * Adds the plugin to the list of known plugins. * * @param plugin * the plugin to add to the list of known plugins. */ public static void addKnownPlugin(Plugin plugin) { if(knownPlugins.contains(plugin)) return; if (PluginUpdateManager.getDefaultPlugins().contains(plugin)) return; knownPlugins.add(plugin); } /** * Makes sure the provided URL ends with "/" (CREOLE URLs always point to * directories so thry should always end with a slash. * * @param url * the URL to be normalised * @return the (maybe) corrected URL. */ public static URL normaliseCreoleUrl(URL url) { // CREOLE URLs are directory URLs so they should end with "/" String urlName = url.toExternalForm(); String separator = "/"; if(urlName.endsWith(separator)) { return url; } else { urlName += separator; try { return new URL(urlName); } catch(MalformedURLException mue) { throw new GateRuntimeException(mue); } } } /** * Returns the list of CREOLE directories the system loads automatically at * start-up. * * @return a {@link List} of {@link URL}s. */ public static List getAutoloadPlugins() { return autoloadPlugins; } /** * Adds a new directory to the list of plugins that are loaded automatically * at start-up. * * @param plugin * the plugin to add to the list of autoload plugins. */ public static void addAutoloadPlugin(Plugin plugin) { if(autoloadPlugins.contains(plugin)) return; // make sure it's known addKnownPlugin(plugin); // add it to autoload list autoloadPlugins.add(plugin); } /** * Gets the information about a known directory. * * @param directory * the URL for the directory in question. * @return a {@link DirectoryInfo} value. */ /*public static DirectoryInfo getDirectoryInfo(URL directory) { directory = normaliseCreoleUrl(directory); if(!knownPlugins.contains(directory)) return null; DirectoryInfo dInfo = pluginData.get(directory); if(dInfo == null) { dInfo = new DirectoryInfo(directory); pluginData.put(directory, dInfo); } return dInfo; }*/ /*public static DirectoryInfo getDirectoryInfo(URL directory, org.jdom.Document creoleDoc) { directory = normaliseCreoleUrl(directory); if(!knownPlugins.contains(directory)) return null; DirectoryInfo dInfo = pluginData.get(directory); if(dInfo == null) { dInfo = new DirectoryInfo(directory, creoleDoc); pluginData.put(directory, dInfo); } return dInfo; }*/ /** * Returns information about plugin directories which provide the requested * resource * * @param resourceClassName * the class name of the resource you are interested in * @return information about the directories which provide an implementation * of the requested resource */ public static Set getPlugins(String resourceClassName) { Set dirs = new HashSet(); for (Plugin plugin: knownPlugins) { for (ResourceInfo rInfo : plugin.getResourceInfoList()) { if (rInfo.resourceClassName.equals(resourceClassName)) { dirs.add(plugin); } } } return dirs; } /** * Tells the system to "forget" about one previously known * directory. If the specified directory was loaded, it will be unloaded as * well - i.e. all the metadata relating to resources defined by this * directory will be removed from memory. * * @param plugin the the plugin to remove from the list of known plugins **/ public static void removeKnownPlugin(Plugin plugin) { //pluginURL = normaliseCreoleUrl(pluginURL); knownPlugins.remove(plugin); autoloadPlugins.remove(plugin); creoleRegister.unregisterPlugin(plugin); } /** * Tells the system to remove a plugin URL from the list of plugins that are * loaded automatically at system start-up. This will be reflected in the * user's configuration data file. * * @param plugin * the plugin to remove from the list of autoload plugins */ public static void removeAutoloadPlugin(Plugin plugin) { autoloadPlugins.remove(plugin); } /** * Stores information about a resource defined by a CREOLE directory. The * resource might not have been loaded in the system so not all information * normally provided by the {@link ResourceData} class is available. This is * what makes this class different from {@link ResourceData}. */ public static class ResourceInfo { public ResourceInfo(String name, String className, String comment) { this.resourceClassName = className; this.resourceName = name; this.resourceComment = comment; } public String toString() { return resourceName+" ("+resourceClassName+")"; } /** * @return Returns the resourceClassName. */ public String getResourceClassName() { return resourceClassName; } /** * @return Returns the resourceComment. */ public String getResourceComment() { return resourceComment; } public void setResourceComment(String resourceComment) { this.resourceComment = resourceComment; } /** * @return Returns the resourceName. */ public String getResourceName() { return resourceName; } public void setResourceName(String resourceName) { this.resourceName = resourceName; } /** * The class for the resource. */ protected String resourceClassName; /** * The resource name. */ protected String resourceName; /** * The comment for the resource. */ protected String resourceComment; } /** * The top level directory of the GATE installation. */ protected static File gateHome; /** Site config file */ private static File siteConfigFile; /** User config file */ private static File userConfigFile; /** * The top level directory for GATE installed plugins. */ protected static File pluginsHome; /** * The "builtin" creole directory URL, where the creole.xml that defines * things like DocumentImpl can be found. */ protected static URL builtinCreoleDir; /** * The user session file to use. */ protected static File userSessionFile; /** * Set the location of the GATE home directory. * * @throws IllegalStateException * if the value has already been set. */ public static void setGateHome(File gateHome) { if(Gate.gateHome != null) { throw new IllegalStateException( "gateHome has already been set"); } Gate.gateHome = gateHome; } /** * Set the location of the plugins directory. * * @throws IllegalStateException * if the value has already been set. */ public static void setPluginsHome(File pluginsHome) { if(Gate.pluginsHome != null) { throw new IllegalStateException( "pluginsHome has already been set"); } Gate.pluginsHome = pluginsHome; } /** * Get the location of the plugins directory. * * @return the plugins drectory, or null if this has not yet been set (i.e. * Gate.init() has not yet been called). */ public static File getPluginsHome() { return pluginsHome; } /** * Set the location of the user's config file. * * @throws IllegalStateException * if the value has already been set. */ public static void setUserConfigFile(File userConfigFile) { if(Gate.userConfigFile != null) { throw new IllegalStateException( "userConfigFile has already been set"); } Gate.userConfigFile = userConfigFile; } /** * Get the location of the user's config file. * * @return the user config file, or null if this has not yet been set (i.e. * Gate.init() has not yet been called). */ public static File getUserConfigFile() { return userConfigFile; } /** * Set the URL to the "builtin" creole directory. The URL must point to a * directory, and must end with a forward slash. * * @throws IllegalStateException * if the value has already been set. */ public static void setBuiltinCreoleDir(URL builtinCreoleDir) { if(Gate.builtinCreoleDir != null) { throw new IllegalStateException( "builtinCreoleDir has already been set"); } Gate.builtinCreoleDir = builtinCreoleDir; } /** * Get the URL to the "builtin" creole directory, i.e. the directory that * contains the creole.xml file that defines things like DocumentImpl, the * Controllers, etc. */ public static URL getBuiltinCreoleDir() { return builtinCreoleDir; } /** * Set the user session file. This can only done prior to calling Gate.init() * which will set the file to either the OS-specific default or whatever has * been set by the property gate.user.session * * @throws IllegalStateException * if the value has already been set. */ public static void setUserSessionFile(File newUserSessionFile) { if(Gate.userSessionFile != null) { throw new IllegalStateException( "userSessionFile has already been set"); } Gate.userSessionFile = newUserSessionFile; } /** * Get the user session file. * * @return the file corresponding to the user session file or null, if not yet * set. */ public static File getUserSessionFile() { return userSessionFile; } /** * The list of plugins (aka CREOLE directories) the system knows about. This * list contains URL objects. */ private static Set knownPlugins; /** * The list of plugins (aka CREOLE directories) the system loads automatically * at start-up. This list contains URL objects. */ protected static List autoloadPlugins; /** * Flag for whether to use native serialization or xml serialization when * saving applications. */ private static boolean useXMLSerialization = true; /** * Tell GATE whether to use XML serialization for applications. */ public static void setUseXMLSerialization(boolean useXMLSerialization) { Gate.useXMLSerialization = useXMLSerialization; } /** * Should we use XML serialization for applications. */ public static boolean getUseXMLSerialization() { return useXMLSerialization; } /** * Returns the listeners map, a map that holds all the listeners that * are singletons (e.g. the status listener that updates the status * bar on the main frame or the progress listener that updates the * progress bar on the main frame). The keys used are the class names * of the listener interface and the values are the actual listeners * (e.g "gate.event.StatusListener" -> this). The returned map is the * actual data member used to store the listeners so any changes in * this map will be visible to everyone. * @return the listeners map */ public static java.util.Map getListeners() { return listeners; } /** * A Map which holds listeners that are singletons (e.g. the status * listener that updates the status bar on the main frame or the * progress listener that updates the progress bar on the main frame). * The keys used are the class names of the listener interface and the * values are the actual listeners (e.g "gate.event.StatusListener" -> * this). */ private static final java.util.Map listeners = new HashMap(); } // class Gate




© 2015 - 2024 Weber Informatics LLC | Privacy Policy