expressir 1.2.1-x64-mingw32 → 1.2.5-x64-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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/.cross_rubies +3 -6
  3. data/.github/workflows/rake.yml +223 -19
  4. data/.github/workflows/release.yml +1 -0
  5. data/.gitignore +7 -1
  6. data/.gitmodules +4 -1
  7. data/.rubocop.yml +13 -4
  8. data/Rakefile +4 -1
  9. data/bin/console +0 -1
  10. data/bin/rspec +3 -3
  11. data/exe/expressir +4 -2
  12. data/exe/format +1 -1
  13. data/exe/format-test +25 -25
  14. data/exe/generate-parser +16 -13
  15. data/expressir.gemspec +13 -11
  16. data/lib/expressir/config.rb +1 -1
  17. data/lib/expressir/express/2.7/express_parser.so +0 -0
  18. data/lib/expressir/express/3.0/express_parser.so +0 -0
  19. data/lib/expressir/express/parser.rb +18 -15
  20. data/lib/expressir/express/visitor.rb +7 -3
  21. data/lib/expressir/model.rb +78 -78
  22. data/lib/expressir/version.rb +1 -1
  23. data/rakelib/antlr4-native.rake +63 -0
  24. data/rakelib/cross-ruby.rake +216 -157
  25. data/spec/acceptance/version_spec.rb +7 -2
  26. data/spec/expressir/express/cache_spec.rb +8 -5
  27. data/spec/expressir/express/formatter_spec.rb +16 -8
  28. data/spec/expressir/express/parser_spec.rb +17 -11
  29. data/spec/expressir/model/model_element_spec.rb +154 -146
  30. metadata +55 -63
  31. data/demo.rb +0 -18
  32. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +0 -9589
  33. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +0 -36619
  34. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +0 -13294
  35. data/original/examples/employment/eclipse/.project +0 -17
  36. data/original/examples/employment/eclipse/Export/Employment.png +0 -0
  37. data/original/examples/employment/eclipse/Express/employment_schema.exp +0 -33
  38. data/original/examples/employment/eclipse/Express/employment_schema.xmi +0 -77
  39. data/original/examples/employment/eclipse/Express/employment_schema.xml +0 -93
  40. data/original/examples/employment/eclipse/Models/Employment.uml +0 -4
  41. data/original/examples/employment/eclipse/Models/Employment.umldi +0 -240
  42. data/original/examples/employment/eclipse/readme.txt +0 -7
  43. data/original/examples/employment/employment_schema.exp +0 -33
  44. data/original/examples/employment/employment_schema.rb +0 -232
  45. data/original/examples/employment/employment_schema.xml +0 -93
  46. data/original/examples/employment/employment_schema___module.rb +0 -46
  47. data/original/examples/employment/employment_schema___p28attr.rb +0 -126
  48. data/original/examples/employment/employment_schema___p28inst.rb +0 -26
  49. data/original/examples/employment/example_employment_data.xml +0 -1
  50. data/original/examples/employment/example_employment_data_copy.xml +0 -1
  51. data/original/examples/employment/example_employment_reader.rb +0 -30
  52. data/original/examples/employment/example_employment_writer.rb +0 -51
  53. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +0 -3710
  54. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +0 -35880
  55. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +0 -15357
  56. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +0 -9468
  57. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +0 -8404
  58. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +0 -43147
  59. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +0 -18341
  60. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +0 -11632
  61. data/original/exp2ruby.rb +0 -525
  62. data/original/expsm.rb +0 -34
  63. data/original/mapping_owl.rb +0 -1018
  64. data/original/mapping_sysml.rb +0 -2281
  65. data/original/mapping_uml2.rb +0 -599
  66. data/original/mapping_uml2_eclipse.rb +0 -433
  67. data/original/reeper.rb +0 -134
  68. data/spec/expressr_spec.rb +0 -5
