[core] Backporting fixes from pmd7

LanguageFactory and LanguageRegistry are more
robust in case a single language can't
be loaded.
This commit is contained in:
Andreas Dangel
2020-08-06 11:29:05 +02:00
parent 0a7d3ff922
commit b01dc8371b
2 changed files with 23 additions and 9 deletions

View File

@@ -37,14 +37,21 @@ public final class LanguageFactory {
// Use current class' classloader instead of the threads context classloader, see https://github.com/pmd/pmd/issues/1788 // Use current class' classloader instead of the threads context classloader, see https://github.com/pmd/pmd/issues/1788
ServiceLoader<Language> languageLoader = ServiceLoader.load(Language.class, getClass().getClassLoader()); ServiceLoader<Language> languageLoader = ServiceLoader.load(Language.class, getClass().getClassLoader());
Iterator<Language> iterator = languageLoader.iterator(); Iterator<Language> iterator = languageLoader.iterator();
while (iterator.hasNext()) {
while (true) {
// this loop is weird, but both hasNext and next may throw ServiceConfigurationError,
// it's more robust that way
try { try {
Language language = iterator.next(); if (iterator.hasNext()) {
languagesList.add(language); Language language = iterator.next();
} catch (ServiceConfigurationError | UnsupportedClassVersionError e) { languagesList.add(language);
} else {
break;
}
} catch (UnsupportedClassVersionError | ServiceConfigurationError e) {
// Some languages require java8 and are therefore only available // Some languages require java8 and are therefore only available
// if java8 or later is used as runtime. // if java8 or later is used as runtime.
System.err.println("Ignoring language for CPD: " + e.toString()); System.err.println("Ignoring language for PMD: " + e.toString());
} }
} }

View File

@@ -31,11 +31,18 @@ public final class LanguageRegistry {
// Use current class' classloader instead of the threads context classloader, see https://github.com/pmd/pmd/issues/1377 // Use current class' classloader instead of the threads context classloader, see https://github.com/pmd/pmd/issues/1377
ServiceLoader<Language> languageLoader = ServiceLoader.load(Language.class, getClass().getClassLoader()); ServiceLoader<Language> languageLoader = ServiceLoader.load(Language.class, getClass().getClassLoader());
Iterator<Language> iterator = languageLoader.iterator(); Iterator<Language> iterator = languageLoader.iterator();
while (iterator.hasNext()) {
while (true) {
// this loop is weird, but both hasNext and next may throw ServiceConfigurationError,
// it's more robust that way
try { try {
Language language = iterator.next(); if (iterator.hasNext()) {
languagesList.add(language); Language language = iterator.next();
} catch (ServiceConfigurationError | UnsupportedClassVersionError e) { languagesList.add(language);
} else {
break;
}
} catch (UnsupportedClassVersionError | ServiceConfigurationError e) {
// Some languages require java8 and are therefore only available // Some languages require java8 and are therefore only available
// if java8 or later is used as runtime. // if java8 or later is used as runtime.
System.err.println("Ignoring language for PMD: " + e.toString()); System.err.println("Ignoring language for PMD: " + e.toString());