package org.wikipedia.miner.web.service;
import java.io.File;
import java.util.HashMap;
import java.util.Set;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import org.wikipedia.miner.comparison.ArticleComparer;
import org.wikipedia.miner.comparison.ConnectionSnippetWeighter;
import org.wikipedia.miner.comparison.LabelComparer;
import org.wikipedia.miner.model.Wikipedia;
import org.wikipedia.miner.util.WikipediaConfiguration;
import org.wikipedia.miner.web.util.HubConfiguration;
import org.wikipedia.miner.web.util.MarkupFormatter;
import org.wikipedia.miner.web.util.WebContentRetriever;
public class WMHub {
private static WMHub instance ;
private HubConfiguration config ;
private HashMap<String, Wikipedia> wikipediasByName ;
private HashMap<String, ArticleComparer> articleComparersByWikiName ;
private HashMap<String, LabelComparer> labelComparersByWikiName ;
private HashMap<String, ConnectionSnippetWeighter> snippetWeightersByWikiName ;
private MarkupFormatter formatter = new MarkupFormatter() ;
private WebContentRetriever retriever ;
// Protect the constructor, so no other class can call it
private WMHub(ServletContext context) throws ServletException {
wikipediasByName = new HashMap<String, Wikipedia>() ;
articleComparersByWikiName = new HashMap<String, ArticleComparer>() ;
labelComparersByWikiName = new HashMap<String, LabelComparer>() ;
snippetWeightersByWikiName = new HashMap<String, ConnectionSnippetWeighter>() ;
try {
String hubConfigFile = context.getInitParameter("hubConfigFile") ;
config = new HubConfiguration(new File(hubConfigFile)) ;
for (String wikiName:config.getWikipediaNames()) {
File wikiConfigFile = new File(config.getWikipediaConfig(wikiName)) ;
WikipediaConfiguration wikiConfig = new WikipediaConfiguration(wikiConfigFile);
Wikipedia wikipedia = new Wikipedia(wikiConfig, true) ;
wikipediasByName.put(wikiName, wikipedia) ;
ArticleComparer artCmp = new ArticleComparer(wikipedia) ;
articleComparersByWikiName.put(wikiName, artCmp) ;
if (artCmp != null && wikiConfig.getLabelDisambiguationModel() != null && wikiConfig.getLabelComparisonModel() != null) {
LabelComparer lblCmp = new LabelComparer(wikipedia, artCmp) ;
labelComparersByWikiName.put(wikiName, lblCmp) ;
}
ConnectionSnippetWeighter sw = new ConnectionSnippetWeighter(wikipedia, artCmp) ;
snippetWeightersByWikiName.put(wikiName, sw) ;
}
retriever = new WebContentRetriever(config) ;
} catch (Exception e) {
throw new ServletException(e) ;
}
}
public static WMHub getInstance(ServletContext context) throws ServletException {
if (instance != null)
return instance ;
instance = new WMHub(context) ;
return instance ;
}
public String getDefaultWikipediaName() {
return config.getDefaultWikipediaName() ;
}
public Wikipedia getWikipedia(String wikiName) {
return wikipediasByName.get(wikiName) ;
}
public String getWikipediaDescription(String wikiName) {
return config.getWikipediaDescription(wikiName) ;
}
public String[] getWikipediaNames() {
Set<String> wikipediaNames = wikipediasByName.keySet() ;
return wikipediaNames.toArray(new String[wikipediaNames.size()]) ;
}
public ArticleComparer getArticleComparer(String wikiName) {
return articleComparersByWikiName.get(wikiName) ;
}
public LabelComparer getLabelComparer(String wikiName) {
return labelComparersByWikiName.get(wikiName) ;
}
public ConnectionSnippetWeighter getConnectionSnippetWeighter(String wikiName) {
return snippetWeightersByWikiName.get(wikiName) ;
}
public MarkupFormatter getFormatter() {
return formatter ;
}
public WebContentRetriever getRetriever() {
return retriever ;
}
}