package org.gbif.checklistbank.service.mybatis.guice;
import com.google.common.base.Preconditions;
import com.google.inject.Key;
import com.google.inject.Scopes;
import com.google.inject.name.Names;
import org.gbif.api.model.checklistbank.*;
import org.gbif.api.model.common.Identifier;
import org.gbif.api.service.checklistbank.*;
import org.gbif.api.vocabulary.Country;
import org.gbif.api.vocabulary.Language;
import org.gbif.checklistbank.config.ClbConfiguration;
import org.gbif.checklistbank.model.*;
import org.gbif.checklistbank.service.*;
import org.gbif.checklistbank.service.ParsedNameService;
import org.gbif.checklistbank.service.mybatis.*;
import org.gbif.checklistbank.service.mybatis.mapper.*;
import org.gbif.mybatis.guice.MyBatisModule;
import org.gbif.mybatis.type.CountryTypeHandler;
import org.gbif.mybatis.type.LanguageTypeHandler;
import org.gbif.mybatis.type.UriTypeHandler;
import org.gbif.mybatis.type.UuidTypeHandler;
import org.gbif.nameparser.GBIFNameParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.sql.DataSource;
import java.net.URI;
import java.util.Properties;
import java.util.UUID;
/**
* This Module should not be used, use the
* {@link org.gbif.checklistbank.service.mybatis.guice.ChecklistBankServiceMyBatisModule} instead.
*/
public class InternalChecklistBankServiceMyBatisModule extends MyBatisModule {
private static final Logger LOG = LoggerFactory.getLogger(InternalChecklistBankServiceMyBatisModule.class);
private static final String DATASOURCE_BINDING_NAME = "checklistbank";
public static final Key<DataSource> DATASOURCE_KEY = Key.get(DataSource.class,
Names.named(InternalChecklistBankServiceMyBatisModule.DATASOURCE_BINDING_NAME));
private final int parserTimeout;
private final int importThreads;
public InternalChecklistBankServiceMyBatisModule(Properties props, int parserTimeout, int importThreads) {
super(DATASOURCE_BINDING_NAME, props);
Preconditions.checkArgument(parserTimeout >= 50, "Name parser timeout must be at least 50ms");
this.parserTimeout = parserTimeout;
Preconditions.checkArgument(importThreads >= 0, "Number of import threads need to be positive");
this.importThreads = importThreads;
}
public static InternalChecklistBankServiceMyBatisModule create(ClbConfiguration cfg) {
LOG.info("Connecting to checklistbank db {} on {} with user {}", cfg.databaseName, cfg.serverName, cfg.user);
return new InternalChecklistBankServiceMyBatisModule(cfg.toProps(false), cfg.parserTimeout, cfg.syncThreads);
}
@Override
protected void bindMappers() {
// mybatis config
addAlias("Count").to(DatasetMetricsServiceMyBatis.Count.class);
addAlias("DatasetCore").to(DatasetCore.class);
addAlias("DatasetMetrics").to(DatasetMetrics.class);
addAlias("Description").to(Description.class);
addAlias("Distribution").to(Distribution.class);
addAlias("Identifier").to(Identifier.class);
addAlias("NameUsage").to(NameUsage.class);
addAlias("ParsedNameUsage").to(ParsedNameUsage.class);
addAlias("ScientificName").to(ScientificName.class);
addAlias("NameUsageContainer").to(NameUsageContainer.class);
addAlias("NameUsageMediaObject").to(NameUsageMediaObject.class);
addAlias("NameUsageMetrics").to(NameUsageMetrics.class);
addAlias("NameUsageWritable").to(NameUsageWritable.class);
addAlias("ParsedName").to(ParsedName.class);
addAlias("RawUsage").to(RawUsage.class);
addAlias("Reference").to(Reference.class);
addAlias("SpeciesProfile").to(SpeciesProfile.class);
addAlias("TocEntry").to(TocEntry.class);
addAlias("TypeSpecimen").to(TypeSpecimen.class);
addAlias("Usage").to(Usage.class);
addAlias("UsageCount").to(UsageCount.class);
addAlias("UsageRelated").to(UsageRelated.class);
addAlias("VerbatimNameUsage").to(VerbatimNameUsage.class);
addAlias("VernacularName").to(VernacularName.class);
// mybatis mapper
addMapperClass(Common.class);
addMapperClass(CitationMapper.class);
addMapperClass(ColAnnotationMapper.class);
addMapperClass(DatasetMapper.class);
addMapperClass(DatasetMetricsMapper.class);
addMapperClass(DescriptionMapper.class);
addMapperClass(DistributionMapper.class);
addMapperClass(IdentifierMapper.class);
addMapperClass(MultimediaMapper.class);
addMapperClass(NameUsageMapper.class);
addMapperClass(NameUsageMetricsMapper.class);
addMapperClass(NubRelMapper.class);
addMapperClass(ParsedNameMapper.class);
addMapperClass(RawUsageMapper.class);
addMapperClass(ReferenceMapper.class);
addMapperClass(SpeciesProfileMapper.class);
addMapperClass(TypeSpecimenMapper.class);
addMapperClass(UsageCountMapper.class);
addMapperClass(UsageMapper.class);
addMapperClass(VernacularNameMapper.class);
}
@Override
protected void bindTypeHandlers() {
// mybatis type handler
handleType(Country.class).with(CountryTypeHandler.class);
handleType(Language.class).with(LanguageTypeHandler.class);
handleType(UUID.class).with(UuidTypeHandler.class);
handleType(URI.class).with(UriTypeHandler.class);
}
@Override
protected void bindManagers() {
// services. Make sure they are also exposed in the public module!
bind(NameUsageService.class).to(NameUsageServiceMyBatis.class).in(Scopes.SINGLETON);
bind(VernacularNameService.class).to(VernacularNameServiceMyBatis.class).in(Scopes.SINGLETON);
bind(ReferenceService.class).to(ReferenceServiceMyBatis.class).in(Scopes.SINGLETON);
bind(DescriptionService.class).to(DescriptionServiceMyBatis.class).in(Scopes.SINGLETON);
bind(DistributionService.class).to(DistributionServiceMyBatis.class).in(Scopes.SINGLETON);
bind(IdentifierService.class).to(IdentifierServiceMyBatis.class).in(Scopes.SINGLETON);
bind(MultimediaService.class).to(MultimediaServiceMyBatis.class).in(Scopes.SINGLETON);
bind(SpeciesProfileService.class).to(SpeciesProfileServiceMyBatis.class).in(Scopes.SINGLETON);
bind(TypeSpecimenService.class).to(TypeSpecimenServiceMyBatis.class).in(Scopes.SINGLETON);
bind(DatasetMetricsService.class).to(DatasetMetricsServiceMyBatis.class).in(Scopes.SINGLETON);
// not exposed in API
bind(UsageService.class).to(UsageServiceMyBatis.class).in(Scopes.SINGLETON);
bind(ParsedNameService.class).to(ParsedNameServiceMyBatis.class).in(Scopes.SINGLETON);
bind(UsageSyncService.class).to(UsageSyncServiceMyBatis.class).in(Scopes.SINGLETON);
bind(CitationService.class).to(CitationServiceMyBatis.class).in(Scopes.SINGLETON);
bind(ColAnnotationService.class).to(ColAnnotationServiceMyBatis.class).in(Scopes.SINGLETON);
bind(DatasetAnalysisService.class).to(DatasetAnalysisServiceMyBatis.class).in(Scopes.SINGLETON);
bind(Integer.class)
.annotatedWith(Mybatis.class)
.toInstance(importThreads);
bind(DatasetImportService.class)
.annotatedWith(Mybatis.class)
.to(DatasetImportServiceMyBatis.class)
.in(Scopes.SINGLETON);
bind(NameParser.class).toInstance(new GBIFNameParser(parserTimeout));
}
}