package org.apache.solr.analysis; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.solr.common.util.StrUtils; import org.apache.solr.core.SolrResourceLoader; import org.apache.lucene.analysis.util.ResourceLoader; import org.apache.lucene.analysis.util.ResourceLoaderAware; import org.apache.lucene.analysis.util.TokenFilterFactory; public abstract class PersistingMapTokenFilterFactory extends TokenFilterFactory implements ResourceLoaderAware { public static final Logger log = LoggerFactory.getLogger(PersistingMapTokenFilterFactory.class); protected WriteableSynonymMap synMap = null; protected String outFile; protected String synonyms; protected String syntax; public PersistingMapTokenFilterFactory(Map<String, String> args) { super(args); synMap = createSynonymMap(); if (args.containsKey("outFile")) { this.outFile = args.remove("outFile"); } if (args.containsKey("synonyms")) { this.synonyms = args.remove("synonyms"); } if (args.containsKey("syntax")) { this.syntax = args.remove("syntax"); } } public void inform(ResourceLoader loader) { if (outFile != null) { File outFilePath = new File(outFile); if (!outFilePath.exists()) { try { outFilePath.createNewFile(); } catch (IOException e) { throw new RuntimeException(e); } log.warn("We have created " + outFilePath); } outFile = outFilePath.getAbsolutePath(); synMap.setOutput(outFile); } else { log.warn("Missing required argument 'outFile' at: " + this.getClass().getName() + "The synonyms will not be saved to disk"); } if (synonyms != null) { File outFilePath = new File(synonyms); if (outFilePath.isAbsolute() == false) { List<String> files = StrUtils.splitFileNames(synonyms); for (String file : files) { loadFile(loader, file); } } else { loadFile(loader, synonyms); } } } public WriteableSynonymMap createSynonymMap() { if (syntax == null) { syntax = "explicit"; } if (syntax.equals("equivalent")) { return new WriteableEquivalentSynonymMap(); } else if (syntax.equals("explicit")) { return new WriteableExplicitSynonymMap(); } else { throw new RuntimeException("Unknown syntax type specified for WriteableSynonymMap"); } } private void loadFile(ResourceLoader loader, String filepath) { try { log.info("Loading: " + filepath); getSynonymMap().populateMap(((SolrResourceLoader) loader).getLines(filepath)); } catch (IOException e) { throw new RuntimeException(e); } } public WriteableSynonymMap getSynonymMap() { if (synMap == null) { synMap = createSynonymMap(); } return synMap; } public void setSynonymMap(WriteableSynonymMap synMap) { this.synMap = synMap; } }