package fr.ippon.tatami.bot;
import fr.ippon.tatami.bot.config.TatamibotConfiguration;
import fr.ippon.tatami.bot.route.GitHubRouteBuilder;
import fr.ippon.tatami.bot.route.RssRouteBuilder;
import fr.ippon.tatami.bot.route.SourceRouteBuilderBase;
import fr.ippon.tatami.bot.route.TwitterRouteBuilder;
import fr.ippon.tatami.config.Constants;
import fr.ippon.tatami.domain.Domain;
import fr.ippon.tatami.repository.DomainRepository;
import fr.ippon.tatami.repository.TatamibotConfigurationRepository;
import fr.ippon.tatami.service.UserService;
import fr.ippon.tatami.service.util.DomainUtil;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.spi.IdempotentRepository;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
/**
* The Tatami Robot.
*/
@Component
public class Tatamibot extends RouteBuilder {
private static final Logger log = LoggerFactory.getLogger(Tatamibot.class);
@Inject
private IdempotentRepository<String> idempotentRepository;
@Inject
private DomainRepository domainRepository;
@Inject
private TatamibotConfigurationRepository tatamibotConfigurationRepository;
@Inject
private UserService userService;
@Override
public void configure() {
log.info("Configuring the Tatami Bot");
for (Domain domain : domainRepository.getAllDomains()) {
log.debug("Configuring Bot for domain {}", domain.getName());
String tatamiBotLogin = getTatamiBotLogin(domain);
for (TatamibotConfiguration configuration :
tatamibotConfigurationRepository.findTatamibotConfigurationsByDomain(domain.getName())) {
log.debug("Configuring Bot : {}", configuration);
SourceRouteBuilderBase subBuilder = null;
if (configuration.getType().equals(TatamibotConfiguration.TatamibotType.RSS)) {
subBuilder = new RssRouteBuilder();
} else if (configuration.getType().equals(TatamibotConfiguration.TatamibotType.TWITTER)) {
subBuilder = new TwitterRouteBuilder();
} else if (configuration.getType().equals(TatamibotConfiguration.TatamibotType.GIT)) {
subBuilder = new GitHubRouteBuilder();
}
if (subBuilder != null) {
subBuilder.setConfiguration(configuration);
subBuilder.setTatamiBotLogin(tatamiBotLogin);
subBuilder.setIdempotentRepository(idempotentRepository);
addRoutesToContext(subBuilder);
}
}
}
}
private void addRoutesToContext(RouteBuilder builder) {
try {
getContext().addRoutes(builder);
} catch (Exception e) {
throw new RuntimeException("Unexpected error when configuring a route", e);
}
}
private String getTatamiBotLogin(Domain domain) {
String tatamiBotLogin = DomainUtil.getLoginFromUsernameAndDomain(Constants.TATAMIBOT_NAME, domain.getName());
automaticBotCreation(domain, tatamiBotLogin);
return tatamiBotLogin;
}
private void automaticBotCreation(Domain domain, String tatamiBotLogin) {
if (userService.getUserByLogin(tatamiBotLogin) == null) {
log.info("Tatami Bot user does not exist for domain " + domain.getName() + " - creating it");
userService.createTatamibot(domain.getName());
if (domain.getName().equals("ippon.fr")) {
log.info("Creating a default RSS robot for ippon.fr");
TatamibotConfiguration configuration = new TatamibotConfiguration();
configuration.setType(TatamibotConfiguration.TatamibotType.RSS);
configuration.setDomain("ippon.fr");
configuration.setUrl("http://feeds.feedburner.com/LeBlogDesExpertsJ2ee?format=xml");
configuration.setPollingDelay(60);
DateTime lastUpdateDate = DateTime.parse("2013-01-01T00:00:00");
configuration.setLastUpdateDate(lastUpdateDate.toDate());
configuration.setTag("BlogIppon");
tatamibotConfigurationRepository.insertTatamibotConfiguration(configuration);
}
}
}
}