package org.molgenis.bootstrap.populate;
import org.molgenis.data.DataService;
import org.molgenis.data.settings.SettingsPopulator;
import org.molgenis.script.ScriptTypePopulator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;
import static java.util.Objects.requireNonNull;
import static org.molgenis.auth.UserMetaData.USER;
/**
* Populates {@link org.molgenis.data.Repository repositories} with data during bootstrapping.
*/
@Component
public class RepositoryPopulator
{
private static final Logger LOG = LoggerFactory.getLogger(RepositoryPopulator.class);
private final DataService dataService;
private final UsersGroupsAuthoritiesPopulator usersGroupsAuthoritiesPopulator;
private final SystemEntityPopulator systemEntityPopulator;
private final SettingsPopulator settingsPopulator;
private final I18nPopulator i18nPopulator;
private final ScriptTypePopulator scriptTypePopulator;
@Autowired
public RepositoryPopulator(DataService dataService, UsersGroupsAuthoritiesPopulator usersGroupsAuthoritiesPopulator,
SystemEntityPopulator systemEntityPopulator, SettingsPopulator settingsPopulator,
I18nPopulator i18nPopulator, ScriptTypePopulator scriptTypePopulator)
{
this.dataService = requireNonNull(dataService);
this.usersGroupsAuthoritiesPopulator = requireNonNull(usersGroupsAuthoritiesPopulator);
this.systemEntityPopulator = requireNonNull(systemEntityPopulator);
this.settingsPopulator = requireNonNull(settingsPopulator);
this.i18nPopulator = requireNonNull(i18nPopulator);
this.scriptTypePopulator = requireNonNull(scriptTypePopulator);
}
public void populate(ContextRefreshedEvent event)
{
if (!isDatabasePopulated())
{
LOG.trace("Populating database with users, groups and authorities ...");
usersGroupsAuthoritiesPopulator.populate();
LOG.trace("Populated database with users, groups and authorities");
LOG.trace("Populating database with I18N strings ...");
i18nPopulator.populateLanguages();
LOG.trace("Populated database with I18N strings");
// populate repositories with application-specific entities
LOG.trace("Populating database with application entities ...");
systemEntityPopulator.populate(event);
LOG.trace("Populated database with application entities");
}
LOG.trace("Populating settings entities ...");
settingsPopulator.initialize(event);
LOG.trace("Populated settings entities");
LOG.trace("Populating database with I18N strings ...");
i18nPopulator.populateI18nStrings();
LOG.trace("Populated database with I18N strings");
LOG.trace("Populating script type entities ...");
scriptTypePopulator.populate();
LOG.trace("Populated script type entities");
}
private boolean isDatabasePopulated()
{
return dataService.count(USER) > 0;
}
}