package org.molgenis.annotation.cmd;
import org.molgenis.CommandLineOnlyConfiguration;
import org.molgenis.annotation.cmd.conversion.EffectStructureConverter;
import org.molgenis.annotation.cmd.data.CmdLineDataService;
import org.molgenis.annotation.cmd.data.CmdLineSettingsEntity;
import org.molgenis.annotation.cmd.utils.VcfValidator;
import org.molgenis.data.*;
import org.molgenis.data.annotation.core.utils.JarRunnerImpl;
import org.molgenis.data.convert.DateToStringConverter;
import org.molgenis.data.convert.StringToDateConverter;
import org.molgenis.data.meta.model.*;
import org.molgenis.data.meta.EntityTypeDependencyResolver;
import org.molgenis.data.meta.model.AttributeMetadata;
import org.molgenis.data.meta.model.EntityTypeMetadata;
import org.molgenis.data.meta.model.PackageMetadata;
import org.molgenis.data.meta.model.TagMetadata;
import org.molgenis.data.populate.AutoValuePopulator;
import org.molgenis.data.populate.DefaultValuePopulator;
import org.molgenis.data.populate.EntityPopulator;
import org.molgenis.data.populate.UuidGenerator;
import org.molgenis.data.vcf.utils.VcfUtils;
import org.molgenis.util.GenericDependencyResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.support.DefaultConversionService;
import javax.annotation.PostConstruct;
import static com.google.common.collect.Lists.newArrayList;
/**
* Commandline-specific annotator configuration.
*/
@Configuration
@CommandLineOnlyConfiguration
@ComponentScan({ "org.molgenis.data.meta.model", "org.molgenis.data.system.model", "org.molgenis.data.vcf.model",
"org.molgenis.data.annotation.core.effects" })
public class CommandLineAnnotatorConfig
{
@Autowired
ApplicationContext applicationContext;
@Autowired
EntityTypeFactory entityTypeFactory;
@Autowired
AttributeFactory attributeFactory;
@PostConstruct
public void bootstrap()
{
EntityTypeMetadata entityTypeMeta = applicationContext.getBean(EntityTypeMetadata.class);
entityTypeMeta.setBackendEnumOptions(newArrayList("test"));
applicationContext.getBean(AttributeMetadata.class).bootstrap(entityTypeMeta);
applicationContext.getBean(EntityTypeMetadata.class).bootstrap(entityTypeMeta);
applicationContext.getBean(PackageMetadata.class).bootstrap(entityTypeMeta);
applicationContext.getBean(TagMetadata.class).bootstrap(entityTypeMeta);
}
@Value("${vcf-validator-location:@null}")
private String vcfValidatorLocation;
/**
* Needed to make @Value annotations with property placeholders work!
* <p>
* https://stackoverflow.com/questions/17097521/spring-3-2-value-annotation-with-pure-java-configuration-does-not
* -work-but-env
*/
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer()
{
PropertySourcesPlaceholderConfigurer result = new PropertySourcesPlaceholderConfigurer();
result.setNullValue("@null");
return result;
}
@Bean
VcfUtils vcfUtils()
{
return new VcfUtils();
}
@Bean
EffectStructureConverter effectStructureConverter()
{
return new EffectStructureConverter(entityTypeFactory, attributeFactory);
}
@Bean
public DataService dataService()
{
return new CmdLineDataService();
}
@Bean
public VcfValidator vcfValidator()
{
return new VcfValidator(vcfValidatorLocation);
}
@Bean
ConversionService conversionService()
{
DefaultConversionService registry = new DefaultConversionService();
registry.addConverter(new DateToStringConverter());
registry.addConverter(new StringToDateConverter());
return registry;
}
@Bean
EntityFactoryRegistry entityFactoryRegistry()
{
return new EntityFactoryRegistry();
}
@Bean
EntityReferenceCreator entityReferenceCreator()
{
return new EntityReferenceCreatorImpl(dataService(), entityFactoryRegistry());
}
@Bean
EntityManager entityManager()
{
return new EntityManagerImpl(dataService(), entityFactoryRegistry(), entityPopulator(),
entityReferenceCreator());
}
@Bean
public CmdLineAnnotator cmdLineAnnotator()
{
return new CmdLineAnnotator();
}
@Bean
public AutoValuePopulator autoValuePopulator()
{
return new AutoValuePopulator(uuidGenerator());
}
@Bean
public DefaultValuePopulator defaultValuePopulator()
{
return new DefaultValuePopulator(entityReferenceCreator());
}
@Bean
public EntityPopulator entityPopulator()
{
return new EntityPopulator(autoValuePopulator(), defaultValuePopulator());
}
@Bean
public EntityTypeDependencyResolver entityTypeDependencyResolver()
{
return new EntityTypeDependencyResolver(genericDependencyResolver());
}
@Bean
public GenericDependencyResolver genericDependencyResolver()
{
return new GenericDependencyResolver();
}
@Bean
public UuidGenerator uuidGenerator()
{
return new UuidGenerator();
}
@Bean
public JarRunnerImpl jarRunner()
{
return new JarRunnerImpl();
}
@Bean
public Entity snpEffAnnotatorSettings()
{
return new CmdLineSettingsEntity();
}
@Bean
public Entity goNLAnnotatorSettings()
{
return new CmdLineSettingsEntity();
}
@Bean
public Entity thousendGenomesAnnotatorSettings()
{
return new CmdLineSettingsEntity();
}
@Bean
public Entity CGDAnnotatorSettings()
{
return new CmdLineSettingsEntity();
}
@Bean
public Entity clinvarAnnotatorSettings()
{
return new CmdLineSettingsEntity();
}
@Bean
public Entity dannAnnotatorSettings()
{
return new CmdLineSettingsEntity();
}
@Bean
public Entity exacAnnotatorSettings()
{
return new CmdLineSettingsEntity();
}
@Bean
public Entity caddAnnotatorSettings()
{
return new CmdLineSettingsEntity();
}
@Bean
public Entity fitConAnnotatorSettings()
{
return new CmdLineSettingsEntity();
}
@Bean
public Entity HPOAnnotatorSettings()
{
return new CmdLineSettingsEntity();
}
@Bean
public Entity gavinAnnotatorSettings()
{
return new CmdLineSettingsEntity();
}
@Bean
public Entity omimAnnotatorSettings()
{
return new CmdLineSettingsEntity();
}
}