-
Notifications
You must be signed in to change notification settings - Fork 0
/
propertyfactory.go
68 lines (59 loc) · 1.62 KB
/
propertyfactory.go
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
package vaquita
import (
"sync"
"time"
)
type PropertyFactory struct {
properties map[string]*DynamicProperty
lock *sync.RWMutex
config DynamicConfig
}
func NewPropertyFactory(owner DynamicConfig) *PropertyFactory {
factory := &PropertyFactory{
properties: make(map[string]*DynamicProperty),
lock: new(sync.RWMutex),
config: owner,
}
owner.Subscribe(factory.eventHandler)
return factory
}
func (f *PropertyFactory) eventHandler(e *ChangeEvent) {
f.lock.RLock()
defer f.lock.RUnlock()
if p, ok := f.properties[e.Name()]; ok {
if e.Event() == PropertyRemoved {
p.clear()
} else {
p.setValue(e.Value())
}
}
}
func (f *PropertyFactory) GetStringProperty(name, defaultValue string) StringProperty {
p := f.getProperty(name)
return newDynamicStringProperty(p, defaultValue)
}
func (f *PropertyFactory) GetBoolProperty(name string, defaultValue bool) BoolProperty {
p := f.getProperty(name)
return newDynamicBoolProperty(p, defaultValue)
}
func (f *PropertyFactory) GetIntProperty(name string, defaultValue int) IntProperty {
p := f.getProperty(name)
return newDynamicIntProperty(p, defaultValue)
}
func (f *PropertyFactory) GetDurationProperty(name string, defaultValue time.Duration, unit time.Duration) DurationProperty {
p := f.getProperty(name)
return newDynamicDurationProperty(p, defaultValue, unit)
}
func (f *PropertyFactory) getProperty(name string) *DynamicProperty {
f.lock.Lock()
defer f.lock.Unlock()
p, ok := f.properties[name]
if !ok {
p = newDynamicProperty(name)
if v, ok := f.config.GetProperty(name); ok {
p.setValue(v)
}
f.properties[name] = p
}
return p
}