Init.java
001 /*
002  *  Init.java
003  *
004  *  Copyright (c) 1995-2012, The University of Sheffield. See the file
005  *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
006  *
007  *  This file is part of GATE (see http://gate.ac.uk/), and is free
008  *  software, licenced under the GNU Library General Public License,
009  *  Version 2, June 1991 (in the distribution as file licence.html,
010  *  and also available at http://gate.ac.uk/gate/licence.html).
011  *
012  *  Ian Roberts, 07/Oct/2006
013  *
014  *  $Id: Init.java 17530 2014-03-04 15:57:43Z markagreenwood $
015  */
016 
017 package gate.util.spring;
018 
019 import gate.Gate;
020 import gate.util.GateException;
021 
022 import org.apache.log4j.Logger;
023 import org.springframework.beans.factory.BeanFactory;
024 import org.springframework.beans.factory.BeanFactoryAware;
025 import org.springframework.beans.factory.BeanFactoryUtils;
026 import org.springframework.beans.factory.ListableBeanFactory;
027 import org.springframework.core.io.Resource;
028 
029 import java.net.MalformedURLException;
030 import java.net.URL;
031 import java.io.File;
032 import java.io.IOException;
033 import java.util.List;
034 
035 /**
036  <p>
037  * Helper class to support GATE initialisation via <a
038  * href="http://www.springframework.org">Spring</a>. The following is a
039  * typical XML fragment to initialise GATE.
040  </p>
041  
042  <pre>
043  * &lt;beans xmlns="http://www.springframework.org/schema/beans"
044  *        xmlns:gate="http://gate.ac.uk/ns/spring"
045  *        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
046  *        xsi:schemaLocation="
047  *          http://www.springframework.org/schema/beans
048  *          http://www.springframework.org/schema/beans/spring-beans.xsd
049  *          http://gate.ac.uk/ns/spring
050  *          http://gate.ac.uk/ns/spring.xsd"&gt;
051  
052  *   &lt;gate:init gate-home="path/to/GATE"
053  *              site-config-file="site/gate.xml"
054  *              user-config-file="user/gate.xml"&gt;
055  *     &lt;gate:preload-plugins&gt;
056  *       &lt;value&gt;plugins/ANNIE&lt;/value&gt;
057  *       &lt;value&gt;http://plugins.org/another/plugin&lt;/value&gt;
058  *     &lt;/gate:preload-plugins&gt;
059  *   &lt;/gate:init&gt;
060  </pre>
061  
062  <p>
063  * Valid attributes are <code>gate-home</code>,
064  <code>plugins-home</code><code>site-config-file</code>,
065  <code>user-config-file</code> and <code>builtin-creole-dir</code> -
066  * Spring <code>Resource</code>s corresponding to the equivalent static
067  * set methods of {@link gate.Gate}. Also, <code>preload-plugins</code>
068  * is a list of <code>Resource</code>s that will be loaded as GATE
069  * plugins after GATE is initialised.
070  </p>
071  *
072  <p>
073  * Alternatively, instead of specifying <code>gate-home</code>,
074  <code>plugins-home</code> and the configuration files, specifying
075  <code>run-in-sandbox="true"</code> will tell GATE to initialize without
076  * reading any configuration files.  See {@link gate.Gate#runInSandbox} for
077  * details.
078  </p>
079  
080  <p>
081  * As well as any plugins specified using <code>preload-plugins</code>,
082  * we also scan the defining bean factory for any beans of type
083  {@link ExtraGatePlugin}, and load the plugins they refer to. This is
084  * useful if bean definitions are provided in several separate files, or
085  * if you are providing additional bean definitions to a context that
086  * already defines an Init bean definition that you cannot edit.
087  </p>
088  
089  <p>
090  * The equivalent definition in "normal" Spring form (without the
091  <code>gate:</code> namespace) would be:
092  </p>
093  
094  <pre>
095  * &lt;bean class="gate.util.spring.Init"
096  *      init-method="init"&gt;
097  *   &lt;property name="gateHome" value="path/to/GATE" /&gt;
098  *   &lt;property name="siteConfigFile" value="site/gate.xml" /&gt;
099  *   &lt;property name="userConfigFile" value="user/gate.xml" /&gt;
100  *   &lt;property name="preloadPlugins"&gt;
101  *     &lt;list&gt;
102  *       &lt;value&gt;plugins/ANNIE&lt;/value&gt;
103  *       &lt;value&gt;http://plugins.org/another/plugin&lt;/value&gt;
104  *     &lt;/list&gt;
105  *   &lt;/property&gt;
106  * &lt;/bean&gt;
107  </pre>
108  
109  <b>Note that when using this form the init-method="init" in the above
110  * definition is vital. GATE will not work if it is omitted.</b>
111  */
112 public class Init implements BeanFactoryAware {
113   
114   private static final Logger log = Logger.getLogger(Init.class);
115 
116   /**
117    * An optional list of plugins to load after GATE initialisation.
118    */
119   private List<Resource> plugins;
120 
121   private BeanFactory beanFactory;
122 
123   @Override
124   public void setBeanFactory(BeanFactory beanFactory) {
125     this.beanFactory = beanFactory;
126   }
127 
128   private File gateHome = null;
129 
130   public void setGateHome(Resource gateHomethrows IOException {
131     this.gateHome = gateHome.getFile();
132   }
133 
134   private File pluginsHome = null;
135 
136   public void setPluginsHome(Resource pluginsHomethrows IOException {
137     this.pluginsHome = pluginsHome.getFile();
138   }
139 
140   private File siteConfigFile = null;
141 
142   public void setSiteConfigFile(Resource siteConfigFilethrows IOException {
143     this.siteConfigFile = siteConfigFile.getFile();
144   }
145 
146   private File userConfigFile = null;
147 
148   public void setUserConfigFile(Resource userConfigFilethrows IOException {
149     this.userConfigFile = userConfigFile.getFile();
150   }
151 
152   private URL builtinCreoleDir = null;
153 
154   public void setBuiltinCreoleDir(Resource builtinCreoleDirthrows IOException {
155     this.builtinCreoleDir = builtinCreoleDir.getURL();
156   }
157 
158   // use Boolean rather than boolean so we can distinguish "set to false" from
159   // "not set"
160   private Boolean runInSandbox = null;
161 
162   public void setRunInSandbox(boolean runInSandbox) {
163     this.runInSandbox = Boolean.valueOf(runInSandbox);
164   }
165 
166   public void setPreloadPlugins(List<Resource> plugins) {
167     this.plugins = plugins;
168   }
169 
170   /**
171    * Initialises GATE and loads any preloadPlugins that have been
172    * specified, as well as any defined by {@link ExtraGatePlugin} beans
173    * in the containing factory.
174    */
175   public void init() throws Exception {
176     if(!Gate.isInitialised()) {
177       log.info("Initialising GATE");
178 
179       if(gateHome != nullGate.setGateHome(gateHome);
180       if(pluginsHome != nullGate.setPluginsHome(pluginsHome);
181       if(siteConfigFile != nullGate.setSiteConfigFile(siteConfigFile);
182       if(userConfigFile != nullGate.setUserConfigFile(userConfigFile);
183       if(builtinCreoleDir != nullGate.setBuiltinCreoleDir(builtinCreoleDir);
184       if(runInSandbox != nullGate.runInSandbox(runInSandbox.booleanValue());
185 
186       Gate.init();
187     }
188     else {
189       log.info("GATE already initialised");
190     }
191     if(plugins != null && !plugins.isEmpty()) {
192       for(Resource plugin : plugins) {
193         log.debug("Loading preload-plugin " + plugin);
194         loadPlugin(plugin);
195       }
196     }
197     // look for any ExtraGatePlugin beans
198     if(beanFactory instanceof ListableBeanFactory) {
199       String[] extraPluginBeanNames = BeanFactoryUtils
200               .beanNamesForTypeIncludingAncestors(
201                       (ListableBeanFactory)beanFactory, ExtraGatePlugin.class);
202       for(String name : extraPluginBeanNames) {
203         Resource plugin = ((ExtraGatePlugin)beanFactory.getBean(name,
204                 ExtraGatePlugin.class)).getLocation();
205         if(plugin != null) {
206           log.debug("Loading extra-plugin " + plugin);
207           loadPlugin(plugin);
208         }
209       }
210     }
211   // init()
212 
213   private void loadPlugin(Resource pluginthrows GateException, IOException,
214           MalformedURLException {
215     File pluginFile = null;
216     try {
217       pluginFile = plugin.getFile();
218     }
219     catch(IOException e) {
220       // no problem, try just as URL
221     }
222 
223     if(pluginFile == null) {
224       Gate.getCreoleRegister().registerDirectories(plugin.getURL());
225     }
226     else {
227       Gate.getCreoleRegister().registerDirectories(pluginFile.toURI().toURL());
228     }
229   }
230 }