@@ -1,599 +0,0 @@
1
- require 'erb'
2
- # EXPRESS to UML 2 Mapping
3
- # Version 0.1
4
- #
5
- # This function navigates the EXPRESS STEPMod Model Ruby Classes
6
- # and performs a structural EXPRESS-to-UML2 (2.1.2) mapping using Ruby ERB templates.
7
- # The output is in XMI 2.1 syntax in a file named <schema>.xmi if one schema input and 'Model.xmi' if more than one schema input.
8
- #
9
- # Integer, Boolean, String -> UML equivalent builtin type
10
- # Real, Number, Binary, Logical -> New PrimitiveType
11
- # Schema -> Package
12
- # Entity (subtype of) -> Class (Generalization)
13
- # Select Type -> Interface and InterfaceRealization
14
- # Enum Type -> Enumeration and EnumerationLiteral
15
- # Explicit Attribute (Optional) Primitive or Enum -> Property owned by Class (with lower)
16
- # Explicit Attribute (Optional) Entity -> Property owned by Class (with lower) plus Association owning other end property
17
- # Explicit Attribute 1-D SET, BAG, LIST of Select or Entity -> Property owned by Class (with lower)
18
- # plus Association owning other end property and multiplicity, unique and ordered set
19
- # Explicit Attribute 1-D SET, BAG, LIST of Primitive or Enum -> Property owned by Class and multiplicity, unique and ordered set
20
- # Explicit Attribute of Entity/Select/Builtin Redeclaration (Renamed) -> Property with (new) name that redefines inherited Property
21
- # Inverse Attribute -> Association end adjustment
22
- # Inverse Attribute Redeclaration (Renamed) -> Property with (new) name that redefines inherited Property
23
- # USE or REFERENCE (even with named items) -> UML PackageImport between Packages
24
- #
25
- #######################################################################################
26
-
27
- def map_from_express( mapinput )
28
-
29
- # Enter file name here to override defaults (<schema>.xmi if one schema, and Model.xmi if more than one)
30
- output_xmi_filename = nil
31
-
32
- # datatypes for builtin types that map directly to UML
33
- datatype_hash = Hash.new
34
- datatype_hash["INTEGER"] = 'http://schema.omg.org/spec/UML/2.1.2/uml.xml#Integer'
35
- datatype_hash["BOOLEAN"] = 'http://schema.omg.org/spec/UML/2.1.2/uml.xml#Boolean'
36
- datatype_hash["STRING"] = 'http://schema.omg.org/spec/UML/2.1.2/uml.xml#String'
37
-
38
- # XMI File Start Template (includes datatypes for builtin with no direct UML equivalent)
39
- overall_start_template = %{<?xml version="1.0" encoding="UTF-8"?>
40
- <uml:Model xmi:version = "2.1" xmlns:xmi = "http://schema.omg.org/spec/XMI/2.1" xmlns:uml = "http://schema.omg.org/spec/UML/2.1.2" name = "UMLfromEXPRESS" xmi:id = "_0">
41
- <packagedElement xmi:type="uml:PrimitiveType" xmi:id="REAL" name="Real" />
42
- <packagedElement xmi:type="uml:PrimitiveType" xmi:id="NUMBER" name="Number" />
43
- <packagedElement xmi:type="uml:PrimitiveType" xmi:id="BINARY" name="Binary" />
44
- <packagedElement xmi:type="uml:PrimitiveType" xmi:id="LOGICAL" name="Logical" />}
45
-
46
- # XMI File End Template
47
- overall_end_template = %{</uml:Model>}
48
-
49
- # SCHEMA Start Template
50
- schema_start_template = %{<packagedElement xmi:type = "uml:Package" xmi:id = "_1_<%= schema.name %>" name = "<%= schema.name %>" visibility = "public">}
51
-
52
- # SCHEMA INTERFACE Template
53
- schema_interface_template = %{<packageImport xmi:type='uml:PackageImport' xmi:id='_2_<%= schema.name %>-<%= interfaced_schema.foreign_schema_id %>' visibility='public' importedPackage='_1_<%= interfaced_schema.foreign_schema_id %>'/>}
54
-
55
- # SCHEMA End Template
56
- schema_end_template = %{</packagedElement>}
57
-
58
- # ENTITY Start Template
59
- entity_start_template = %{<packagedElement xmi:type = "uml:Class" xmi:id = "<%= xmiid %>" name = "<%= entity.name %>" isAbstract = "<% if entity.isAbs %>TRUE<% else %>FALSE<% end %>" visibility = "public">}
60
-
61
- # SUBTYPE OF Template
62
- supertype_template = %{<generalization xmi:type="uml:Generalization" xmi:id="<%= xmiid %>" general="<%= xmiid_general %>"/>}
63
-
64
- # ENTITY End Template
65
- entity_end_template = %{</packagedElement>}
66
-
67
- # ENUMERATION Start Template
68
- enum_start_template = %{<packagedElement xmi:type = "uml:Enumeration" xmi:id = "<%= type_xmiid %>" name = "<%= enum.name %>">}
69
-
70
- # ENUMERATION ITEM Template
71
- enum_item_template = %{<ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="<%= enumitem_xmiid %>" name="<%= enumitem %>" classifier="<%= type_xmiid %>" enumeration="<%= type_xmiid %>">
72
- <specification xmi:type="uml:LiteralInteger" xmi:id="<%= enumitem_xmiid + '_specification' %> "/>
73
- </ownedLiteral>}
74
-
75
- # ENUMERATION End Template
76
- enum_end_template = %{</packagedElement>}
77
-
78
- # SELECT Start Template
79
- select_start_template = %{<packagedElement xmi:type = "uml:Interface" xmi:id = "<%= xmiid %>" name = "<%= select.name %>" isAbstract = "TRUE" visibility = "public">}
80
-
81
- # SELECT ITEM is ENTITY Template
82
- selectitem_entity_template = %{ <interfaceRealization xmi:type="uml:InterfaceRealization" xmi:id="<%= xmiid %>" supplier="<%= xmiid_general %>" client="<%= xmiid_entity %>" contract="<%= xmiid_general %>" implementingClassifier="<%= xmiid_entity %>"/>}
83
-
84
- # SELECT ITEM is TYPE Template
85
- selectitem_type_template = %{ <packagedElement xmi:type="uml:Realization" xmi:id="<%= xmiid %>" supplier="<%= xmiid_general %>" client="<%= xmiid_type %>"/>}
86
-
87
- # SELECT End Template
88
- select_end_template = %{</packagedElement>}
89
-
90
- # Template covering abstract entity types
91
- abstract_entity_template = %{}
92
-
93
- # Template covering the output file contents for each attribute that is an aggregate
94
- attribute_aggregate_template = %{}
95
-
96
- # Template covering the output file contents for each attribute that is an aggregate of select of entity
97
- attribute_aggregate_entity_select_template = %{}
98
-
99
- # Template covering the output file contents for each attribute that is a select of entity
100
- attribute_entity_select_template = %{}
101
-
102
- # Template covering the output file contents for each attribute that is an entity
103
- attribute_entity_template = %{<ownedAttribute xmi:type="uml:Property" xmi:id="<%= xmiid %>" name="<%= attr.name %>" visibility="public" isOrdered='<%= islist %>' isUnique='<%= isset %>' isLeaf='false' isStatic='false' isReadOnly='false' isDerived='false' isDerivedUnion='false' type="<%= domain_xmiid %>" aggregation="none" association="<%= assoc_xmiid %>"<% if attr.redeclare_entity %> redefinedProperty="<%= redefined_xmiid %>"<% end %>>}
104
-
105
- # INVERSE ATTRIBUTE Template
106
- inverse_attribute_template = %{<ownedAttribute xmi:type="uml:Property" xmi:id="<%= xmiid %>" name="<%= inverse.name %>" visibility="public" isOrdered='<%= islist %>' isUnique='<%= isset %>' isLeaf='false' isStatic='false' isReadOnly='true' isDerived='false' isDerivedUnion='false' type="<%= domain_xmiid %>" aggregation="none" association="<%= assoc_xmiid %>" <% if inverse.redeclare_entity %>redefinedProperty="<%= redefined_xmiid %>"<% end %>>}
107
-
108
- #Template covering attribute wrapup
109
- attribute_end = %{<% if lower == '0' %><lowerValue xmi:type="uml:LiteralInteger" xmi:id="<%= xmiid %>-lowerValue"/><% end %>
110
- <% if lower != '0' and lower != '1' %><lowerValue xmi:type="uml:LiteralInteger" xmi:id="<%= xmiid %>-lowerValue" value="<%= lower %>"/><% end %>
111
- <% if upper != '1' %><upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="<%= xmiid %>-upperValue" value="<%= upper %>"/><% end %>
112
- </ownedAttribute>}
113
-
114
-
115
- # EXPLICIT ATTRIBUTE ENTITY Create Association Template
116
- attribute_entity_association_template = %{<packagedElement xmi:type="uml:Association" xmi:id="<%= xmiid %>" name="" visibility='public' isLeaf='false' isAbstract='false' isDerived='false'>
117
- <memberEnd xmi:idref="<%= attr_xmiid %>"/>
118
- <% if !inverse_exists %><memberEnd xmi:idref="<%= xmiid + '-end' %>"/>
119
- <ownedEnd xmi:type="uml:Property" xmi:id="<%= xmiid + '-end' %>" type="<%= owner_xmiid %>" owningAssociation="<%= xmiid %>" association="<%= xmiid %>" visibility='public'>
120
- <lowerValue xmi:type="uml:LiteralInteger" xmi:id="<%= xmiid %>-lowerValue"/>
121
- <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="<%= xmiid %>-upperValue" value="*"/>
122
- </ownedEnd><% else %><memberEnd xmi:idref="<%= iattr_xmiid %>"/>
123
- <% end %>
124
- <% if general_exists %><generalization xmi:type="uml:Generalization" xmi:id="<%= general_xmiid %>" general="<%= redefined_xmiid %>"/><% end %>
125
- </packagedElement>}
126
-
127
-
128
- # INVERSE ATTRIBUTE ENTITY Create Association Template
129
- inverse_entity_association_template = %{<packagedElement xmi:type="uml:Association" xmi:id="<%= xmiid %>" name="" visibility='public' isLeaf='false' isAbstract='false' isDerived='false'>
130
- <memberEnd xmi:idref="<%= iattr_xmiid %>"/>
131
- <memberEnd xmi:idref="<%= xmiid + '-end' %>"/>
132
- <ownedEnd xmi:type="uml:Property" xmi:id="<%= xmiid + '-end' %>" type="<%= owner_xmiid %>" owningAssociation="<%= xmiid %>" association="<%= xmiid %>" visibility='public'/>
133
- <generalization xmi:type="uml:Generalization" xmi:id="<%= general_xmiid %>" general="<%= redefined_xmiid %>"/>
134
- </packagedElement>}
135
-
136
-
137
- # Template covering the output file contents for each attribute
138
- attribute_template = %{}
139
-
140
- # EXPLICIT ATTRIBUTE SIMPLE TYPE Template
141
- attribute_builtin_template = %{<ownedAttribute xmi:type="uml:Property" xmi:id="<%= xmiid %>" name="<%= attr.name %>" visibility="public" <% if datatype_hash[attr.domain] != nil %>isOrdered='<%= islist %>' isUnique='<%= isset %>'<% if attr.redeclare_entity %> redefinedProperty="<%= redefined_xmiid %>"<% end %>>
142
- <type xmi:type="uml:PrimitiveType" href="<%= datatype_hash[attr.domain] %>" /><% end %>
143
- <% if datatype_hash[attr.domain] == nil %>type="<%= attr.domain %>"<% if attr.redeclare_entity %> redefinedProperty="<%= redefined_xmiid %>"<% end %>><% end %>}
144
-
145
-
146
- # EXPLICIT ATTRIBUTE ENUM and TYPE Template
147
- attribute_enum_type_template = %{<ownedAttribute xmi:type="uml:Property" xmi:id="<%= xmiid %>" name="<%= attr.name %>" visibility="public" type="<%= type_xmiid %>" isOrdered='<%= islist %>' isUnique='<%= isset %>' >}
148
-
149
- # UNIQUE rule template
150
- unique_template = %{<ownedRule xmi:type="uml:Constraint" xmi:id="<%= xmiid %>" name="<%= unique.name %>" visibility="public">
151
- <constrainedElement xmi:idref="<%= xmiid_entity %>"/>
152
- <specification xmi:type="uml:OpaqueExpression" xmi:id="<%= xmiid + '-spec' %>" visibility="public">
153
- <body><%= entity.name %>::allInstance()-&gt;isUnique(<%= unique_text %>)</body>
154
- <language>OCL2.0</language>
155
- </specification>
156
- </ownedRule>}
157
-
158
- # TYPE Template
159
- type_template = %{<packagedElement xmi:type="uml:PrimitiveType" xmi:id="_<%= schema.name %>-<%= type.name %>" name="<%= type.name %>" >
160
- <% if datatype_hash[type.domain] != nil %>
161
- <generalization xmi:type="uml:Generalization" xmi:id="_supertype_<%= schema.name %>-<%= type.name %>">
162
- <general xmi:type='uml:PrimitiveType' href="<%= datatype_hash[type.domain] %>" />
163
- </generalization>
164
- <% end %>
165
- <% if datatype_hash[type.domain] == nil %>
166
- <generalization xmi:type="uml:Generalization" xmi:id="_supertype_<%= schema.name %>-<%= type.name %>" general="<%= type.domain %>"/>
167
- <% end %>
168
- </packagedElement>}
169
-
170
-
171
- #############################################################################################
172
- # Set up list of schemas to process, input may be a repository containing schemas or a single schema
173
- #############################################################################################
174
-
175
- if mapinput.kind_of? EXPSM::Repository
176
- schema_list = mapinput.schemas
177
- elsif mapinput.kind_of? EXPSM::SchemaDefinition
178
- schema_list = [mapinput]
179
- else
180
- puts "ERROR : map_from_express input no Repository instance or Schema instance"
181
- exit
182
- end
183
-
184
- # Set up XMI output file
185
-
186
- if schema_list.size == 1 and output_xmi_filename == nil
187
- schema = schema_list[0]
188
- output_xmi_filename = schema.name.to_s + ".xmi"
189
- elsif output_xmi_filename == nil
190
- output_xmi_filename = 'Model.xmi'
191
- end
192
-
193
- file = File.new(output_xmi_filename, "w")
194
- puts 'reeper : Writing output to file ' + output_xmi_filename
195
-
196
- # Evaluate and write file start template
197
- res = ERB.new(overall_start_template)
198
- t = res.result(binding)
199
- file.puts t
200
-
201
- # Set up list of all EXPRESS Inverses in all schemas
202
- all_inverse_list = []
203
-
204
- for schema in schema_list
205
- entity_list = schema.contents.find_all{ |e| e.kind_of? EXPSM::Entity }
206
- for entity in entity_list
207
- entity_inverse_list = entity.attributes.find_all{ |e| e.kind_of? EXPSM::Inverse }
208
- for inverse in entity_inverse_list
209
- all_inverse_list.push inverse
210
- end
211
- end
212
-
213
-
214
- # Evaluate and write schema start template
215
- res = ERB.new(schema_start_template)
216
- t = res.result(binding)
217
- file.puts t
218
-
219
- interfaced_schema_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::InterfaceSpecification}
220
-
221
- for interfaced_schema in interfaced_schema_list
222
- # Evaluate and write schema interface template
223
- res = ERB.new(schema_interface_template)
224
- t = res.result(binding)
225
- file.puts t
226
- end
227
-
228
- # set up select_list - used in a number of places
229
- select_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::TypeSelect }
230
-
231
- # Map EXPRESS TYPE of Builtin
232
- type_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::Type and e.isBuiltin}
233
- for type in type_list
234
- xmiid = '_' + schema.name + '-' + type.name
235
- res = ERB.new(type_template)
236
- t = res.result(binding)
237
- file.puts t
238
-
239
- # Map TYPE Select has Type as item
240
- for select in select_list
241
- if select.selectitems_array.include?(type)
242
- xmiid = '_2_selectitem_' + schema.name + '-' + type.name + '-' + select.name
243
- xmiid_general = '_' + schema.name + '-' + select.name
244
- res = ERB.new(selectitem_type_template)
245
- t = res.result(binding)
246
- file.puts t
247
- end
248
- end
249
- end
250
-
251
- # Map EXPRESS TYPE of TYPE Select
252
- type_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::Type and !e.isBuiltin}
253
- for select in type_list
254
- superselect = NamedType.find_by_name( select.domain )
255
- if superselect.kind_of? EXPSM::TypeSelect
256
- # Evaluate and write TYPE Select start template
257
- xmiid = '_' + schema.name + '-' + select.name
258
- xmiid_type = xmiid
259
- res = ERB.new(select_start_template)
260
- t = res.result(binding)
261
- file.puts t
262
-
263
- # Write Select Item template for parent (maps to UML same as EXPRESS supertype)
264
- xmiid = '_2_superselect_' + schema.name + '-' + select.name + '-' + superselect.name
265
- xmiid_general = '_' + schema.name + '-' + superselect.name
266
- res = ERB.new(supertype_template)
267
- t = res.result(binding)
268
- file.puts t
269
-
270
- # Evaluate and write TYPE Select end template
271
- res = ERB.new(select_end_template)
272
- t = res.result(binding)
273
- file.puts t
274
- end
275
- end
276
-
277
- # Map EXPRESS Enumeration Types
278
- enum_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::TypeEnum }
279
- for enum in enum_list
280
-
281
- # Evaluate and write TYPE Enum start template
282
- type_xmiid = '_' + schema.name + '-' + enum.name
283
- res = ERB.new(enum_start_template)
284
- t = res.result(binding)
285
- file.puts t
286
-
287
- superenum = enum.extends_item
288
- if superenum != nil
289
- if superselect.kind_of? EXPSM::TypeEnum
290
- # Write Enum Item template for parent (maps to UML same as EXPRESS supertype)
291
- xmiid = '_2_superenum_' + schema.name + '-' + enum.name + '-' + superenum.name
292
- xmiid_general = '_' + superenum.schema.name + '-' + superenum.name
293
- res = ERB.new(supertype_template)
294
- t = res.result(binding)
295
- file.puts t
296
- end
297
- end
298
-
299
- # Evaluate and write Enum Item template for each item
300
- enumitem_name_list = enum.items.scan(/\w+/)
301
- for enumitem in enumitem_name_list
302
- enumitem_xmiid = '_1_enumitem_' + schema.name + '-' + enum.name + '-' + enumitem
303
- res = ERB.new(enum_item_template)
304
- t = res.result(binding)
305
- file.puts t
306
- end
307
-
308
- # Evaluate and write TYPE Enum end template
309
- res = ERB.new(enum_end_template)
310
- t = res.result(binding)
311
- file.puts t
312
- end
313
-
314
- # Map EXPRESS TYPE Selects
315
- for select in select_list
316
-
317
- # Evaluate and write TYPE Select start template
318
- xmiid = '_' + schema.name + '-' + select.name
319
- res = ERB.new(select_start_template)
320
- t = res.result(binding)
321
- file.puts t
322
-
323
- superselect = select.extends_item
324
- if superselect != nil
325
- if superselect.kind_of? EXPSM::TypeSelect
326
- # Write Select Item template for parent (maps to UML same as EXPRESS supertype)
327
- xmiid = '_2_superselect_' + schema.name + '-' + select.name + '-' + superselect.name
328
- xmiid_general = '_' + superselect.schema.name + '-' + superselect.name
329
- res = ERB.new(supertype_template)
330
- t = res.result(binding)
331
- file.puts t
332
- end
333
- end
334
-
335
- # Evaluate and write Select Item template for each item (maps to UML same as EXPRESS supertype)
336
- for superselect in select_list
337
- if superselect.selectitems_array.include?(select)
338
- xmiid = '_2_superselect_' + schema.name + '-' + select.name + '-' + superselect.name
339
- xmiid_general = '_' + schema.name + '-' + superselect.name
340
- res = ERB.new(supertype_template)
341
- t = res.result(binding)
342
- file.puts t
343
- end
344
- end
345
-
346
- # Evaluate and write TYPE Select end template
347
- res = ERB.new(select_end_template)
348
- t = res.result(binding)
349
- file.puts t
350
- end
351
-
352
- entity_list = schema.contents.find_all{ |e| e.kind_of? EXPSM::Entity }
353
-
354
- # Map EXPRESS Explicit Attribute resulting UML Association (the Association is referenced from Class resulting from Entity)
355
- for entity in entity_list
356
- attr_list = entity.attributes.find_all{ |e| e.kind_of? EXPSM::Explicit }
357
- for attr in attr_list
358
-
359
- if NamedType.find_by_name( attr.domain ).kind_of? EXPSM::Entity or NamedType.find_by_name( attr.domain ).kind_of? EXPSM::TypeSelect
360
- xmiid = '_1_association_' + schema.name + '-' + entity.name + '-' + attr.name
361
- attr_xmiid = '_2_attr_' + schema.name + '-' + entity.name + '-' + attr.name
362
- owner_xmiid = '_' + schema.name + '-' + entity.name
363
- domain_xmiid = '_' + schema.name + '-' + NamedType.find_by_name( attr.domain ).name
364
-
365
- general_exists = false
366
- if attr.redeclare_entity
367
- general_exists = true
368
- redeclare_entity = NamedType.find_by_name( attr.redeclare_entity )
369
- general_xmiid = '_2_general_' + schema.name + '-' + entity.name + '-' + attr.name
370
- if attr.redeclare_oldname
371
- redefined_xmiid = '_1_association_' + redeclare_entity.schema.name + '-' + attr.redeclare_entity + '-' + attr.redeclare_oldname
372
- else
373
- redefined_xmiid = '_1_association_' + redeclare_entity.schema.name + '-' + attr.redeclare_entity + '-' + attr.name
374
- end
375
- end
376
-
377
- # check if inverse refers to this attribute, affects how association is written
378
- inverse_exists = false
379
- for inverse in all_inverse_list
380
- if inverse.reverseAttr == attr
381
- if attr.domain == inverse.entity.name
382
- iattr_xmiid = '_2_attr_' + inverse.entity.schema.name + '-' + inverse.entity.name + '-' + inverse.name
383
- all_inverse_list.delete inverse
384
- inverse_exists = true
385
- end
386
- end
387
- end
388
-
389
- res = ERB.new(attribute_entity_association_template)
390
- t = res.result(binding)
391
- file.puts t
392
- end
393
- end
394
- end
395
-
396
- # Map EXPRESS Inverse Attribute resulting UML Association (the Association is referenced from Class resulting from Entity)
397
- for inverse in all_inverse_list
398
- xmiid = '_1_association_' + inverse.reverseEntity.schema.name + '-' + inverse.entity.name + '-' + inverse.reverseAttr_id
399
- owner_xmiid = '_' + inverse.entity.schema.name + '-' + inverse.entity.name
400
- iattr_xmiid = '_2_attr_' + inverse.entity.schema.name + '-' + inverse.entity.name + '-' + inverse.name
401
-
402
- general_xmiid = '_2_general_' + inverse.reverseEntity.schema.name + '-' + inverse.entity.name + '-' + inverse.reverseAttr_id
403
- redefined_xmiid = '_1_association_' + inverse.entity.schema.name + '-' + inverse.reverseEntity.name + '-' + inverse.reverseAttr_id
404
-
405
- res = ERB.new(inverse_entity_association_template)
406
- t = res.result(binding)
407
- file.puts t
408
- end
409
-
410
- # Map EXPRESS Entity Types
411
- for entity in entity_list
412
-
413
- # Evaluate and write ENTITY start template
414
- xmiid = '_' + schema.name + '-' + entity.name
415
- xmiid_entity = xmiid
416
- res = ERB.new(entity_start_template)
417
- t = res.result(binding)
418
- file.puts t
419
-
420
- # Map Entity is SUBTYPE OF (i.e. list of supertypes)
421
- for supertype in entity.supertypes_array
422
- xmiid = '_2_supertype_' + schema.name + '-' + entity.name + '-' + supertype.name
423
- xmiid_general = '_' + supertype.schema.name + '-' + supertype.name
424
- res = ERB.new(supertype_template)
425
- t = res.result(binding)
426
- file.puts t
427
- end
428
-
429
- # Map TYPE Select has Entity as item
430
- for select in select_list
431
- if select.selectitems_array.include?(entity)
432
- xmiid = '_2_selectitem_' + schema.name + '-' + entity.name + '-' + select.name
433
- xmiid_general = '_' + schema.name + '-' + select.name
434
- res = ERB.new(selectitem_entity_template)
435
- t = res.result(binding)
436
- file.puts t
437
- end
438
- end
439
-
440
- # Map EXPRESS Explicit Attributes
441
- attr_list = entity.attributes.find_all{ |e| e.kind_of? EXPSM::Explicit }
442
- for attr in attr_list
443
- xmiid = '_2_attr_' + schema.name + '-' + entity.name + '-' + attr.name
444
-
445
- # set up references resulting from attribute being a redeclaration
446
- if attr.redeclare_entity
447
- redeclare_entity = NamedType.find_by_name( attr.redeclare_entity )
448
- if attr.redeclare_oldname
449
- redefined_xmiid = '_2_attr_' + redeclare_entity.schema.name + '-' + attr.redeclare_entity + '-' + attr.redeclare_oldname
450
- else
451
- redefined_xmiid = '_2_attr_' + redeclare_entity.schema.name + '-' + attr.redeclare_entity + '-' + attr.name
452
- end
453
- end
454
-
455
- # initialize default cardinailty constraints
456
- lower = '1'
457
- upper = '1'
458
- isset = 'true'
459
- islist = 'false'
460
-
461
- # set up cardinailty constraints from attribute being a 1-D aggregate
462
- if attr.instance_of? EXPSM::ExplicitAggregate and attr.rank == 1
463
- upper = attr.dimensions[0].upper
464
- if upper == '?'
465
- upper = '*'
466
- end
467
- lower = attr.dimensions[0].lower
468
- if attr.dimensions[0].aggrtype == 'LIST'
469
- islist = 'true'
470
- end
471
- if attr.dimensions[0].aggrtype == 'BAG'
472
- isset = 'false'
473
- end
474
- if attr.dimensions[0].aggrtype == 'LIST' and !attr.dimensions[0].isUnique
475
- isset = 'false'
476
- end
477
- end
478
- if attr.isOptional == TRUE
479
- lower = '0'
480
- end
481
-
482
- attrset = false
483
-
484
- # Map EXPRESS Explicit Attributes of Builtin
485
- if attr.isBuiltin
486
- attrset= true
487
- res = ERB.new(attribute_builtin_template,0,"<>")
488
- t = res.result(binding)
489
- file.puts t
490
- end
491
-
492
- attr_domain = NamedType.find_by_name( attr.domain )
493
-
494
- # Map EXPRESS Explicit Attributes of TYPE and TYPE Enum
495
- if attr_domain.kind_of? EXPSM::Type or attr_domain.kind_of? EXPSM::TypeEnum
496
- attrset= true
497
- type_xmiid = '_' + attr_domain.schema.name + '-' + attr_domain.name
498
- res = ERB.new(attribute_enum_type_template,0,"<>")
499
- t = res.result(binding)
500
- file.puts t
501
- end
502
-
503
- # Map EXPRESS Explicit Attributes of Entity and Select
504
- if attr_domain.kind_of? EXPSM::Entity or attr_domain.kind_of? EXPSM::TypeSelect
505
- attrset= true
506
- domain_xmiid = '_' + attr_domain.schema.name + '-' + attr_domain.name
507
- assoc_xmiid = '_1_association_' + schema.name + '-' + entity.name + '-' + attr.name
508
- res = ERB.new(attribute_entity_template,0,"<>")
509
- t = res.result(binding)
510
- file.puts t
511
- end
512
-
513
- if !attrset
514
- puts 'Oops ' + entity.name + '.' + attr.name
515
- puts attr.domain
516
- end
517
-
518
- res = ERB.new(attribute_end,0,"<>")
519
- t = res.result(binding)
520
- file.puts t
521
- end
522
-
523
- #Map EXPRESS Inverse Attributes
524
- inverse_attr_list = entity.attributes.find_all{ |e| e.kind_of? EXPSM::Inverse }
525
- for inverse in inverse_attr_list
526
- xmiid = '_2_attr_' + schema.name + '-' + entity.name + '-' + inverse.name
527
- # set up references resulting from attribute being a redeclaration
528
- if inverse.redeclare_entity
529
- puts 'FOUND REDECLARED INVERSE ' + inverse.name
530
- if inverse.redeclare_oldname
531
- redefined_xmiid = '_2_attr_' + schema.name + '-' + inverse.redeclare_entity + '-' + inverse.redeclare_oldname
532
- else
533
- redefined_xmiid = '_2_attr_' + schema.name + '-' + inverse.redeclare_entity + '-' + inverse.name
534
- end
535
- end
536
-
537
- lower = '1'
538
- upper = '1'
539
- isset = 'true'
540
- if inverse.instance_of? EXPSM::InverseAggregate
541
- lower = '0'
542
- upper = '*'
543
- if inverse.upper != '?'
544
- upper = inverse.upper
545
- end
546
- if inverse.lower != '0'
547
- lower = inverse.lower
548
- end
549
- if inverse.aggrtype == 'BAG'
550
- isset = 'false'
551
- end
552
- end
553
- domain_xmiid = '_' + schema.name + '-' + inverse.reverseEntity.name
554
- if inverse.reverseAttr.domain == entity.name
555
- assoc_xmiid = '_1_association_' + inverse.reverseEntity.schema.name + '-' + inverse.reverseEntity.name + '-' + inverse.reverseAttr_id
556
- else
557
- assoc_xmiid = '_1_association_' + inverse.reverseEntity.schema.name + '-' + entity.name + '-' + inverse.reverseAttr_id
558
- end
559
- res = ERB.new(inverse_attribute_template)
560
- t = res.result(binding)
561
- file.puts t
562
-
563
- res = ERB.new(attribute_end,0,"<>")
564
- t = res.result(binding)
565
- file.puts t
566
- end
567
-
568
- #Map EXPRESS Unique crules
569
- if entity.uniques.size > 0
570
- for unique in entity.uniques
571
- xmiid = '_3_uniq_' + schema.name + '-' + entity.name + '-' + unique.name
572
- if unique.attributes.size == 1
573
- unique_text = unique.attributes[0]
574
- else
575
- unique_text = 'Sequence{'+ unique.attributes.join(', ') +'}'
576
- end
577
- res = ERB.new(unique_template)
578
- t = res.result(binding)
579
- file.puts t
580
- end
581
- end
582
-
583
- # Evaluate and write ENTITY end template
584
- res = ERB.new(entity_end_template)
585
- t = res.result(binding)
586
- file.puts t
587
- end
588
-
589
- # Evaluate and write SCHEMA end template
590
- res = ERB.new(schema_end_template)
591
- t = res.result(binding)
592
- file.puts t
593
- end
594
-
595
- # Evaluate and write file end template
596
- res = ERB.new(overall_end_template)
597
- t = res.result(binding)
598
- file.puts t
599
- end