expressir 0.2.7-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. checksums.yaml +7 -0
  2. data/.cross_rubies +30 -0
  3. data/.github/workflows/rake.yml +45 -0
  4. data/.github/workflows/release.yml +84 -0
  5. data/.gitignore +17 -0
  6. data/.gitmodules +3 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +508 -0
  9. data/Gemfile +4 -0
  10. data/README.adoc +147 -0
  11. data/Rakefile +11 -0
  12. data/bin/console +12 -0
  13. data/bin/rspec +29 -0
  14. data/bin/setup +8 -0
  15. data/demo.rb +18 -0
  16. data/docs/development.md +90 -0
  17. data/exe/expressir +20 -0
  18. data/exe/generate-parser +48 -0
  19. data/expressir.gemspec +43 -0
  20. data/lib/expressir.rb +21 -0
  21. data/lib/expressir/cli.rb +27 -0
  22. data/lib/expressir/cli/ui.rb +36 -0
  23. data/lib/expressir/config.rb +23 -0
  24. data/lib/expressir/express.rb +11 -0
  25. data/lib/expressir/express/aggregate_dimension.rb +38 -0
  26. data/lib/expressir/express/attribute.rb +15 -0
  27. data/lib/expressir/express/comment.rb +7 -0
  28. data/lib/expressir/express/defined_type.rb +36 -0
  29. data/lib/expressir/express/derived.rb +65 -0
  30. data/lib/expressir/express/derived_aggregate.rb +43 -0
  31. data/lib/expressir/express/entity.rb +137 -0
  32. data/lib/expressir/express/explicit.rb +70 -0
  33. data/lib/expressir/express/explicit_aggregate.rb +46 -0
  34. data/lib/expressir/express/explicit_or_derived.rb +16 -0
  35. data/lib/expressir/express/global_rule.rb +44 -0
  36. data/lib/expressir/express/interface_specification.rb +51 -0
  37. data/lib/expressir/express/interfaced_item.rb +38 -0
  38. data/lib/expressir/express/inverse.rb +46 -0
  39. data/lib/expressir/express/inverse_aggregate.rb +37 -0
  40. data/lib/expressir/express/model_element.rb +7 -0
  41. data/lib/expressir/express/named_type.rb +19 -0
  42. data/lib/expressir/express/remark.rb +8 -0
  43. data/lib/expressir/express/repository.rb +306 -0
  44. data/lib/expressir/express/schema_definition.rb +96 -0
  45. data/lib/expressir/express/subtype_constraint.rb +14 -0
  46. data/lib/expressir/express/type.rb +26 -0
  47. data/lib/expressir/express/type_aggregate.rb +42 -0
  48. data/lib/expressir/express/type_enum.rb +29 -0
  49. data/lib/expressir/express/type_parser.rb +45 -0
  50. data/lib/expressir/express/type_select.rb +82 -0
  51. data/lib/expressir/express/unique_rule.rb +35 -0
  52. data/lib/expressir/express/where_rule.rb +32 -0
  53. data/lib/expressir/express_exp/2.4/express_parser.so +0 -0
  54. data/lib/expressir/express_exp/2.5/express_parser.so +0 -0
  55. data/lib/expressir/express_exp/2.6/express_parser.so +0 -0
  56. data/lib/expressir/express_exp/2.7/express_parser.so +0 -0
  57. data/lib/expressir/express_exp/3.0/express_parser.so +0 -0
  58. data/lib/expressir/express_exp/formatter.rb +1450 -0
  59. data/lib/expressir/express_exp/parser.rb +41 -0
  60. data/lib/expressir/express_exp/visitor.rb +2464 -0
  61. data/lib/expressir/express_parser.rb +30 -0
  62. data/lib/expressir/model.rb +65 -0
  63. data/lib/expressir/model/attribute.rb +27 -0
  64. data/lib/expressir/model/constant.rb +17 -0
  65. data/lib/expressir/model/entity.rb +46 -0
  66. data/lib/expressir/model/enumeration_item.rb +11 -0
  67. data/lib/expressir/model/expressions/aggregate_initializer.rb +13 -0
  68. data/lib/expressir/model/expressions/aggregate_item.rb +15 -0
  69. data/lib/expressir/model/expressions/attribute_reference.rb +15 -0
  70. data/lib/expressir/model/expressions/binary_expression.rb +40 -0
  71. data/lib/expressir/model/expressions/call.rb +15 -0
  72. data/lib/expressir/model/expressions/entity_constructor.rb +15 -0
  73. data/lib/expressir/model/expressions/group_reference.rb +15 -0
  74. data/lib/expressir/model/expressions/index_reference.rb +17 -0
  75. data/lib/expressir/model/expressions/interval.rb +21 -0
  76. data/lib/expressir/model/expressions/query_expression.rb +26 -0
  77. data/lib/expressir/model/expressions/simple_reference.rb +13 -0
  78. data/lib/expressir/model/expressions/unary_expression.rb +19 -0
  79. data/lib/expressir/model/function.rb +62 -0
  80. data/lib/expressir/model/identifier.rb +10 -0
  81. data/lib/expressir/model/interface.rb +18 -0
  82. data/lib/expressir/model/literals/binary.rb +13 -0
  83. data/lib/expressir/model/literals/integer.rb +13 -0
  84. data/lib/expressir/model/literals/logical.rb +17 -0
  85. data/lib/expressir/model/literals/real.rb +13 -0
  86. data/lib/expressir/model/literals/string.rb +15 -0
  87. data/lib/expressir/model/parameter.rb +17 -0
  88. data/lib/expressir/model/procedure.rb +60 -0
  89. data/lib/expressir/model/renamed_ref.rb +13 -0
  90. data/lib/expressir/model/repository.rb +19 -0
  91. data/lib/expressir/model/rule.rb +62 -0
  92. data/lib/expressir/model/schema.rb +67 -0
  93. data/lib/expressir/model/scope.rb +17 -0
  94. data/lib/expressir/model/statements/alias.rb +26 -0
  95. data/lib/expressir/model/statements/assignment.rb +15 -0
  96. data/lib/expressir/model/statements/call.rb +15 -0
  97. data/lib/expressir/model/statements/case.rb +17 -0
  98. data/lib/expressir/model/statements/case_action.rb +15 -0
  99. data/lib/expressir/model/statements/compound.rb +13 -0
  100. data/lib/expressir/model/statements/escape.rb +8 -0
  101. data/lib/expressir/model/statements/if.rb +17 -0
  102. data/lib/expressir/model/statements/null.rb +8 -0
  103. data/lib/expressir/model/statements/repeat.rb +34 -0
  104. data/lib/expressir/model/statements/return.rb +13 -0
  105. data/lib/expressir/model/statements/skip.rb +8 -0
  106. data/lib/expressir/model/subtype_constraint.rb +27 -0
  107. data/lib/expressir/model/type.rb +24 -0
  108. data/lib/expressir/model/types/aggregate.rb +17 -0
  109. data/lib/expressir/model/types/array.rb +21 -0
  110. data/lib/expressir/model/types/bag.rb +17 -0
  111. data/lib/expressir/model/types/binary.rb +15 -0
  112. data/lib/expressir/model/types/boolean.rb +8 -0
  113. data/lib/expressir/model/types/enumeration.rb +19 -0
  114. data/lib/expressir/model/types/generic.rb +13 -0
  115. data/lib/expressir/model/types/generic_entity.rb +13 -0
  116. data/lib/expressir/model/types/integer.rb +8 -0
  117. data/lib/expressir/model/types/list.rb +19 -0
  118. data/lib/expressir/model/types/logical.rb +8 -0
  119. data/lib/expressir/model/types/number.rb +8 -0
  120. data/lib/expressir/model/types/real.rb +13 -0
  121. data/lib/expressir/model/types/select.rb +21 -0
  122. data/lib/expressir/model/types/set.rb +17 -0
  123. data/lib/expressir/model/types/string.rb +15 -0
  124. data/lib/expressir/model/unique.rb +15 -0
  125. data/lib/expressir/model/variable.rb +17 -0
  126. data/lib/expressir/model/where.rb +15 -0
  127. data/lib/expressir/parser.rb +6 -0
  128. data/lib/expressir/parser/owl_parser.rb +8 -0
  129. data/lib/expressir/version.rb +3 -0
  130. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +9589 -0
  131. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +36619 -0
  132. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +13294 -0
  133. data/original/examples/employment/eclipse/.project +17 -0
  134. data/original/examples/employment/eclipse/Export/Employment.png +0 -0
  135. data/original/examples/employment/eclipse/Express/employment_schema.exp +33 -0
  136. data/original/examples/employment/eclipse/Express/employment_schema.xmi +77 -0
  137. data/original/examples/employment/eclipse/Express/employment_schema.xml +93 -0
  138. data/original/examples/employment/eclipse/Models/Employment.uml +4 -0
  139. data/original/examples/employment/eclipse/Models/Employment.umldi +240 -0
  140. data/original/examples/employment/eclipse/readme.txt +7 -0
  141. data/original/examples/employment/employment_schema.exp +33 -0
  142. data/original/examples/employment/employment_schema.rb +232 -0
  143. data/original/examples/employment/employment_schema.xml +93 -0
  144. data/original/examples/employment/employment_schema___module.rb +46 -0
  145. data/original/examples/employment/employment_schema___p28attr.rb +126 -0
  146. data/original/examples/employment/employment_schema___p28inst.rb +26 -0
  147. data/original/examples/employment/example_employment_data.xml +1 -0
  148. data/original/examples/employment/example_employment_data_copy.xml +1 -0
  149. data/original/examples/employment/example_employment_reader.rb +30 -0
  150. data/original/examples/employment/example_employment_writer.rb +51 -0
  151. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +3710 -0
  152. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +35880 -0
  153. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +15357 -0
  154. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +9468 -0
  155. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +8404 -0
  156. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +43147 -0
  157. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +18341 -0
  158. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +11632 -0
  159. data/original/examples/syntax/remark.exp +146 -0
  160. data/original/examples/syntax/remark_formatted.exp +175 -0
  161. data/original/examples/syntax/syntax.exp +311 -0
  162. data/original/examples/syntax/syntax_formatted.exp +1191 -0
  163. data/original/exp2ruby.rb +525 -0
  164. data/original/expsm.rb +34 -0
  165. data/original/mapping_owl.rb +1018 -0
  166. data/original/mapping_sysml.rb +2281 -0
  167. data/original/mapping_uml2.rb +599 -0
  168. data/original/mapping_uml2_eclipse.rb +433 -0
  169. data/original/reeper.rb +134 -0
  170. data/rakelib/cross-ruby.rake +308 -0
  171. data/spec/acceptance/express_to_owl_spec.rb +18 -0
  172. data/spec/acceptance/version_spec.rb +12 -0
  173. data/spec/expressir/express/repository_spec.rb +25 -0
  174. data/spec/expressir/express_exp/ap233_spec.rb +22 -0
  175. data/spec/expressir/express_exp/format_remark_spec.rb +28 -0
  176. data/spec/expressir/express_exp/format_syntax_spec.rb +28 -0
  177. data/spec/expressir/express_exp/parse_remark_spec.rb +346 -0
  178. data/spec/expressir/express_exp/parse_syntax_spec.rb +3003 -0
  179. data/spec/expressir/model/find_spec.rb +110 -0
  180. data/spec/expressr_spec.rb +5 -0
  181. data/spec/spec_helper.rb +17 -0
  182. data/spec/support/console_helper.rb +29 -0
  183. metadata +357 -0
