openhab-scripting 4.46.2 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/openhab/core/actions/audio.rb +47 -0
- data/lib/openhab/core/actions/ephemeris.rb +39 -0
- data/lib/openhab/core/actions/exec.rb +51 -0
- data/lib/openhab/core/actions/http.rb +80 -0
- data/lib/openhab/core/actions/ping.rb +30 -0
- data/lib/openhab/core/actions/transformation.rb +32 -0
- data/lib/openhab/core/actions/voice.rb +36 -0
- data/lib/openhab/core/actions.rb +82 -0
- data/lib/openhab/core/dependency_tracking.rb +34 -0
- data/lib/openhab/core/dto/item_channel_link.rb +33 -0
- data/lib/openhab/core/dto/thing.rb +27 -0
- data/lib/openhab/core/dto.rb +11 -0
- data/lib/openhab/core/entity_lookup.rb +152 -70
- data/lib/openhab/core/events/abstract_event.rb +18 -0
- data/lib/openhab/core/events/abstract_item_registry_event.rb +36 -0
- data/lib/openhab/core/events/abstract_thing_registry_event.rb +40 -0
- data/lib/openhab/core/events/item_command_event.rb +78 -0
- data/lib/openhab/core/events/item_event.rb +22 -0
- data/lib/openhab/core/events/item_state_changed_event.rb +75 -0
- data/lib/openhab/core/events/item_state_event.rb +79 -0
- data/lib/openhab/core/events/thing_status_info_event.rb +55 -0
- data/lib/openhab/core/events.rb +10 -0
- data/lib/openhab/core/items/accepted_data_types.rb +29 -0
- data/lib/openhab/core/items/color_item.rb +52 -0
- data/lib/openhab/core/items/contact_item.rb +52 -0
- data/lib/openhab/core/items/date_time_item.rb +59 -0
- data/lib/openhab/core/items/dimmer_item.rb +148 -0
- data/lib/openhab/core/items/generic_item.rb +292 -0
- data/lib/openhab/core/items/group_item.rb +176 -0
- data/lib/openhab/{dsl → core}/items/image_item.rb +35 -29
- data/lib/openhab/core/items/item.rb +273 -0
- data/lib/openhab/core/items/location_item.rb +34 -0
- data/lib/openhab/core/items/metadata/hash.rb +433 -0
- data/lib/openhab/core/items/metadata/namespace_hash.rb +475 -0
- data/lib/openhab/core/items/metadata/provider.rb +48 -0
- data/lib/openhab/core/items/metadata.rb +11 -0
- data/lib/openhab/core/items/number_item.rb +62 -0
- data/lib/openhab/core/items/numeric_item.rb +22 -0
- data/lib/openhab/core/items/persistence.rb +416 -0
- data/lib/openhab/core/items/player_item.rb +66 -0
- data/lib/openhab/core/items/provider.rb +44 -0
- data/lib/openhab/core/items/proxy.rb +136 -0
- data/lib/openhab/core/items/registry.rb +86 -0
- data/lib/openhab/core/items/rollershutter_item.rb +68 -0
- data/lib/openhab/core/items/semantics/enumerable.rb +177 -0
- data/lib/openhab/core/items/semantics.rb +473 -0
- data/lib/openhab/core/items/state_storage.rb +53 -0
- data/lib/openhab/core/items/string_item.rb +28 -0
- data/lib/openhab/core/items/switch_item.rb +78 -0
- data/lib/openhab/core/items.rb +108 -0
- data/lib/openhab/{dsl → core}/lazy_array.rb +9 -3
- data/lib/openhab/core/profile_factory.rb +132 -0
- data/lib/openhab/core/provider.rb +230 -0
- data/lib/openhab/core/proxy.rb +130 -0
- data/lib/openhab/core/registry.rb +40 -0
- data/lib/openhab/core/rules/module.rb +26 -0
- data/lib/openhab/core/rules/provider.rb +25 -0
- data/lib/openhab/core/rules/registry.rb +76 -0
- data/lib/openhab/core/rules/rule.rb +150 -0
- data/lib/openhab/core/rules.rb +25 -0
- data/lib/openhab/core/script_handling.rb +78 -20
- data/lib/openhab/core/things/channel.rb +48 -0
- data/lib/openhab/core/things/channel_uid.rb +51 -0
- data/lib/openhab/core/things/item_channel_link.rb +33 -0
- data/lib/openhab/core/things/links/provider.rb +78 -0
- data/lib/openhab/core/things/profile_callback.rb +52 -0
- data/lib/openhab/core/things/provider.rb +29 -0
- data/lib/openhab/core/things/proxy.rb +87 -0
- data/lib/openhab/core/things/registry.rb +73 -0
- data/lib/openhab/core/things/thing.rb +194 -0
- data/lib/openhab/core/things.rb +22 -0
- data/lib/openhab/core/timer.rb +148 -0
- data/lib/openhab/{dsl → core}/types/comparable_type.rb +5 -3
- data/lib/openhab/{dsl → core}/types/date_time_type.rb +55 -127
- data/lib/openhab/{dsl → core}/types/decimal_type.rb +50 -48
- data/lib/openhab/{dsl → core}/types/hsb_type.rb +35 -83
- data/lib/openhab/core/types/increase_decrease_type.rb +34 -0
- data/lib/openhab/core/types/next_previous_type.rb +34 -0
- data/lib/openhab/{dsl → core}/types/numeric_type.rb +20 -7
- data/lib/openhab/core/types/on_off_type.rb +46 -0
- data/lib/openhab/core/types/open_closed_type.rb +41 -0
- data/lib/openhab/{dsl → core}/types/percent_type.rb +19 -20
- data/lib/openhab/core/types/play_pause_type.rb +38 -0
- data/lib/openhab/core/types/point_type.rb +117 -0
- data/lib/openhab/core/types/quantity_type.rb +325 -0
- data/lib/openhab/core/types/raw_type.rb +26 -0
- data/lib/openhab/core/types/refresh_type.rb +27 -0
- data/lib/openhab/core/types/rewind_fastforward_type.rb +38 -0
- data/lib/openhab/core/types/stop_move_type.rb +34 -0
- data/lib/openhab/{dsl → core}/types/string_type.rb +17 -28
- data/lib/openhab/{dsl → core}/types/type.rb +42 -40
- data/lib/openhab/core/types/un_def_type.rb +38 -0
- data/lib/openhab/core/types/up_down_type.rb +50 -0
- data/lib/openhab/core/types.rb +82 -0
- data/lib/openhab/{dsl → core}/uid.rb +4 -23
- data/lib/openhab/core/value_cache.rb +188 -0
- data/lib/openhab/core.rb +98 -0
- data/lib/openhab/core_ext/between.rb +32 -0
- data/lib/openhab/core_ext/ephemeris.rb +53 -0
- data/lib/openhab/core_ext/java/class.rb +34 -0
- data/lib/openhab/core_ext/java/duration.rb +142 -0
- data/lib/openhab/core_ext/java/list.rb +436 -0
- data/lib/openhab/core_ext/java/local_date.rb +104 -0
- data/lib/openhab/core_ext/java/local_time.rb +118 -0
- data/lib/openhab/core_ext/java/map.rb +66 -0
- data/lib/openhab/core_ext/java/month.rb +71 -0
- data/lib/openhab/core_ext/java/month_day.rb +119 -0
- data/lib/openhab/core_ext/java/period.rb +103 -0
- data/lib/openhab/core_ext/java/temporal_amount.rb +34 -0
- data/lib/openhab/core_ext/java/time.rb +62 -0
- data/lib/openhab/core_ext/java/unit.rb +15 -0
- data/lib/openhab/core_ext/java/zoned_date_time.rb +213 -0
- data/lib/openhab/core_ext/ruby/array.rb +21 -0
- data/lib/openhab/core_ext/ruby/date.rb +96 -0
- data/lib/openhab/core_ext/ruby/date_time.rb +55 -0
- data/lib/openhab/core_ext/ruby/module.rb +15 -0
- data/lib/openhab/core_ext/ruby/numeric.rb +195 -0
- data/lib/openhab/core_ext/ruby/range.rb +70 -0
- data/lib/openhab/core_ext/ruby/symbol.rb +7 -0
- data/lib/openhab/core_ext/ruby/time.rb +108 -0
- data/lib/openhab/core_ext.rb +18 -0
- data/lib/openhab/dsl/debouncer.rb +259 -0
- data/lib/openhab/dsl/events/watch_event.rb +18 -0
- data/lib/openhab/dsl/events.rb +9 -0
- data/lib/openhab/dsl/gems.rb +1 -1
- data/lib/openhab/dsl/items/builder.rb +578 -0
- data/lib/openhab/dsl/items/ensure.rb +73 -82
- data/lib/openhab/dsl/items/timed_command.rb +214 -159
- data/lib/openhab/dsl/rules/automation_rule.rb +126 -115
- data/lib/openhab/dsl/rules/builder.rb +1935 -0
- data/lib/openhab/dsl/rules/guard.rb +51 -114
- data/lib/openhab/dsl/rules/name_inference.rb +66 -25
- data/lib/openhab/dsl/rules/property.rb +48 -75
- data/lib/openhab/dsl/rules/rule_triggers.rb +22 -27
- data/lib/openhab/dsl/rules/terse.rb +58 -14
- data/lib/openhab/dsl/rules/triggers/changed.rb +48 -94
- data/lib/openhab/dsl/rules/triggers/channel.rb +9 -40
- data/lib/openhab/dsl/rules/triggers/command.rb +14 -63
- data/lib/openhab/dsl/rules/triggers/conditions/duration.rb +34 -69
- data/lib/openhab/dsl/rules/triggers/conditions/proc.rb +6 -14
- data/lib/openhab/dsl/rules/triggers/cron/cron.rb +48 -82
- data/lib/openhab/dsl/rules/triggers/cron/cron_handler.rb +30 -47
- data/lib/openhab/dsl/rules/triggers/trigger.rb +7 -28
- data/lib/openhab/dsl/rules/triggers/updated.rb +21 -45
- data/lib/openhab/dsl/rules/triggers/watch/watch_handler.rb +257 -102
- data/lib/openhab/dsl/rules/triggers.rb +12 -0
- data/lib/openhab/dsl/rules.rb +8 -0
- data/lib/openhab/dsl/things/builder.rb +299 -0
- data/lib/openhab/{core → dsl}/thread_local.rb +27 -17
- data/lib/openhab/dsl/timer_manager.rb +204 -0
- data/lib/openhab/dsl/version.rb +9 -0
- data/lib/openhab/dsl.rb +979 -0
- data/lib/openhab/log.rb +355 -0
- data/lib/openhab/osgi.rb +68 -0
- data/lib/openhab/rspec/configuration.rb +56 -0
- data/lib/openhab/rspec/example_group.rb +132 -0
- data/lib/openhab/rspec/helpers.rb +458 -0
- data/lib/openhab/rspec/hooks.rb +113 -0
- data/lib/openhab/rspec/jruby.rb +46 -0
- data/lib/openhab/rspec/karaf.rb +851 -0
- data/lib/openhab/rspec/mocks/bundle_install_support.rb +25 -0
- data/lib/openhab/rspec/mocks/bundle_resolver.rb +30 -0
- data/lib/openhab/rspec/mocks/event_admin.rb +146 -0
- data/lib/openhab/rspec/mocks/instance_method_stasher.rb +22 -0
- data/lib/openhab/rspec/mocks/persistence_service.rb +155 -0
- data/lib/openhab/rspec/mocks/safe_caller.rb +40 -0
- data/lib/openhab/rspec/mocks/space.rb +23 -0
- data/lib/openhab/rspec/mocks/synchronous_executor.rb +63 -0
- data/lib/openhab/rspec/mocks/thing_handler.rb +76 -0
- data/lib/openhab/rspec/mocks/timer.rb +134 -0
- data/lib/openhab/rspec/openhab/core/actions.rb +38 -0
- data/lib/openhab/rspec/openhab/core/items/proxy.rb +15 -0
- data/lib/openhab/rspec/openhab/core/things/proxy.rb +27 -0
- data/lib/openhab/rspec/shell.rb +31 -0
- data/lib/openhab/rspec/suspend_rules.rb +50 -0
- data/lib/openhab/rspec.rb +26 -0
- data/lib/openhab/yard/base_helper.rb +19 -0
- data/lib/openhab/yard/cli/stats.rb +23 -0
- data/lib/openhab/yard/code_objects/group_object.rb +23 -0
- data/lib/openhab/yard/code_objects/java/base.rb +31 -0
- data/lib/openhab/yard/code_objects/java/class_object.rb +11 -0
- data/lib/openhab/yard/code_objects/java/field_object.rb +15 -0
- data/lib/openhab/yard/code_objects/java/interface_object.rb +15 -0
- data/lib/openhab/yard/code_objects/java/package_object.rb +11 -0
- data/lib/openhab/yard/code_objects/java/proxy.rb +23 -0
- data/lib/openhab/yard/coderay.rb +17 -0
- data/lib/openhab/yard/handlers/jruby/base.rb +58 -0
- data/lib/openhab/yard/handlers/jruby/class_handler.rb +18 -0
- data/lib/openhab/yard/handlers/jruby/constant_handler.rb +18 -0
- data/lib/openhab/yard/handlers/jruby/java_import_handler.rb +30 -0
- data/lib/openhab/yard/handlers/jruby/mixin_handler.rb +23 -0
- data/lib/openhab/yard/html_helper.rb +78 -0
- data/lib/openhab/yard/markdown_helper.rb +148 -0
- data/lib/openhab/yard/tags/constant_directive.rb +20 -0
- data/lib/openhab/yard/tags/group_directive.rb +24 -0
- data/lib/openhab/yard/tags/library.rb +3 -0
- data/lib/openhab/yard.rb +38 -0
- metadata +475 -106
- data/lib/openhab/core/item_proxy.rb +0 -29
- data/lib/openhab/core/load_path.rb +0 -19
- data/lib/openhab/core/openhab_setup.rb +0 -29
- data/lib/openhab/core/osgi.rb +0 -58
- data/lib/openhab/core/services.rb +0 -24
- data/lib/openhab/dsl/actions.rb +0 -114
- data/lib/openhab/dsl/between.rb +0 -25
- data/lib/openhab/dsl/channel.rb +0 -43
- data/lib/openhab/dsl/dsl.rb +0 -59
- data/lib/openhab/dsl/group.rb +0 -54
- data/lib/openhab/dsl/imports.rb +0 -21
- data/lib/openhab/dsl/items/color_item.rb +0 -76
- data/lib/openhab/dsl/items/comparable_item.rb +0 -62
- data/lib/openhab/dsl/items/contact_item.rb +0 -41
- data/lib/openhab/dsl/items/date_time_item.rb +0 -65
- data/lib/openhab/dsl/items/dimmer_item.rb +0 -65
- data/lib/openhab/dsl/items/generic_item.rb +0 -229
- data/lib/openhab/dsl/items/group_item.rb +0 -127
- data/lib/openhab/dsl/items/item_equality.rb +0 -59
- data/lib/openhab/dsl/items/item_registry.rb +0 -54
- data/lib/openhab/dsl/items/items.rb +0 -109
- data/lib/openhab/dsl/items/location_item.rb +0 -59
- data/lib/openhab/dsl/items/metadata.rb +0 -326
- data/lib/openhab/dsl/items/number_item.rb +0 -17
- data/lib/openhab/dsl/items/numeric_item.rb +0 -87
- data/lib/openhab/dsl/items/persistence.rb +0 -307
- data/lib/openhab/dsl/items/player_item.rb +0 -58
- data/lib/openhab/dsl/items/rollershutter_item.rb +0 -51
- data/lib/openhab/dsl/items/semantics/enumerable.rb +0 -91
- data/lib/openhab/dsl/items/semantics.rb +0 -227
- data/lib/openhab/dsl/items/string_item.rb +0 -51
- data/lib/openhab/dsl/items/switch_item.rb +0 -70
- data/lib/openhab/dsl/monkey_patch/actions/actions.rb +0 -4
- data/lib/openhab/dsl/monkey_patch/actions/script_thing_actions.rb +0 -39
- data/lib/openhab/dsl/monkey_patch/events/events.rb +0 -7
- data/lib/openhab/dsl/monkey_patch/events/item_command.rb +0 -85
- data/lib/openhab/dsl/monkey_patch/events/item_event.rb +0 -28
- data/lib/openhab/dsl/monkey_patch/events/item_state.rb +0 -61
- data/lib/openhab/dsl/monkey_patch/events/item_state_changed.rb +0 -60
- data/lib/openhab/dsl/monkey_patch/events/thing_status_info.rb +0 -33
- data/lib/openhab/dsl/monkey_patch/java/java.rb +0 -4
- data/lib/openhab/dsl/monkey_patch/java/local_time.rb +0 -44
- data/lib/openhab/dsl/monkey_patch/java/time_extensions.rb +0 -50
- data/lib/openhab/dsl/monkey_patch/java/zoned_date_time.rb +0 -45
- data/lib/openhab/dsl/monkey_patch/ruby/number.rb +0 -104
- data/lib/openhab/dsl/monkey_patch/ruby/ruby.rb +0 -6
- data/lib/openhab/dsl/monkey_patch/ruby/string.rb +0 -47
- data/lib/openhab/dsl/monkey_patch/ruby/time.rb +0 -61
- data/lib/openhab/dsl/openhab.rb +0 -30
- data/lib/openhab/dsl/persistence.rb +0 -27
- data/lib/openhab/dsl/rules/item_event.rb +0 -19
- data/lib/openhab/dsl/rules/rule.rb +0 -160
- data/lib/openhab/dsl/rules/rule_config.rb +0 -147
- data/lib/openhab/dsl/rules/triggers/generic.rb +0 -31
- data/lib/openhab/dsl/rules/triggers/triggers.rb +0 -11
- data/lib/openhab/dsl/rules/triggers/watch/watch.rb +0 -81
- data/lib/openhab/dsl/states.rb +0 -89
- data/lib/openhab/dsl/things.rb +0 -147
- data/lib/openhab/dsl/time/month_day.rb +0 -180
- data/lib/openhab/dsl/time/time_of_day.rb +0 -235
- data/lib/openhab/dsl/timers/manager.rb +0 -119
- data/lib/openhab/dsl/timers/reentrant_timer.rb +0 -38
- data/lib/openhab/dsl/timers/timer.rb +0 -132
- data/lib/openhab/dsl/timers.rb +0 -77
- data/lib/openhab/dsl/types/increase_decrease_type.rb +0 -23
- data/lib/openhab/dsl/types/next_previous_type.rb +0 -23
- data/lib/openhab/dsl/types/on_off_type.rb +0 -28
- data/lib/openhab/dsl/types/open_closed_type.rb +0 -29
- data/lib/openhab/dsl/types/play_pause_type.rb +0 -27
- data/lib/openhab/dsl/types/point_type.rb +0 -180
- data/lib/openhab/dsl/types/quantity_type.rb +0 -265
- data/lib/openhab/dsl/types/refresh_type.rb +0 -18
- data/lib/openhab/dsl/types/rewind_fastforward_type.rb +0 -33
- data/lib/openhab/dsl/types/stop_move_type.rb +0 -23
- data/lib/openhab/dsl/types/types.rb +0 -83
- data/lib/openhab/dsl/types/un_def_type.rb +0 -22
- data/lib/openhab/dsl/types/up_down_type.rb +0 -32
- data/lib/openhab/dsl/units.rb +0 -45
- data/lib/openhab/log/configuration.rb +0 -21
- data/lib/openhab/log/logger.rb +0 -282
- data/lib/openhab/version.rb +0 -9
- data/lib/openhab.rb +0 -36
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "types"
|
|
4
|
+
|
|
5
|
+
Dir[File.expand_path("items/*.rb", __dir__)].sort.each do |f|
|
|
6
|
+
require f
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module OpenHAB
|
|
10
|
+
module Core
|
|
11
|
+
#
|
|
12
|
+
# Contains the core types that openHAB uses to represent items.
|
|
13
|
+
# Items have states from the {Types} module.
|
|
14
|
+
#
|
|
15
|
+
# You may use an item or group name anywhere {DSL} (or just {Core::EntityLookup})
|
|
16
|
+
# is available, and it will automatically be loaded.
|
|
17
|
+
#
|
|
18
|
+
module Items
|
|
19
|
+
class << self
|
|
20
|
+
# Imports all of the item classes into the global namespace
|
|
21
|
+
# for convenient access.
|
|
22
|
+
def import_into_global_namespace
|
|
23
|
+
concrete_item_classes.each do |k|
|
|
24
|
+
const_name = k.java_class.simple_name
|
|
25
|
+
Object.const_set(const_name, k) unless Object.const_defined?(const_name)
|
|
26
|
+
end
|
|
27
|
+
Object.const_set(:GenericItem, GenericItem) unless Object.const_defined?(:GenericItem)
|
|
28
|
+
Object.const_set(:Item, Item) unless Object.const_defined?(:Item)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
# takes an array of Type java classes and returns
|
|
34
|
+
# all the Enum values, in a flat array
|
|
35
|
+
def values_for_enums(enums)
|
|
36
|
+
enums.map(&:ruby_class)
|
|
37
|
+
.select { |k| k < java.lang.Enum }
|
|
38
|
+
.flat_map(&:values)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# define predicates for checking if an item is in one of the Enum states
|
|
42
|
+
def def_predicate_methods(klass)
|
|
43
|
+
values_for_enums(klass.ACCEPTED_DATA_TYPES).each do |state|
|
|
44
|
+
_command_predicate, state_predicate = Types::PREDICATE_ALIASES[state.to_s]
|
|
45
|
+
next if klass.instance_methods.include?(state_predicate)
|
|
46
|
+
|
|
47
|
+
logger.trace("Defining #{klass}##{state_predicate} for #{state}")
|
|
48
|
+
klass.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
|
49
|
+
def #{state_predicate} # def on?
|
|
50
|
+
raw_state.as(#{state.class.java_class.simple_name}).equal?(#{state}) # raw_state.as(OnOffType) == ON
|
|
51
|
+
end # end
|
|
52
|
+
RUBY
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# define methods for commanding an item to one of the Enum states
|
|
57
|
+
# as well as predicates for if an ItemCommandEvent is one of those commands
|
|
58
|
+
def def_command_methods(klass)
|
|
59
|
+
values_for_enums(klass.ACCEPTED_COMMAND_TYPES).each do |value|
|
|
60
|
+
command = Types::COMMAND_ALIASES[value.to_s]
|
|
61
|
+
next if klass.instance_methods.include?(command)
|
|
62
|
+
|
|
63
|
+
logger.trace("Defining #{klass}##{command} for #{value}")
|
|
64
|
+
klass.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
|
65
|
+
ruby2_keywords def #{command}(*args, &block) # ruby2_keywords def on(*args, &block)
|
|
66
|
+
command(#{value}, *args, &block) # command(ON, *args, &block)
|
|
67
|
+
end # end
|
|
68
|
+
RUBY
|
|
69
|
+
|
|
70
|
+
logger.trace("Defining Enumerable##{command} for #{value}")
|
|
71
|
+
Enumerable.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
|
72
|
+
def #{command} # def on
|
|
73
|
+
each(&:#{command}) # each(&:on)
|
|
74
|
+
end # end
|
|
75
|
+
RUBY
|
|
76
|
+
|
|
77
|
+
logger.trace("Defining ItemCommandEvent##{command}? for #{value}")
|
|
78
|
+
Events::ItemCommandEvent.class_eval <<~RUBY, __FILE__, __LINE__ + 1
|
|
79
|
+
def #{command}? # def refresh?
|
|
80
|
+
command.as(#{value.class.java_class.simple_name}).equal?(#{value}) # command.as(RefreshType).equal?(REFRESH)
|
|
81
|
+
end # end
|
|
82
|
+
RUBY
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def concrete_item_classes
|
|
87
|
+
constants.map { |c| const_get(c) }
|
|
88
|
+
.grep(Module)
|
|
89
|
+
.select { |k| k < GenericItem }
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# sort classes by hierarchy so we define methods on parent classes first
|
|
94
|
+
constants.map { |c| const_get(c) }
|
|
95
|
+
.grep(Module)
|
|
96
|
+
.select { |k| k <= GenericItem && k != GroupItem && k != StringItem }
|
|
97
|
+
.sort { |a, b| (a < b) ? 1 : -1 }
|
|
98
|
+
.each do |klass|
|
|
99
|
+
klass.field_reader :ACCEPTED_COMMAND_TYPES, :ACCEPTED_DATA_TYPES unless klass == GenericItem
|
|
100
|
+
|
|
101
|
+
def_predicate_methods(klass)
|
|
102
|
+
def_command_methods(klass)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
prepend_accepted_data_types
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
end
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module OpenHAB
|
|
4
|
-
module
|
|
4
|
+
module Core
|
|
5
5
|
# Common base class for array-like collections that have lookup
|
|
6
6
|
# methods to avoid instantiating the elements if you only use
|
|
7
7
|
# the lookup method
|
|
@@ -11,6 +11,12 @@ module OpenHAB
|
|
|
11
11
|
module LazyArray
|
|
12
12
|
include Enumerable
|
|
13
13
|
|
|
14
|
+
# @!visibility private
|
|
15
|
+
def self.included(klass)
|
|
16
|
+
klass.undef_method :inspect
|
|
17
|
+
klass.undef_method :to_s
|
|
18
|
+
end
|
|
19
|
+
|
|
14
20
|
# Calls the given block once for each object, passing that object as a
|
|
15
21
|
# parameter. Returns self.
|
|
16
22
|
#
|
|
@@ -30,14 +36,14 @@ module OpenHAB
|
|
|
30
36
|
|
|
31
37
|
# Delegate any other methods to the actual array, exclude mutating methods
|
|
32
38
|
def method_missing(method, *args, &block)
|
|
33
|
-
return to_a.send(method, *args, &block) if method[-1] !=
|
|
39
|
+
return to_a.send(method, *args, &block) if method[-1] != "!" && Array.instance_methods.include?(method)
|
|
34
40
|
|
|
35
41
|
super
|
|
36
42
|
end
|
|
37
43
|
|
|
38
44
|
# @!visibility private
|
|
39
45
|
def respond_to_missing?(method, include_private = false)
|
|
40
|
-
return true if method[-1] !=
|
|
46
|
+
return true if method[-1] != "!" && Array.instance_methods.include?(method.to_sym)
|
|
41
47
|
|
|
42
48
|
super
|
|
43
49
|
end
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "singleton"
|
|
4
|
+
|
|
5
|
+
require_relative "script_handling"
|
|
6
|
+
|
|
7
|
+
module OpenHAB
|
|
8
|
+
module Core
|
|
9
|
+
# @!visibility private
|
|
10
|
+
class ProfileFactory
|
|
11
|
+
include org.openhab.core.thing.profiles.ProfileFactory
|
|
12
|
+
include Singleton
|
|
13
|
+
|
|
14
|
+
# rubocop:disable Naming/MethodName
|
|
15
|
+
class Profile
|
|
16
|
+
include org.openhab.core.thing.profiles.StateProfile
|
|
17
|
+
|
|
18
|
+
def initialize(callback, context, uid, thread_locals, block)
|
|
19
|
+
unless callback.class.ancestors.include?(Things::ProfileCallback)
|
|
20
|
+
callback.class.prepend(Things::ProfileCallback)
|
|
21
|
+
callback.class.field_reader :link
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
@callback = callback
|
|
25
|
+
@context = context
|
|
26
|
+
@uid = uid
|
|
27
|
+
@thread_locals = thread_locals
|
|
28
|
+
@block = block
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# @!visibility private
|
|
32
|
+
def getProfileTypeUID
|
|
33
|
+
@uid
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @!visibility private
|
|
37
|
+
def onCommandFromItem(command)
|
|
38
|
+
return unless process_event(:command_from_item, command: command) == true
|
|
39
|
+
|
|
40
|
+
logger.trace("Forwarding original command")
|
|
41
|
+
@callback.handle_command(command)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# @!visibility private
|
|
45
|
+
def onStateUpdateFromHandler(state)
|
|
46
|
+
return unless process_event(:state_from_handler, state: state) == true
|
|
47
|
+
|
|
48
|
+
logger.trace("Forwarding original update")
|
|
49
|
+
@callback.send_update(state)
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# @!visibility private
|
|
53
|
+
def onCommandFromHandler(command)
|
|
54
|
+
return unless process_event(:command_from_handler, command: command) == true
|
|
55
|
+
|
|
56
|
+
logger.trace("Forwarding original command")
|
|
57
|
+
callback.send_command(command)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# @!visibility private
|
|
61
|
+
def onStateUpdateFromItem(state)
|
|
62
|
+
process_event(:state_from_item, state: state)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
def process_event(event, **params)
|
|
68
|
+
logger.trace("Handling event #{event.inspect} in profile #{@uid} with param #{params.values.first.inspect}.")
|
|
69
|
+
|
|
70
|
+
params[:callback] = @callback
|
|
71
|
+
params[:context] = @context
|
|
72
|
+
params[:configuration] = @context.configuration.properties
|
|
73
|
+
params[:link] = @callback.link
|
|
74
|
+
params[:item] = @callback.link.item
|
|
75
|
+
params[:channel_uid] = @callback.link.linked_uid
|
|
76
|
+
params[:state] ||= nil
|
|
77
|
+
params[:command] ||= nil
|
|
78
|
+
|
|
79
|
+
kwargs = {}
|
|
80
|
+
@block.parameters.each do |(param_type, name)|
|
|
81
|
+
case param_type
|
|
82
|
+
when :keyreq, :key
|
|
83
|
+
kwargs[name] = params[name] if params.key?(name)
|
|
84
|
+
when :keyrest
|
|
85
|
+
kwargs = params
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
DSL::ThreadLocal.thread_local(**@thread_locals) do
|
|
90
|
+
@block.call(event, **kwargs)
|
|
91
|
+
rescue Exception => e
|
|
92
|
+
raise if defined?(::RSpec)
|
|
93
|
+
|
|
94
|
+
@block.binding.eval("self").logger.log_exception(e)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
private_constant :Profile
|
|
99
|
+
# rubocop:enable Naming/MethodName
|
|
100
|
+
|
|
101
|
+
def initialize
|
|
102
|
+
@profiles = {}
|
|
103
|
+
|
|
104
|
+
@registration = OSGi.register_service(self)
|
|
105
|
+
ScriptHandling.script_unloaded { unregister }
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# Unregister the ProfileFactory OSGi service
|
|
110
|
+
#
|
|
111
|
+
# @!visibility private
|
|
112
|
+
# @return [void]
|
|
113
|
+
#
|
|
114
|
+
def unregister
|
|
115
|
+
@registration.unregister
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# @!visibility private
|
|
119
|
+
def register(uid, block)
|
|
120
|
+
@profiles[uid] = [DSL::ThreadLocal.persist, block]
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def createProfile(type, callback, context) # rubocop:disable Naming/MethodName
|
|
124
|
+
@profiles[type].then { |(thread_locals, block)| Profile.new(callback, context, type, thread_locals, block) }
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def getSupportedProfileTypeUIDs # rubocop:disable Naming/MethodName
|
|
128
|
+
@profiles.keys
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
end
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "singleton"
|
|
4
|
+
|
|
5
|
+
module OpenHAB
|
|
6
|
+
module Core
|
|
7
|
+
# @interface
|
|
8
|
+
java_import org.openhab.core.common.registry.ManagedProvider
|
|
9
|
+
|
|
10
|
+
# @!visibility private
|
|
11
|
+
module ManagedProvider
|
|
12
|
+
# Maps actual element types to the symbol used in Thread.local[:openhab_providers]
|
|
13
|
+
TYPE_TO_PROVIDER_TYPE = {
|
|
14
|
+
org.openhab.core.items.Item.java_class => :items,
|
|
15
|
+
org.openhab.core.items.Metadata.java_class => :metadata,
|
|
16
|
+
org.openhab.core.automation.Rule.java_class => :rules,
|
|
17
|
+
org.openhab.core.thing.Thing.java_class => :things,
|
|
18
|
+
org.openhab.core.thing.link.ItemChannelLink.java_class => :links
|
|
19
|
+
}.freeze
|
|
20
|
+
private_constant :TYPE_TO_PROVIDER_TYPE
|
|
21
|
+
|
|
22
|
+
# @return [Symbol, nil]
|
|
23
|
+
def type
|
|
24
|
+
java_class.generic_ancestors.each do |klass|
|
|
25
|
+
next unless klass.respond_to?(:raw_type)
|
|
26
|
+
next unless klass.raw_type == org.openhab.core.common.registry.Provider.java_class
|
|
27
|
+
|
|
28
|
+
type_arg = klass.actual_type_arguments.first
|
|
29
|
+
next unless type_arg.is_a?(java.lang.Class)
|
|
30
|
+
next unless klass.actual_type_arguments.first.is_a?(java.lang.Class)
|
|
31
|
+
|
|
32
|
+
return TYPE_TO_PROVIDER_TYPE[type_arg]
|
|
33
|
+
end
|
|
34
|
+
nil
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# @abstract
|
|
39
|
+
class Provider < org.openhab.core.common.registry.AbstractProvider
|
|
40
|
+
include org.openhab.core.common.registry.ManagedProvider
|
|
41
|
+
include Enumerable
|
|
42
|
+
include Singleton
|
|
43
|
+
public_class_method :new
|
|
44
|
+
|
|
45
|
+
# Known supported provider types
|
|
46
|
+
# @return [Array<Symbol>]
|
|
47
|
+
KNOWN_TYPES = %i[items metadata things links].freeze
|
|
48
|
+
|
|
49
|
+
class << self
|
|
50
|
+
#
|
|
51
|
+
# Determines the current provider that should be used to create elements belonging to this registry.
|
|
52
|
+
#
|
|
53
|
+
# @param [org.openhab.core.common.registry.Provider, Proc, :persistent, :transient, nil] preferred_provider
|
|
54
|
+
# An optional preferred provider to use. Can be one of several types:
|
|
55
|
+
# * An explicit instance of {org.openhab.core.common.registry.ManagedProvider ManagedProvider}
|
|
56
|
+
# * A Proc, which can calculate the preferred provider based on whatever conditions it wants,
|
|
57
|
+
# and then is further processed as this parameter.
|
|
58
|
+
# * `:persistent`, meaning the default {org.openhab.core.common.registry.ManagedProvider ManagedProvider}
|
|
59
|
+
# for this registry. Managed providers persist their objects to JSON, and will survive after the
|
|
60
|
+
# Ruby script is unloaded. This is where objects you configure with MainUI are stored. You should
|
|
61
|
+
# use this provider when you're creating something in response to a one-time event.
|
|
62
|
+
# * `:transient`, meaning a {org.openhab.core.common.registry.ManagedProvider ManagedProvider} that
|
|
63
|
+
# will remove all of its contents when the Ruby script is unloaded. You should use this if you're
|
|
64
|
+
# generating objects dynamically, either based on some sort of other configuration, or simply
|
|
65
|
+
# hard coded and you're using Ruby as a more expressive way to define things than a `.items` or
|
|
66
|
+
# `.things` file. If you _don't_ use this provider for something such as metadata, then you
|
|
67
|
+
# may have issues such as metadata still showing up even though you're no longer creating items
|
|
68
|
+
# with it anymore.
|
|
69
|
+
# * `nil`, meaning to fall back to the current thread setting. See {OpenHAB::DSL.provider}.
|
|
70
|
+
# If there is no thread setting (or the thread setting was Proc that returned `nil`),
|
|
71
|
+
# it defaults to `:transient`.
|
|
72
|
+
# @return [org.openhab.core.common.registry.Provider]
|
|
73
|
+
#
|
|
74
|
+
def current(preferred_provider = nil, element = nil)
|
|
75
|
+
preferred_provider ||= Thread.current[:openhab_providers]&.[](type)
|
|
76
|
+
if preferred_provider.is_a?(Proc)
|
|
77
|
+
preferred_provider = if preferred_provider.arity.zero? || element.nil?
|
|
78
|
+
preferred_provider.call
|
|
79
|
+
else
|
|
80
|
+
preferred_provider.call(element)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
case preferred_provider
|
|
85
|
+
when nil, :transient
|
|
86
|
+
instance
|
|
87
|
+
when :persistent
|
|
88
|
+
registry.managed_provider.get
|
|
89
|
+
when org.openhab.core.common.registry.ManagedProvider
|
|
90
|
+
preferred_provider
|
|
91
|
+
else
|
|
92
|
+
raise ArgumentError, "#{preferred_provider.inspect} is not a ManagedProvider"
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# @abstract
|
|
97
|
+
# @!attribute [r] registry
|
|
98
|
+
#
|
|
99
|
+
# The registry that this provider provides elements for.
|
|
100
|
+
#
|
|
101
|
+
# @return [org.openhab.core.common.registry.Registry]
|
|
102
|
+
#
|
|
103
|
+
def registry
|
|
104
|
+
raise NotImplementedError
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
#
|
|
108
|
+
# Creates a new instance of a provider, registers it, sets it as the
|
|
109
|
+
# default for the thread, calls the block, and then unregisters it.
|
|
110
|
+
#
|
|
111
|
+
# @param [true, false] thread_provider Set this new provider as the default for the thread
|
|
112
|
+
# @yieldparam [Provider] provider The provider
|
|
113
|
+
# @return [Object] The result of the block
|
|
114
|
+
#
|
|
115
|
+
# @!visibility private
|
|
116
|
+
def new(thread_provider: true)
|
|
117
|
+
unless @singleton__instance__.nil? || block_given?
|
|
118
|
+
raise NoMethodError,
|
|
119
|
+
"private method `new' called for #{self}:Class"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
r = provider = super()
|
|
123
|
+
if block_given?
|
|
124
|
+
if thread_provider
|
|
125
|
+
DSL.provider(provider) do
|
|
126
|
+
r = yield provider
|
|
127
|
+
end
|
|
128
|
+
else
|
|
129
|
+
r = yield provider
|
|
130
|
+
end
|
|
131
|
+
provider.unregister
|
|
132
|
+
end
|
|
133
|
+
r
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# @!attribute [r] type
|
|
137
|
+
# @!visibility private
|
|
138
|
+
# @return [Symbol]
|
|
139
|
+
#
|
|
140
|
+
def type
|
|
141
|
+
name.split("::")[-2].downcase.to_sym
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# @!visibility private
|
|
146
|
+
def each(&block)
|
|
147
|
+
@elements.each_value(&block)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# @return [String]
|
|
151
|
+
def inspect
|
|
152
|
+
"#<#{self.class.name}:#{object_id}>"
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# @!visibility private
|
|
156
|
+
def add(element)
|
|
157
|
+
@elements.compute(element.uid) do |_k, old_element|
|
|
158
|
+
raise ArgumentError, "Element #{element.uid} already exists, and cannot be added again" if old_element
|
|
159
|
+
|
|
160
|
+
element
|
|
161
|
+
end
|
|
162
|
+
notify_listeners_about_added_element(element)
|
|
163
|
+
element
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
#
|
|
167
|
+
# Get an element from this provider
|
|
168
|
+
#
|
|
169
|
+
# @param [Object] key The proper key type for the elements in this provider.
|
|
170
|
+
# @return [Object]
|
|
171
|
+
#
|
|
172
|
+
def [](key)
|
|
173
|
+
@elements[key]
|
|
174
|
+
end
|
|
175
|
+
alias_method :get, :[]
|
|
176
|
+
|
|
177
|
+
#
|
|
178
|
+
# Get all elements in this provider
|
|
179
|
+
#
|
|
180
|
+
# @return [Array<Object>]
|
|
181
|
+
#
|
|
182
|
+
def all
|
|
183
|
+
@elements.values
|
|
184
|
+
end
|
|
185
|
+
alias_method :getAll, :all
|
|
186
|
+
|
|
187
|
+
#
|
|
188
|
+
# Remove an element from this provider
|
|
189
|
+
#
|
|
190
|
+
# @return [Object, nil] the removed element
|
|
191
|
+
#
|
|
192
|
+
# @!visibility private
|
|
193
|
+
#
|
|
194
|
+
def remove(key)
|
|
195
|
+
@elements.delete(key)&.tap do |element|
|
|
196
|
+
notify_listeners_about_removed_element(element)
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# @return [Object, nil] the previous version of the element
|
|
201
|
+
# @!visibility private
|
|
202
|
+
#
|
|
203
|
+
def update(element)
|
|
204
|
+
old = nil
|
|
205
|
+
@elements.compute(element.uid) do |_k, old_element|
|
|
206
|
+
raise ArgumentError, "Element #{element.uid} does not exist to update" unless old_element
|
|
207
|
+
|
|
208
|
+
old = old_element
|
|
209
|
+
element
|
|
210
|
+
end
|
|
211
|
+
notify_listeners_about_updated_element(old, element)
|
|
212
|
+
old
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
# @!visibility private
|
|
216
|
+
def unregister
|
|
217
|
+
self.class.registry.remove_provider(self)
|
|
218
|
+
end
|
|
219
|
+
|
|
220
|
+
private
|
|
221
|
+
|
|
222
|
+
def initialize(unload_priority: nil)
|
|
223
|
+
super()
|
|
224
|
+
@elements = java.util.concurrent.ConcurrentHashMap.new
|
|
225
|
+
self.class.registry.add_provider(self)
|
|
226
|
+
ScriptHandling.script_unloaded(priority: unload_priority) { unregister }
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
end
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "singleton"
|
|
4
|
+
require "weakref"
|
|
5
|
+
|
|
6
|
+
require_relative "script_handling"
|
|
7
|
+
|
|
8
|
+
module OpenHAB
|
|
9
|
+
module Core
|
|
10
|
+
#
|
|
11
|
+
# Contains the infrastructure necessary to listen for events when objects are
|
|
12
|
+
# added/removed from their registry, and keep Proxy objects up-to-date with
|
|
13
|
+
# their underlying object.
|
|
14
|
+
#
|
|
15
|
+
# The including class must meet a few requirements:
|
|
16
|
+
# * Have an `EVENTS` constant that is an Array<String> of the events to
|
|
17
|
+
# listen for
|
|
18
|
+
# * The _last_ entry in the `EVENTS` array must be the "removed" event
|
|
19
|
+
# * It must have a sibling class called `Provider`, with a `.registry`
|
|
20
|
+
# method
|
|
21
|
+
# * It's parent module, downcased and with trailing "s" stripped, must be
|
|
22
|
+
# the method name to retrieve an object from one of the incoming events
|
|
23
|
+
#
|
|
24
|
+
# @!visibility private
|
|
25
|
+
#
|
|
26
|
+
module Proxy
|
|
27
|
+
#
|
|
28
|
+
# Registers and listens to openHAB bus events for objects getting
|
|
29
|
+
# added/updated/removed, and updates references from proxy objects
|
|
30
|
+
# to real objects.
|
|
31
|
+
#
|
|
32
|
+
# Proxies are tracked (via a WeakRef), and their underlying object is
|
|
33
|
+
# if it has changed.
|
|
34
|
+
#
|
|
35
|
+
class EventSubscriber
|
|
36
|
+
include Singleton
|
|
37
|
+
include org.openhab.core.events.EventSubscriber
|
|
38
|
+
|
|
39
|
+
def initialize
|
|
40
|
+
@proxies = java.util.concurrent.ConcurrentHashMap.new
|
|
41
|
+
@parent_module = Object.const_get(self.class.name.split("::")[0..-3].join("::"), false)
|
|
42
|
+
@object_type = @parent_module.name.split("::").last.downcase[0..-2].to_sym
|
|
43
|
+
|
|
44
|
+
@event_types = @parent_module::Proxy::EVENTS
|
|
45
|
+
@uid_method = @parent_module::Proxy::UID_METHOD
|
|
46
|
+
@registry = @parent_module::Provider.registry
|
|
47
|
+
@registration = OSGi.register_service(self, "event.topics": "openhab/*")
|
|
48
|
+
ScriptHandling.script_unloaded { @registration.unregister }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
#
|
|
52
|
+
# @!attribute [r] subscribed_event_types
|
|
53
|
+
# @return [Set<String>]
|
|
54
|
+
#
|
|
55
|
+
def subscribed_event_types
|
|
56
|
+
@event_types.to_set
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# @return [org.openhab.core.events.EventFilter, nil]
|
|
60
|
+
def event_filter
|
|
61
|
+
nil
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
#
|
|
65
|
+
# @param [Events::AbstractEvent] event
|
|
66
|
+
# @return [void]
|
|
67
|
+
#
|
|
68
|
+
def receive(event)
|
|
69
|
+
uid = event.__send__(@object_type).__send__(@uid_method)
|
|
70
|
+
object = @registry.get(uid) unless event.class.simple_name == @event_types.last
|
|
71
|
+
|
|
72
|
+
@proxies.compute_if_present(uid) do |_, proxy_ref|
|
|
73
|
+
proxy = resolve_ref(proxy_ref)
|
|
74
|
+
next nil unless proxy
|
|
75
|
+
|
|
76
|
+
proxy.__setobj__(object)
|
|
77
|
+
proxy_ref
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
#
|
|
82
|
+
# Get or create a Proxy for the given raw openHAB object.
|
|
83
|
+
#
|
|
84
|
+
def fetch(object)
|
|
85
|
+
result = nil
|
|
86
|
+
|
|
87
|
+
@proxies.compute(object.__send__(@uid_method)) do |_k, proxy_ref|
|
|
88
|
+
result = resolve_ref(proxy_ref)
|
|
89
|
+
proxy_ref = nil unless result
|
|
90
|
+
result ||= yield
|
|
91
|
+
|
|
92
|
+
proxy_ref || WeakRef.new(result)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
result
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
private
|
|
99
|
+
|
|
100
|
+
def resolve_ref(proxy_ref)
|
|
101
|
+
proxy_ref.__getobj__ if proxy_ref&.weakref_alive?
|
|
102
|
+
rescue WeakRef::RefError
|
|
103
|
+
nil
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# @!visibility private
|
|
108
|
+
module ClassMethods
|
|
109
|
+
# Intercepts calls to create new proxies, and returns the already
|
|
110
|
+
# existing (and tracked) proxy if it exists. Otherwise it does create
|
|
111
|
+
# a new instance of Proxy.
|
|
112
|
+
def new(object)
|
|
113
|
+
self::EventSubscriber.instance.fetch(object) { super }
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# @!visibility private
|
|
118
|
+
def self.included(klass)
|
|
119
|
+
klass.singleton_class.prepend(ClassMethods)
|
|
120
|
+
# define a sub-class of EventSubscriber as a child class of the including class
|
|
121
|
+
klass.const_set(:EventSubscriber, Class.new(EventSubscriber))
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# @!visibility private
|
|
125
|
+
def to_java
|
|
126
|
+
__getobj__
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module OpenHAB
|
|
4
|
+
module Core
|
|
5
|
+
Registry = org.openhab.core.common.registry.AbstractRegistry
|
|
6
|
+
|
|
7
|
+
Registry.field_reader :elementToProvider, :elementReadLock, :identifierToElement, :providerToElements
|
|
8
|
+
|
|
9
|
+
# @abstract
|
|
10
|
+
#
|
|
11
|
+
# The base class for all registries in openHAB.
|
|
12
|
+
#
|
|
13
|
+
class Registry
|
|
14
|
+
#
|
|
15
|
+
# Determines which provider an element is associated with.
|
|
16
|
+
#
|
|
17
|
+
# @param [Object] key
|
|
18
|
+
# @return [org.openhab.core.common.registry.Provider]
|
|
19
|
+
#
|
|
20
|
+
def provider_for(key)
|
|
21
|
+
elementReadLock.lock
|
|
22
|
+
if key.is_a?(org.openhab.core.common.registry.Identifiable)
|
|
23
|
+
element = key
|
|
24
|
+
else
|
|
25
|
+
return nil unless (element = identifierToElement[key])
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
elementToProvider[element]
|
|
29
|
+
ensure
|
|
30
|
+
elementReadLock.unlock
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @!attribute [r] providers
|
|
34
|
+
# @return [Enumerable<org.openhab.core.common.registry.Provider>]
|
|
35
|
+
def providers
|
|
36
|
+
providerToElements.keys
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|