package org.molgenis.bootstrap.populate;
import org.molgenis.data.DataService;
import org.molgenis.data.FileRepositoryCollectionFactory;
import org.molgenis.data.i18n.LanguageService;
import org.molgenis.data.i18n.model.LanguageFactory;
import org.molgenis.data.importer.ImportService;
import org.molgenis.data.importer.ImportServiceFactory;
import org.molgenis.data.support.FileRepositoryCollection;
import org.molgenis.file.FileStore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Locale;
import static java.util.Objects.requireNonNull;
import static org.molgenis.data.DatabaseAction.ADD_IGNORE_EXISTING;
import static org.molgenis.data.i18n.model.LanguageMetadata.LANGUAGE;
import static org.molgenis.data.meta.DefaultPackage.PACKAGE_DEFAULT;
import static org.molgenis.security.core.runas.RunAsSystemProxy.runAsSystem;
/**
* Imports i18n static strings from molgenis-core-ui/src/main/resources/i18n.xlsx at startup.
* <p>
* Only adds new strings, does not update existing ones, because otherwise the ones you have changed using the
* dataexplorer will be overwritten again on the next startup.
*/
@Component
public class I18nPopulator
{
private static final Logger LOG = LoggerFactory.getLogger(I18nPopulator.class);
private final DataService dataService;
private final LanguageFactory languageFactory;
private final FileRepositoryCollectionFactory fileRepositoryCollectionFactory;
private final ImportServiceFactory importServiceFactory;
private final FileStore fileStore;
@Autowired
public I18nPopulator(DataService dataService, LanguageFactory languageFactory,
FileRepositoryCollectionFactory fileRepositoryCollectionFactory, ImportServiceFactory importServiceFactory,
FileStore fileStore)
{
this.dataService = requireNonNull(dataService);
this.languageFactory = requireNonNull(languageFactory);
this.fileRepositoryCollectionFactory = requireNonNull(fileRepositoryCollectionFactory);
this.importServiceFactory = requireNonNull(importServiceFactory);
this.fileStore = requireNonNull(fileStore);
}
/**
* Populate data store with internationalization strings
*/
public void populateI18nStrings()
{
final String i18nFileName = "i18n.xlsx";
// "i18n is saved as a Application/Library resource.
// "It is not possible to use it as a file but should streamed as a resource"
InputStream is = I18nPopulator.class.getClassLoader().getResourceAsStream(i18nFileName);
try
{
File fileInTempDir = fileStore.store(is, i18nFileName);
LOG.trace("Create temp file for {} : {}", i18nFileName, fileInTempDir);
FileRepositoryCollection repoCollection = fileRepositoryCollectionFactory
.createFileRepositoryCollection(fileInTempDir);
ImportService importService = importServiceFactory.getImportService(fileInTempDir, repoCollection);
runAsSystem(() -> importService.doImport(repoCollection, ADD_IGNORE_EXISTING, PACKAGE_DEFAULT));
if (fileInTempDir.exists())
{
LOG.trace("Delete temp file for {} : {}", i18nFileName, fileInTempDir);
fileInTempDir.delete();
}
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
/**
* Populate data store with default languages
*/
public void populateLanguages()
{
dataService.add(LANGUAGE, languageFactory
.create(LanguageService.DEFAULT_LANGUAGE_CODE, LanguageService.DEFAULT_LANGUAGE_NAME, true));
dataService
.add(LANGUAGE, languageFactory.create("nl", new Locale("nl").getDisplayName(new Locale("nl")), false));
dataService
.add(LANGUAGE, languageFactory.create("pt", new Locale("pt").getDisplayName(new Locale("pt")), false));
dataService
.add(LANGUAGE, languageFactory.create("es", new Locale("es").getDisplayName(new Locale("es")), false));
dataService
.add(LANGUAGE, languageFactory.create("de", new Locale("de").getDisplayName(new Locale("de")), false));
dataService
.add(LANGUAGE, languageFactory.create("it", new Locale("it").getDisplayName(new Locale("it")), false));
dataService
.add(LANGUAGE, languageFactory.create("fr", new Locale("fr").getDisplayName(new Locale("fr")), false));
dataService.add(LANGUAGE, languageFactory.create("xx", "My language", false));
}
}