source: ruby/trunk/lib/open_ehr/rm/common/change_control.rb@ 370

Last change on this file since 370 was 370, checked in by KOBAYASHI, Shinji, 14 years ago

merge operation

File size: 11.7 KB
Line 
1# This module is based on the UML,
2# http://www.openehr.org/uml/release-1.0.1/Browsable/_9_0_76d0249_1109326589721_134411_997Report.html
3# Ticket refs #64
4include OpenEHR::RM::Common::Generic
5module OpenEHR
6 module RM
7 module Common
8 module ChangeControl
9 class Contribution
10 attr_reader :uid, :versions, :audit
11
12 def initialize(args = { })
13 self.uid = args[:uid]
14 self.versions = args[:versions]
15 self.audit = args[:audit]
16 end
17
18 def uid=(uid)
19 if uid.nil?
20 raise ArgumentError, "uid should not be nil."
21 end
22 @uid = uid
23 end
24
25 def versions=(versions)
26 unless versions.nil?
27 if versions.empty?
28 raise ArgumentError, 'versions shoud not be nil or empty.'
29 end
30 end
31 @versions = versions
32 end
33
34 def audit=(audit)
35 if audit.nil?
36 raise ArgumentError, 'audit should not be nil.'
37 end
38 if audit.description.nil?
39 raise ArgumentError, 'audit.description should not be nil.'
40 end
41 @audit = audit
42 end
43 end
44
45 class Version
46 attr_reader :uid, :preceding_version_uid, :lifecycle_state,
47 :commit_audit, :contribution
48 attr_accessor :data, :signature
49
50 def initialize(args = { })
51 self.uid = args[:uid]
52 self.preceding_version_uid = args[:preceding_version_uid]
53 self.data = args[:data]
54 self.lifcycle_state = args[:lifecycle_state]
55 self.commit_audit = args[:commit_audit]
56 self.contribution = args[:contribution]
57 self.signature = args[:signature]
58 end
59
60 def uid=(uid)
61 raise ArgumentError, "uid should not be nil" if uid.nil?
62 @uid = uid
63 end
64
65 def preceding_version_uid=(preceding_version_uid)
66 if (!preceding_version_uid.nil?) == @uid.version_tree_id.is_first?
67 raise ArgumentError, 'preceding version is invalid'
68 end
69 @preceding_version_uid = preceding_version_uid
70 end
71
72# remove hard coding of lifecycle
73 def lifcycle_state=(lifecycle_state)
74 if lifecycle_state.nil? ||
75 !%w[532 553 523].include?(
76 lifecycle_state.defining_code.code_string)
77 raise ArgumentError, 'invalid lifecycle_state'
78 end
79 @lifecycle_state = lifecycle_state
80 end
81
82 def commit_audit=(commit_audit)
83 if commit_audit.nil?
84 raise ArgumentError,'commit_audit is mandatory'
85 end
86 @commit_audit = commit_audit
87 end
88
89 def contribution=(contribution)
90 if contribution.nil? or contribution.type.empty?
91 raise ArgumentError, "contribution is invalid"
92 end
93 if contribution.type == 'CONTRIBUTION'
94 @contribution = contribution
95 else
96 raise ArgumentError, 'contribution is invalid'
97 end
98 end
99
100 def owner_id
101 return HierObjectID.new(:value => @uid.value)
102 end
103
104 def is_branch?
105 return @uid.is_branch?
106 end
107
108 def canonical_form
109 raise NotImplementedError, 'canonical form is not determined'
110 end
111 end
112
113 class ImportedVersion < Version
114 attr_reader :item
115
116 def initialize(args = { })
117 self.item = args[:item]
118 super(:uid => @item.uid,
119 :preceding_version_uid => @item.preceding_version_uid,
120 :data => @item.data, :commit_audit=> args[:commit_audit],
121 :commit_audit => args[:commit_audit],
122 :contribution => args[:contribution],
123 :lifecycle_state => @item.lifecycle_state,
124 :signature => args[:signature])
125 end
126
127 def item=(item)
128 raise ArgumentError, 'item is mandatory' if item.nil?
129 @item = item
130 end
131 end
132
133 class OriginalVersion < Version
134 attr_reader :attestations, :other_input_version_uids
135
136 def initialize(args = { })
137 super(args)
138 self.attestations = args[:attestations]
139 self.other_input_version_uids = args[:other_input_version_uids]
140 end
141
142 def attestations=(attestations)
143 if attestations.nil? || attestations.empty?
144 raise ArgumentError, 'attestations is mandatory'
145 end
146 @attestations = attestations
147 end
148
149 def other_input_version_uids=(other_input_version_uids)
150 if !other_input_version_uids.nil? && other_input_version_uids.empty?
151 raise ArgumentError, 'invaild other_input_version_uids'
152 end
153 @other_input_version_uids = other_input_version_uids
154 end
155
156 def is_merged?
157 return !other_input_version_uids.nil?
158 end
159 end
160
161 class VersionedObject
162 attr_reader :uid, :owner_id, :time_created, :all_versions
163
164 def initialize(args = { })
165 self.uid = args[:uid]
166 self.owner_id = args[:owner_id]
167 self.time_created = args[:time_created]
168 self.all_versions = args[:all_versions]
169 end
170
171 def uid=(uid)
172 raise ArgumentError, 'uid is mandatory' if uid.nil?
173 @uid = uid
174 end
175
176 def owner_id=(owner_id)
177 raise ArgumentError, 'owner_id is mandatory' if owner_id.nil?
178 @owner_id = owner_id
179 end
180
181 def time_created=(time_created)
182 if time_created.nil?
183 raise ArgumentError, 'time_created is mandatory'
184 end
185 @time_created = time_created
186 end
187
188 def all_versions=(all_versions)
189 if all_versions.nil? || all_versions.size < 0
190 raise ArgumentError, 'version count invalid'
191 end
192 @all_versions = all_versions
193 end
194
195 def all_version_ids
196 ids = []
197 @all_versions.each{|id| ids << id.uid}
198 return ids
199 end
200
201 def version_count
202 return all_versions.size
203 end
204
205 def has_version_id?(a_ver_id)
206 raise ArgumentError, 'argument is mandatory' if a_ver_id.nil?
207 return self.all_version_ids.include?(a_ver_id)
208 end
209
210 def is_original_version?(a_ver_id)
211 if a_ver_id.nil? || !self.has_version_id?(a_ver_id)
212 raise ArgumentError, 'invalid a_ver_id'
213 end
214 return @all_versions[self.all_version_ids.index(a_ver_id)].instance_of? OriginalVersion
215 end
216
217 def has_version_at_time?(a_time)
218 raise ArgumentError, 'argument mandatory' if a_time.nil?
219 @all_versions.each do |ver|
220 if ver.commit_audit.time_committed == a_time
221 return true
222 end
223 end
224 return false
225 end
226
227 def version_with_id(a_ver_id)
228 if a_ver_id.nil? || !self.has_version_id?(a_ver_id)
229 raise ArgumentError, 'argument invalid'
230 end
231 return @all_versions[self.all_version_ids.index(a_ver_id)]
232 end
233
234 def version_at_time(a_time)
235 if a_time.nil? || !self.has_version_at_time?(a_time)
236 raise ArgumentError, 'argument invalid'
237 end
238 @all_versions.each do |ver|
239 if ver.commit_audit.time_committed == a_time
240 return ver
241 end
242 end
243 end
244
245 def latest_version
246 time_sorted_version = @all_versions.sort do |a,b|
247 a.commit_audit.time_committed <=> b.commit_audit.time_committed
248 end
249 return time_sorted_version.last
250 end
251
252 def latest_trunk_version
253 trunk_versions = [ ]
254 @all_versions.each do |ver|
255 if ver.uid.version_tree_id.trunk_version == '1'
256 trunk_versions << ver
257 end
258 end
259 sorted_trunk_version = trunk_versions.sort do |a,b|
260 a.commit_audit.time_committed <=> b.commit_audit.time_committed
261 end
262 return sorted_trunk_version.last
263 end
264
265 def trunk_lifecycle_state
266 return self.latest_trunk_version.lifecycle_state
267 end
268
269 def revision_history
270 revision_history_items = [ ]
271 @all_versions.each do |ver|
272 audits = [ ]
273 if ver.instance_of? OriginalVersion
274 audits << ver.attestations
275 end
276 audits << ver.commit_audit
277 revision_history_items << RevisionHistoryItem.new(
278 :audits => audits,
279 :version_id => ver.uid)
280 end
281 return RevisionHistory.new(:items => revision_history_items)
282 end
283
284 def commit_original_version(args={ })
285 if has_version_id?(args[:preceding_version_uid]) or self.version_count == 0
286 @all_versions << OriginalVersion.new(:uid => args[:uid],
287 :preceding_version_uid => args[:preceding_version_uid],
288 :contribution => args[:contribution],
289 :commit_audit => args[:commit_audit],
290 :lifecycle_state => args[:lifecycle_state],
291 :data => args[:data],
292 :attestations => args[:attestations],
293 :signature => args[:signature])
294 else
295 raise ArgumentError, 'invalid preceding uid'
296 end
297 end
298
299 def commit_original_merged_version(args = { })
300 @all_versions << OriginalVersion.new(:uid => args[:uid],
301 :contribution => args[:contribution],
302 :preceding_version_uid => args[:preceding_version_uid],
303 :commit_audit => args[:commit_audit],
304 :lifecycle_state => args[:lifecycle_state],
305 :data => args[:data],
306 :attestations => args[:attestations],
307 :other_input_version_uids => args[:other_input_version_uids],
308 :signature => args[:signature])
309 end
310
311 def commit_imported_version(args = { })
312 @all_versions << ImportedVersion.new(:item => args[:item],
313 :contribution => args[:contribution],
314 :commit_audit => args[:commit_audit])
315 end
316
317 def commit_attestation(args = { })
318 if args[:attestation].nil?
319 raise ArgumentError, 'attestation is mandatory'
320 end
321 if self.has_version_id?(args[:uid]) && self.is_original_version?(args[:uid])
322 self.version_with_id(args[:uid]).attestations << args[:attestation]
323 self.version_with_id(args[:uid]).signature = args[:signature]
324 else
325 raise ArgumentError, 'uid invalid'
326 end
327 end
328 end
329 end # of ChangeControl
330 end # of Common
331 end # of RM
332end # of OpenEHR
Note: See TracBrowser for help on using the repository browser.