|
|
@@ -1,6 +1,12 @@
|
|
|
package de.jplag;
|
|
|
|
|
|
-import java.util.*;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.Optional;
|
|
|
+import java.util.ServiceLoader;
|
|
|
+import java.util.TreeMap;
|
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
@@ -12,7 +18,7 @@ import org.slf4j.LoggerFactory;
|
|
|
public final class LanguageLoader {
|
|
|
private static final Logger logger = LoggerFactory.getLogger(LanguageLoader.class);
|
|
|
|
|
|
- private static List<Language> loaded = null;
|
|
|
+ private static Map<String,Language> loaded = null;
|
|
|
|
|
|
private LanguageLoader() {
|
|
|
throw new IllegalAccessError();
|
|
|
@@ -22,28 +28,25 @@ public final class LanguageLoader {
|
|
|
* Load all languages that are currently in the classpath.
|
|
|
* @return the languages
|
|
|
*/
|
|
|
- public static synchronized List<Language> loadLanguages() {
|
|
|
+ public static synchronized List<Language> getAllAvailableLanguages() {
|
|
|
if (loaded != null)
|
|
|
- return loaded;
|
|
|
+ return loaded.values().stream().toList();
|
|
|
|
|
|
- Set<String> loadedShortNames = new HashSet<>();
|
|
|
- List<Language> languages = new ArrayList<>();
|
|
|
+ Map<String, Language> languages = new TreeMap<>();
|
|
|
|
|
|
- for (Language notInitializedLanguage : ServiceLoader.load(Language.class)) {
|
|
|
- String shortName = notInitializedLanguage.getShortName();
|
|
|
- if (!loadedShortNames.add(shortName)) {
|
|
|
+ for (Language language : ServiceLoader.load(Language.class)) {
|
|
|
+ String shortName = language.getShortName();
|
|
|
+ if (languages.containsKey(shortName)) {
|
|
|
logger.error("Multiple implementations for a language '{}' are present in the classpath! Skipping ..", shortName);
|
|
|
- languages.removeIf(l -> Objects.equals(shortName, l.getShortName()));
|
|
|
+ languages.remove(shortName);
|
|
|
continue;
|
|
|
}
|
|
|
- logger.info("Loading Language Frontend '{}'", notInitializedLanguage.getName());
|
|
|
- languages.add(notInitializedLanguage);
|
|
|
+ logger.info("Loading Language Frontend '{}'", language.getName());
|
|
|
+ languages.put(shortName, language);
|
|
|
}
|
|
|
|
|
|
- languages.sort(Comparator.comparing(Language::getShortName));
|
|
|
-
|
|
|
- loaded = Collections.unmodifiableList(languages);
|
|
|
- return loaded;
|
|
|
+ loaded = Collections.unmodifiableMap(languages);
|
|
|
+ return loaded.values().stream().toList();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -51,8 +54,8 @@ public final class LanguageLoader {
|
|
|
* @param shortName the short name of the language
|
|
|
* @return the language or an empty optional if no language has been found.
|
|
|
*/
|
|
|
- public static Optional<Language> loadLanguage(String shortName) {
|
|
|
- var result = loadLanguages().stream().filter(it -> Objects.equals(it.getShortName(), shortName)).findFirst();
|
|
|
+ public static Optional<Language> getLanguage(String shortName) {
|
|
|
+ var result = getAllAvailableLanguages().stream().filter(it -> Objects.equals(it.getShortName(), shortName)).findFirst();
|
|
|
if (result.isEmpty())
|
|
|
logger.warn("Attempt to load Language {} was not successful", shortName);
|
|
|
return result;
|
|
|
@@ -62,14 +65,14 @@ public final class LanguageLoader {
|
|
|
* Get a list of all available languages with their short name.
|
|
|
* @return the list of all languages
|
|
|
*/
|
|
|
- public static List<String> getAllLanguageNames() {
|
|
|
- return loadLanguages().stream().map(Language::getShortName).toList();
|
|
|
+ public static List<String> getAllAvailableLanguageShortNames() {
|
|
|
+ return getAllAvailableLanguages().stream().map(Language::getShortName).toList();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Resets the internal cache of all loaded languages
|
|
|
*/
|
|
|
- public static synchronized void reload() {
|
|
|
+ public static synchronized void clearCache() {
|
|
|
loaded = null;
|
|
|
}
|
|
|
}
|