Add check for language files to smoke tests and remove references to … (#74)
* Add check for language files to smoke tests and remove references to build.properties * Catch IOException more goodly * Make languages.selectableLocales optional, fix default value for RDFService.languageFilter
This commit is contained in:
parent
96a2b8a474
commit
5ca7a9235f
1 changed files with 66 additions and 17 deletions
|
@ -4,6 +4,13 @@ package edu.cornell.mannlib.vitro.webapp.config;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
import javax.servlet.ServletContextEvent;
|
import javax.servlet.ServletContextEvent;
|
||||||
|
@ -25,10 +32,11 @@ public class ConfigurationPropertiesSmokeTests implements
|
||||||
.getLog(ConfigurationPropertiesSmokeTests.class);
|
.getLog(ConfigurationPropertiesSmokeTests.class);
|
||||||
|
|
||||||
private static final String PROPERTY_DEFAULT_NAMESPACE = "Vitro.defaultNamespace";
|
private static final String PROPERTY_DEFAULT_NAMESPACE = "Vitro.defaultNamespace";
|
||||||
private static final String PROPERTY_LANGUAGE_BUILD = "languages.addToBuild";
|
|
||||||
private static final String PROPERTY_LANGUAGE_SELECTABLE = "languages.selectableLocales";
|
private static final String PROPERTY_LANGUAGE_SELECTABLE = "languages.selectableLocales";
|
||||||
private static final String PROPERTY_LANGUAGE_FORCE = "languages.forceLocale";
|
private static final String PROPERTY_LANGUAGE_FORCE = "languages.forceLocale";
|
||||||
private static final String PROPERTY_LANGUAGE_FILTER = "RDFService.languageFilter";
|
private static final String PROPERTY_LANGUAGE_FILTER = "RDFService.languageFilter";
|
||||||
|
private static final String VIVO_BUNDLE_PREFIX = "vivo_all_";
|
||||||
|
private static final String VITRO_BUNDLE_PREFIX = "all_";
|
||||||
private static final String PROPERTY_ARGON2_TIME = "argon2.time";
|
private static final String PROPERTY_ARGON2_TIME = "argon2.time";
|
||||||
private static final String PROPERTY_ARGON2_MEMORY = "argon2.memory";
|
private static final String PROPERTY_ARGON2_MEMORY = "argon2.memory";
|
||||||
private static final String PROPERTY_ARGON2_PARALLELISM = "argon2.parallelism";
|
private static final String PROPERTY_ARGON2_PARALLELISM = "argon2.parallelism";
|
||||||
|
@ -41,8 +49,9 @@ public class ConfigurationPropertiesSmokeTests implements
|
||||||
|
|
||||||
checkDefaultNamespace(ctx, props, ss);
|
checkDefaultNamespace(ctx, props, ss);
|
||||||
checkMultipleRPFs(ctx, props, ss);
|
checkMultipleRPFs(ctx, props, ss);
|
||||||
checkLanguages(props, ss);
|
checkLanguages(ctx, props, ss);
|
||||||
checkEncryptionParameters(props, ss);
|
checkEncryptionParameters(props, ss);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -110,10 +119,7 @@ public class ConfigurationPropertiesSmokeTests implements
|
||||||
* languages and force language. Shouldn't build with language unless
|
* languages and force language. Shouldn't build with language unless
|
||||||
* language filtering is enabled.
|
* language filtering is enabled.
|
||||||
*/
|
*/
|
||||||
private void checkLanguages(ConfigurationProperties props, StartupStatus ss) {
|
private void checkLanguages(ServletContext ctx, ConfigurationProperties props, StartupStatus ss) {
|
||||||
String buildString = props.getProperty(PROPERTY_LANGUAGE_BUILD);
|
|
||||||
boolean buildWithLanguages = StringUtils.isNotBlank(buildString);
|
|
||||||
|
|
||||||
String selectString = props.getProperty(PROPERTY_LANGUAGE_SELECTABLE);
|
String selectString = props.getProperty(PROPERTY_LANGUAGE_SELECTABLE);
|
||||||
boolean selectableLanguages = StringUtils.isNotBlank(selectString);
|
boolean selectableLanguages = StringUtils.isNotBlank(selectString);
|
||||||
|
|
||||||
|
@ -121,16 +127,44 @@ public class ConfigurationPropertiesSmokeTests implements
|
||||||
boolean forceLanguage = StringUtils.isNotBlank(forceString);
|
boolean forceLanguage = StringUtils.isNotBlank(forceString);
|
||||||
|
|
||||||
String filterString = props.getProperty(PROPERTY_LANGUAGE_FILTER,
|
String filterString = props.getProperty(PROPERTY_LANGUAGE_FILTER,
|
||||||
"true");
|
"false");
|
||||||
boolean languageFilter = Boolean.valueOf(filterString);
|
boolean languageFilter = Boolean.valueOf(filterString);
|
||||||
|
String i18nDirPath = ctx.getRealPath("/i18n");
|
||||||
|
|
||||||
if (selectableLanguages && !buildWithLanguages) {
|
if (i18nDirPath == null) {
|
||||||
ss.warning(this, String.format("Problem with Language setup - "
|
throw new IllegalStateException(
|
||||||
+ "runtime.properties specifies a "
|
"Application does not have an /i18n directory.");
|
||||||
+ "list of selectable languages (%s = %s), but "
|
}
|
||||||
+ "build.properties did not include any languages with %s",
|
|
||||||
PROPERTY_LANGUAGE_SELECTABLE, selectString,
|
List<String> i18nNames = null;
|
||||||
PROPERTY_LANGUAGE_BUILD));
|
|
||||||
|
i18nNames = geti18nNames(i18nDirPath);
|
||||||
|
|
||||||
|
log.debug("i18nNames: " + i18nNames);
|
||||||
|
|
||||||
|
if (i18nNames.isEmpty()) {
|
||||||
|
ss.fatal(this, "The application found no files in '"
|
||||||
|
+ i18nDirPath
|
||||||
|
+ "' .");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ss.info(this, "Base language files loaded: " + i18nNames);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure language files exist for values in the selectableLocales propery.
|
||||||
|
The prefixes of vitro and vivo are hard coded into the app,
|
||||||
|
so we can assume the bundle names must have the same file format */
|
||||||
|
if (selectableLanguages) {
|
||||||
|
List<String> selectableLanguagesList = Arrays.asList(selectString.split("\\s*,\\s*"));
|
||||||
|
for (String language : selectableLanguagesList) {
|
||||||
|
String vivoBundle = VIVO_BUNDLE_PREFIX + language + ".properties";
|
||||||
|
String vitroBundle = VITRO_BUNDLE_PREFIX + language + ".properties";
|
||||||
|
if (!i18nNames.contains(vivoBundle) && !i18nNames.contains(vitroBundle)) {
|
||||||
|
ss.warning(this, language + " was found in the value for "
|
||||||
|
+ PROPERTY_LANGUAGE_SELECTABLE + " but no corresponding "
|
||||||
|
+ "language file was found.");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selectableLanguages && forceLanguage) {
|
if (selectableLanguages && forceLanguage) {
|
||||||
|
@ -142,17 +176,31 @@ public class ConfigurationPropertiesSmokeTests implements
|
||||||
PROPERTY_LANGUAGE_SELECTABLE, selectString));
|
PROPERTY_LANGUAGE_SELECTABLE, selectString));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buildWithLanguages && !languageFilter) {
|
if (selectableLanguages && !languageFilter) {
|
||||||
ss.warning(this, String.format("Problem with Language setup - "
|
ss.warning(this, String.format("Problem with Language setup - "
|
||||||
+ "build.properties includes one or more additional "
|
+ "languages.selectableLocales in runtime.properties "
|
||||||
|
+ "includes one or more additional "
|
||||||
+ "languages (%s = %s), but runtime.properties has "
|
+ "languages (%s = %s), but runtime.properties has "
|
||||||
+ "disabled language filtering (%s = %s). This will "
|
+ "disabled language filtering (%s = %s). This will "
|
||||||
+ "likely result in a mix of languages in the "
|
+ "likely result in a mix of languages in the "
|
||||||
+ "application.", PROPERTY_LANGUAGE_BUILD, buildString,
|
+ "application.", PROPERTY_LANGUAGE_SELECTABLE, selectString,
|
||||||
PROPERTY_LANGUAGE_FILTER, filterString));
|
PROPERTY_LANGUAGE_FILTER, filterString));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Create a list of the names of available language files. */
|
||||||
|
private List<String> geti18nNames(String i18nBaseDirPath) {
|
||||||
|
try {
|
||||||
|
return Files.walk(Paths.get(i18nBaseDirPath))
|
||||||
|
.filter(Files::isRegularFile)
|
||||||
|
.map(Path::getFileName)
|
||||||
|
.map(p -> {return p.toString();})
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException("Failed to find language files", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fail if there are no config properties for the Argon2 encryption.
|
* Fail if there are no config properties for the Argon2 encryption.
|
||||||
*/
|
*/
|
||||||
|
@ -170,6 +218,7 @@ public class ConfigurationPropertiesSmokeTests implements
|
||||||
ss.fatal(this, "runtime.properties does not contain a value for '"
|
ss.fatal(this, "runtime.properties does not contain a value for '"
|
||||||
+ name + "'");
|
+ name + "'");
|
||||||
return;
|
return;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue