GateResourceFactoryBean.java
001 /*
002  *  GateResourceFactoryBean.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, 22/Jan/2008
013  *
014  *  $Id: GateResourceFactoryBean.java 17657 2014-03-14 09:08:56Z markagreenwood $
015  */
016 
017 package gate.util.spring;
018 
019 import java.util.List;
020 
021 import gate.Factory;
022 import gate.FeatureMap;
023 
024 import org.springframework.beans.factory.DisposableBean;
025 import org.springframework.beans.factory.FactoryBean;
026 
027 /**
028  * Spring factory bean to create a GATE resource (LR, PR, controller).
029  * Generally used via the <code>gate:</code> extension namespace,
030  * e.g.:
031  
032  <pre>
033  * &lt;gate:resource id=&quot;doc&quot; scope=&quot;prototype&quot;
034  *                resource-class=&quot;gate.corpora.DocumentImpl&quot;
035  *                resource-name=&quot;News document&quot;&gt;
036  *   &lt;gate:parameters&gt;
037  *     &lt;entry key=&quot;sourceUrl&quot;&gt;
038  *       &lt;value type=&quot;org.springframework.core.io.Resource&quot;&gt;resources/doc.xm&lt;/value&gt;
039  *     &lt;/entry&gt;
040  *     &lt;entry key=&quot;preserveOriginalContent&quot; value=&quot;true&quot; /&gt;
041  *   &lt;/gate:parameters&gt;
042  *   &lt;gate:features&gt;
043  *     &lt;entry key=&quot;genre&quot; value=&quot;news&quot; /&gt;
044  *   &lt;/gate:features&gt;
045  *   &lt;gate:customisers&gt;
046  *     &lt;!-- optional list of {@link ResourceCustomiser}s applied to the resource after creation --&gt;
047  *   &lt;/gate:customisers&gt;
048  * &lt;/gate:resource&gt;
049  </pre>
050  
051  * The <code>gate:parameters</code> and <code>gate:features</code>
052  * elements are FeatureMaps giving the init-time parameters and features
053  * for the resource respectively. Any Spring Resource values in these
054  * maps are converted to URLs, so the rest of the GATE code does not
055  * need to know about Spring. For details of how to declare the
056  <code>gate</code> namespace, see {@link Init}.
057  */
058 public class GateResourceFactoryBean extends GateAwareObject implements
059                                                             FactoryBean,
060                                                             DisposableBean {
061 
062   private String resourceClass;
063 
064   private String resourceName;
065 
066   private FeatureMap parameters;
067 
068   private FeatureMap features;
069 
070   private List<ResourceCustomiser> customisers;
071 
072   private gate.Resource object;
073 
074   /**
075    * Create the resource specified by this bean.
076    */
077   @Override
078   public Object getObject() throws Exception {
079     if(object == null) {
080       ensureGateInit();
081 
082       if(parameters == null) {
083         parameters = Factory.newFeatureMap();
084       }
085 
086       if(features == null) {
087         features = Factory.newFeatureMap();
088       }
089 
090       if(resourceName == null) {
091         object = Factory.createResource(resourceClass, parameters, features);
092       }
093       else {
094         object = Factory.createResource(resourceClass, parameters, features,
095                 resourceName);
096       }
097 
098       if(customisers != null) {
099         for(ResourceCustomiser c : customisers) {
100           c.customiseResource(object);
101         }
102       }
103     }
104 
105     return object;
106   }
107 
108   @Override
109   public Class<?> getObjectType() {
110     if(object != null) {
111       return object.getClass();
112     }
113     return null;
114   }
115 
116   @Override
117   public boolean isSingleton() {
118     return true;
119   }
120 
121   /**
122    * Destroy the resource created by this bean, by passing it to
123    {@link Factory#deleteResource}.
124    */
125   @Override
126   public void destroy() throws Exception {
127     if(object != null) {
128       Factory.deleteResource(object);
129     }
130   }
131 
132   public void setResourceClass(String resourceClass) {
133     this.resourceClass = resourceClass;
134   }
135 
136   public void setResourceName(String resourceName) {
137     this.resourceName = resourceName;
138   }
139 
140   public void setParameters(FeatureMap parameters) {
141     this.parameters = parameters;
142   }
143 
144   public void setFeatures(FeatureMap features) {
145     this.features = features;
146   }
147 
148   public void setCustomisers(List<ResourceCustomiser> customisers) {
149     this.customisers = customisers;
150   }
151 }