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

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