@@ -0,0 +1,525 @@
1
+ require 'rexml/document'
2
+ include REXML
3
+ ##
4
+ ## Set global variable for XML namespace prefix to use (including the colon)
5
+ $xnspre = ""
6
+ ##
7
+ ## Set global variable that is the name of the Ruby module containing the resulting EXPRESS-based classes (make uppercase)
8
+ $modname = ""
9
+ ##
10
+ ## Set up Part 28 writer functions for attributes of simple, aggregates of simple, instance reference and aggregate of instance reference
11
+ ##
12
+ def write_attribute_text_p28writer(rubyfile, attribute_name)
13
+ rubyfile.puts " a___" + attribute_name + ".text = " + attribute_name
14
+ end
15
+ def write_member_text_p28writer(rubyfile, attribute_name, attr_type,attr_aggr_dim)
16
+ rubyfile.puts " for " + attribute_name + "___member in " + attribute_name
17
+ rubyfile.puts " amember___" + attribute_name + " = a___" + attribute_name + ".add_element(" + "'ex:" + attr_type.downcase + "-wrapper'" + ")"
18
+ rubyfile.puts " amember___" + attribute_name + ".text = " + attribute_name + "___member"
19
+ rubyfile.puts " end"
20
+ end
21
+ def write_attribute_id_p28writer(rubyfile, attribute_name)
22
+ rubyfile.puts " a___" + attribute_name + " = a___" + attribute_name + ".add_element(" + attribute_name + ".getP28entity)"
23
+ rubyfile.puts " a___" + attribute_name + ".attributes['ref'] = " + attribute_name + ".getP28id"
24
+ rubyfile.puts " a___" + attribute_name + ".attributes['xsi:nil'] = 'true'"
25
+ end
26
+ def write_member_id_p28writer(rubyfile, attribute_name,attr_aggr_dim)
27
+ rubyfile.puts " for " + attribute_name + "___member in " + attribute_name
28
+ rubyfile.puts " amember___" + attribute_name + " = a___" + attribute_name + ".add_element(" + attribute_name + "___member.getP28entity)"
29
+ rubyfile.puts " amember___" + attribute_name + ".attributes['ref'] = " + attribute_name + "___member" + ".getP28id"
30
+ rubyfile.puts " amember___" + attribute_name + ".attributes['xsi:nil'] = 'true'"
31
+ rubyfile.puts " end"
32
+ end
33
+ ##
34
+ ## this function handles the output related to EXPRESS explicit attributes
35
+ def handle_explicit(rubyfile, exp, attribute)
36
+ attr_redecl = attribute.elements["redeclaration"]
37
+ if attr_redecl == nil
38
+ rubyfile.puts " if " + attribute.attributes["name"].downcase + " != nil"
39
+ rubyfile.puts " a___" + attribute.attributes["name"].downcase + " = e___added.add_element('" + attribute.attributes["name"].capitalize + "'" + ")"
40
+ attr_builtintype = attribute.elements["builtintype"]
41
+ attr_type = attribute.elements["typename"]
42
+ attr_aggr = attribute.elements["aggregate"]
43
+ attr_aggr_dim = attribute.elements.size - 1
44
+ if attr_builtintype != nil
45
+ if attr_aggr == nil
46
+ write_attribute_text_p28writer(rubyfile, attribute.attributes["name"].downcase)
47
+ else
48
+ attr_datatype = attr_builtintype.attributes["type"]
49
+ write_member_text_p28writer(rubyfile, attribute.attributes["name"].downcase, attr_datatype,attr_aggr_dim)
50
+ end
51
+ end
52
+ if attr_type != nil
53
+ attr_type_name = attr_type.attributes["name"]
54
+ xp = "//schema/entity[@name = " + "'" + attr_type_name + "'" + "]"
55
+ attr_type_entity = exp.root.elements[xp]
56
+ if attr_type_entity != nil
57
+ if attr_aggr != nil
58
+ write_member_id_p28writer(rubyfile, attribute.attributes["name"].downcase,attr_aggr_dim)
59
+ else
60
+ write_attribute_id_p28writer(rubyfile, attribute.attributes["name"].downcase)
61
+ end
62
+ end
63
+ xp = "//schema/type[@name = " + "'" + attr_type_name + "'" + "]"
64
+ attr_type_type = exp.root.elements[xp]
65
+ if attr_type_type != nil
66
+ attr_type_type_builtin = attr_type_type.elements["builtintype"]
67
+ if attr_type_type_builtin != nil
68
+ write_attribute_text_p28writer(rubyfile, attribute.attributes["name"].downcase)
69
+ end
70
+ attr_type_type_enum = attr_type_type.elements["enumeration"]
71
+ if attr_type_type_enum != nil
72
+ if attr_aggr != nil
73
+ write_member_text_p28writer(rubyfile, attribute.attributes["name"].downcase, attr_datatype,attr_aggr_dim)
74
+ else
75
+ write_attribute_text_p28writer(rubyfile, attribute.attributes["name"].downcase)
76
+ end
77
+ end
78
+
79
+ attr_type_type_select = attr_type_type.elements["select"]
80
+ if attr_type_type_select != nil
81
+ if attr_aggr != nil
82
+ write_member_id_p28writer(rubyfile, attribute.attributes["name"].downcase,attr_aggr_dim)
83
+ else
84
+ write_attribute_id_p28writer(rubyfile, attribute.attributes["name"].downcase)
85
+ end
86
+ end
87
+ end
88
+ end
89
+ rubyfile.puts " end"
90
+ end
91
+ end
92
+ ##
93
+ ## this function handles the p28 reader related to EXPRESS explicit attributes
94
+ def handle_attr_p28read(rubyp28attr, exp, attribute)
95
+ attr_redecl = attribute.elements["redeclaration"]
96
+ if attr_redecl == nil
97
+ attr_builtintype = attribute.elements["builtintype"]
98
+ attr_type = attribute.elements["typename"]
99
+ attr_aggr = attribute.elements["aggregate"]
100
+ if attr_builtintype != nil
101
+ if attr_aggr == nil
102
+ write_attribute_text_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
103
+ else
104
+ attr_datatype = attr_builtintype.attributes["type"]
105
+ write_member_text_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
106
+ end
107
+ end
108
+ if attr_type != nil
109
+ attr_type_name = attr_type.attributes["name"]
110
+ xp = "//schema/entity[@name = " + "'" + attr_type_name + "'" + "]"
111
+ attr_type_entity = exp.root.elements[xp]
112
+ if attr_type_entity != nil
113
+ if attr_aggr != nil
114
+ write_member_id_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
115
+ else
116
+ write_attribute_id_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
117
+ end
118
+ end
119
+ xp = "//schema/type[@name = " + "'" + attr_type_name + "'" + "]"
120
+ attr_type_type = exp.root.elements[xp]
121
+ if attr_type_type != nil
122
+ attr_type_type_builtin = attr_type_type.elements["builtintype"]
123
+ if attr_type_type_builtin != nil
124
+ write_attribute_text_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
125
+ end
126
+
127
+ attr_type_type_enum = attr_type_type.elements["enumeration"]
128
+ if attr_type_type_enum != nil
129
+ write_attribute_text_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
130
+ end
131
+
132
+ attr_type_type_select = attr_type_type.elements["select"]
133
+ if attr_type_type_select != nil
134
+ if attr_aggr != nil
135
+ write_member_id_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
136
+ else
137
+ write_attribute_id_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
144
+ def get_all_supertypes(exp)
145
+ if $todo_array.size == 0
146
+ return
147
+ end
148
+ temp_array = $todo_array
149
+ new_name_array = []
150
+ temp_array.reverse_each do |super_name|
151
+ $name_array.push super_name
152
+ new_name_array.push super_name
153
+ $todo_array.pop
154
+ end
155
+ new_name_array.reverse_each do |super_name|
156
+ xp = "//schema/entity[@name = " + "'" + super_name + "'" + "]"
157
+ entity = exp.root.elements[xp]
158
+ supertypes = entity.attributes["supertypes"]
159
+ if supertypes != nil
160
+ supertype_names = supertypes.split
161
+ supertype_names.each do |super_name|
162
+ $todo_array.push super_name
163
+ end
164
+ end
165
+ end
166
+ get_all_supertypes(exp)
167
+ end
168
+ def write_read_P28_entity_instance_read(rubyp28inst, name)
169
+ rubyp28inst.puts " if entity.name == " + "'" + name + "'"
170
+ rubyp28inst.puts " r = " + $modname + "::" + name + ".new"
171
+ rubyp28inst.puts " m.model_elements.push r"
172
+ rubyp28inst.puts " r.putP28id(id.to_s)"
173
+ rubyp28inst.puts " end"
174
+ end
175
+ def write_read_P28_attribute_value_read(rubyp28attr, ename, exp)
176
+ rubyp28attr.puts " if entity.name == " + "'" + ename + "'"
177
+ rubyp28attr.puts " for child in entity.elements"
178
+ xp = "//schema/entity[@name = " + "'" + ename + "'" + "]"
179
+ current_entity = exp.root.elements[xp]
180
+ supertypes = current_entity.attributes["supertypes"]
181
+ $name_array = []
182
+ $todo_array = []
183
+ if supertypes != nil
184
+ supertype_names = supertypes.split
185
+ supertype_names.each do |super_name|
186
+ $todo_array.push super_name
187
+ end
188
+ end
189
+ get_all_supertypes(exp)
190
+ $name_array.reverse_each do |super_name|
191
+ xp = "//schema/entity[@name = " + "'" + super_name + "'" + "]"
192
+ super_entity = exp.root.elements[xp]
193
+ for super_attribute in super_entity.elements.to_a("./explicit")
194
+ ## aname = super_attribute.attributes["name"]
195
+ handle_attr_p28read(rubyp28attr, exp, super_attribute)
196
+ ## write_attribute_text_p28reader(rubyp28attr,aname)
197
+ end
198
+ end
199
+ for current_attribute in current_entity.elements.to_a("./explicit")
200
+ ## aname = current_attribute.attributes["name"]
201
+ ## write_attribute_text_p28reader(rubyp28attr,aname)
202
+ handle_attr_p28read(rubyp28attr, exp, current_attribute)
203
+ end
204
+ rubyp28attr.puts " end"
205
+ rubyp28attr.puts " end"
206
+ end
207
+ def write_attribute_text_p28reader(rubyp28attr, attribute_name)
208
+ rubyp28attr.puts " if child.name == '" + attribute_name.capitalize + "'"
209
+ rubyp28attr.puts " r." + attribute_name.downcase + "= child.text()"
210
+ rubyp28attr.puts " end"
211
+ end
212
+ def write_member_text_p28reader(rubyp28attr, attribute_name)
213
+ rubyp28attr.puts " if child.name == '" + attribute_name.capitalize + "'"
214
+ rubyp28attr.puts " memlist = []"
215
+ rubyp28attr.puts " for member in child.elements"
216
+ rubyp28attr.puts " memlist.push member.text()"
217
+ rubyp28attr.puts " end"
218
+ rubyp28attr.puts " r." + attribute_name.downcase + "= memlist"
219
+ rubyp28attr.puts " end"
220
+ end
221
+ def write_member_id_p28reader(rubyp28attr, attribute_name)
222
+ rubyp28attr.puts " if child.name == '" + attribute_name.capitalize + "'"
223
+ rubyp28attr.puts " memlist = []"
224
+ rubyp28attr.puts " for member in child.elements"
225
+ rubyp28attr.puts " ref = member.attribute('ref')"
226
+ rubyp28attr.puts " i = 0"
227
+ rubyp28attr.puts " while i != -1"
228
+ rubyp28attr.puts " tempid = m.model_elements[i].getP28id.to_s"
229
+ rubyp28attr.puts " if tempid == ref.to_s"
230
+ rubyp28attr.puts " p = m.model_elements[i]"
231
+ rubyp28attr.puts " i = -2"
232
+ rubyp28attr.puts " end"
233
+ rubyp28attr.puts " i = i + 1"
234
+ rubyp28attr.puts " end"
235
+ rubyp28attr.puts " memlist.push p"
236
+ rubyp28attr.puts " end"
237
+ rubyp28attr.puts " r." + attribute_name.downcase + "= memlist"
238
+ rubyp28attr.puts " end"
239
+ end
240
+ def write_attribute_id_p28reader(rubyp28attr, attribute_name)
241
+ rubyp28attr.puts " if child.name == '" + attribute_name.capitalize + "'"
242
+ rubyp28attr.puts " ref = child.elements[1].attribute('ref')"
243
+ rubyp28attr.puts " i = 0"
244
+ rubyp28attr.puts " while i != -1"
245
+ rubyp28attr.puts " tempid = m.model_elements[i].getP28id.to_s"
246
+ rubyp28attr.puts " if tempid == ref.to_s"
247
+ rubyp28attr.puts " p = m.model_elements[i]"
248
+ rubyp28attr.puts " i = -2"
249
+ rubyp28attr.puts " end"
250
+ rubyp28attr.puts " i = i + 1"
251
+ rubyp28attr.puts " end"
252
+ rubyp28attr.puts " r." + attribute_name.downcase + "= p"
253
+ rubyp28attr.puts " end"
254
+ end
255
+ ## exp2ruby
256
+ ## Version 0.1
257
+ ## 2006-09-07
258
+ ##
259
+ ## Parse input options : exp=<filename> prefix=<shortname> are required
260
+ ##
261
+ exp_input = " "
262
+ prefix_input = " "
263
+ for arg in ARGV
264
+ argarray = arg.split('=')
265
+ if argarray[0] == "exp"
266
+ exp_input = argarray[1]
267
+ end
268
+ if argarray[0] == "prefix"
269
+ prefix_input = argarray[1]
270
+ end
271
+ if argarray[0] == "help" or argarray[0] == "-help" or argarray[0] == "--help"
272
+ puts "exp2ruby Version 0.1"
273
+ puts " "
274
+ puts "Usage : exp2ruby exp=<schema.xml> prefix=<shortname>"
275
+ puts " "
276
+ puts " <schema.xml> required input EXPRESS as XML file"
277
+ puts " <shortname> required XML Namespace prefix shortname (case sensitive) and Ruby module name (automatic upcase)"
278
+ puts "Example: exp2ruby exp=Model.XML prefix=ap233 results in ap233 for XML prefix and AP233 for Ruby module name for EXPRESS in Model.XML file"
279
+ exit
280
+ end
281
+ end
282
+ if exp_input == " "
283
+ puts "ERROR : No Schema XML input file (exp=<schema.xml>)"
284
+ exit
285
+ end
286
+ if prefix_input == " "
287
+ puts "ERROR : No XML Prefix and Ruby module name specified (prefix=<shortname>)"
288
+ exit
289
+ end
290
+ if FileTest.exist?(exp_input) != true
291
+ puts "ERROR : Schema XML input file not found : " + exp_input
292
+ exit
293
+ end
294
+ $modname = prefix_input.upcase
295
+ $xnspre = prefix_input + ':'
296
+ puts "exp2ruby : XML prefix = " + prefix_input
297
+ puts "exp2ruby : Ruby module name = " + $modname
298
+ ##
299
+ ## Set up EXPRESS XML File and new Ruby files
300
+ ##
301
+ expxmlfile = File.new(exp_input, "r")
302
+ exp = Document.new(expxmlfile)
303
+ schema_element = exp.elements["//schema[1]"]
304
+ schema_name = schema_element.attributes["name"]
305
+ puts "exp2ruby : EXPRESS SCHEMA = " + schema_name.to_s
306
+ rubyfile = File.new(schema_name + ".rb", "w")
307
+ rubyfile.puts "require " + '"' + schema_name + "___module" + '"'
308
+ rubyfile.puts "require " + '"' + schema_name + "___p28inst" + '"'
309
+ rubyfile.puts "require " + '"' + schema_name + "___p28attr" + '"'
310
+ rubyfile.puts "module " + $modname
311
+ rubymodule = File.new(schema_name + "___module.rb", "w")
312
+ ##
313
+ ## Set up P28 E2 instance reader code
314
+ rubyp28inst = File.new(schema_name + "___p28inst.rb", "w")
315
+ rubyp28inst.puts "def read_P28_entity_instances(p28doc,m)"
316
+ rubyp28inst.puts " uos = p28doc.root"
317
+ rubyp28inst.puts " for entity in uos.elements.to_a()"
318
+ rubyp28inst.puts " id = entity.attribute('id')"
319
+ ##
320
+ ## Set up P28 E2 attribute reader code
321
+ rubyp28attr = File.new(schema_name + "___p28attr.rb", "w")
322
+ rubyp28attr.puts "def read_P28_attribute_values(p28doc,m)"
323
+ rubyp28attr.puts " uos = p28doc.root"
324
+ rubyp28attr.puts " for entity in uos.elements.to_a()"
325
+ rubyp28attr.puts " id = entity.attribute('id')"
326
+ rubyp28attr.puts " i = 0"
327
+ rubyp28attr.puts " if entity.name != 'header'"
328
+ rubyp28attr.puts " while i != -1"
329
+ rubyp28attr.puts " tempid = m.model_elements[i].getP28id"
330
+ rubyp28attr.puts " if tempid == id.to_s"
331
+ rubyp28attr.puts " r = m.model_elements[i]"
332
+ rubyp28attr.puts " i = -2"
333
+ rubyp28attr.puts " end"
334
+ rubyp28attr.puts " i = i + 1"
335
+ rubyp28attr.puts " end"
336
+ rubyp28attr.puts " end"
337
+ ##
338
+ ## Global arrays used to deal with supertypes
339
+ $name_array = []
340
+ $todo_array = []
341
+ ##
342
+ ## WRITE a Ruby module for each entity type and include each locally-defined attribute
343
+ ##
344
+ stime = Time.now
345
+ ne = 0
346
+ entity_list = exp.elements.to_a("//schema/entity")
347
+ ce = entity_list.size
348
+ for entity in entity_list
349
+ ne = ne + 1
350
+ puts "Entity " + ne.to_s + " of " + ce.to_s + " = " + entity.attributes["name"].to_s + " (after " + ((Time.now - stime)/60).to_s + " minutes"
351
+ rubymodule.puts "module " + entity.attributes["name"].capitalize + "___module"
352
+ ##
353
+ ## write accessor (reader and writer) for each locally defined explicit attribute
354
+ ##
355
+ mandatory_attribute_name_list = []
356
+ for attribute in entity.elements.to_a("./explicit")
357
+ attr_redecl = attribute.elements["redeclaration"]
358
+ if attr_redecl == nil
359
+ rubymodule.puts " attr_accessor :" + attribute.attributes["name"].downcase
360
+ if attribute.attributes["optional"] == nil or attribute.attributes["optional"].to_s == 'NO'
361
+ mandatory_attribute_name_list.push attribute.attributes["name"].downcase
362
+ end
363
+ end
364
+ end
365
+ if mandatory_attribute_name_list.size != 0
366
+ rubymodule.puts ' def isValid' + entity.attributes["name"].capitalize + "___module"
367
+ rubymodule.puts ' return case'
368
+ for mp in mandatory_attribute_name_list
369
+ rubymodule.puts ' when ' + mp + ' == nil : false'
370
+ end
371
+ rubymodule.puts ' else true'
372
+ rubymodule.puts ' end'
373
+ rubymodule.puts ' end'
374
+ else
375
+ rubymodule.puts ' def isValid' + entity.attributes["name"].capitalize + "___module"
376
+ rubymodule.puts ' return true'
377
+ rubymodule.puts ' end'
378
+ end
379
+ rubymodule.puts "end"
380
+ ##
381
+ ## WRITE P28 READER for each entity instance and attribute value
382
+ write_read_P28_entity_instance_read(rubyp28inst, entity.attributes["name"])
383
+ write_read_P28_attribute_value_read(rubyp28attr, entity.attributes["name"], exp)
384
+ ##
385
+ ## WRITE a Ruby class for each entity type, include module for it and each supertype
386
+ ##
387
+ rubyfile.puts "class " + entity.attributes["name"].capitalize
388
+ supertypes = entity.attributes["supertypes"]
389
+ $name_array = []
390
+ $todo_array = []
391
+ if supertypes != nil
392
+ supertype_names = supertypes.split
393
+ supertype_names.each do |super_name|
394
+ $todo_array.push super_name
395
+ end
396
+ end
397
+ get_all_supertypes(exp)
398
+ $name_array.reverse_each do |super_name|
399
+ rubyfile.puts " include " + super_name.capitalize + "___module"
400
+ end
401
+ rubyfile.puts " include " + entity.attributes["name"].capitalize + "___module"
402
+ ##
403
+ ## write class variables containing the entity type and attribute names from the schema
404
+ ##
405
+ rubyfile.puts " @@entity = " + "'" + entity.attributes["name"].capitalize + "'"
406
+ for attribute in entity.elements.to_a("./explicit")
407
+ attr_redecl = attribute.elements["redeclaration"]
408
+ if attr_redecl == nil
409
+ rubyfile.puts " @@attr___" + attribute.attributes["name"].downcase + " = " + "'" + attribute.attributes["name"].capitalize + "'"
410
+ end
411
+ end
412
+
413
+ ##
414
+ ## initialize the count of the number of instances of the class for the entity type
415
+ ## increment the count each time a new instance is created and use it to define a Part 28 E2 XML ID for the instance
416
+ ##
417
+ rubyfile.puts " @@" + entity.attributes["name"].capitalize + "___count = 0"
418
+ rubyfile.puts " def initialize"
419
+ rubyfile.puts " @@" + entity.attributes["name"].capitalize + "___count += 1"
420
+ rubyfile.puts " @p28id = " + "'" + "id-" + entity.attributes["name"].upcase + "-" + "' + " + "@@" + entity.attributes["name"].capitalize+ "___count.to_s"
421
+ rubyfile.puts " end"
422
+ ##
423
+ ## add the method to check validity of instance
424
+ ##
425
+ rubyfile.puts ' def isValid'
426
+ rubyfile.puts ' return case'
427
+ rubyfile.puts ' when !isValid' + entity.attributes["name"].capitalize + '___module : false'
428
+ $name_array.reverse_each do |super_name|
429
+ rubyfile.puts ' when !isValid' + super_name.capitalize + '___module : false'
430
+ end
431
+ rubyfile.puts ' else true'
432
+ rubyfile.puts ' end'
433
+ rubyfile.puts ' end'
434
+ ##
435
+ ## add the method to write the Part 28 Edition 2 file content for the entity instance
436
+ ##
437
+ rubyfile.puts " def writeP28 p28file"
438
+ rubyfile.puts " e___added = p28file.root.add_element(" + "\'" + $xnspre + entity.attributes["name"].capitalize + "\', " + "{\'id\' => @p28id})"
439
+ ##
440
+ $name_array = []
441
+ $todo_array = []
442
+ if supertypes != nil
443
+ supertype_names = supertypes.split
444
+ supertype_names.each do |super_name|
445
+ $todo_array.push super_name
446
+ end
447
+ end
448
+ get_all_supertypes(exp)
449
+ $name_array.reverse_each do |super_name|
450
+ xp = "//entity[@name = " + "'" + super_name + "'" + "]"
451
+ super_entity = exp.root.elements[xp]
452
+ for super_attribute in super_entity.elements.to_a("./explicit")
453
+ handle_explicit(rubyfile, exp, super_attribute)
454
+ end
455
+ end
456
+
457
+ for attribute in entity.elements.to_a("./explicit")
458
+ handle_explicit(rubyfile, exp, attribute)
459
+ end
460
+
461
+ rubyfile.puts " end"
462
+ rubyfile.puts " def getP28id"
463
+ rubyfile.puts " @p28id"
464
+ rubyfile.puts " end"
465
+ rubyfile.puts " def putP28id(the_id)"
466
+ rubyfile.puts " @p28id = the_id"
467
+ rubyfile.puts " end"
468
+ rubyfile.puts " def getP28entity"
469
+ rubyfile.puts " return(" + "'" + $xnspre + "'" + " + @@entity)"
470
+ rubyfile.puts " end"
471
+ rubyfile.puts "end"
472
+ end
473
+ rubyfile.puts "class Model___data"
474
+ rubyfile.puts " attr_reader :model_elements, :model_name, :namespace, :originating_system, :preprocessor_version"
475
+ rubyfile.puts " attr_writer :model_elements, :model_name, :namespace, :originating_system, :preprocessor_version"
476
+ rubyfile.puts " def initialize"
477
+ rubyfile.puts " @model_elements = []"
478
+ rubyfile.puts " @namespace = '" + $xnspre.chop + "'"
479
+ rubyfile.puts " end"
480
+ rubyfile.puts " def readP28e2 p28doc"
481
+ rubyfile.puts " puts 'Reading P28E2 XML'"
482
+ rubyfile.puts " read_P28_entity_instances(p28doc,self)"
483
+ rubyfile.puts " read_P28_attribute_values(p28doc,self)"
484
+ rubyfile.puts " end"
485
+ rubyfile.puts " require 'time'"
486
+ rubyfile.puts " def writeP28e2 p28file"
487
+ rubyfile.puts " puts 'Writing P28E2 with XML namespace = ' + namespace"
488
+ rubyfile.puts " @p28file = p28file"
489
+ rubyfile.puts " p28file << XMLDecl.new"
490
+ rubyfile.puts " the_ns = 'xmlns:' + namespace"
491
+ rubyfile.puts " the_uos = namespace + ':uos'"
492
+ rubyfile.puts " uos = p28file.add_element(the_uos, {the_ns => 'urn:iso10303-28:schema/" + schema_name.capitalize + "'})"
493
+ rubyfile.puts " uos.add_namespace('xsi','http://www.w3.org/2001/XMLSchema-instance')"
494
+ rubyfile.puts " uos.add_namespace('ex','urn:iso:std:iso:10303:28:ed-2:2005:schema:common')"
495
+ rubyfile.puts " uos.add_namespace('exp','urn:iso:std:iso:10303:28:ed-2:2005:schema:common')"
496
+ rubyfile.puts " uos.add_attribute('xsi:schemaLocation','urn:iso10303-28:schema/" + schema_name.capitalize + " " + schema_name.capitalize + ".xsd')"
497
+ rubyfile.puts " header = p28file.root.add_element('exp:header')"
498
+ rubyfile.puts " t = header.add_element('time_stamp')"
499
+ rubyfile.puts " t.text = Time.now.xmlschema()"
500
+ rubyfile.puts " if self.originating_system != nil"
501
+ rubyfile.puts " t = header.add_element('preprocessor_version')"
502
+ rubyfile.puts " t.text = self.preprocessor_version"
503
+ rubyfile.puts " end"
504
+ rubyfile.puts " if self.originating_system != nil"
505
+ rubyfile.puts " t = header.add_element('originating_system')"
506
+ rubyfile.puts " t.text = self.originating_system"
507
+ rubyfile.puts " end"
508
+ rubyfile.puts " i = 1"
509
+ rubyfile.puts " for e in model_elements"
510
+ rubyfile.puts " puts i"
511
+ rubyfile.puts " e.writeP28(p28file)"
512
+ rubyfile.puts " i = i + 1"
513
+ rubyfile.puts " end"
514
+ rubyfile.puts " end"
515
+ rubyfile.puts "end"
516
+ rubyfile.puts "end"
517
+ rubyp28inst.puts " end"
518
+ rubyp28inst.puts "end"
519
+ rubyp28attr.puts " end"
520
+ rubyp28attr.puts "end"
521
+ expxmlfile.close
522
+ rubyfile.close
523
+ rubymodule.close
524
+ rubyp28inst.close
525
+ rubyp28attr.close