SharedDefaultGazetteer.java
01 package gate.creole.gazetteer;
02 
03 import gate.Factory;
04 import gate.Resource;
05 import gate.creole.CustomDuplication;
06 import gate.creole.ResourceInstantiationException;
07 import gate.creole.metadata.CreoleParameter;
08 import gate.creole.metadata.CreoleResource;
09 
10 /**
11  * Provides a way to efficiently multi-thread a DefaultGazetteer.
12  
13  * The reccommended way to multithread a gate pipeline is to have a
14  * seperate instance per thread (or a resource pool). This is not ideal
15  * when using large Gazetteers as these can take a long time to
16  * initialise and take up a lot of memory. This class provides a way to
17  * bootstrap a new gazetteer instance off of an existing gazetteer
18  * instance while still maintaining all thread level variables.
19  {@link DefaultGazetteer} implements {@link CustomDuplication} using
20  * this class, so the easiest way to build multiple copies of a
21  {@link DefaultGazetteer} PR that share a single FSM is to create one
22  * in the usual way and then use {@link Factory#duplicate(Resource)} to
23  * copy it.
24  
25  * NOTE: It is (probably) impossible to use this class from within
26  * either the Gaze user interface or from a .gapp application file. You
27  * should only use this PR when embedding GATE within another
28  * application and initialise it specifically. There is no reason a
29  * DefaultGazetteer loaded via a .gapp file cannot be used to bootstrap
30  * this PR however.
31  
32  @author Matt Nathan
33  */
34 @CreoleResource(isPrivate = true, name = "Sharable Gazetteer")
35 public class SharedDefaultGazetteer extends DefaultGazetteer {
36 
37   private static final long serialVersionUID = 5298177260117975299L;
38 
39   public static final String SDEF_GAZ_BOOTSTRAP_GAZETTEER_PROPERTY_NAME =
40           "bootstrapGazetteer";
41 
42   /**
43    * The existing DefaultGazetteer instance whose FSM we will share.
44    */
45   protected DefaultGazetteer bootstrapGazetteer;
46 
47   /**
48    * Copy the references to the shareable state (i.e. the FSM) from the
49    * existing gazetteer. Note that this method <i>deliberately</i> does
50    * not call <code>super.init()</code> as to do so would cause the
51    * lists to be reloaded.
52    */
53   @Override
54   public Resource init() throws ResourceInstantiationException {
55     if(bootstrapGazetteer == null) {
56       throw new ResourceInstantiationException(
57               "No gazetteer provided to bootstrap this gazetteer creation!");
58     }
59     this.annotationSetName = bootstrapGazetteer.annotationSetName;
60     this.caseSensitive = bootstrapGazetteer.caseSensitive;
61     this.definition = bootstrapGazetteer.definition;
62     this.encoding = bootstrapGazetteer.encoding;
63     this.fsmStates = bootstrapGazetteer.fsmStates;
64     this.gazetteerFeatureSeparator =
65             bootstrapGazetteer.gazetteerFeatureSeparator;
66     this.initialState = bootstrapGazetteer.initialState;
67     this.listsByNode = bootstrapGazetteer.listsByNode;
68     this.listsURL = bootstrapGazetteer.listsURL;
69     this.longestMatchOnly = bootstrapGazetteer.longestMatchOnly;
70     this.mappingDefinition = bootstrapGazetteer.mappingDefinition;
71     this.wholeWordsOnly = bootstrapGazetteer.wholeWordsOnly;
72 
73     this.getFeatures().putAll(bootstrapGazetteer.getFeatures());
74     return this;
75   }
76 
77   public DefaultGazetteer getBootstrapGazetteer() {
78     return bootstrapGazetteer;
79   }
80 
81   @CreoleParameter(comment = "The DefaultGazetteer that is to be used to bootstrap this shared instance")
82   public void setBootstrapGazetteer(DefaultGazetteer bootstrapGazetteer) {
83     this.bootstrapGazetteer = bootstrapGazetteer;
84   }
85 }