source: ruby/trunk/lib/open_ehr/serializer.rb@ 408

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

serializer implementation

File size: 4.9 KB
RevLine 
[405]1require 'rexml/document'
[406]2require 'builder'
[405]3
[404]4module OpenEHR
[405]5 module Serializer
[407]6 NL = "\r\n"
7 INDENT = ' '
8
[405]9 class BaseSerializer
10 def initialize(archetype)
11 @archetype = archetype
12 end
[404]13
[405]14 def serialize
15 return self.merge
16 end
17 end
[404]18
[405]19 class ADLSerializer < BaseSerializer
[406]20 def header
[407]21 hd = 'archetype'
22 unless @archetype.adl_version.nil?
23 hd << " (adl_version = #{@archetype.adl_version})"
24 end
[408]25 hd << NL+INDENT + "#{@archetype.archetype_id.value}"+NL*2
[407]26 hd << 'concept'+NL+ INDENT+"[#{@archetype.concept}]"+NL
27 hd << NL+'language'+NL+INDENT+'original_language = <['+
28 @archetype.original_language.terminology_id.value+'::'+
29 @archetype.original_language.code_string+']>'+NL
30 return hd
[405]31 end
32
[406]33 def description
[408]34 desc = ''
35 if @archetype.description
36 ad = @archetype.description
37 desc << 'description' + NL
38 desc << INDENT + 'original_author = <' + NL
39 ad.original_author.each do |k,v|
40 desc << INDENT+INDENT+'["'+k+'"] = <"'+v+'">'+NL
41 end
42 desc << INDENT+'>'+NL
43 desc << INDENT+'lifecycle_state = <"'+ad.lifecycle_state+'">'+NL
44 desc << INDENT+'details = <'+NL
45 ad.details.each do |lang,item|
46 desc << INDENT*2+'["'+lang+'"] = <'+NL
47 desc << INDENT*3+'language = <['+
48 item.language.terminology_id.value+'::'+
49 item.language.code_string+']>'+NL
50 desc << INDENT*3+'purpose = <"'+item.purpose+'">'+NL
51 if item.keywords then
52 desc << INDENT*3+'keywords = <'
53 item.keywords.each do |word|
54 desc << '"'+word+'",'
55 end
56 desc.chop! << '>'+NL
57 end
58 desc << INDENT*3+'use = <"'+item.use+'">'+NL if item.use
59 desc << INDENT*3+'misuse = <"'+item.misuse+'">'+NL if item.misuse
60 desc << INDENT*3+'copyright = <"'+item.copyright+'">'+NL if item.copyright
61 if item.original_resource_uri
62 desc << INDENT*3 + 'original_resource_uri = <'
63 item.original_resource_uri.each do |k,v|
64 desc << INDENT*4+'["'+k+'"] = <"'+v+'">'+NL
65 end
66 desc << INDENT*3+'>'+NL
67 end
68 if item.other_details
69 desc << INDENT*3 + 'other_details = <'
70 item.original_resource_uri.each do |k,v|
71 desc << INDENT*4+'["'+k+'"] = <"'+v+'">'+NL
72 end
73 desc << INDENT*3+'>'+NL
74 end
75 desc << INDENT*2+'>'+NL
76 end
77 desc << INDENT+'>'+NL
78 end
79 return desc
[406]80 end
81
[405]82 def definition
83 end
84
85 def ontology
86 end
87
88 def envelope
89 end
90
91 def merge
[406]92 return header + description + definition + ontology
[405]93 end
94 end
95
96 class XMLSerializer < BaseSerializer
[406]97
98 def header
99 header = ''
100 xml = Builder::XmlMarkup.new(:indent => 2, :target => header)
101 xml.archetype_id do
102 xml.value @archetype.archetype_id.value
103 end
104 xml.concept @archetype.concept
[407]105 xml.original_language do
106 xml.terminology_id do
107 xml.value @archetype.original_language.terminology_id.value
108 end
[408]109 xml.code_string @archetype.original_language.code_string
[407]110 end
[406]111 return header
112 end
113
[405]114 def description
[408]115 desc = ''
116 xml = Builder::XmlMarkup.new(:indent => 2, :target => desc)
117 ad = @archetype.description
118 if ad
119 xml.description do
120 ad.original_author.each do |key,value|
121 xml.original_author(value,"id"=>key)
122 end
123 if ad.other_contributors
124 ad.other_contributors.each do |co|
125 xml.other_contributors co
126 end
127 end
128 xml.lifecycle_state ad.lifecycle_state
129 xml.details do
130 ad.details.each do |lang, item|
131 xml.language do
132 xml.terminology_id do
133 xml.value item.language.terminology_id.value
134 end
135 xml.code_string lang
136 end
137 xml.purpose item.purpose
138 xml.use item.use if item.use
139 xml.misuse item.misuse if item.misuse
140 xml.copyright item.copyright if item.copyright
141 if ad.other_details
142 ad.other_details.each do |key,value|
143 xml.other_details(value, "id"=>key)
144 end
145 end
146 end
147 end
148 end
149 end
150 return desc
[405]151 end
[406]152
153 def merge
154
155 end
[405]156 end
[404]157 end
[405]158end
[404]159
[405]160class Publisher
161 def initialize(serializer)
162 @serializer = serializer
163 end
[404]164
[405]165 def publish(writer)
166 writer.out(@serializer.serialize)
[404]167 end
168end
[405]169
170class Writer
[406]171 def initialize(target)
172 @target = target
173 end
174 def out
175 end
[405]176end
Note: See TracBrowser for help on using the repository browser.