source: ruby/branches/0.5/lib/open_ehr/rm/support/identification.rb @ 267

Last change on this file since 267 was 267, checked in by KOBAYASHI, Shinji, 11 years ago

bugs fixed around identification

File size: 11.1 KB
Line 
1# This module is an implementation of this UML:
2# http://www.openehr.org/uml/release-1.0.1/Browsable/_9_0_76d0249_1109331021343_528780_2066Report.html
3# Ticket refs #39
4module OpenEHR
5  module RM
6    module Support
7      module Identification
8        class ObjectID
9          attr_reader :value
10
11          def initialize(args = {})
12            self.value=args[:value]
13          end
14
15          def value=(value)
16            raise ArgumentError, "empty value" if value.nil? or value.empty?
17            @value = value           
18          end
19
20          def ==(object_id)
21            @value == object_id.value
22          end
23        end # of ObjectID
24
25        class ObjectRef
26          attr_reader :namespace, :type, :id
27
28          def initialize(namespace, type, id)
29            self.namespace = namespace
30            self.type = type
31            self.id = id
32          end
33
34          def namespace=(namespace)
35            raise ArgumentError if namespace.nil? or namespace.empty? or !(/([a-z]|[A-Z]).*/ =~ namespace) # error original is =~ #([a-z][A-Z])([a-z]|[A-Z]|\s|[v0-9]|[_-\:\/\&\+\?])*/
36            @namespace = namespace
37          end
38
39          def type=(type)
40            raise ArgumentError if type.nil? or type.empty?
41            @type = type
42          end
43
44          def id=(id)
45            raise ArgumentError if id.nil?
46            @id = id
47          end
48        end
49
50        class ArchetypeID < ObjectID
51          attr_reader :rm_originator, :rm_name, :rm_entity,
52                      :concept_name, :specialisation, :version_id
53         
54          def initialize(args = {})
55            if args[:value].nil?
56              self.rm_originator = args[:rm_originator]
57              self.rm_name = args[:rm_name]
58              self.rm_entity = args[:rm_entity]
59              self.concept_name = args[:concept_name]
60              self.version_id = args[:version_id]
61              self.specialisation = args[:specialisation]
62            else
63              super(args)
64            end
65          end
66
67          def value=(value)
68            if /([a-zA-Z]\w+)-([a-zA-Z]\w+)-([a-zA-Z]\w+)\.([a-zA-Z]\w+)(-([a-zA-Z]\w+))?\.(v[1-9]\d*)/ =~ value
69              self.rm_originator = $1
70              self.rm_name = $2
71              self.rm_entity = $3
72              self.concept_name = $4
73              self.specialisation = $6
74              self.version_id = $7
75            else
76              raise ArgumentError, 'invalid archetype id form'
77            end
78          end
79
80          def qualified_rm_entity
81            return @rm_originator + '-' + @rm_name + '-' + @rm_entity
82          end
83
84          def domain_concept
85            if @specialisation.nil?
86              return @concept_name
87            else
88              return @concept_name + '-' + @specialisation
89            end
90          end
91
92          def value
93            return self.qualified_rm_entity + '.' +
94              self.domain_concept + '.' + @version_id
95          end
96
97          def concept_name=(concept_name)
98            if concept_name.nil? or concept_name.empty?
99              raise ArgumentError, 'concept_name is mandatory'
100            end
101            @concept_name = concept_name
102          end
103
104          def domain_concept=(domain_concept)
105            if domain_concept.nil? or domain_concept.empty?
106              raise ArgumentError, "domain concept not valid"
107            end
108            if /([a-zA-Z]\w+)(-([a-zA-Z]\w))?/ =~ domain_concept
109              self.concept_name = $1
110              self.specialisation = $3
111            else
112              raise ArgumentError, 'invalid domain concept form'
113            end
114          end
115
116          def rm_name=(rm_name)
117            raise ArgumentError, "rm_name not valid" if rm_name.nil? or rm_name.empty?
118            @rm_name = rm_name
119          end
120
121          def rm_entity=(rm_entity)
122            if rm_entity.nil? or rm_entity.empty?
123              raise ArgumentError, "rm_entity is mandatory"
124            end
125            @rm_entity = rm_entity
126          end
127
128          def rm_originator=(rm_originator)
129            if rm_originator.nil? or rm_originator.empty?
130              raise ArgumentError, "rm_originator not valid"
131            end
132            @rm_originator = rm_originator
133          end
134
135          def specialisation=(specialisation)
136            if !specialisation.nil? and specialisation.empty?
137              raise ArgumentError, "rm_specialisation not valid" 
138            end
139            @specialisation = specialisation
140          end
141
142          def version_id=(version_id)
143            raise ArgumentError, "version_id not valid" if version_id.nil? or version_id.empty?
144            @version_id = version_id
145          end
146        end
147
148        class TerminologyID < ObjectID
149          attr_reader :name, :version_id
150
151          def initialize(args = {})
152            if args[:value].nil?
153              self.name = args[:name]
154              self.version_id = args[:version_id]
155            else
156              super(args)
157            end
158          end
159
160          def value
161            if @version_id.empty?
162              @name
163            else
164              @name + '(' + @version_id + ')'
165            end 
166          end
167
168
169          def value=(value)
170            raise ArgumentError, "value not valid" if value.nil? or value.empty?
171            if /(.*)\((.*)\)/ =~ value
172              self.name = $1
173              self.version_id = $2
174            else
175              self.name = value
176              self.version_id = ''
177            end
178          end
179
180          def name=(name)
181            raise ArgumentError, "name not valid" if name.nil? or name.empty?
182            @name = name
183          end
184
185          def version_id=(version_id)
186            if version_id.nil?
187              @version_id = ''
188            else
189              @version_id = version_id
190            end
191          end
192        end # of Terminology_ID
193
194        class GenericID < ObjectID
195          attr_reader :scheme
196
197          def initialize(value, scheme)
198            super(value)
199            self.scheme = scheme
200          end
201
202          def scheme=(scheme)
203            raise ArgumentError, "scheme not valid" if scheme.nil? or scheme.empty?
204            @scheme = scheme
205          end
206        end # of Generic_ID
207
208        class TemplateID < ObjectID
209
210        end
211
212        class UIDBasedID < ObjectID
213          def initialize(value)
214            super(value)
215          end
216
217          def extension
218            if self.has_extension?
219              @value[/::.*/][2..-1]
220            else
221              ''
222            end
223          end
224
225          def has_extension?
226            @value.include? '::'
227          end
228
229          def root
230            if self.has_extension?
231              @value[/.*::/][0..-3]
232            else
233              @value
234            end
235          end
236        end
237
238        class ObjectVersionID < UIDBasedID
239          attr_reader :object_id, :creating_system_id, :version_tree_id
240
241          def initialize(value)
242            super(value)
243          end
244
245          def value=(value)
246            super(value)
247            if /^(\w+)::(\w+)::((\d|\.)+)$/ =~ value
248              self.object_id = UID.new($1)
249              self.creating_system_id = UID.new($2)
250              self.version_tree_id = VersionTreeID.new($3)
251            else
252              raise ArgumentError, 'invalid format'
253            end
254          end
255
256          def object_id=(object_id)
257            raise ArgumentError, 'object_id is mandatory' if object_id.nil?
258            @object_id = object_id
259          end
260
261          def creating_system_id=(creating_system_id)
262            if creating_system_id.nil?
263              raise ArgumentError, 'creating_system_id is mandatory'
264            end
265            @creating_system_id = creating_system_id
266          end
267
268          def version_tree_id=(version_tree_id)
269            if version_tree_id.nil?
270              raise ArgumentError, 'version_tree_id is mandatory'
271            end
272            @version_tree_id = version_tree_id
273          end
274
275          def is_branch?
276            return @version_tree_id.is_branch?
277          end
278        end
279
280        class LocatableRef < ObjectRef
281          attr_reader :namespace, :type, :id, :path
282
283          def initialize(namespace, type, id, path)
284            super(namespace, type, id)
285            self.path = path
286          end
287
288          def path=(path)
289            raise ArgumentError if path.nil? or path.empty?
290            @path = path
291          end
292
293          def as_uri
294            'ehr://' + @id.value + '/' + @path
295          end
296        end
297
298        class PartyRef < ObjectRef
299
300          def type=(type)
301            parties = ['PERSON', 'ORGANISATION', 'GROUP', 'AGENT', 'ROLE','PARTY', 'ACTOR']
302            raise ArgumentError, 'type invalid' unless parties.include? type
303            @type = type
304          end
305        end
306
307        class AccessGroupRef < ObjectRef
308          def type=(type)
309            raise ArgumentError, 'type invalid' unless type == 'ACCESS_GROUP'
310            @type = type
311          end
312        end
313
314        class HierObjectID < UIDBasedID
315
316        end
317
318        class VersionTreeID
319          attr_reader :value, :trunk_version, :branch_number, :branch_version
320
321          def initialize(value)
322            self.value = value
323          end
324
325          def value=(value)
326            raise ArgumentError, 'value invalid' if value.nil? or value.empty?
327            @trunk_version = @branch_number = @branch_version = nil
328            (trunk_version, branch_number, branch_version) = value.split '.'
329            self.trunk_version = trunk_version
330            self.branch_number = branch_number
331            self.branch_version = branch_version
332          end
333
334          def trunk_version=(trunk_version)
335            raise ArgumentError, 'trunk_version invalid' if trunk_version.nil? and !trunk_version.to_i >= 1
336            @trunk_version = trunk_version
337            set_value
338          end
339
340          def branch_number=(branch_number)
341            raise ArgumentError, 'branch number invalid' unless branch_number.nil? or branch_number.to_i >= 1
342            @branch_number = branch_number
343            set_value
344          end
345
346          def branch_version=(branch_version)
347            raise ArgumentError, 'branch version invalid' if (!branch_version.nil? and !( branch_version.to_i >= 1)) or (!branch_version.nil? and @branch_number.nil?)
348            @branch_version = branch_version
349            set_value
350          end
351          def is_branch?
352            !@branch_version.nil? and !@branch_number.nil?
353          end
354
355          def is_first?
356            trunk_version == '1'
357          end
358
359          private
360          def set_value
361            @value = trunk_version
362            @value = @value + '.' + @branch_number unless @branch_number.nil?
363            @value = @value + '.' + @branch_version unless @branch_version.nil?
364          end
365        end
366
367        class UID
368          attr_reader :value
369
370          def initialize(value)
371            self.value = value
372          end
373
374          def value=(value)
375            raise ArgumentError if value.nil? or value.empty?
376            @value = value
377          end
378        end
379
380        class UUID < UID
381
382        end
383
384        class InternetID <UID
385         
386        end
387
388        class IsoOID <UID
389
390        end       
391      end # of Identification
392    end # of Support
393  end # of RM
394end # of OpenEHR
Note: See TracBrowser for help on using the repository browser.