[rulesupport] sort JSR223 scripts by start level before filename (#3099)

The docs say that JSR223 scripts will be loaded in order of start level
(as defined by filename or containing folder). this works (mostly) fine
when you're stepping through start levels sequentially on startup, but if
you're already at SL100, and have scripts located in sl folders, and then
install an addon for those scripts, they were loading in alphabetic
order instead. This ensures they'll still respect start level order
relative to each other.

This should also fix the case of script start levels not matching
start levels OpenHAB actually steps through (which are all multiples
of 10) - i.e. if you define scripts in sl30, sl31, and sl32, when
OpenHAB jumps from 30 to 40, 31 should be executed before 32.

Signed-off-by: Cody Cutrer <cody@cutrer.us>
This commit is contained in:
Cody Cutrer 2022-10-05 10:43:48 -06:00 committed by GitHub
parent 93a8a214cf
commit 5062ab5fb0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 0 deletions

View File

@ -105,6 +105,10 @@ public class ScriptFileReference implements Comparable<ScriptFileReference> {
String name2 = path2.getFileName().toString();
LOGGER.trace("o2 [{}], path2 [{}], name2 [{}]", other.scriptFileURL, path2, name2);
int startLevelCompare = Integer.compare(getStartLevel(), other.getStartLevel());
if (startLevelCompare != 0) {
return startLevelCompare;
}
int nameCompare = name1.compareToIgnoreCase(name2);
if (nameCompare != 0) {
return nameCompare;

View File

@ -266,6 +266,33 @@ class ScriptFileWatcherTest {
p66.toFile().toURI().toString());
}
@Test
public void testOrderingStartlevelFolders() {
when(scriptEngineManager.isSupported("js")).thenReturn(true);
ScriptEngineContainer scriptEngineContainer = mock(ScriptEngineContainer.class);
when(scriptEngineContainer.getScriptEngine()).thenReturn(mock(ScriptEngine.class));
when(scriptEngineManager.createScriptEngine(anyString(), anyString())).thenReturn(scriptEngineContainer);
Path p50 = getFile("a_script.js");
scriptFileWatcher.processWatchEvent(null, ENTRY_CREATE, p50);
Path p40 = getFile("sl40/b_script.js");
scriptFileWatcher.processWatchEvent(null, ENTRY_CREATE, p40);
Path p30 = getFile("sl30/script.js");
scriptFileWatcher.processWatchEvent(null, ENTRY_CREATE, p30);
updateStartLevel(70);
InOrder inOrder = inOrder(scriptEngineManager);
inOrder.verify(scriptEngineManager, timeout(10000).times(1)).createScriptEngine("js",
p30.toFile().toURI().toString());
inOrder.verify(scriptEngineManager, timeout(10000).times(1)).createScriptEngine("js",
p40.toFile().toURI().toString());
inOrder.verify(scriptEngineManager, timeout(10000).times(1)).createScriptEngine("js",
p50.toFile().toURI().toString());
}
@Test
public void testReloadActiveWhenDependencyChanged() {
when(scriptEngineManager.isSupported("js")).thenReturn(true);