package com.vistatec.ocelot.di;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import javax.xml.bind.JAXBException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.eventbus.EventBus;
import com.google.common.io.ByteSource;
import com.google.common.io.CharSink;
import com.google.common.io.Files;
import com.google.inject.AbstractModule;
import com.google.inject.Scopes;
import com.vistatec.ocelot.DefaultPlatformSupport;
import com.vistatec.ocelot.OSXPlatformSupport;
import com.vistatec.ocelot.OcelotApp;
import com.vistatec.ocelot.PlatformSupport;
import com.vistatec.ocelot.config.ConfigService;
import com.vistatec.ocelot.config.ConfigTransferService;
import com.vistatec.ocelot.config.ConfigTransferService.TransferException;
import com.vistatec.ocelot.config.Configs;
import com.vistatec.ocelot.config.DirectoryBasedConfigs;
import com.vistatec.ocelot.config.LQIXmlConfigTransferService;
import com.vistatec.ocelot.config.LqiConfigService;
import com.vistatec.ocelot.config.OcelotConfigService;
import com.vistatec.ocelot.config.OcelotXmlConfigTransferService;
import com.vistatec.ocelot.events.api.EventBusWrapper;
import com.vistatec.ocelot.events.api.OcelotEventQueue;
import com.vistatec.ocelot.findrep.FindAndReplaceController;
import com.vistatec.ocelot.its.stats.model.ITSDocStats;
import com.vistatec.ocelot.lqi.LQIGridController;
import com.vistatec.ocelot.lqi.constants.LQIConstants;
import com.vistatec.ocelot.plugins.PluginManager;
import com.vistatec.ocelot.rules.RuleConfiguration;
import com.vistatec.ocelot.rules.RulesParser;
import com.vistatec.ocelot.services.ITSDocStatsService;
import com.vistatec.ocelot.services.OkapiXliffService;
import com.vistatec.ocelot.services.ProvenanceService;
import com.vistatec.ocelot.services.SegmentService;
import com.vistatec.ocelot.services.SegmentServiceImpl;
import com.vistatec.ocelot.services.XliffService;
import com.vistatec.ocelot.tm.TmManager;
import com.vistatec.ocelot.tm.TmPenalizer;
import com.vistatec.ocelot.tm.TmService;
import com.vistatec.ocelot.tm.gui.TmGuiManager;
import com.vistatec.ocelot.tm.okapi.OkapiTmManager;
import com.vistatec.ocelot.tm.okapi.OkapiTmService;
import com.vistatec.ocelot.tm.okapi.OkapiTmxWriter;
import com.vistatec.ocelot.tm.penalty.SimpleTmPenalizer;
/**
* Main Ocelot object dependency context module.
*/
public class OcelotModule extends AbstractModule {
private static final Logger LOG = LoggerFactory.getLogger(OcelotModule.class);
@Override
protected void configure() {
OcelotEventQueue eventQueue = new EventBusWrapper(new EventBus());
bind(OcelotEventQueue.class).toInstance(eventQueue);
ITSDocStats docStats = new ITSDocStats();
bind(ITSDocStats.class).toInstance(docStats);
bind(OcelotApp.class).in(Scopes.SINGLETON);
PlatformSupport platformSupport = getPlatformSupport();
bind(PlatformSupport.class).toInstance(platformSupport);
ConfigService cfgService = null;
LqiConfigService lqiCfgService = null;
RuleConfiguration ruleConfig = null;
PluginManager pluginManager = null;
TmManager tmManager = null;
TmService tmService = null;
TmPenalizer penalizer = null;
TmGuiManager tmGuiManager = null;
LQIGridController lqiGridController = null;
FindAndReplaceController frController = null;
try {
File ocelotDir = new File(System.getProperty("user.home"), ".ocelot");
ocelotDir.mkdirs();
Configs configs = new DirectoryBasedConfigs(ocelotDir);
cfgService = setupConfigService(ocelotDir);
lqiCfgService = setupLQIConfigService(ocelotDir);
ruleConfig = new RulesParser().loadConfig(configs.getRulesReader());
pluginManager = new PluginManager(cfgService, new File(ocelotDir, "plugins"), eventQueue);
pluginManager.discover();
eventQueue.registerListener(pluginManager);
SegmentService segmentService = new SegmentServiceImpl(eventQueue);
bind(SegmentService.class).toInstance(segmentService);
eventQueue.registerListener(segmentService);
File tm = new File(ocelotDir, "tm");
tm.mkdirs();
OkapiTmxWriter tmxWriter = new OkapiTmxWriter(segmentService);
eventQueue.registerListener(tmxWriter);
tmManager = new OkapiTmManager(tm, cfgService, tmxWriter);
bind(OkapiTmManager.class).toInstance((OkapiTmManager) tmManager);
penalizer = new SimpleTmPenalizer(tmManager);
tmService = new OkapiTmService((OkapiTmManager)tmManager, penalizer, cfgService);
tmGuiManager = new TmGuiManager(tmManager, tmService, eventQueue, cfgService);
lqiGridController = new LQIGridController(lqiCfgService, eventQueue,
platformSupport);
eventQueue.registerListener(lqiGridController);
bind(LQIGridController.class).toInstance(lqiGridController);
frController = new FindAndReplaceController(eventQueue);
eventQueue.registerListener(frController);
} catch (IOException | JAXBException | ConfigTransferService.TransferException ex) {
LOG.error("Failed to initialize configuration", ex);
System.exit(1);
}
bind(RuleConfiguration.class).toInstance(ruleConfig);
bind(PluginManager.class).toInstance(pluginManager);
bind(TmManager.class).toInstance(tmManager);
bind(TmPenalizer.class).toInstance(penalizer);
bind(TmService.class).toInstance(tmService);
bind(TmGuiManager.class).toInstance(tmGuiManager);
bind(FindAndReplaceController.class).toInstance(frController);
bindServices(eventQueue, cfgService, lqiCfgService, docStats);
}
public static PlatformSupport getPlatformSupport() {
String os = System.getProperty("os.name");
if (os.startsWith("Mac")) {
return new OSXPlatformSupport();
}
return new DefaultPlatformSupport();
}
private void bindServices(OcelotEventQueue eventQueue,
ConfigService cfgService, LqiConfigService lqiCfgService,
ITSDocStats docStats) {
bind(ConfigService.class).toInstance(cfgService);
bind(LqiConfigService.class).toInstance(lqiCfgService);
ProvenanceService provService = new ProvenanceService(eventQueue, cfgService);
bind(ProvenanceService.class).toInstance(provService);
eventQueue.registerListener(provService);
ITSDocStatsService docStatsService = new ITSDocStatsService(docStats, eventQueue);
bind(ITSDocStatsService.class).toInstance(docStatsService);
eventQueue.registerListener(docStatsService);
XliffService xliffService = new OkapiXliffService(cfgService, eventQueue);
bind(XliffService.class).toInstance(xliffService);
eventQueue.registerListener(xliffService);
}
private OcelotConfigService setupConfigService(File ocelotDir) throws ConfigTransferService.TransferException, JAXBException {
File configFile = new File(ocelotDir, "ocelot_cfg.xml");
ByteSource configSource = !configFile.exists() ?
ByteSource.empty() :
Files.asByteSource(configFile);
CharSink configSink = Files.asCharSink(configFile,
Charset.forName("UTF-8"));
return new OcelotConfigService(new OcelotXmlConfigTransferService(
configSource, configSink));
}
private LqiConfigService setupLQIConfigService(File ocelotDir)
throws TransferException, JAXBException {
File configFile = new File(ocelotDir, "lqi_cfg.xml");
ByteSource configSource = !configFile.exists() ? ByteSource.empty()
: Files.asByteSource(configFile);
CharSink configSink = Files.asCharSink(configFile,
Charset.forName("UTF-8"));
LqiConfigService service = new LqiConfigService(new LQIXmlConfigTransferService(
configSource, configSink));
// If the config file doesn't exist, initialize a default configuration.
if (!configFile.exists()) {
LOG.info("Writing default LQI Grid configuration to " + configFile);
service.saveLQIConfig(LQIConstants.getDefaultLQIGrid());
}
return service;
}
}