source: ruby/branches/0.5/lib/open_ehr/rm/common/change_control.rb@ 331

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

change_control package is complexed

File size: 11.5 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
126 end
127
128 def item=(item)
129 raise ArgumentError, 'item is mandatory' if item.nil?
130 @item = item
131 end
132 end
133
134 class OriginalVersion < Version
135 attr_reader :attestations, :other_input_version_uids
136
137 def initialize(args = { })
138 super(args)
139 self.attestations = args[:attestations]
140 self.other_input_version_uids = args[:other_input_version_uids]
141 end
142
143 def attestations=(attestations)
144 if attestations.nil? || attestations.empty?
145 raise ArgumentError, 'attestations is mandatory'
146 end
147 @attestations = attestations
148 end
149
150 def other_input_version_uids=(other_input_version_uids)
151 if !other_input_version_uids.nil? && other_input_version_uids.empty?
152 raise ArgumentError, 'invaild other_input_version_uids'
153 end
154 @other_input_version_uids = other_input_version_uids
155 end
156
157 def is_merged?
158# Java implementation has is_merged attribute, Eiffel implementation does
159# nothing
160 end
161 end
162
163 class VersionedObject
164 attr_reader :uid, :owner_id, :time_created, :all_versions
165
166 def initialize(args = { })
167 self.uid = args[:uid]
168 self.owner_id = args[:owner_id]
169 self.time_created = args[:time_created]
170 self.all_versions = args[:all_versions]
171 end
172
173 def uid=(uid)
174 raise ArgumentError, 'uid is mandatory' if uid.nil?
175 @uid = uid
176 end
177
178 def owner_id=(owner_id)
179 raise ArgumentError, 'owner_id is mandatory' if owner_id.nil?
180 @owner_id = owner_id
181 end
182
183 def time_created=(time_created)
184 if time_created.nil?
185 raise ArgumentError, 'time_created is mandatory'
186 end
187 @time_created = time_created
188 end
189
190 def all_versions=(all_versions)
191 if all_versions.nil? || all_versions.size < 0
192 raise ArgumentError, 'version count invalid'
193 end
194 @all_versions = all_versions
195 end
196
197 def all_version_ids
198 ids = []
199 @all_versions.each{|id| ids << id.uid}
200 return ids
201 end
202
203 def version_count
204 return all_versions.size
205 end
206
207 def has_version_id?(a_ver_id)
208 raise ArgumentError, 'argument is mandatory' if a_ver_id.nil?
209 return self.all_version_ids.include?(a_ver_id)
210 end
211
212 def is_original_version?(a_ver_id)
213 if a_ver_id.nil? || !self.has_version_id?(a_ver_id)
214 raise ArgumentError, 'invalid a_ver_id'
215 end
216 return @all_versions[self.all_version_ids.index(a_ver_id)].instance_of? OriginalVersion
217 end
218
219 def has_version_at_time?(a_time)
220 raise ArgumentError, 'argument mandatory' if a_time.nil?
221 @all_versions.each do |ver|
222 if ver.commit_audit.time_committed == a_time
223 return true
224 end
225 end
226 return false
227 end
228
229 def version_with_id(a_ver_id)
230 if a_ver_id.nil? || !self.has_version_id?(a_ver_id)
231 raise ArgumentError, 'argument invalid'
232 end
233 return @all_versions[self.all_version_ids.index(a_ver_id)]
234 end
235
236 def version_at_time(a_time)
237 if a_time.nil? || !self.has_version_at_time?(a_time)
238 raise ArgumentError, 'argument invalid'
239 end
240 @all_versions.each do |ver|
241 if ver.commit_audit.time_committed == a_time
242 return ver
243 end
244 end
245 end
246
247 def latest_version
248 time_sorted_version = @all_versions.sort do |a,b|
249 a.commit_audit.time_committed <=> b.commit_audit.time_committed
250 end
251 return time_sorted_version.last
252 end
253
254 def latest_trunk_version
255 trunk_versions = [ ]
256 @all_versions.each do |ver|
257 if ver.uid.version_tree_id.trunk_version == '1'
258 trunk_versions << ver
259 end
260 end
261 sorted_trunk_version = trunk_versions.sort do |a,b|
262 a.commit_audit.time_committed <=> b.commit_audit.time_committed
263 end
264 return sorted_trunk_version.last
265 end
266
267 def trunk_lifecycle_state
268 return self.latest_trunk_version.lifecycle_state
269 end
270
271 def revision_history
272 revision_history_items = [ ]
273 @all_versions.each do |ver|
274 audits = [ ]
275 if ver.instance_of? OriginalVersion
276 audits << ver.attestations
277 end
278 audits << ver.commit_audit
279 revision_history_items << RevisionHistoryItem.new(
280 :audits => audits,
281 :version_id => ver.uid)
282 end
283 return RevisionHistory.new(revision_history_items)
284 end
285
286 def commit_original_version(args={ })
287 @all_versions << OriginalVersion.new(:uid => args[:uid],
288 :preceding_version_uid => args[:preceding_version_uid],
289 :contribution => args[:contribution],
290 :commit_audit => args[:commit_audit],
291 :lifecycle_state => args[:lifecycle_state],
292 :data => args[:data],
293 :attestations => args[:attestations],
294 :signature => args[:signature])
295 end
296
297 def commit_original_merged_version(args = { })
298 @all_versions << OriginalVersion.new(:uid => args[:uid],
299 :contribution => args[:contribution],
300 :preceding_version_uid => args[:preceding_version_uid],
301 :commit_audit => args[:commit_audit],
302 :lifecycle_state => args[:lifecycle_state],
303 :data => args[:data],
304 :attestations => args[:attestations],
305 :other_input_version_uids => args[:other_input_version_uids],
306 :signature => args[:signature])
307 end
308
309 def commit_imported_version(args = { })
310 @all_versions << ImportedVersion.new(:item => args[:item],
311 :contribution => args[:contribution],
312 :commit_audit => args[:commit_audit])
313 end
314
315 def commit_attestation(args = { })
316 if args[:attestation].nil?
317 raise ArgumentError, 'attestation is mandatory'
318 end
319 if self.has_version_id?(args[:uid]) && self.is_original_version?(args[:uid])
320 self.version_with_id(args[:uid]).attestations << args[:attestation]
321 self.version_with_id(args[:uid]).signature = args[:signature]
322 else
323 raise ArgumentError, 'uid invalid'
324 end
325 end
326 end
327 end # of ChangeControl
328 end # of Common
329 end # of RM
330end # of OpenEHR
Note: See TracBrowser for help on using the repository browser.