LanguageLoader.java 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package de.jplag;
  2. import java.util.*;
  3. import org.slf4j.Logger;
  4. import org.slf4j.LoggerFactory;
  5. /**
  6. * This class contains methods to load {@link Language Languages}.
  7. * @author Dominik Fuchss
  8. */
  9. public final class LanguageLoader {
  10. private static final Logger logger = LoggerFactory.getLogger(LanguageLoader.class);
  11. private static Map<String, Language> cachedLanguageInstances = null;
  12. private LanguageLoader() {
  13. throw new IllegalAccessError();
  14. }
  15. /**
  16. * Get all languages that are currently in the classpath. The languages will be cached. Use {@link #clearCache()} to
  17. * obtain new instances.
  18. * @return the languages as unmodifiable map from identifier to language instance.
  19. */
  20. public static synchronized Map<String, Language> getAllAvailableLanguages() {
  21. if (cachedLanguageInstances != null)
  22. return cachedLanguageInstances;
  23. Map<String, Language> languages = new TreeMap<>();
  24. for (Language language : ServiceLoader.load(Language.class)) {
  25. String languageIdentifier = language.getIdentifier();
  26. if (languages.containsKey(languageIdentifier)) {
  27. logger.error("Multiple implementations for a language '{}' are present in the classpath! Skipping ..", languageIdentifier);
  28. languages.remove(languageIdentifier);
  29. continue;
  30. }
  31. logger.debug("Loading Language Frontend '{}'", language.getName());
  32. languages.put(languageIdentifier, language);
  33. }
  34. logger.info("Available languages: '{}'", languages.values().stream().map(Language::getName).toList());
  35. cachedLanguageInstances = Collections.unmodifiableMap(languages);
  36. return cachedLanguageInstances;
  37. }
  38. /**
  39. * Load a language that is currently in the classpath by its short name.
  40. * @param identifier the identifier of the language
  41. * @return the language or an empty optional if no language has been found.
  42. * @see Language#getIdentifier()
  43. */
  44. public static Optional<Language> getLanguage(String identifier) {
  45. var language = getAllAvailableLanguages().get(identifier);
  46. if (language == null)
  47. logger.warn("Attempt to load Language {} was not successful", identifier);
  48. return Optional.ofNullable(language);
  49. }
  50. /**
  51. * Get an unmodifiable set of all available languages with their identifiers.
  52. * @return identifiers of all available languages
  53. * @see Language#getIdentifier()
  54. */
  55. public static Set<String> getAllAvailableLanguageIdentifiers() {
  56. return new TreeSet<>(getAllAvailableLanguages().keySet());
  57. }
  58. /**
  59. * Resets the internal cache of all loaded languages
  60. */
  61. public static synchronized void clearCache() {
  62. cachedLanguageInstances = null;
  63. }
  64. }