1   package org.daisy.pipeline.nlp.impl.matchrules;
2   
3   import java.util.ArrayList;
4   import java.util.Arrays;
5   import java.util.Collection;
6   import java.util.Locale;
7   
8   import org.daisy.pipeline.nlp.TextCategorizer.Category;
9   import org.daisy.pipeline.nlp.TextCategorizer.MatchMode;
10  import org.daisy.pipeline.nlp.impl.FullMatchStringFinder;
11  import org.daisy.pipeline.nlp.impl.IStringFinder;
12  import org.daisy.pipeline.nlp.impl.MatchRule;
13  import org.daisy.pipeline.nlp.impl.PrefixMatchStringFinder;
14  
15  /**
16   * Match the input strings with a list of strings.
17   */
18  public class WordListMatchRule extends MatchRule {
19  	private boolean mCapitalSensitive;
20  	private IStringFinder mStringFinder;
21  	private Locale mLocale;
22  
23  	/**
24  	 * @param locale can be null if caseSensitive = capitalSensitive = true
25  	 */
26  	public WordListMatchRule(Category category, int priority, boolean caseSensitive,
27  	        MatchMode matchMode, boolean capitalSensitive, Locale locale) {
28  		super(category, priority, caseSensitive, matchMode);
29  		mLocale = locale;
30  		mCapitalSensitive = capitalSensitive;
31  		switch (matchMode) {
32  		case FULL_MATCH:
33  			mStringFinder = new FullMatchStringFinder();
34  		default:
35  			mStringFinder = new PrefixMatchStringFinder();
36  		}
37  	}
38  
39  	public void init(Collection<String> prefixes) {
40  		Collection<String> tocompile;
41  		if (mCaseSensitive) {
42  			if (!mCapitalSensitive) {
43  				tocompile = new ArrayList<String>();
44  				tocompile.addAll(prefixes);
45  				for (String prefix : prefixes) {
46  					String lw = prefix.toLowerCase(mLocale);
47  					tocompile.add(lw.substring(0, 1) + prefix.substring(1));
48  				}
49  			} else
50  				tocompile = prefixes;
51  		} else {
52  			String[] lowerCasePrefixes = new String[prefixes.size()];
53  			int k = 0;
54  			for (String prefix : prefixes) {
55  				lowerCasePrefixes[k++] = prefix.toLowerCase(mLocale);
56  			}
57  			tocompile = Arrays.asList(lowerCasePrefixes);
58  		}
59  		mStringFinder.compile(tocompile);
60  	}
61  
62  	@Override
63  	protected String match(String input) {
64  		return mStringFinder.find(input);
65  	}
66  
67  	@Override
68  	public boolean threadsafe() {
69  		return mStringFinder.threadsafe();
70  	}
71  
72  }