This repository has been archived by the owner on Apr 3, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathprovider.js
115 lines (90 loc) · 3.16 KB
/
provider.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
const osgi = require('./osgi');
const log = require('./log')('provider');
const utils = require('./utils');
function getAllFunctionNames(obj) {
var props = [];
var o = obj;
do {
props = props.concat(Object.getOwnPropertyNames(o));
o = Object.getPrototypeOf(o);
} while (o.constructor.name !== 'AbstractProvider');
return props.filter(p => typeof obj[p] === 'function');
}
class AbstractProvider {
constructor(type) {
this.typeName = type.class.getName();
this.javaType = Java.extend(type);//require('@runtime/osgi').classutil.extend(type);
}
register() {
let javaConfig = {};
let functionNamesToBind = getAllFunctionNames(this).
filter(f => f !== 'constructor').
filter(f => f !== 'javaType');
for(let fn of functionNamesToBind) {
javaConfig[fn] = this[fn].bind(this);
}
let hostProvider = this.processHostProvider(new this.javaType(javaConfig));
this.hostProvider = hostProvider;
osgi.registerService(this.hostProvider, this.typeName);
}
processHostProvider(hostProvider) {
return hostProvider;
}
}
class CallbackProvider extends AbstractProvider {
constructor(type){
super(type);
this.callbacks = [];
}
addProviderChangeListener(listener) {
}
removeProviderChangeListener(listener) {
}
addCallback(callback) {
this.callbacks.push(callback);
}
getAll(){
return utils.jsArrayToJavaList(this.callbacks.flatMap(c => c()));
}
}
class ItemProvider extends CallbackProvider {
constructor(ctxName = "JSAPI") {
super(utils.typeBySuffix('core.items.ItemProvider'))
this.ctxName = ctxName;
}
processHostProvider(hostProvider) {
return require('@runtime/provider').itemBinding.create(this.ctxName, super.processHostProvider(hostProvider));
}
}
class StateDescriptionFragmentProvider extends AbstractProvider {
constructor() {
super(utils.typeBySuffix('core.types.StateDescriptionFragmentProvider'));
this.callbacks = [];
}
addCallback(callback) {
this.callbacks.push(callback);
}
getStateDescriptionFragment(itemName, locale) {
for(let c of this.callbacks) {
let result = c(itemName, locale);
if(typeof result !== 'undefined') {
return result;
}
}
return null;
}
getRank() {
return 0;
}
}
let ItemChannelLinkProviderClass = utils.typeBySuffix('core.thing.link.ItemChannelLinkProvider');
let MetadataProviderClass = utils.typeBySuffix('core.items.MetadataProvider');
let ThingProviderClass = utils.typeBySuffix('core.thing.ThingProvider');
module.exports = {
AbstractProvider,
newCallbackItemChannelLinkProvider: () => new CallbackProvider(ItemChannelLinkProviderClass),
newCallbackMetadataProvider: () => new CallbackProvider(MetadataProviderClass),
newCallbackItemProvider: c => new ItemProvider(c),
newCallbackThingProvider: () => new CallbackProvider(ThingProviderClass),
newCallbackStateDescriptionFragmentProvider: () => new StateDescriptionFragmentProvider
}