expressir 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/macos.yml +38 -0
  3. data/.github/workflows/ubuntu.yml +56 -0
  4. data/.github/workflows/windows.yml +40 -0
  5. data/.gitignore +12 -0
  6. data/.rspec +2 -0
  7. data/.rubocop.yml +508 -0
  8. data/Gemfile +4 -0
  9. data/README.adoc +147 -0
  10. data/Rakefile +6 -0
  11. data/bin/console +12 -0
  12. data/bin/rspec +29 -0
  13. data/bin/setup +8 -0
  14. data/docs/development.md +90 -0
  15. data/exe/expressir +20 -0
  16. data/expressir.gemspec +35 -0
  17. data/lib/expressir.rb +21 -0
  18. data/lib/expressir/cli.rb +27 -0
  19. data/lib/expressir/cli/ui.rb +36 -0
  20. data/lib/expressir/config.rb +23 -0
  21. data/lib/expressir/express.rb +12 -0
  22. data/lib/expressir/express/aggregate_dimension.rb +38 -0
  23. data/lib/expressir/express/attribute.rb +15 -0
  24. data/lib/expressir/express/comment.rb +7 -0
  25. data/lib/expressir/express/defined_type.rb +36 -0
  26. data/lib/expressir/express/derived.rb +65 -0
  27. data/lib/expressir/express/derived_aggregate.rb +43 -0
  28. data/lib/expressir/express/entity.rb +137 -0
  29. data/lib/expressir/express/explicit.rb +70 -0
  30. data/lib/expressir/express/explicit_aggregate.rb +46 -0
  31. data/lib/expressir/express/explicit_or_derived.rb +16 -0
  32. data/lib/expressir/express/global_rule.rb +44 -0
  33. data/lib/expressir/express/interface_specification.rb +51 -0
  34. data/lib/expressir/express/interfaced_item.rb +38 -0
  35. data/lib/expressir/express/inverse.rb +46 -0
  36. data/lib/expressir/express/inverse_aggregate.rb +37 -0
  37. data/lib/expressir/express/model_element.rb +7 -0
  38. data/lib/expressir/express/named_type.rb +19 -0
  39. data/lib/expressir/express/remark.rb +8 -0
  40. data/lib/expressir/express/repository.rb +306 -0
  41. data/lib/expressir/express/schema_definition.rb +96 -0
  42. data/lib/expressir/express/subtype_constraint.rb +14 -0
  43. data/lib/expressir/express/type.rb +26 -0
  44. data/lib/expressir/express/type_aggregate.rb +42 -0
  45. data/lib/expressir/express/type_enum.rb +29 -0
  46. data/lib/expressir/express/type_parser.rb +45 -0
  47. data/lib/expressir/express/type_select.rb +82 -0
  48. data/lib/expressir/express/unique_rule.rb +35 -0
  49. data/lib/expressir/express/where_rule.rb +32 -0
  50. data/lib/expressir/express_parser.rb +30 -0
  51. data/lib/expressir/parser.rb +6 -0
  52. data/lib/expressir/parser/owl_parser.rb +8 -0
  53. data/lib/expressir/version.rb +3 -0
  54. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +9589 -0
  55. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +36619 -0
  56. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +13294 -0
  57. data/original/examples/employment/eclipse/.project +17 -0
  58. data/original/examples/employment/eclipse/Export/Employment.png +0 -0
  59. data/original/examples/employment/eclipse/Express/employment_schema.exp +33 -0
  60. data/original/examples/employment/eclipse/Express/employment_schema.xmi +77 -0
  61. data/original/examples/employment/eclipse/Express/employment_schema.xml +93 -0
  62. data/original/examples/employment/eclipse/Models/Employment.uml +4 -0
  63. data/original/examples/employment/eclipse/Models/Employment.umldi +240 -0
  64. data/original/examples/employment/eclipse/readme.txt +7 -0
  65. data/original/examples/employment/employment_schema.exp +33 -0
  66. data/original/examples/employment/employment_schema.rb +232 -0
  67. data/original/examples/employment/employment_schema.xml +93 -0
  68. data/original/examples/employment/employment_schema___module.rb +46 -0
  69. data/original/examples/employment/employment_schema___p28attr.rb +126 -0
  70. data/original/examples/employment/employment_schema___p28inst.rb +26 -0
  71. data/original/examples/employment/example_employment_data.xml +1 -0
  72. data/original/examples/employment/example_employment_data_copy.xml +1 -0
  73. data/original/examples/employment/example_employment_reader.rb +30 -0
  74. data/original/examples/employment/example_employment_writer.rb +51 -0
  75. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +3710 -0
  76. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +35880 -0
  77. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +15357 -0
  78. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +9468 -0
  79. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +8404 -0
  80. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +43147 -0
  81. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +18341 -0
  82. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +11632 -0
  83. data/original/exp2ruby.rb +525 -0
  84. data/original/expsm.rb +34 -0
  85. data/original/mapping_owl.rb +1018 -0
  86. data/original/mapping_sysml.rb +2281 -0
  87. data/original/mapping_uml2.rb +599 -0
  88. data/original/mapping_uml2_eclipse.rb +433 -0
  89. data/original/reeper.rb +134 -0
  90. data/spec/acceptance/express_to_owl_spec.rb +18 -0
  91. data/spec/acceptance/version_spec.rb +12 -0
  92. data/spec/expressir/express/repository_spec.rb +25 -0
  93. data/spec/expressr_spec.rb +5 -0
  94. data/spec/spec_helper.rb +17 -0
  95. data/spec/support/console_helper.rb +29 -0
  96. metadata +239 -0
@@ -0,0 +1,599 @@
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