-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathdefault_persistent_object.py
130 lines (107 loc) · 4.58 KB
/
default_persistent_object.py
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
from digitalpy.core.persistence.impl.null_mapper import NullMapper
from digitalpy.core.main.object_factory import ObjectFactory
from digitalpy.core.domain.object_id import ObjectId
from digitalpy.core.persistence.persistent_object import PersistentObject
from digitalpy.core.persistence.property_change_event import PropertyChangeEvent
from digitalpy.core.persistence.value_change_event import ValueChangeEvent
class DefaultPersistentObject(PersistentObject):
id = None
__type = ""
data = {}
properties = {}
value_properties = {}
state = PersistentObject.STATE_CLEAN
changed_attributes = {}
original_data = {}
mapper = None
null_mapper = None
def __init__(self, oid: ObjectId = None, initial_data=None):
if oid is None or not ObjectId.is_valid(oid):
oid = ObjectId.NULL_OID()
self.__type = oid.get_type()
self._oid = oid
if oid.contains_dummy_ids():
self.state = DefaultPersistentObject.STATE_NEW
else:
self.state = DefaultPersistentObject.STATE_CLEAN
data = {}
self.attribute_descriptions = self.get_mapper().get_attributes()
for cur_attribute_desc in self.attribute_descriptions:
data[cur_attribute_desc.get_name()] = cur_attribute_desc.get_default_value()
if initial_data is not None:
data = {**data, **initial_data}
for name, value in data.items():
self.set_value_internal(name, value)
self.original_data = data
self._set_oid_internal(oid, False)
def __initialize_mapper(self):
self.persistence_facade = ObjectFactory.get_instance("persistencefacade")
if self.persistence_facade.is_known_type(self.__type):
self.mapper = self.persistence_facade.get_mapper(self.__type)
else:
if DefaultPersistentObject.null_mapper == None:
DefaultPersistentObject.null_mapper = NullMapper()
self.mapper = DefaultPersistentObject.null_mapper
def _set_oid_internal(self, oid: ObjectId, trigger_listeners):
self.__type = oid.get_type()
self._oid = oid
ids = oid.get_id()
pk_names = self.get_mapper().get_pk_names()
for i in range(len(pk_names)):
if trigger_listeners:
self.set_value(pk_names[i], ids[i], True)
else:
self.set_value_internal(pk_names[i], ids[i])
def set_property(self, name, value):
old_value = self.get_property(name)
self._properties[name] = value
ObjectFactory.get_instance("eventManager").dispatch(
PropertyChangeEvent.NAME, PropertyChangeEvent(self, name, old_value, value)
)
def get_properties(self):
return self.properties
def get_property(self, name):
if name in self.properties:
return self.properties[name]
else:
properties = self.get_mapper().get_properties()
if name in properties:
return properties[name]
@classmethod
def get_value(cls, name):
return cls.data.get(name, None)
@classmethod
def set_state(cls, state):
raise NotImplementedError("this method is not implemented yet")
def validate_value(self, name, value):
raise NotImplementedError("this method is not implemented yet")
def get_mapper(self):
if self.mapper is None:
self.__initialize_mapper()
return self.mapper
def set_value(self, name, value, force_set=False, track_change=True):
if not force_set:
self.validate_value(name, value)
old_value = self.get_value(name)
if force_set or old_value != value:
self.set_value_internal(name, value)
if name in self.get_mapper().get_pk_names():
self.update_oid()
if track_change:
DefaultPersistentObject.set_state(DefaultPersistentObject.STATE_DIRTY)
self.changed_attributes[name] = True
ObjectFactory.get_instance("eventManager").dispatch(
ValueChangeEvent.NAME,
ValueChangeEvent(self, name, old_value, value),
)
return True
return False
def get_property_names(self):
result = self.get_mapper().get_properties().keys()
return result.extend(self.properties.keys())
def set_value_internal(self, name, value):
"""Internal (fast) version to set a value without any validation, state change,
listener notification etc."""
self.data[name] = value
def get_oid(self):
return self._oid