Skip to content

Commit 14e0491

Browse files
committed
ScriptLanguageIndex: fix gentle language addition
When adding a language "gently" (i.e., without ovewriting existing languages), we should be smarter about not overwriting _any_ of the language names or extensions. Otherwise, a lower-priority language can override a higher-priority one with respect to a specific name or extension.
1 parent d3cbee4 commit 14e0491

File tree

1 file changed

+17
-19
lines changed

1 file changed

+17
-19
lines changed

src/main/java/org/scijava/script/ScriptLanguageIndex.java

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -75,32 +75,24 @@ public ScriptLanguageIndex(final LogService logService) {
7575
}
7676

7777
public boolean add(final ScriptEngineFactory factory, final boolean gently) {
78-
final String duplicateName = checkDuplicate(factory);
79-
if (duplicateName != null) {
80-
if (gently) return false;
81-
if (log != null) {
82-
log.warn("Duplicate scripting language '" +
83-
duplicateName + "': existing=" +
84-
byName.get(duplicateName).getClass().getName() +
85-
", new=" + factory.getClass().getName());
86-
}
87-
}
78+
boolean result = false;
8879

8980
final ScriptLanguage language = wrap(factory);
9081

9182
// add language names
92-
byName.put(language.getLanguageName(), language);
83+
result |= put("name", byName, language.getLanguageName(), language, gently);
9384
for (final String name : language.getNames()) {
94-
byName.put(name, language);
85+
result |= put("name", byName, name, language, gently);
9586
}
9687

9788
// add file extensions
9889
for (final String extension : language.getExtensions()) {
9990
if ("".equals(extension)) continue;
100-
byExtension.put(extension, language);
91+
result |= put("extension", byExtension, extension, language, gently);
10192
}
10293

103-
return super.add(language);
94+
result |= super.add(language);
95+
return result;
10496
}
10597

10698
public ScriptLanguage getByExtension(final String extension) {
@@ -137,13 +129,19 @@ public boolean add(final ScriptLanguage language) {
137129

138130
// -- Helper methods --
139131

140-
private String checkDuplicate(final ScriptEngineFactory factory) {
141-
for (final String name : factory.getNames()) {
142-
if (byName.containsKey(name)) {
143-
return name;
132+
private boolean put(final String type, final Map<String, ScriptLanguage> map,
133+
final String key, final ScriptLanguage value, final boolean gently)
134+
{
135+
if (gently && map.containsKey(key)) {
136+
if (log != null) {
137+
log.warn("Not registering " + type + " '" + key +
138+
"' for scripting language " + value.getClass().getName() +
139+
": existing=" + map.get(key).getClass().getName());
144140
}
141+
return false;
145142
}
146-
return null;
143+
map.put(key, value);
144+
return true;
147145
}
148146

149147
private ScriptLanguage wrap(final ScriptEngineFactory factory) {

0 commit comments

Comments
 (0)