17
17
import java .util .List ;
18
18
import java .util .Locale ;
19
19
import java .util .Map ;
20
- import java .util .Optional ;
21
20
import java .util .TreeMap ;
22
- import java .util .stream .Collectors ;
23
- import java .util .stream .Stream ;
24
21
25
22
import javax .script .ScriptEngine ;
26
23
36
33
import org .openhab .core .automation .type .ModuleType ;
37
34
import org .openhab .core .automation .type .ModuleTypeProvider ;
38
35
import org .openhab .core .automation .type .Output ;
39
- import org .openhab .core .common .registry .ProviderChangeListener ;
36
+ import org .openhab .core .common .registry .AbstractProvider ;
40
37
import org .openhab .core .config .core .ConfigDescriptionParameter ;
41
38
import org .openhab .core .config .core .ConfigDescriptionParameter .Type ;
42
39
import org .openhab .core .config .core .ConfigDescriptionParameterBuilder ;
43
40
import org .openhab .core .config .core .ParameterOption ;
44
41
import org .osgi .service .component .annotations .Component ;
42
+ import org .osgi .service .component .annotations .Deactivate ;
45
43
import org .osgi .service .component .annotations .Reference ;
46
44
import org .osgi .service .component .annotations .ReferenceCardinality ;
47
45
import org .osgi .service .component .annotations .ReferencePolicy ;
56
54
*/
57
55
@ NonNullByDefault
58
56
@ Component
59
- public class ScriptModuleTypeProvider implements ModuleTypeProvider {
57
+ public class ScriptModuleTypeProvider extends AbstractProvider < ModuleType > implements ModuleTypeProvider {
60
58
61
59
private final Logger logger = LoggerFactory .getLogger (ScriptModuleTypeProvider .class );
62
60
private final Map <String , String > parameterOptions = new TreeMap <>();
63
61
62
+ @ Deactivate
63
+ public void deactivate () {
64
+ listeners .clear ();
65
+ parameterOptions .clear ();
66
+ }
67
+
64
68
@ SuppressWarnings ("unchecked" )
65
69
@ Override
66
70
public @ Nullable ModuleType getModuleType (String UID , @ Nullable Locale locale ) {
67
- if (ScriptActionHandler .TYPE_ID .equals (UID )) {
71
+ if (parameterOptions .isEmpty ()) {
72
+ return null ;
73
+ } else if (ScriptActionHandler .TYPE_ID .equals (UID )) {
68
74
return getScriptActionType (locale );
69
75
} else if (ScriptConditionHandler .TYPE_ID .equals (UID )) {
70
76
return getScriptConditionType (locale );
@@ -73,26 +79,22 @@ public class ScriptModuleTypeProvider implements ModuleTypeProvider {
73
79
}
74
80
}
75
81
76
- private @ Nullable ModuleType getScriptActionType (@ Nullable Locale locale ) {
77
- if (parameterOptions .isEmpty ()) {
78
- return null ;
79
- } else {
80
- List <Output > outputs = new ArrayList <>();
81
- Output result = new Output ("result" , "java.lang.Object" , "result" , "the script result" , null , null , null );
82
- outputs .add (result );
83
- return new ActionType (ScriptActionHandler .TYPE_ID , getConfigDescriptions (locale ), "execute a given script" ,
84
- "Allows the execution of a user-defined script." , null , Visibility .VISIBLE , null , outputs );
85
- }
82
+ private ModuleType getScriptActionType (@ Nullable Locale locale ) {
83
+ List <Output > outputs = new ArrayList <>();
84
+ Output result = new Output ("result" , "java.lang.Object" , "result" , "the script result" , null , null , null );
85
+ outputs .add (result );
86
+ return new ActionType (ScriptActionHandler .TYPE_ID , getConfigDescriptions (locale ), "execute a given script" ,
87
+ "Allows the execution of a user-defined script." , null , Visibility .VISIBLE , null , outputs );
86
88
}
87
89
88
- private @ Nullable ModuleType getScriptConditionType (@ Nullable Locale locale ) {
89
- if ( parameterOptions . isEmpty ()) {
90
- return null ;
91
- } else {
92
- return new ConditionType ( ScriptConditionHandler . TYPE_ID , getConfigDescriptions ( locale ),
93
- "a given script evaluates to true" , "Allows the definition of a condition through a script." , null ,
94
- Visibility . VISIBLE , null );
95
- }
90
+ private ModuleType getScriptConditionType (@ Nullable Locale locale ) {
91
+ return new ConditionType ( ScriptConditionHandler . TYPE_ID , getConfigDescriptions ( locale ),
92
+ "a given script evaluates to true" , "Allows the definition of a condition through a script." , null ,
93
+ Visibility . VISIBLE , null );
94
+ }
95
+
96
+ private List < ModuleType > getModuleTypesUnconditionally ( @ Nullable Locale locale ) {
97
+ return List . of ( getScriptActionType ( locale ), getScriptConditionType ( locale ));
96
98
}
97
99
98
100
/**
@@ -118,25 +120,24 @@ private List<ConfigDescriptionParameter> getConfigDescriptions(@Nullable Locale
118
120
119
121
@ Override
120
122
public Collection <ModuleType > getModuleTypes (@ Nullable Locale locale ) {
121
- return Stream
122
- .of (Optional .ofNullable (getScriptActionType (locale )),
123
- Optional .ofNullable (getScriptConditionType (locale )))
124
- .filter (Optional ::isPresent ).map (Optional ::get ).collect (Collectors .toUnmodifiableList ());
123
+ return parameterOptions .isEmpty () ? List .of () : getModuleTypesUnconditionally (locale );
125
124
}
126
125
127
126
@ Override
128
127
public Collection <ModuleType > getAll () {
129
128
return getModuleTypes (null );
130
129
}
131
130
132
- @ Override
133
- public void addProviderChangeListener (ProviderChangeListener <ModuleType > listener ) {
134
- // does nothing because this provider does not change
131
+ private void notifyModuleTypesAdded () {
132
+ for (ModuleType moduleType : getModuleTypesUnconditionally (null )) {
133
+ notifyListenersAboutAddedElement (moduleType );
134
+ }
135
135
}
136
136
137
- @ Override
138
- public void removeProviderChangeListener (ProviderChangeListener <ModuleType > listener ) {
139
- // does nothing because this provider does not change
137
+ private void notifyModuleTypesRemoved () {
138
+ for (ModuleType moduleType : getModuleTypesUnconditionally (null )) {
139
+ notifyListenersAboutRemovedElement (moduleType );
140
+ }
140
141
}
141
142
142
143
/**
@@ -149,8 +150,12 @@ public void setScriptEngineFactory(ScriptEngineFactory engineFactory) {
149
150
if (!scriptTypes .isEmpty ()) {
150
151
ScriptEngine scriptEngine = engineFactory .createScriptEngine (scriptTypes .get (0 ));
151
152
if (scriptEngine != null ) {
153
+ boolean notifyListeners = parameterOptions .isEmpty ();
152
154
parameterOptions .put (getPreferredMimeType (engineFactory ), getLanguageName (scriptEngine .getFactory ()));
153
155
logger .trace ("ParameterOptions: {}" , parameterOptions );
156
+ if (notifyListeners ) {
157
+ notifyModuleTypesAdded ();
158
+ }
154
159
} else {
155
160
logger .trace ("setScriptEngineFactory: engine was null" );
156
161
}
@@ -166,6 +171,9 @@ public void unsetScriptEngineFactory(ScriptEngineFactory engineFactory) {
166
171
if (scriptEngine != null ) {
167
172
parameterOptions .remove (getPreferredMimeType (engineFactory ));
168
173
logger .trace ("ParameterOptions: {}" , parameterOptions );
174
+ if (parameterOptions .isEmpty ()) {
175
+ notifyModuleTypesRemoved ();
176
+ }
169
177
} else {
170
178
logger .trace ("unsetScriptEngineFactory: engine was null" );
171
179
}
0 commit comments