expressir 1.2.4-x86_64-darwin → 1.2.5-x86_64-darwin

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 +0 -6
  3. data/.github/workflows/rake.yml +200 -9
  4. data/.gitignore +7 -2
  5. data/.gitmodules +3 -0
  6. data/.rubocop.yml +13 -4
  7. data/Rakefile +4 -1
  8. data/bin/console +0 -1
  9. data/bin/rspec +3 -3
  10. data/exe/expressir +4 -2
  11. data/exe/format +1 -1
  12. data/exe/format-test +25 -25
  13. data/exe/generate-parser +16 -13
  14. data/expressir.gemspec +11 -9
  15. data/lib/expressir/config.rb +1 -1
  16. data/lib/expressir/express/2.7/express_parser.bundle +0 -0
  17. data/lib/expressir/express/3.0/express_parser.bundle +0 -0
  18. data/lib/expressir/express/3.1/express_parser.bundle +0 -0
  19. data/lib/expressir/express/parser.rb +2 -2
  20. data/lib/expressir/express/visitor.rb +7 -5
  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 +213 -162
  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 +52 -61
  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,2281 +0,0 @@
1
- require 'erb'
2
- require 'uuid'
3
- require 'nokogiri'
4
- include Nokogiri
5
-
6
- # EXPRESS to SysML Mapping
7
- # Version 0.5
8
- #
9
- # This function navigates the EXPRESS STEPMod Model Ruby Classes
10
- # and performs a structural EXPRESS-to-SysML (1.4) mapping using Ruby ERB templates.
11
- # The output is in XMI 2.1 or 2.5 syntax in a file named <schema>.xmi if one schema input and 'Model.xmi' if more than one schema input.
12
- #
13
- # Real, Number, Integer, Boolean, String -> New Primitive Type
14
- # Binary, Logical -> New PrimitiveType
15
- # Schema -> Package
16
- # Entity (subtype of) -> Class (Generalization) + Block stereotype
17
- # Select Type -> Class & Generalization + Block/value and <<Auxillary>> stereotype
18
- # Agg Type -> Collapsed into attribute if just used, converted into class with elements if part of aggregation or select type
19
- # Enum Type -> Enumeration and EnumerationLiteral
20
- # Explicit Attribute (Optional) Primitive or Enum -> Property owned by Class (with lower)
21
- # Explicit Attribute (Optional) Entity -> Property owned by Class (with lower) plus Association owning other end property
22
- # Explicit Attribute 1-D SET, BAG, LIST of Select or Entity -> Property owned by Class (with lower)
23
- # plus Association owning other end property and multiplicity, unique and ordered set
24
- # Explicit Attribute 1-D SET, BAG, LIST of Primitive or Enum -> Property owned by Class and multiplicity, unique and ordered set
25
- # Higher level aggregations create intermediary blocks
26
- # Explicit Attribute of Entity/Select/Builtin Redeclaration (Renamed) -> Property with (new) name that redefines inherited Property
27
- # Inverse Attribute -> Association end adjustment
28
- # Inverse Attribute Redeclaration (Renamed) -> Property with (new) name that redefines inherited Property
29
- # USE or REFERENCE (even with named items) -> UML PackageImport between Packages
30
- #
31
- #######################################################################################
32
-
33
- def get_uuid(id)
34
- if $uuidsRequired
35
- uuidmap = $uuidxml.xpath('//uuidmap[@id="' + id + '"]').first
36
- if !uuidmap.nil?
37
- $olduuids.delete uuidmap
38
- return ' xmi:uuid="' + uuidmap.attributes["uuid"].to_s.strip + '"'
39
- else
40
- theUUID = $uuid.generate
41
- uuidtext = theUUID.to_s.strip
42
- uuidmap = Nokogiri::XML::Node.new("uuidmap", $uuidxml)
43
- uuidmap['id'] = id
44
- uuidmap['uuid'] = theUUID
45
- $uuidxml.root.add_child uuidmap
46
- return ' xmi:uuid="' + theUUID + '"'
47
- end
48
- else
49
- return ""
50
- end
51
- end
52
-
53
- def get_where(id,rule)
54
- if !$wherexml.nil?
55
- wheremap = $wherexml.xpath('//wheremap[@id="' + id + '"]').first
56
- if !wheremap.nil?
57
- return wheremap.at("OCL").inner_html
58
- else
59
- wheremap = Nokogiri::XML::Node.new("wheremap", $wherexml)
60
- wheremap['id'] = id
61
- express = Nokogiri::XML::Node.new("EXPRESS", $wherexml)
62
- express.content = rule
63
- wheremap.add_child express
64
- ocl = Nokogiri::XML::Node.new("OCL", $wherexml)
65
- wheremap.add_child ocl
66
- $wherexml.root.add_child wheremap
67
- return ""
68
- end
69
- else
70
- return ""
71
- end
72
- end
73
-
74
- def put_ops(name, file)
75
- # operation template
76
- operation_template = %{<ownedOperation xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Operation">
77
- <name><%= op_name %></name>
78
- <ownedRule xmi:id="<%= xmiid %>-body"<%= get_uuid(xmiid+'-body') %> xmi:type="uml:Constraint">
79
- <specification xmi:id="<%= xmiid %>-spec"<%= get_uuid(xmiid+'-spec') %> xmi:type="uml:OpaqueExpression">
80
- <body><%= op_ocl %></body>
81
- <language>OCL2.0</language>
82
- </specification>
83
- </ownedRule>}
84
-
85
- parameter_template = %{<ownedParameter xmi:id="<%= par_xmiid %>"<%= get_uuid(par_xmiid) %> xmi:type="uml:Parameter">
86
- <name><%= par_name %></name>
87
- <type xmi:idref="<%= par_type %>"/>
88
- </ownedParameter>}
89
-
90
- return_template = %{<ownedParameter xmi:id="<%= xmiid %>-return"<%= get_uuid(xmiid+'-return') %> xmi:type="uml:Parameter">
91
- <direction>return</direction>
92
- <type xmi:idref="<%= ret_type %>"/>
93
- </ownedParameter>}
94
-
95
- operation_end = %{</ownedOperation>}
96
-
97
- if !$opsxml.nil?
98
- ops = $opsxml.xpath('//operation[@for="' + name + '"]')
99
- for op in ops
100
- body = op.at('body')
101
- if !body.nil?
102
- op_ocl = body.content
103
- op_name = op['name']
104
- ret_type = op['type']
105
- xmiid = '_2_op_' + name + '_' + op_name
106
- res = ERB.new(operation_template)
107
- t = res.result(binding)
108
- file.puts t
109
-
110
- params = op.xpath('./param')
111
- for param in params
112
- par_name = param['name']
113
- par_xmiid = xmiid + '-' + par_name
114
- par_type = param['type']
115
- res = ERB.new(parameter_template)
116
- t = res.result(binding)
117
- file.puts t
118
- end
119
- res = ERB.new(return_template)
120
- t = res.result(binding)
121
- file.puts t
122
- res = ERB.new(operation_end)
123
- t = res.result(binding)
124
- file.puts t
125
- else
126
- puts 'Operation ' + name + '.' + op['name'] + ' has no body - ignored!'
127
- end
128
- end
129
- end
130
- end
131
-
132
- def isEncapsulated (type, attrib)
133
- encapsulated = false
134
- rules = type.wheres.select {|w| w.name == "encapsulated"}
135
- if rules.length > 0
136
- for rule in rules
137
- if rule.expression == "SIZEOF(USEDIN(SELF, '')) = 1"
138
- encapsulated = true
139
- elsif rule.expression == "SIZEOF(QUERY(elem <* SELF | SIZEOF(USEDIN(elem, '')) = 1)) = SIZEOF(SELF)"
140
- encapsulated = true
141
- elsif rule.expression[0..24] == "SIZEOF(USEDIN(SELF, '') -"
142
- encapsulated = !(rule.expression[25..-1].include? ("." + attrib.entity.name.upcase + "." + attrib.name.upcase))
143
- else
144
- puts "Unknown encapsulated rule: " + rule.expression
145
- end
146
- if encapsulated
147
- break
148
- end
149
- end
150
- end
151
- if (type.kind_of? EXPSM::Entity) && !encapsulated
152
- for supertype in type.supertypes_array
153
- encapsulated = isEncapsulated(supertype, attrib)
154
- if encapsulated
155
- break
156
- end
157
- end
158
- end
159
- return encapsulated
160
- end
161
-
162
- def isEncapsulatedInto (parent, entity, attrib)
163
- encapsulated = false
164
- rules = parent.wheres.select {|w| w.name == "encapsulateInto"}
165
- if rules.length > 0
166
- for rule in rules
167
- ruleString = rule.expression.upcase
168
- if ruleString[0..6] == "EXISTS("
169
- closeParen = ruleString.index(')')
170
- if ruleString[closeParen..-1].include? " XOR (SIZEOF(TYPEOF(SELF) *"
171
- if !ruleString[closeParen+28..-1].include? ('.'+entity.name.upcase+'''')
172
- encapsulated = (ruleString[6..closeParen].include? ('('+attrib.name.upcase+')'))
173
- end
174
- else
175
- encapsulated = (ruleString[6..closeParen].include? ('('+attrib.name.upcase+')'))
176
- end
177
- else
178
- puts "Unknown encapsulateInto rule: " + rule.expression
179
- end
180
- if encapsulated
181
- break
182
- end
183
- end
184
- end
185
- if !encapsulated
186
- for supertype in parent.supertypes_array
187
- encapsulated = isEncapsulatedInto(supertype, entity, attrib)
188
- if encapsulated
189
- break
190
- end
191
- end
192
- end
193
- return encapsulated
194
- end
195
-
196
- def map_from_express(mapinput, passedArgs)
197
- # Enter file name here to override defaults (<schema>.xmi if one schema, and Model.xmi if more than one)
198
- output_xmi_filename = nil
199
-
200
- noprune = false
201
- schemaId = false
202
- $uuidsRequired = true
203
- xmiVersion = "2.1"
204
- dtHandle = "local"
205
- outPath = nil
206
- for arg in passedArgs
207
- argarray = arg.split('=')
208
- case argarray[0]
209
- when "noprune" then noprune = true
210
- when "nouuids" then $uuidsRequired = false
211
- when "path" then outPath = argarray[1]
212
- when "schemaid" then schemaId = true
213
- when "xmi" then xmiVersion = argarray[1]
214
- when "types" then dtHandle = argarray[1]
215
- end
216
- end
217
-
218
- case xmiVersion
219
- when "2.1" then $StandardProfile = "StandardProfileL2"
220
- when "2.5" then $StandardProfile = "StandardProfile"
221
- else
222
- puts "XMI version "+xmiVersion+" is not handled!"
223
- exit
224
- end
225
-
226
- case dtHandle
227
- when "local"
228
- puts "Data types will generated within the package structure"
229
- when "ignore"
230
- puts "Data types will not be generated"
231
- when "export"
232
- puts "Data types will be exported to DataTypes.xmi"
233
- else
234
- puts "Data type handling option: "+dtHandle+" not valid!"
235
- exit
236
- end
237
-
238
- if dtHandle != "local"
239
- if outPath.nil?
240
- puts "path must be specified when type=" + dtHandle
241
- exit
242
- end
243
- end
244
-
245
- uuidSafe = nil
246
- uuidOldSafe = nil
247
- if $uuidsRequired
248
- $uuid = UUID.new
249
- if File.exists?("UUIDs.xml")
250
- uuidfile = File.open("UUIDs.xml")
251
- $uuidxml = Nokogiri::XML(uuidfile, &:noblanks)
252
- uuidfile.close
253
- else
254
- $uuidxml = Nokogiri::XML::Builder.new { |b| b.uuids }.doc
255
- end
256
- $olduuids = $uuidxml.xpath('//uuidmap')
257
- end
258
-
259
- if File.exists?("WhereRuleMapping.xml")
260
- wherefile = File.open("WhereRuleMapping.xml")
261
- $wherexml = Nokogiri::XML(wherefile, &:noblanks)
262
- wherefile.close
263
- end
264
-
265
- if File.exists?("Operators.xml")
266
- opsfile = File.open("Operators.xml")
267
- $opsxml = Nokogiri::XML(opsfile, &:noblanks)
268
- opsfile.close
269
- end
270
-
271
- # datatypes for builtin types that have been exported
272
- datatype_hash = Hash.new
273
-
274
- # XMI File Start Template (includes datatypes for builtin with no direct UML equivalent)
275
- overall_start_template = %{<?xml version="1.0" encoding="UTF-8"?><%
276
- if xmiVersion == "2.1" %>
277
- <xmi:XMI xmi:version="2.1" xmlns:xmi="http://schema.omg.org/spec/XMI/2.1" xmlns:uml="http://www.omg.org/spec/UML/20090901" xmlns:StandardProfileL2="http://schema.omg.org/spec/UML/2.3/StandardProfileL2.xmi" xmlns:sysml="http://www.omg.org/spec/SysML/20100301/SysML-profile"><%
278
- else %>
279
- <xmi:XMI xmlns:uml='http://www.omg.org/spec/UML/20131001' xmlns:xmi='http://www.omg.org/spec/XMI/20131001' xmlns:StandardProfile='http://www.omg.org/spec/UML/20131001/StandardProfile' xmlns:sysml='http://www.omg.org/spec/SysML/20150709/SysML'><%
280
- end
281
- $dtprefix=''
282
- if !outPath.nil?
283
- pathElements = outPath.split('/')
284
- if dtHandle=='local'
285
- for elem in pathElements
286
- $dtprefix = $dtprefix + elem[0]
287
- end
288
- $dtprefix = $dtprefix + '_'
289
- end
290
- end %>}
291
-
292
- # Package Structure Start
293
- package_start = %{<%
294
- if outPath.nil?
295
- name = "SysMLfromEXPRESS"
296
- else
297
- pathElements = outPath.split('/')
298
- name = pathElements[-1]
299
- end %>
300
- <uml:Package xmi:id="_0_<%= name %>"<%= get_uuid('_0_'+name) %> xmi:type="uml:Package">
301
- <name><%= name %></name>}
302
-
303
- # Apply SysML profile
304
- apply_sysml = %{<profileApplication xmi:id="_profileApplication0"<%= get_uuid('_profileApplication0') %> xmi:type="uml:ProfileApplication"><%
305
- if xmiVersion == "2.1" %>
306
- <appliedProfile href="http://www.omg.org/spec/SysML/20100301/SysML-profile.uml#_0"/><%
307
- else %>
308
- <appliedProfile href="http://www.omg.org/spec/SysML/20150709/SysML.xmi#_SysML__0"/><%
309
- end %>
310
- </profileApplication>}
311
-
312
- # Package end
313
- package_end = %{</uml:Package>}
314
-
315
- # XMI File End Template
316
- overall_end_template = %{</xmi:XMI>}
317
-
318
- #DATA TYPEs
319
- data_types = %{<packagedElement xmi:id="<%= $dtprefix %>BINARY"<%= get_uuid($dtprefix+'BINARY') %> xmi:type="uml:PrimitiveType">
320
- <name>Binary</name>
321
- </packagedElement>
322
- <packagedElement xmi:id="<%= $dtprefix %>STRING"<%= get_uuid($dtprefix+'STRING') %> xmi:type="uml:PrimitiveType">
323
- <name>String</name>
324
- </packagedElement>
325
- <packagedElement xmi:id="<%= $dtprefix %>NUMBER"<%= get_uuid($dtprefix+'NUMBER') %> xmi:type="uml:PrimitiveType">
326
- <name>Number</name>
327
- <isAbstract>true</isAbstract>
328
- </packagedElement>
329
- <packagedElement xmi:id="<%= $dtprefix %>REAL"<%= get_uuid($dtprefix+'REAL') %> xmi:type="uml:PrimitiveType">
330
- <name>Real</name>
331
- <generalization xmi:id="_generalization-<%= $dtprefix %>REAL_NUMBER"<%= get_uuid('_generalization-'+$dtprefix+'REAL_NUMBER') %> xmi:type="uml:Generalization">
332
- <general xmi:idref="<%= $dtprefix %>NUMBER"/>
333
- </generalization>
334
- </packagedElement>
335
- <packagedElement xmi:id="<%= $dtprefix %>INTEGER"<%= get_uuid($dtprefix+'INTEGER') %> xmi:type="uml:PrimitiveType">
336
- <name>Integer</name>
337
- <generalization xmi:id="_generalization-<%= $dtprefix %>INTEGER_REAL"<%= get_uuid('_generalization-'+$dtprefix+'INTEGER_REAL') %> xmi:type="uml:Generalization">
338
- <general xmi:idref="<%= $dtprefix %>REAL"/>
339
- </generalization>
340
- </packagedElement>
341
- <packagedElement xmi:id="<%= $dtprefix %>LOGICAL"<%= get_uuid($dtprefix+'LOGICAL') %> xmi:type="uml:Enumeration">
342
- <name>Logical</name>
343
- <ownedLiteral xmi:id="<%= $dtprefix %>UNKNOWN"<%= get_uuid($dtprefix+'UNKNOWN') %> xmi:type="uml:EnumerationLiteral">
344
- <name>Unknown</name>
345
- </ownedLiteral>
346
- </packagedElement>
347
- <packagedElement xmi:id="<%= $dtprefix %>BOOLEAN"<%= get_uuid($dtprefix+'BOOLEAN') %> xmi:type="uml:Enumeration">
348
- <name>Boolean</name>
349
- <generalization xmi:id="<%= $dtprefix %>_generalization-<%= $dtprefix %>BOOLEAN-LOGICAL"<%= get_uuid('_generalization-'+$dtprefix+'BOOLEAN-LOGICAL') %> xmi:type="uml:Generalization">
350
- <general xmi:idref="<%= $dtprefix %>LOGICAL"/>
351
- </generalization>
352
- <ownedLiteral xmi:id="<%= $dtprefix %>TRUE"<%= get_uuid($dtprefix+'TRUE') %> xmi:type="uml:EnumerationLiteral">
353
- <name>True</name>
354
- </ownedLiteral>
355
- <ownedLiteral xmi:id="<%= $dtprefix %>FALSE"<%= get_uuid($dtprefix+'FALSE') %> xmi:type="uml:EnumerationLiteral">
356
- <name>False</name>
357
- </ownedLiteral>
358
- </packagedElement>}
359
-
360
- #DATA TYPE end
361
- data_type_stereos = %{<sysml:ValueType xmi:id="<%= $dtprefix %>LOGICAL_VT"<%= get_uuid($dtprefix+'LOGICAL_VT') %>>
362
- <base_DataType xmi:idref="<%= $dtprefix %>LOGICAL"/>
363
- </sysml:ValueType>
364
- <sysml:ValueType xmi:id="<%= $dtprefix %>BOOLEAN_VT"<%= get_uuid($dtprefix+'BOOLEAN_VT') %>>
365
- <base_DataType xmi:idref="<%= $dtprefix %>BOOLEAN"/>
366
- </sysml:ValueType>
367
- <sysml:ValueType xmi:id="<%= $dtprefix %>NUMBER_VT"<%= get_uuid($dtprefix+'NUMBER_VT') %>>
368
- <base_DataType xmi:idref="<%= $dtprefix %>NUMBER"/>
369
- </sysml:ValueType>
370
- <sysml:ValueType xmi:id="<%= $dtprefix %>REAL_VT"<%= get_uuid($dtprefix+'REAL_VT') %>>
371
- <base_DataType xmi:idref="<%= $dtprefix %>REAL"/>
372
- </sysml:ValueType>
373
- <sysml:ValueType xmi:id="<%= $dtprefix %>INTEGER_VT"<%= get_uuid($dtprefix+'INTEGER_VT') %>>
374
- <base_DataType xmi:idref="<%= $dtprefix %>INTEGER"/>
375
- </sysml:ValueType>
376
- <sysml:ValueType xmi:id="<%= $dtprefix %>STRING_VT"<%= get_uuid($dtprefix+'STRING_VT') %>>
377
- <base_DataType xmi:idref="<%= $dtprefix %>STRING"/>
378
- </sysml:ValueType>
379
- <sysml:ValueType xmi:id="<%= $dtprefix %>BINARY_VT"<%= get_uuid($dtprefix+'BINARY_VT') %>>
380
- <base_DataType xmi:idref="<%= $dtprefix %>BINARY"/>
381
- </sysml:ValueType>}
382
-
383
- # SCHEMA Start Template
384
- schema_start_template = %{<% if schema_list.size > 1 %><packagedElement<% else %><uml:Package<% end %> xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Package">
385
- <name><%= schema.name %></name>}
386
-
387
- # SCHEMA INTERFACE Template
388
- schema_interface_template = %{<packageImport xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:PackageImport">
389
- <importedPackage xmi:idref="_1_<%= interfaced_schema.foreign_schema_id %>"/>
390
- </packageImport>}
391
-
392
- # SCHEMA End Template
393
- schema_end_template = %{<% if schema_list.size > 1 %></packagedElement><% else %></uml:Package><% end %>}
394
-
395
- # ENTITY Block Template
396
- entity_block_template = %{<sysml:Block xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %>>
397
- <base_Class xmi:idref="<%= baseClass %>"/>
398
- </sysml:Block>}
399
-
400
- # ENTITY Start Template
401
- entity_start_template = %{<packagedElement xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Class">
402
- <name><%= entity.name %></name><% if entity.isAbs %>
403
- <isAbstract>true</isAbstract><% end %>}
404
-
405
- # SUBTYPE OF Template
406
- supertype_template = %{<generalization xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Generalization">
407
- <general xmi:idref="<%= xmiid_general %>"/>
408
- </generalization>}
409
-
410
- # ENTITY End Template
411
- entity_end_template = %{</packagedElement>}
412
-
413
- # ENUMERATION Start Template
414
- enum_start_template = %{<packagedElement xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Enumeration">
415
- <name><%= enum.name %></name><% if !general.nil?
416
- if !datatype_hash[general].nil? %>
417
- <generalization xmi:id="<%= gen_xmiid %>"<%= get_uuid(gen_xmiid) %> xmi:type="uml:Generalization">
418
- <general href="<%= datatype_hash[general] %>"/>
419
- </generalization><% else %>
420
- <generalization xmi:id="<%= gen_xmiid %>"<%= get_uuid(gen_xmiid) %> xmi:type="uml:Generalization">
421
- <general xmi:idref="<%= xmiid_general %>"/>
422
- </generalization>
423
- <% end
424
- end%>}
425
-
426
- # ENUMERATION ITEM Template
427
- enum_item_template = %{<ownedLiteral xmi:id="<%= enumitem_xmiid %>"<%= get_uuid(enumitem_xmiid) %> xmi:type="uml:EnumerationLiteral">
428
- <name><%= enumitem %></name>
429
- </ownedLiteral>}
430
-
431
- # ENUMERATION End Template
432
- enum_end_template = %{</packagedElement>}
433
-
434
- # SELECT Start Template
435
- select_start_template = %{<packagedElement xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="<% if selectTypeType[type.name] == "Type" %>uml:DataType<% else %>uml:Class<% end %>">
436
- <name><%= type.name %></name>
437
- <isAbstract>true</isAbstract>}
438
-
439
- # SELECT End Template
440
- select_end_template = %{</packagedElement>}
441
-
442
- # SELECT Stereotype Template
443
- select_stereotype_template = %{<<%= $StandardProfile %>:Auxiliary xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %>>
444
- <base_Class xmi:idref="<%= baseClass %>"/>
445
- </<%= $StandardProfile %>:Auxiliary>}
446
-
447
- # Template covering the output file contents for each attribute that is an entity
448
- attribute_entity_template = %{<ownedAttribute xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Property">
449
- <name><%= attr.name %></name><% if islist %>
450
- <isOrdered>true</isOrdered><% end %><% if !isset %>
451
- <isUnique>false</isUnique><% end %>
452
- <type xmi:idref="<%= domain_xmiid %>"/><% if (direct_inverse and !encapsulatedInto) or encapsulated %>
453
- <aggregation>composite</aggregation><% end %>
454
- <association xmi:idref="<%= assoc_xmiid %>"/><% if attr.redeclare_entity %>
455
- <redefinedProperty xmi:idref="<%= redefined_xmiid %>"/><% end %>}
456
-
457
- # INVERSE ATTRIBUTE Template
458
- inverse_attribute_template = %{<ownedAttribute xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Property">
459
- <name><%= inverse.name %></name><% if !isset %>
460
- <isUnique>false</isUnique><% end %>
461
- <isReadOnly>true</isReadOnly><% if encapsulatedInto %>
462
- <aggregation>composite</aggregation><% end %>
463
- <type xmi:idref="<%= domain_xmiid %>"/>
464
- <association xmi:idref="<%= assoc_xmiid %>"/><% if inverse.redeclare_entity %>
465
- <redefinedProperty xmi:idref="<%= redefined_xmiid %>"/><% end %>}
466
-
467
- #Template covering multiplicities
468
- multiplicity = %{<% dummy = nil
469
- if lower == '0' %><lowerValue xmi:id="<%= xmiid %>-lowerValue"<%= get_uuid(xmiid + '-lowerValue') %> xmi:type="uml:LiteralInteger"/><%
470
- else
471
- if lower != '1' %><lowerValue xmi:id="<%= xmiid %>-lowerValue"<%= get_uuid(xmiid + '-lowerValue') %> xmi:type=<% if /\\d+/ === lower %>"uml:LiteralInteger"<% else %>"uml:LiteralString"<% end %>>
472
- <value><%= lower %></value>
473
- </lowerValue><%
474
- else
475
- dummy = get_uuid(xmiid + '-lowerValue')
476
- end
477
- end %><% if dummy.nil? %>
478
- <% end %><% if upper != '1' %><upperValue xmi:id="<%= xmiid %>-upperValue"<%= get_uuid(xmiid + '-upperValue') %> xmi:type=<% if /(\\d+|\\*)/ === upper %>"uml:LiteralUnlimitedNatural"<% else %>"uml:LiteralString"<% end %>>
479
- <value><%= upper %></value>
480
- </upperValue><%
481
- else
482
- dummy = get_uuid(xmiid + '-upperValue')
483
- end %>}
484
-
485
- #Template covering attribute wrapup
486
- attribute_end = %{</ownedAttribute>}
487
-
488
-
489
- # EXPLICIT ATTRIBUTE ENTITY Create Association Template
490
- attribute_entity_association_template = %{<packagedElement xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Association">
491
- <memberEnd xmi:idref="<%= attr_xmiid %>"/><%
492
- if !inverse_exists %>
493
- <memberEnd xmi:idref="<%= xmiid + '-end' %>"/>
494
- <ownedEnd xmi:id="<%= xmiid %>-end"<%= get_uuid(xmiid+'-end') %> xmi:type="uml:Property"><% if encapsulatedInto %>
495
- <aggregation>composite</aggregation><% end %>
496
- <type xmi:idref="<%= owner_xmiid %>"/>
497
- <association xmi:idref="<%= xmiid %>"/>
498
- <lowerValue xmi:id="<%= xmiid %>-end-lowerValue"<%= get_uuid(xmiid+'-end-lowerValue') %> xmi:type="uml:LiteralInteger"/><%
499
- if encapsulated
500
- dummy = get_uuid(xmiid+'-end-upperValue')
501
- else %>
502
- <upperValue xmi:id="<%= xmiid %>-end-upperValue"<%= get_uuid(xmiid+'-end-upperValue') %> xmi:type="uml:LiteralUnlimitedNatural">
503
- <value>*</value>
504
- </upperValue><%
505
- end %>
506
- </ownedEnd><%
507
- else %><memberEnd xmi:idref="<%= iattr_xmiid %>"/><%
508
- end %><%
509
- if general_exists %>
510
- <generalization xmi:id="<%= general_xmiid %>"<%= get_uuid(general_xmiid) %> xmi:type="uml:Generalization">
511
- <general xmi:idref="<%= redefined_xmiid %>"/>
512
- </generalization><%
513
- end %>
514
- </packagedElement>}
515
-
516
-
517
- # INVERSE ATTRIBUTE ENTITY Create Association Template
518
- inverse_entity_association_template = %{<packagedElement xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Association">
519
- <memberEnd xmi:idref="<%= xmiid + '-end' %>"/>
520
- <memberEnd xmi:idref="<%= iattr_xmiid %>"/>
521
- <ownedEnd xmi:id="<%= xmiid %>-end"<%= get_uuid(xmiid+'-end') %> xmi:type="uml:Property">
522
- <type xmi:idref="<%= owner_xmiid %>"/>
523
- <association xmi:idref="<%= xmiid %>"/><% xmiid = xmiid + '-end' %>}
524
-
525
- inverse_entity_association_end = %{</ownedEnd>
526
- <generalization xmi:id="<%= general_xmiid %>"<%= get_uuid(general_xmiid) %> xmi:type="uml:Generalization">
527
- <general xmi:idref="<%= redefined_xmiid %>"/>
528
- </generalization>
529
- </packagedElement>}
530
-
531
-
532
- # EXPLICIT ATTRIBUTE SIMPLE TYPE Template
533
- attribute_builtin_template = %{<ownedAttribute xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Property">
534
- <name><%= attr.name %></name><% if islist %>
535
- <isOrdered>true</isOrdered><% end %><% if !isset %>
536
- <isUnique>false</isUnique><% end %>
537
- <aggregation>composite</aggregation><% if attr.redeclare_entity %>
538
- <redefinedProperty xmi:idref="<%= redefined_xmiid %>"/><% end %><% if !nestedAggs[domain_name].nil? %>
539
- <type xmi:idref="<%= prefix+domain_name %>"/><% else if !datatype_hash[domain_name].nil? %>
540
- <type href="<%= datatype_hash[domain_name] %>"/><% else %>
541
- <type xmi:idref="<%= $dtprefix+domain_name %>"/><% end end %>}
542
-
543
-
544
- # EXPLICIT ATTRIBUTE ENUM and TYPE Template
545
- attribute_enum_type_template = %{<ownedAttribute xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Property">
546
- <name><%= attr.name %></name>
547
- <type xmi:idref="<%= type_xmiid %>"/><% if islist %>
548
- <isOrdered>true</isOrdered><% end %><% if !isset %>
549
- <isUnique>false</isUnique><% end %>
550
- <aggregation>composite</aggregation>}
551
-
552
- # Lower bound constraint template
553
- bound_constraint = %{<ownedRule xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Constraint">
554
- <name><%= name %>_LB</name>
555
- <constrainedElement xmi:idref="<%= xmiid_entity %>"/>
556
- <specification xmi:id="<%= xmiid %>-spec"<%= get_uuid(xmiid+'-spec') %> xmi:type="uml:OpaqueExpression">
557
- <body><%= name %>-&gt;isEmpty() or <%= name %>-&gt;size() &gt;= <%= bound %></body>
558
- <language>OCL2.0</language>
559
- </specification>
560
- </ownedRule>}
561
-
562
- # UNIQUE rule template
563
- unique_template = %{<ownedRule xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Constraint">
564
- <name><%= unique.name %></name>
565
- <constrainedElement xmi:idref="<%= xmiid_entity %>"/>
566
- <specification xmi:id="<%= xmiid %>-spec"<%= get_uuid(xmiid+'-spec') %> xmi:type="uml:OpaqueExpression">
567
- <body><%= entity.name %>::allInstances()-&gt;isUnique(<%= unique_text %>)</body>
568
- <language>OCL2.0</language>
569
- </specification>
570
- </ownedRule>}
571
-
572
- # WHERE rule template
573
- where_template = %{<ownedRule xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Constraint">
574
- <name><%= where.name %></name>
575
- <constrainedElement xmi:idref="<%= xmiidref %>"/>
576
- <specification xmi:id="<%= xmiid %>-spec"<%= get_uuid(xmiid+'-spec') %> xmi:type="uml:OpaqueExpression">
577
- <body><%= where_ocl %></body>
578
- <language>OCL2.0</language>
579
- </specification>
580
- </ownedRule>}
581
-
582
- # TYPE Template
583
- type_template = %{<packagedElement xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:PrimitiveType">
584
- <name><%= type.name %></name><% if !datatype_hash[type.domain].nil? %>
585
- <generalization xmi:id="_supertype<%= xmiid %>"<%= get_uuid('_supertype'+xmiid) %> xmi:type="uml:Generalization">
586
- <general href="<%= datatype_hash[type.domain] %>"/>
587
- </generalization><% else %>
588
- <generalization xmi:id="_supertype<%= xmiid %>"<%= get_uuid('_supertype'+xmiid) %> xmi:type="uml:Generalization">
589
- <general xmi:idref="<%= $dtprefix+xmiid_general %>"/>
590
- </generalization>
591
- <% end %>}
592
-
593
- # ProxyTYPE Start Template
594
- proxy_start_template = %{<packagedElement xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Class">
595
- <name><%= type.name %>Proxy</name>
596
- <ownedAttribute xmi:id="<%= xmiid %>_value"<%= get_uuid(xmiid + "_value") %> xmi:type="uml:Property">
597
- <name>value</name>
598
- <type xmi:idref="<%= xmiid_type %>"/>
599
- <aggregation>composite</aggregation>
600
- </ownedAttribute><%
601
- dummy = get_uuid(xmiid + "_value-lowerValue")
602
- dummy = get_uuid(xmiid + "_value-upperValue")
603
- %>}
604
-
605
- # AggTYPE Start Template
606
- aggtype_start_template = %{<packagedElement xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Class">
607
- <name><%= type_name %></name>}
608
-
609
- aggtype_attribute = %{<ownedAttribute xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %> xmi:type="uml:Property">
610
- <name>elements</name><% if islist %>
611
- <isOrdered>true</isOrdered><% end %><% if !isset %>
612
- <isUnique>false</isUnique><% end %><% if datatype_hash[type.domain].nil? %>
613
- <type xmi:idref="<%= xmiid_type %>"/><% else %>
614
- <type href="<%= datatype_hash[type.domain] %>"/><% end %><% if associationNeeded %>
615
- <association xmi:idref="<%= assoc_xmiid %>"/><% else %>
616
- <aggregation>composite</aggregation><% end %>}
617
-
618
- aggtype_association = %{<packagedElement xmi:id="<%= assoc_xmiid %>"<%= get_uuid(assoc_xmiid) %> xmi:type="uml:Association">
619
- <memberEnd xmi:idref="<%= xmiid %>"/>
620
- <memberEnd xmi:idref="<%= assoc_xmiid + '-end' %>"/>
621
- <ownedEnd xmi:id="<%= assoc_xmiid %>-end"<%= get_uuid(assoc_xmiid+'-end') %> xmi:type="uml:Property">
622
- <type xmi:idref="<%= xmiid_type %>"/>
623
- <association xmi:idref="<%= assoc_xmiid %>"/>
624
- <lowerValue xmi:id="<%= assoc_xmiid %>-end-lowerValue"<%= get_uuid(assoc_xmiid+'-end-lowerValue') %> xmi:type="uml:LiteralInteger"/>
625
- </ownedEnd>
626
- </packagedElement>}
627
-
628
- # TYPE Stereotype Template
629
- type_stereotype_template = %{<<%= $StandardProfile %>:Type xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %>>
630
- <base_Class xmi:idref="<%= baseClass %>"/>
631
- </<%= $StandardProfile %>:Type>}
632
-
633
- #TYPE end Template
634
- type_end_template=%{</packagedElement>}
635
-
636
- # TYPE ValueType Template
637
- valuetype_template = %{<sysml:ValueType xmi:id="<%= xmiid %>"<%= get_uuid(xmiid) %>>
638
- <base_DataType xmi:idref="<%= baseType %>"/>
639
- </sysml:ValueType>}
640
-
641
- #############################################################################################
642
- # Set up list of schemas to process, input may be a repository containing schemas or a single schema
643
- #############################################################################################
644
-
645
- if mapinput.kind_of? EXPSM::Repository
646
- schema_list = mapinput.schemas
647
- elsif mapinput.kind_of? EXPSM::SchemaDefinition
648
- schema_list = [mapinput]
649
- else
650
- puts "ERROR : map_from_express input no Repository instance or Schema instance"
651
- exit
652
- end
653
-
654
- # Set up XMI output file
655
-
656
- if schema_list.size == 1
657
- if output_xmi_filename.nil?
658
- schema = schema_list[0]
659
- output_xmi_filename = schema.name.to_s + ".xmi"
660
- end
661
- if schemaId
662
- get_prefix = lambda {|schema| '_' + schema.name + '-'}
663
- else
664
- get_prefix = lambda {|schema| '_'}
665
- end
666
- else
667
- if output_xmi_filename.nil?
668
- output_xmi_filename = 'Model.xmi'
669
- end
670
- get_prefix = lambda {|schema| '_' + schema.name + '-'}
671
- end
672
-
673
- file = File.new(output_xmi_filename, "w")
674
- puts 'reeper : Writing output to file ' + output_xmi_filename
675
-
676
- # Evaluate and write file start template
677
- res = ERB.new(overall_start_template)
678
- t = res.result(binding)
679
- file.puts t
680
-
681
- if dtHandle != "local"
682
- pathElements = outPath.split('/')
683
- relPath = "DataTypes.xmi"
684
- for elem in pathElements
685
- relPath = "../" + relPath
686
- end
687
- datatype_hash["LOGICAL"] = relPath + "#LOGICAL"
688
- datatype_hash["BOOLEAN"] = relPath + "#BOOLEAN"
689
- datatype_hash["NUMBER"] = relPath + "#NUMBER"
690
- datatype_hash["REAL"] = relPath + "#REAL"
691
- datatype_hash["INTEGER"] = relPath + "#INTEGER"
692
- datatype_hash["STRING"] = relPath + "#STRING"
693
- datatype_hash["BINARY"] = relPath + "#BINARY"
694
- end
695
-
696
- # sort out data types
697
- if dtHandle != "ignore"
698
- if dtHandle == "local"
699
- dtfile = file
700
- else
701
- dtfile = File.new("DataTypes.xmi","w")
702
- res = ERB.new(overall_start_template)
703
- t = res.result(binding)
704
- dtfile.puts t
705
- if $uuidsRequired
706
- uuidSafe = $uuidxml
707
- uuidOldSafe = $olduuids
708
- if File.exists?("DataTypes_UUIDs.xml")
709
- uuidfile = File.open("DataTypes_UUIDs.xml")
710
- $uuidxml = Nokogiri::XML(uuidfile, &:noblanks)
711
- uuidfile.close
712
- else
713
- $uuidxml = Nokogiri::XML::Builder.new { |b| b.uuids }.doc
714
- end
715
- $olduuids = $uuidxml.xpath('//uuidmap')
716
- end
717
- xmiid = "_0_" + $dtprefix + "DataTypes"
718
- dtfile.puts '<uml:Package xmi:id="'+ xmiid +'"' + get_uuid(xmiid) +' xmi:type="uml:Package">'
719
- dtfile.puts '<name>DataTypes</name>'
720
- res = ERB.new(apply_sysml)
721
- t = res.result(binding)
722
- dtfile.puts t
723
- end
724
- res = ERB.new(data_types)
725
- t = res.result(binding)
726
- dtfile.puts t
727
- if dtHandle == "export"
728
- dtfile.puts '</uml:Package>'
729
- end
730
- if !uuidSafe.nil?
731
- tmp = uuidSafe
732
- uuidSafe = $uuidxml
733
- $uuidxml = tmp
734
- tmp = uuidOldSafe
735
- uuidOldSafe = $olduuids
736
- $olduuids = tmp
737
- end
738
- end
739
-
740
- # Set up list of all EXPRESS Inverses in all schemas
741
- all_inverse_list = []
742
- direct_inverses = []
743
- # Set up list of all EXPRESS Selects in all schemas
744
- all_select_list = []
745
- renamed_select_list = []
746
- # setup global proxy type handling
747
- typeProxies = Hash.new
748
-
749
- # build all_select_list
750
- for schema in schema_list
751
- select_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::TypeSelect }
752
- all_select_list = all_select_list + select_list
753
- type_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::Type and !e.isBuiltin}
754
- for type in type_list
755
- superselect = NamedType.find_by_name( type.domain )
756
- while (superselect.instance_of? EXPSM::Type and !superselect.isBuiltin)
757
- superselect = NamedType.find_by_name(superselect.domain)
758
- end
759
- if superselect.kind_of? EXPSM::TypeSelect
760
- renamed_select_list << type
761
- end
762
- end
763
- end
764
-
765
- # Set up storage for handling Aggregate and Select Types correctly
766
- aggTypes = Hash.new
767
- specialSelects = Hash.new
768
-
769
- # determine Aggregate and Select types needing special consideration
770
- for schema in schema_list
771
- entity_list = schema.contents.find_all{ |e| e.kind_of? EXPSM::Entity }
772
- for entity in entity_list
773
- attr_list = entity.attributes.find_all{ |e| e.kind_of? EXPSM::Explicit }
774
- for attr in attr_list
775
- if attr.instance_of? EXPSM::ExplicitAggregate
776
- orig_domain = NamedType.find_by_name( attr.domain )
777
- if orig_domain.class.to_s == "EXPSM::TypeAggregate"
778
- if aggTypes[attr.domain].nil?
779
- aggTypes[attr.domain] = orig_domain
780
- end
781
- end
782
- end
783
- if attr.redeclare_entity
784
- attr_domain = NamedType.find_by_name(attr.domain)
785
- if attr_domain.instance_of? EXPSM::TypeSelect
786
- supertype = NamedType.find_by_name( attr.redeclare_entity )
787
- if attr.redeclare_oldname
788
- redeclOf = supertype.find_attr_by_name( attr.redeclare_oldname )
789
- else
790
- redeclOf = supertype.find_attr_by_name( attr.name )
791
- end
792
- redecl_domain = NamedType.find_by_name( redeclOf.domain )
793
- case redecl_domain.class.to_s
794
- when 'EXPSM::Entity', 'EXPSM::TypeSelect'
795
- if specialSelects[attr.domain].nil?
796
- specialSelects[attr.domain] = [redecl_domain]
797
- else
798
- if !specialSelects[attr.domain].include?(redecl_domain)
799
- specialSelects[attr.domain].push(redecl_domain)
800
- end
801
- end
802
- end
803
- end
804
- end
805
- end
806
- end
807
- end
808
-
809
- # Set up storage for handling select types correctly
810
- selectTypeType = Hash.new
811
-
812
- # determine the type of select
813
- # - entity if only contains entities
814
- # - type if only contains types
815
- # - hybrid if a mixture
816
- # - remove if a single object in list
817
- unknownSelect = all_select_list.dup
818
- for select in unknownSelect
819
- if (select.selectitems_array.size == 1 && !noprune)
820
- if !select.selectitems_array[0].kind_of? EXPSM::TypeSelect
821
- puts select.name + " is pruned since it only contains one element"
822
- selectTypeType[select.name] = "Remove"
823
- end
824
- end
825
- entcount = 0
826
- typcount = 0
827
- select.selectitems_array.each do |e|
828
- case e.class.to_s
829
- when "EXPSM::Entity" then entcount += 1
830
- when "EXPSM::Type" then typcount += 1
831
- when "EXPSM::TypeEnum" then typcount += 1
832
- when "EXPSM::TypeAggregate"
833
- if selectTypeType[select.name] != "Remove"
834
- entcount += 1
835
- if aggTypes[e.name].nil?
836
- aggTypes[e.name] = e
837
- end
838
- end
839
- when "EXPSM::TypeSelect"
840
- case selectTypeType[e.name]
841
- when "Entity" then entcount += 1
842
- when "Type" then typcount += 1
843
- when "Hybrid" then selectTypeType[select.name] = "Hybrid"
844
- when "Remove"
845
- case e.selectitems_array[0].class.to_s
846
- when "EXPSM::Entity" then entcount += 1
847
- when "EXPSM::Type" then typcount += 1
848
- end
849
- end
850
- else
851
- puts "unknown class " + e.class.to_s + " for " + select.name
852
- end
853
- end
854
-
855
- if selectTypeType[select.name].nil?
856
- case select.selectitems_array.size
857
- when entcount then selectTypeType[select.name] = "Entity"
858
- when typcount then selectTypeType[select.name] = "Type"
859
- else
860
- if (entcount > 0) && (typcount > 0)
861
- selectTypeType[select.name] = "Hybrid"
862
- else
863
- unknownSelect.push select
864
- end
865
- end
866
- end
867
- if selectTypeType[select.name] == "Hybrid"
868
- puts select.name + " is Hybrid select - proxy block(s) generated."
869
- end
870
- end
871
-
872
- # process subsetted select types
873
- selectSubset = Hash.new
874
- selectSubs = Hash.new
875
- for select in renamed_select_list
876
- superselect = NamedType.find_by_name( select.domain )
877
- if superselect.kind_of? EXPSM::TypeSelect
878
- temp = []
879
- superselect.selectitems_array.each{|e|
880
- if e.kind_of? EXPSM::TypeSelect
881
- e.selectitems_array.each{|inner|
882
- if inner.kind_of? EXPSM::TypeSelect
883
- puts "select of select select for " + superselect.name
884
- else
885
- temp << inner.name
886
- end}
887
- else
888
- temp << e.name
889
- end}
890
- if selectSubset[superselect.name].nil?
891
- selectSubset[superselect.name] = temp.dup
892
- end
893
- select.wheres.each{|rule| ruleString = rule.expression.upcase
894
- if ruleString[0..5] == "NOT ('"
895
- startPos = ruleString.index('.',6) + 1
896
- endPos = ruleString.index("'",startPos) - 1
897
- removeName = ruleString[startPos..endPos]
898
- temp.reject!{|e| e.upcase == removeName}
899
- else
900
- puts "Unexpected expression: " + rule.expression
901
- end
902
- }
903
- selectSubset[select.name] = temp
904
- selectSubset[superselect.name] = selectSubset[superselect.name] - temp
905
- if selectSubs[superselect.name].nil?
906
- selectSubs[superselect.name] = [select.name]
907
- else
908
- selectSubs[superselect.name] << select.name
909
- end
910
- selectTypeType[select.name] = selectTypeType[superselect.name]
911
- else
912
- puts "ERROR: Unhandled select subset for " + superselect.name
913
- end
914
- end
915
-
916
- if schema_list.size > 1
917
- res = ERB.new(package_start)
918
- t = res.result(binding)
919
- file.puts t
920
-
921
- #Apply sysml profile
922
- res = ERB.new(apply_sysml)
923
- t = res.result(binding)
924
- file.puts t
925
- end
926
-
927
- for schema in schema_list
928
- # Set up storage for handling nested Aggregates correctly
929
- nestedAggs = Hash.new
930
- nestedTypes = Hash.new
931
- prefix = get_prefix.call(schema)
932
-
933
- entity_list = schema.contents.find_all{ |e| e.kind_of? EXPSM::Entity }
934
- for entity in entity_list
935
- entity_inverse_list = entity.attributes.find_all{ |e| e.kind_of? EXPSM::Inverse }
936
- for inverse in entity_inverse_list
937
- all_inverse_list.push inverse
938
- end
939
- end
940
-
941
- # Evaluate and write schema start template
942
- xmiid = '_1_' + schema.name
943
- res = ERB.new(schema_start_template)
944
- t = res.result(binding)
945
- file.puts t
946
-
947
- if schema_list.size == 1
948
- #Apply sysml profile
949
- res = ERB.new(apply_sysml)
950
- t = res.result(binding)
951
- file.puts t
952
- end
953
-
954
- interfaced_schema_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::InterfaceSpecification}
955
- for interfaced_schema in interfaced_schema_list
956
- # Evaluate and write schema interface template
957
- xmiid = '_2_' + schema.name + '-' + interfaced_schema.foreign_schema_id
958
- res = ERB.new(schema_interface_template)
959
- t = res.result(binding)
960
- file.puts t
961
- end
962
-
963
- # Map EXPRESS TYPE of Builtin
964
- type_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::Type and e.isBuiltin}
965
- for type in type_list
966
- xmiid = prefix + type.name
967
- xmiid_type = xmiid
968
- xmiid_general = type.domain
969
- if ["BOOLEAN", "LOGICAL"].include?(type.domain)
970
- enum = type
971
- general = type.domain
972
- gen_xmiid = '_supertype' + xmiid
973
- res = ERB.new(enum_start_template)
974
- t = res.result(binding)
975
- file.puts t
976
- else
977
- res = ERB.new(type_template)
978
- t = res.result(binding)
979
- file.puts t
980
- end
981
-
982
- # Map TYPE Select has Type as item
983
- for select in type.selectedBy
984
- # sort out what type of select we are dealing with
985
- case selectTypeType[select.name]
986
- when "Type"
987
- superName = select.name
988
- subset = selectSubset[superName]
989
- if !subset.nil?
990
- if !subset.include?(type.name)
991
- selectSubs[superName].each{|e|
992
- if selectSubset[e].include?(type.name)
993
- superName = e
994
- end}
995
- end
996
- end
997
- xmiid = '_2_selectitem' + prefix + type.name + '-' + superName
998
- xmiid_general = prefix + superName
999
- res = ERB.new(supertype_template)
1000
- t = res.result(binding)
1001
- file.puts t
1002
- when "Hybrid"
1003
- typeProxy = typeProxies[type.name]
1004
- if typeProxy.nil?
1005
- typeProxies[type.name] = type
1006
- end
1007
- when "Remove"
1008
- # do nothing
1009
- end
1010
- end
1011
-
1012
- # Map EXPRESS Where rules
1013
- whererules = type.wheres.select {|w| w.name[0..10] != "encapsulate"}
1014
- if whererules.size > 0
1015
- for where in whererules
1016
- xmiid = '_3_whr' + prefix + type.name + '-' + where.name.to_s
1017
- where_ocl = get_where(xmiid, where.expression)
1018
- if where_ocl.size > 0
1019
- xmiidref = xmiid_type
1020
- res = ERB.new(where_template)
1021
- t = res.result(binding)
1022
- file.puts t
1023
- else
1024
- puts "Where rule " + type.name + "." + where.name + " not mapped to OCL - ignored!"
1025
- end
1026
- end
1027
- end
1028
-
1029
- put_ops(type.name, file)
1030
-
1031
- res = ERB.new(type_end_template)
1032
- t = res.result(binding)
1033
- file.puts t
1034
- end
1035
-
1036
- # Map EXPRESS TYPE of TYPE
1037
- type_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::Type and !e.isBuiltin}
1038
- for type in type_list
1039
- domain = NamedType.find_by_name( type.domain )
1040
- xmiid = prefix + type.name
1041
- xmiid_type = xmiid
1042
- # deal with special cases
1043
- case domain.class.to_s
1044
- when "EXPSM::TypeSelect"
1045
- res = ERB.new(select_start_template)
1046
- t = res.result(binding)
1047
- file.puts t
1048
-
1049
- xmiid = '_2_superselect' + prefix + type.name + '-' + type.domain
1050
- xmiid_general = prefix + type.domain
1051
- res = ERB.new(supertype_template)
1052
- t = res.result(binding)
1053
- file.puts t
1054
-
1055
- when "EXPSM::TypeEnum"
1056
- enum = type
1057
- gen_xmiid = '_2_superenum' + prefix + type.name + '-' + type.domain
1058
- xmiid_general = prefix + type.domain
1059
- general = type.domain
1060
- res = ERB.new(enum_start_template)
1061
- t = res.result(binding)
1062
- file.puts t
1063
-
1064
- else
1065
- xmiid_general = prefix + type.domain
1066
- res = ERB.new(type_template)
1067
- t = res.result(binding)
1068
- file.puts t
1069
- end
1070
-
1071
- # Map TYPE Select has Type as item
1072
- if selectTypeType[type.name] == "Type"
1073
- for select in type.selectedBy
1074
- case selectTypeType[select.name]
1075
- when "Type"
1076
- superName = select.name
1077
- subset = selectSubset[superName]
1078
- if !subset.nil?
1079
- if !subset.include?(type.name)
1080
- selectSubs[superName].each{|e|
1081
- if selectSubset[e].include?(type.name)
1082
- superName = e
1083
- end}
1084
- end
1085
- end
1086
- xmiid = '_2_selectitem' + prefix + type.name + '-' + superName
1087
- xmiid_general = prefix + superName
1088
- res = ERB.new(supertype_template)
1089
- t = res.result(binding)
1090
- file.puts t
1091
- when "Hybrid"
1092
- typeProxy = typeProxies[type.name]
1093
- if typeProxy.nil?
1094
- typeProxies[type.name] = type
1095
- end
1096
- when "Remove"
1097
- # do nothing
1098
- end
1099
- end
1100
- else
1101
- for select in type.selectedBy
1102
- if selectTypeType[select.name] != "Remove"
1103
- superName = select.name
1104
- subset = selectSubset[superName]
1105
- if !subset.nil?
1106
- if !subset.include?(type.name)
1107
- selectSubs[superName].each{|e|
1108
- if selectSubset[e].include?(type.name)
1109
- superName = e
1110
- end}
1111
- end
1112
- end
1113
- xmiid = '_2_selectitem' + prefix + type.name + '-' + superName
1114
- xmiid_general = prefix + superName
1115
- res = ERB.new(supertype_template)
1116
- t = res.result(binding)
1117
- file.puts t
1118
- end
1119
- end
1120
- end
1121
-
1122
- case domain.class.to_s
1123
- when "EXPSM::TypeSelect"
1124
- when "EXPSM::TypeEnum"
1125
- #Map EXPRESS Where rules
1126
- whererules = type.wheres.select {|w| w.name[0..10] != "encapsulate"}
1127
- if whererules.size > 0
1128
- for where in whererules
1129
- xmiid = '_3_whr' + prefix + type.name + '-' + where.name.to_s
1130
- where_ocl = where.expression.gsub("<>", "&lt;&gt;")
1131
- xmiidref = xmiid_type
1132
- res = ERB.new(where_template)
1133
- t = res.result(binding)
1134
- file.puts t
1135
- end
1136
- end
1137
- else
1138
- #Map EXPRESS Where rules
1139
- whererules = type.wheres.select {|w| w.name[0..10] != "encapsulate"}
1140
- if whererules.size > 0
1141
- for where in whererules
1142
- xmiid = '_3_whr' + prefix + type.name + '-' + where.name.to_s
1143
- where_ocl = get_where(xmiid, where.expression)
1144
- if where_ocl.size > 0
1145
- xmiidref = xmiid_type
1146
- res = ERB.new(where_template)
1147
- t = res.result(binding)
1148
- file.puts t
1149
- else
1150
- puts "Where rule " + type.name + "." + where.name + " not mapped to OCL - ignored!"
1151
- end
1152
- end
1153
- end
1154
-
1155
- put_ops(type.name, file)
1156
- end
1157
-
1158
- res = ERB.new(type_end_template)
1159
- t = res.result(binding)
1160
- file.puts t
1161
- end
1162
-
1163
- aggTypes.each_value do |type|
1164
- if type.schema == schema
1165
- # Evaluate and write aggType start template
1166
- # initialize default cardinailty constraints
1167
- isset = true
1168
- islist = false
1169
-
1170
- upper = type.dimensions[0].upper
1171
- if upper == '?'
1172
- upper = '*'
1173
- end
1174
- lower = type.dimensions[0].lower
1175
- if type.dimensions[0].aggrtype == 'ARRAY'
1176
- puts 'Warning ARRAY not fully supported for '+type.name
1177
- upper = (upper.to_i - lower.to_i + 1).to_s
1178
- lower = upper
1179
- end
1180
- if type.dimensions[0].aggrtype == 'LIST'
1181
- islist = true
1182
- end
1183
- if type.dimensions[0].aggrtype == 'BAG'
1184
- isset = false
1185
- end
1186
- if type.dimensions[0].aggrtype == 'LIST' and !type.dimensions[0].isUnique
1187
- isset = false
1188
- end
1189
-
1190
- xmiid = prefix + type.name
1191
- associationNeeded = false
1192
- if type.isBuiltin
1193
- xmiid_type = $dtprefix + type.domain
1194
- else
1195
- xmiid_type = prefix + type.domain
1196
-
1197
- domain = NamedType.find_by_name( type.domain )
1198
- case domain.class.to_s
1199
- when "EXPSM::Entity"
1200
- associationNeeded = true
1201
- when "EXPSM::Type"
1202
- case selectTypeType[type.domain]
1203
- when "Entity", "Hybrid"
1204
- associationNeeded = true
1205
- end
1206
- when "EXPSM::TypeAggregate"
1207
- if !aggTypes[type.domain].nil?
1208
- associationNeeded = true
1209
- end
1210
- when "EXPSM::TypeSelect"
1211
- case selectTypeType[type.domain]
1212
- when "Entity", "Hybrid"
1213
- associationNeeded = true
1214
- end
1215
- end
1216
- end
1217
-
1218
- type_name = type.name
1219
- res = ERB.new(aggtype_start_template)
1220
- t = res.result(binding)
1221
- file.puts t
1222
-
1223
- # Map TYPE Select has Entity as item
1224
- for select in type.selectedBy
1225
- superName = select.name
1226
- subset = selectSubset[superName]
1227
- if !subset.nil?
1228
- if !subset.include?(type.name)
1229
- selectSubs[superName].each{|e|
1230
- if selectSubset[e].include?(type.name)
1231
- superName = e
1232
- end}
1233
- end
1234
- end
1235
- xmiid = '_2_selectitem' + prefix + type.name + '-' + superName
1236
- xmiid_general = prefix + superName
1237
- res = ERB.new(supertype_template)
1238
- t = res.result(binding)
1239
- file.puts t
1240
- end
1241
-
1242
- if associationNeeded
1243
- assoc_xmiid = '_1_association' + prefix + type.name + '-elements'
1244
- end
1245
-
1246
- xmiid = '_2_attr' + prefix + type.name + "-elements"
1247
- res = ERB.new(aggtype_attribute)
1248
- t = res.result(binding)
1249
- file.puts t
1250
-
1251
- res = ERB.new(multiplicity,0,"<>")
1252
- t = res.result(binding)
1253
- if !t.nil? && t.size>0
1254
- file.puts t
1255
- end
1256
-
1257
- res = ERB.new(attribute_end)
1258
- t = res.result(binding)
1259
- file.puts t
1260
-
1261
- res = ERB.new(type_end_template)
1262
- t = res.result(binding)
1263
- file.puts t
1264
-
1265
- if associationNeeded
1266
- res = ERB.new(aggtype_association)
1267
- t = res.result(binding)
1268
- file.puts t
1269
- end
1270
- end
1271
- end
1272
-
1273
- # Map EXPRESS Enumeration Types
1274
- enum_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::TypeEnum }
1275
- for enum in enum_list
1276
-
1277
- superenum = enum.extends_item
1278
- general = nil
1279
- if !superenum.nil?
1280
- if superenum.kind_of? EXPSM::TypeEnum
1281
- # Write Enum Item template for parent (maps to UML same as EXPRESS supertype)
1282
- gen_xmiid = '_2_superenum' + prefix + enum.name + '-' + superenum.name
1283
- xmiid_general = get_prefix.call(superenum.schema) + superenum.name
1284
- general = superenum.name
1285
- end
1286
- end
1287
- # Evaluate and write TYPE Enum start template
1288
- xmiid = prefix + enum.name
1289
- res = ERB.new(enum_start_template)
1290
- t = res.result(binding)
1291
- file.puts t
1292
-
1293
- # Map TYPE Select has Enum as item
1294
- for select in enum.selectedBy
1295
- # sort out what type of select we are dealing with
1296
- case selectTypeType[select.name]
1297
- when "Type"
1298
- superName = select.name
1299
- subset = selectSubset[superName]
1300
- if !subset.nil?
1301
- if !subset.include?(enum.name)
1302
- selectSubs[superName].each{|e|
1303
- if selectSubset[e].include?(enum.name)
1304
- superName = e
1305
- end}
1306
- end
1307
- end
1308
- xmiid = '_2_selectitem' + prefix + enum.name + '-' + superName
1309
- xmiid_general = prefix + superName
1310
- res = ERB.new(supertype_template)
1311
- t = res.result(binding)
1312
- file.puts t
1313
- when "Hybrid"
1314
- typeProxy = typeProxies[enum.name]
1315
- if typeProxy.nil?
1316
- typeProxies[enum.name] = enum
1317
- end
1318
- when "Remove"
1319
- # do nothing
1320
- end
1321
- end
1322
-
1323
- # Evaluate and write Enum Item template for each item
1324
- enumitem_name_list = enum.items.scan(/\w+/)
1325
- for enumitem in enumitem_name_list
1326
- enumitem_xmiid = '_1_enumitem' + prefix + enum.name + '-' + enumitem
1327
- res = ERB.new(enum_item_template)
1328
- t = res.result(binding)
1329
- file.puts t
1330
- end
1331
-
1332
- # Evaluate and write TYPE Enum end template
1333
- res = ERB.new(enum_end_template)
1334
- t = res.result(binding)
1335
- file.puts t
1336
- end
1337
-
1338
- # Map EXPRESS TYPE Selects
1339
- select_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::TypeSelect }
1340
- for type in select_list
1341
- if selectTypeType[type.name] != "Remove"
1342
- # Evaluate and write TYPE Select start template
1343
- xmiid = prefix + type.name
1344
- res = ERB.new(select_start_template)
1345
- t = res.result(binding)
1346
- file.puts t
1347
-
1348
- # Deal with ad-hoc subtype constraints on entities
1349
- superentities = specialSelects[type.name]
1350
- if !superentities.nil?
1351
- superentities.each {|superentity|
1352
- xmiid = '_2_superentity' + prefix + type.name + '-' + superentity.name
1353
- xmiid_general = get_prefix.call(superentity.schema) + superentity.name
1354
- res = ERB.new(supertype_template)
1355
- t = res.result(binding)
1356
- file.puts t}
1357
- end
1358
-
1359
- superselect = type.extends_item
1360
- if !superselect.nil?
1361
- if superselect.kind_of? EXPSM::TypeSelect
1362
- if !superentities.include?(superselect)
1363
- # Write Select Item template for parent (maps to UML same as EXPRESS supertype)
1364
- xmiid = '_2_superselect' + prefix + type.name + '-' + superselect.name
1365
- xmiid_general = get_prefix.call(superselect.schema) + superselect.name
1366
- res = ERB.new(supertype_template)
1367
- t = res.result(binding)
1368
- file.puts t
1369
- end
1370
- end
1371
- end
1372
-
1373
- # Evaluate and write Select Item template for each item (maps to UML same as EXPRESS supertype)
1374
- if selectTypeType[type.name] == "Type"
1375
- for superselect in type.selectedBy
1376
- case selectTypeType[superselect.name]
1377
- when "Hybrid"
1378
- typeProxy = typeProxies[type.name]
1379
- if typeProxy.nil?
1380
- typeProxies[type.name] = type
1381
- end
1382
- when "Remove"
1383
- # do nothing
1384
- else
1385
- superName = superselect.name
1386
- subset = selectSubset[superselect.name]
1387
- if !subset.nil?
1388
- if !subset.include?(type.name)
1389
- selectSubs[superselect.name].each{|e|
1390
- if selectSubset[e].include?(type.name)
1391
- superName = e
1392
- end}
1393
- end
1394
- end
1395
- if superentities.nil? || superentities.all?{|superentity| superentity.name != superName}
1396
- xmiid = '_2_selectitem' + prefix + type.name + '-' + superName
1397
- xmiid_general = prefix + superName
1398
- res = ERB.new(supertype_template)
1399
- t = res.result(binding)
1400
- file.puts t
1401
- end
1402
- end
1403
- end
1404
- else
1405
- for superselect in type.selectedBy
1406
- if selectTypeType[superselect.name] !="Remove"
1407
- superName = superselect.name
1408
- subset = selectSubset[superselect.name]
1409
- if !subset.nil?
1410
- if !subset.include?(type.name)
1411
- selectSubs[superselect.name].each{|e|
1412
- if selectSubset[e].include?(type.name)
1413
- superName = e
1414
- end}
1415
- end
1416
- end
1417
- if superentities.nil? || superentities.all?{|superentity| superentity.name != superName}
1418
- xmiid = '_2_selectitem' + prefix + type.name + '-' + superName
1419
- xmiid_general = prefix + superName
1420
- res = ERB.new(supertype_template)
1421
- t = res.result(binding)
1422
- file.puts t
1423
- end
1424
- end
1425
- end
1426
- end
1427
-
1428
- # Evaluate and write TYPE Select end template
1429
- res = ERB.new(select_end_template)
1430
- t = res.result(binding)
1431
- file.puts t
1432
- end
1433
- end
1434
-
1435
- typeProxies.each_value do |type|
1436
- if type.schema == schema
1437
- # Evaluate and write proxy start template
1438
- xmiid_type = prefix + type.name
1439
- xmiid = xmiid_type + "_Proxy"
1440
- res = ERB.new(proxy_start_template)
1441
- t = res.result(binding)
1442
- file.puts t
1443
-
1444
- # Map TYPE Select has Entity as item
1445
- for select in type.selectedBy
1446
- if selectTypeType[select.name] == "Hybrid"
1447
- superName = select.name
1448
- subset = selectSubset[superName]
1449
- if !subset.nil?
1450
- if !subset.include?(type.name)
1451
- selectSubs[superName].each{|e|
1452
- if selectSubset[e].include?(type.name)
1453
- superName = e
1454
- end}
1455
- end
1456
- end
1457
- xmiid = '_2_selectitem' + prefix + type.name + '-' + superName
1458
- xmiid_general = prefix + superName
1459
- res = ERB.new(supertype_template)
1460
- t = res.result(binding)
1461
- file.puts t
1462
- end
1463
- end
1464
-
1465
- res = ERB.new(type_end_template)
1466
- t = res.result(binding)
1467
- file.puts t
1468
- end
1469
- end
1470
-
1471
- entity_list = schema.contents.find_all{ |e| e.kind_of? EXPSM::Entity }
1472
-
1473
- # Map EXPRESS Explicit Attribute resulting UML Association (the Association is referenced from Class resulting from Entity)
1474
- for entity in entity_list
1475
- attr_list = entity.attributes.find_all{ |e| e.kind_of? EXPSM::Explicit }
1476
- for attr in attr_list
1477
-
1478
- domain_name = attr.domain
1479
- orig_domain = NamedType.find_by_name(domain_name)
1480
- attr_domain = orig_domain
1481
- agg_domain = nil
1482
- attrType = nil
1483
- associationNeeded = false
1484
- begin
1485
- unchanged = true
1486
- case attr_domain.class.to_s
1487
- when "EXPSM::Entity"
1488
- associationNeeded = true
1489
- when "EXPSM::Type"
1490
- case selectTypeType[domain_name]
1491
- when "Entity", "Hybrid"
1492
- associationNeeded = true
1493
- end
1494
- #ignore unhandled named aggregations
1495
- when "EXPSM::TypeAggregate"
1496
- if aggTypes[domain_name].nil?
1497
- attrType = attr_domain
1498
- agg_domain = attr_domain
1499
- if attr_domain.isBuiltin
1500
- domain_name = attr_domain.domain
1501
- attr_domain = nil
1502
- else
1503
- domain_name = attr_domain.domain
1504
- attr_domain = NamedType.find_by_name(domain_name)
1505
- unchanged = false
1506
- end
1507
- else
1508
- associationNeeded = true
1509
- end
1510
- when "EXPSM::TypeSelect"
1511
- case selectTypeType[domain_name]
1512
- when "Entity", "Hybrid"
1513
- associationNeeded = true
1514
- # ignore removed select types
1515
- when "Remove"
1516
- attr_domain = attr_domain.selectitems_array[0]
1517
- domain_name = attr_domain.name
1518
- unchanged = false
1519
- end
1520
- end
1521
- end until unchanged
1522
-
1523
- if attr.instance_of? EXPSM::ExplicitAggregate
1524
- attrType = attr
1525
- end
1526
-
1527
- if !attrType.nil?
1528
- if attrType.rank > 1
1529
- associationNeeded = true
1530
- for i in 2..attrType.rank
1531
- domain_name = attrType.dimensions[i-1].aggrtype+domain_name
1532
- end
1533
- end
1534
- end
1535
-
1536
- if associationNeeded
1537
- xmiid = '_1_association' + prefix + entity.name + '-' + attr.name
1538
- attr_xmiid = '_2_attr' + prefix + entity.name + '-' + attr.name
1539
- owner_xmiid = prefix + entity.name
1540
- if attr_domain.nil?
1541
- domain_xmiid = prefix + domain_name
1542
- else
1543
- domain_xmiid = get_prefix.call(attr_domain.schema) + attr_domain.name
1544
- end
1545
-
1546
- general_exists = false
1547
- if attr.redeclare_entity
1548
- general_exists = true
1549
- redeclare_entity = NamedType.find_by_name( attr.redeclare_entity )
1550
- general_xmiid = '_2_general' + prefix + entity.name + '-' + attr.name
1551
- if attr.redeclare_oldname
1552
- redefined_xmiid = '_1_association' + get_prefix.call(redeclare_entity.schema) + attr.redeclare_entity + '-' + attr.redeclare_oldname
1553
- else
1554
- redefined_xmiid = '_1_association' + get_prefix.call(redeclare_entity.schema) + attr.redeclare_entity + '-' + attr.name
1555
- end
1556
- end
1557
-
1558
- # check if inverse refers to this attribute, affects how association is written
1559
- inverse_exists = false
1560
- direct_inverse = false
1561
- for inverse in all_inverse_list
1562
- if inverse.reverseAttr == attr
1563
- if attr.domain == inverse.entity.name
1564
- iattr_xmiid = '_2_attr' + get_prefix.call(inverse.entity.schema) + inverse.entity.name + '-' + inverse.name
1565
- direct_inverses.push inverse
1566
- all_inverse_list.delete inverse
1567
- if !inverse.instance_of? EXPSM::InverseAggregate
1568
- direct_inverse = true
1569
- end
1570
- inverse_exists = true
1571
- end
1572
- end
1573
- end
1574
-
1575
- encapsulated = false
1576
- if !attr_domain.nil?
1577
- if attr_domain == orig_domain
1578
- encapsulated = isEncapsulated(attr_domain, attr)
1579
- else
1580
- if !agg_domain.nil?
1581
- encapsulated = isEncapsulated(agg_domain, attr)
1582
- end
1583
- if !encapsulated
1584
- encapsulated = isEncapsulated(attr_domain, attr)
1585
- if !encapsulated
1586
- encapsulated = isEncapsulated(orig_domain, attr)
1587
- end
1588
- end
1589
- end
1590
- end
1591
-
1592
- encapsulatedInto = false
1593
- if !inverse_exists
1594
- encapsulatedInto = isEncapsulatedInto(entity, entity, attr)
1595
- end
1596
-
1597
- res = ERB.new(attribute_entity_association_template)
1598
- t = res.result(binding)
1599
- file.puts t
1600
- end
1601
- end
1602
- end
1603
-
1604
- # Map EXPRESS Inverse Attribute resulting UML Association (the Association is referenced from Class resulting from Entity)
1605
- for inverse in all_inverse_list
1606
- if inverse.entity.schema == schema
1607
- temp_id = get_prefix.call(inverse.entity.schema) + inverse.entity.name + '-' + inverse.name
1608
- xmiid = '_1_association' + temp_id
1609
- owner_xmiid = get_prefix.call(inverse.entity.schema) + inverse.entity.name
1610
- iattr_xmiid = '_2_attr' + temp_id
1611
-
1612
- general_xmiid = '_2_general' + temp_id
1613
- redefined_xmiid = '_1_association' + get_prefix.call(inverse.reverseAttr.entity.schema) + inverse.reverseAttr.entity.name + '-' + inverse.reverseAttr_id
1614
-
1615
- lower = '1'
1616
- upper = '1'
1617
- if inverse.reverseAttr.instance_of? EXPSM::ExplicitAggregate
1618
- if inverse.reverseAttr.rank == 1
1619
- upper = inverse.reverseAttr.dimensions[0].upper
1620
- if upper == '?'
1621
- upper = '*'
1622
- end
1623
- lower = inverse.reverseAttr.dimensions[0].lower
1624
- end
1625
- end
1626
- if inverse.reverseAttr.isOptional
1627
- lower = '0'
1628
- end
1629
- res = ERB.new(inverse_entity_association_template)
1630
- t = res.result(binding)
1631
- file.puts t
1632
-
1633
- res = ERB.new(multiplicity,0,"<>")
1634
- t = res.result(binding)
1635
- if !t.nil? && t.size>0
1636
- file.puts t
1637
- end
1638
-
1639
- res = ERB.new(inverse_entity_association_end)
1640
- t = res.result(binding)
1641
- file.puts t
1642
- end
1643
- end
1644
-
1645
- # Map EXPRESS Entity Types
1646
- for entity in entity_list
1647
- lowBounds = Hash.new
1648
-
1649
- # Evaluate and write ENTITY start template
1650
- xmiid = prefix + entity.name
1651
- xmiid_entity = xmiid
1652
- res = ERB.new(entity_start_template)
1653
- t = res.result(binding)
1654
- file.puts t
1655
-
1656
-
1657
- # Map Entity is SUBTYPE OF (i.e. list of supertypes)
1658
- for supertype in entity.supertypes_array
1659
- xmiid = '_2_supertype' + prefix + entity.name + '-' + supertype.name
1660
- xmiid_general = get_prefix.call(supertype.schema) + supertype.name
1661
- res = ERB.new(supertype_template)
1662
- t = res.result(binding)
1663
- file.puts t
1664
- end
1665
-
1666
- # Map TYPE Select has Entity as item
1667
- for select in entity.selectedBy
1668
- if selectTypeType[select.name] != "Remove"
1669
- superName = select.name
1670
- subset = selectSubset[superName]
1671
- if !subset.nil?
1672
- if !subset.include?(entity.name)
1673
- selectSubs[superName].each{|e|
1674
- if selectSubset[e].include?(entity.name)
1675
- superName = e
1676
- end}
1677
- end
1678
- end
1679
- xmiid = '_2_selectitem' + prefix + entity.name + '-' + superName
1680
- xmiid_general = prefix + superName
1681
- res = ERB.new(supertype_template)
1682
- t = res.result(binding)
1683
- file.puts t
1684
- else
1685
- # if in a select list that has been removed make it a subtype of all selects that include the removed select
1686
- for superselect in all_select_list
1687
- if superselect.selectitems_array.include?(select)
1688
- superName = superselect.name
1689
- subset = selectSubset[superName]
1690
- if !subset.nil?
1691
- if !subset.include?(select.name)
1692
- selectSubs[superName].each{|e|
1693
- if selectSubset[e].include?(select.name)
1694
- superName = e
1695
- end}
1696
- end
1697
- end
1698
- puts entity.name + " added to " + superName
1699
- puts " following removal of " + select.name
1700
- xmiid = '_2_selectitem' + prefix + entity.name + '-' + superName
1701
- xmiid_general = prefix + superName
1702
- res = ERB.new(supertype_template)
1703
- t = res.result(binding)
1704
- file.puts t
1705
- end
1706
- end
1707
- end
1708
- end
1709
-
1710
- # Map EXPRESS Explicit Attributes
1711
- attr_list = entity.attributes.find_all{ |e| e.kind_of? EXPSM::Explicit }
1712
- for attr in attr_list
1713
- xmiid = '_2_attr' + prefix + entity.name + '-' + attr.name
1714
-
1715
- # set up references resulting from attribute being a redeclaration
1716
- if attr.redeclare_entity
1717
- redeclare_entity = NamedType.find_by_name( attr.redeclare_entity )
1718
- if attr.redeclare_oldname
1719
- redefined_xmiid = '_2_attr' + get_prefix.call(redeclare_entity.schema) + attr.redeclare_entity + '-' + attr.redeclare_oldname
1720
- else
1721
- redefined_xmiid = '_2_attr' + get_prefix.call(redeclare_entity.schema) + attr.redeclare_entity + '-' + attr.name
1722
- end
1723
- end
1724
-
1725
- # initialize default cardinailty constraints
1726
- lower = '1'
1727
- upper = '1'
1728
- isset = true
1729
- islist = false
1730
-
1731
- domain_name = attr.domain
1732
- orig_domain = NamedType.find_by_name( attr.domain )
1733
- attr_domain = orig_domain
1734
- agg_domain = nil
1735
- attrType = nil
1736
- associationNeeded = false
1737
- begin
1738
- unchanged = true
1739
- case attr_domain.class.to_s
1740
- when "EXPSM::Entity"
1741
- associationNeeded = true
1742
- when "EXPSM::Type"
1743
- case selectTypeType[attr_domain.name]
1744
- when "Entity", "Hybrid"
1745
- associationNeeded = true
1746
- end
1747
- #ignore unhandled named aggregations
1748
- when "EXPSM::TypeAggregate"
1749
- if aggTypes[attr.domain].nil?
1750
- attrType = attr_domain
1751
- agg_domain = attr_domain
1752
- if attr_domain.isBuiltin
1753
- domain_name = attr_domain.domain
1754
- attr_domain = nil
1755
- else
1756
- newDomain = NamedType.find_by_name( attr_domain.domain )
1757
- attr_domain = newDomain
1758
- domain_name = attr_domain.name
1759
- unchanged = false
1760
- end
1761
- else
1762
- associationNeeded = true
1763
- end
1764
- when "EXPSM::TypeSelect"
1765
- case selectTypeType[attr_domain.name]
1766
- when "Entity", "Hybrid"
1767
- associationNeeded = true
1768
- # ignore removed select types
1769
- when "Remove"
1770
- attr_domain = attr_domain.selectitems_array[0]
1771
- domain_name = attr_domain.name
1772
- unchanged = false
1773
- end
1774
- end
1775
- end until unchanged
1776
-
1777
- # set up cardinailty constraints from attribute being a 1-D aggregate
1778
- # or a type defined to be a 1-D aggregate
1779
- if attr.instance_of? EXPSM::ExplicitAggregate
1780
- attrType = attr
1781
- end
1782
-
1783
- if !attrType.nil?
1784
- upper = attrType.dimensions[0].upper
1785
- if upper == '?'
1786
- upper = '*'
1787
- end
1788
- lower = attrType.dimensions[0].lower
1789
- if attrType.dimensions[0].aggrtype == 'ARRAY'
1790
- puts 'Warning ARRAY not fully supported for '+attr.name
1791
- end
1792
- if attrType.dimensions[0].aggrtype == 'LIST'
1793
- islist = true
1794
- end
1795
- if attrType.dimensions[0].aggrtype == 'BAG'
1796
- isset = false
1797
- end
1798
- if attrType.dimensions[0].aggrtype == 'LIST' and !attrType.dimensions[0].isUnique
1799
- isset = false
1800
- end
1801
- if attrType.rank > 1
1802
- associationNeeded = true
1803
- for i in 2..attrType.rank
1804
- domain_name = attrType.dimensions[i-1].aggrtype+domain_name+lower+upper
1805
- nestedAggs[domain_name] = attrType.dimensions[i-1]
1806
- nestedTypes[domain_name] = attrType
1807
- end
1808
- end
1809
- end
1810
- if attr.isOptional
1811
- case lower
1812
- when '0','1'
1813
- else
1814
- lowBounds[attr.name] = lower
1815
- end
1816
- lower = '0'
1817
- end
1818
-
1819
- # Map EXPRESS Explicit Attributes that need an association
1820
- if associationNeeded
1821
- if attr_domain.nil?
1822
- domain_xmiid = prefix + domain_name
1823
- else
1824
- domain_xmiid = get_prefix.call(attr_domain.schema) + domain_name
1825
- end
1826
- assoc_xmiid = '_1_association' + prefix + entity.name + '-' + attr.name
1827
-
1828
- direct_inverse = false
1829
- encapsulatedInto = false
1830
- for inverse in direct_inverses
1831
- if inverse.reverseAttr == attr
1832
- if !inverse.instance_of? EXPSM::InverseAggregate
1833
- direct_inverse = true
1834
- encapsulatedInto = isEncapsulatedInto(entity, entity, attr)
1835
- end
1836
- end
1837
- end
1838
-
1839
- if !attr_domain.nil?
1840
- if attr_domain == orig_domain
1841
- encapsulated = isEncapsulated(attr_domain, attr)
1842
- else
1843
- if !agg_domain.nil?
1844
- encapsulated = isEncapsulated(agg_domain, attr)
1845
- else
1846
- encapsulated = false
1847
- end
1848
- if !encapsulated
1849
- encapsulated = isEncapsulated(attr_domain, attr)
1850
- if !encapsulated
1851
- encapsulated = isEncapsulated(orig_domain, attr)
1852
- end
1853
- end
1854
- end
1855
- end
1856
-
1857
- res = ERB.new(attribute_entity_template,0,"<>")
1858
- t = res.result(binding)
1859
- file.puts t
1860
- else
1861
- # Map EXPRESS Explicit Attributes of Builtin
1862
- if attr.isBuiltin or (attr_domain.nil?)
1863
- res = ERB.new(attribute_builtin_template,0,"<>")
1864
- t = res.result(binding)
1865
- file.puts t
1866
- else
1867
- # Map EXPRESS Explicit Attributes of TYPE, TYPE Enum and TYPE Select (type)
1868
- type_xmiid = get_prefix.call(attr_domain.schema) + domain_name
1869
- res = ERB.new(attribute_enum_type_template,0,"<>")
1870
- t = res.result(binding)
1871
- file.puts t
1872
- end
1873
- end
1874
-
1875
- res = ERB.new(multiplicity,0,"<>")
1876
- t = res.result(binding)
1877
- if !t.nil? && t.size>0
1878
- file.puts t
1879
- end
1880
-
1881
- res = ERB.new(attribute_end)
1882
- t = res.result(binding)
1883
- file.puts t
1884
- end
1885
-
1886
- #Map EXPRESS Inverse Attributes
1887
- inverse_attr_list = entity.attributes.find_all{ |e| e.kind_of? EXPSM::Inverse }
1888
- for inverse in inverse_attr_list
1889
- xmiid = '_2_attr' + prefix + entity.name + '-' + inverse.name
1890
- # set up references resulting from attribute being a redeclaration
1891
- if inverse.redeclare_entity
1892
- if inverse.redeclare_oldname
1893
- redefined_xmiid = '_2_attr' + prefix + inverse.redeclare_entity + '-' + inverse.redeclare_oldname
1894
- else
1895
- redefined_xmiid = '_2_attr' + prefix + inverse.redeclare_entity + '-' + inverse.name
1896
- end
1897
- end
1898
-
1899
- lower = '1'
1900
- upper = '1'
1901
- isset = true
1902
- if inverse.instance_of? EXPSM::InverseAggregate
1903
- lower = '0'
1904
- upper = '*'
1905
- if inverse.upper != '?'
1906
- upper = inverse.upper
1907
- end
1908
- if inverse.lower != '0'
1909
- lower = inverse.lower
1910
- end
1911
- if inverse.aggrtype == 'BAG'
1912
- isset = false
1913
- end
1914
- end
1915
- domain_xmiid = prefix + inverse.reverseEntity.name
1916
- if all_inverse_list.include?(inverse)
1917
- assoc_xmiid = '_1_association' + get_prefix.call(inverse.reverseEntity.schema) + entity.name + '-' + inverse.name
1918
- else
1919
- if inverse.reverseAttr.domain == entity.name
1920
- assoc_xmiid = '_1_association' + get_prefix.call(inverse.reverseEntity.schema) + inverse.reverseEntity.name + '-' + inverse.reverseAttr_id
1921
- else
1922
- assoc_xmiid = '_1_association' + get_prefix.call(inverse.reverseEntity.schema) + entity.name + '-' + inverse.reverseAttr_id
1923
- end
1924
- end
1925
-
1926
- encapsulatedInto = isEncapsulatedInto(inverse.reverseEntity, inverse.reverseEntity, inverse.reverseAttr)
1927
-
1928
- res = ERB.new(inverse_attribute_template)
1929
- t = res.result(binding)
1930
- file.puts t
1931
-
1932
- res = ERB.new(multiplicity,0,"<>")
1933
- t = res.result(binding)
1934
- if !t.nil? && t.size>0
1935
- file.puts t
1936
- end
1937
-
1938
- res = ERB.new(attribute_end)
1939
- t = res.result(binding)
1940
- file.puts t
1941
- end
1942
-
1943
- # Create lower bound constraints where required
1944
- lowBounds.each do |name, bound|
1945
- xmiid = '_3_lb' + prefix + entity.name + '-' + name
1946
- res = ERB.new(bound_constraint)
1947
- t = res.result(binding)
1948
- file.puts t
1949
- end
1950
-
1951
- # Map EXPRESS Unique rules
1952
- if entity.uniques.size > 0
1953
- for unique in entity.uniques
1954
- xmiid = '_3_uniq' + prefix + entity.name + '-' + unique.name
1955
- if unique.attributes.size == 1
1956
- unique_text = unique.attributes[0]
1957
- else
1958
- unique_text = 'Sequence{'+ unique.attributes.join(', ') +'}'
1959
- end
1960
- res = ERB.new(unique_template)
1961
- t = res.result(binding)
1962
- file.puts t
1963
- end
1964
- end
1965
-
1966
- # Map EXPRESS Where rules
1967
- whererules = entity.wheres.select {|w| w.name[0..10] != "encapsulate"}
1968
- if whererules.size > 0
1969
- for where in whererules
1970
- xmiid = '_3_whr' + prefix + entity.name + '-' + where.name.to_s
1971
- where_ocl = get_where(xmiid, where.expression)
1972
- if where_ocl.size > 0
1973
- xmiidref = xmiid_entity
1974
- res = ERB.new(where_template)
1975
- t = res.result(binding)
1976
- file.puts t
1977
- else
1978
- puts "Where rule " + entity.name + "." + where.name.to_s + " not mapped to OCL - ignored!"
1979
- end
1980
- end
1981
- end
1982
-
1983
- # Evaluate and write ENTITY end template
1984
- res = ERB.new(entity_end_template)
1985
- t = res.result(binding)
1986
- file.puts t
1987
- end
1988
-
1989
- nestedAggs.each do |type_name, dimension|
1990
- # Evaluate and write aggType start template
1991
- # initialize default cardinailty constraints
1992
- isset = true
1993
- islist = false
1994
-
1995
- upper = dimension.upper
1996
- if upper == '?'
1997
- upper = '*'
1998
- end
1999
- lower = dimension.lower
2000
- if dimension.aggrtype == 'LIST'
2001
- islist = true
2002
- end
2003
- if dimension.aggrtype == 'BAG'
2004
- isset = false
2005
- end
2006
- if dimension.aggrtype == 'LIST' and !dimension.isUnique
2007
- isset = false
2008
- end
2009
-
2010
- xmiid = prefix + type_name
2011
- type = nestedTypes[type_name]
2012
- associationNeeded = false
2013
-
2014
- if type.isBuiltin
2015
- xmiid_type = $dtprefix + type.domain
2016
- else
2017
- xmiid_type = prefix + type.domain
2018
-
2019
- domain = NamedType.find_by_name( type.domain )
2020
- case domain.class.to_s
2021
- when "EXPSM::Entity"
2022
- associationNeeded = true
2023
- when "EXPSM::Type"
2024
- case selectTypeType[type.domain]
2025
- when "Entity", "Hybrid"
2026
- associationNeeded = true
2027
- end
2028
- when "EXPSM::TypeAggregate"
2029
- if !aggTypes[type.domain].nil?
2030
- associationNeeded = true
2031
- end
2032
- when "EXPSM::TypeSelect"
2033
- case selectTypeType[type.domain]
2034
- when "Entity", "Hybrid"
2035
- associationNeeded = true
2036
- end
2037
- end
2038
- end
2039
- res = ERB.new(aggtype_start_template)
2040
- t = res.result(binding)
2041
- file.puts t
2042
-
2043
- if associationNeeded
2044
- assoc_xmiid = '_1_association' + prefix + type.name + '-elements'
2045
- end
2046
-
2047
- xmiid = '_2_attr' + prefix + type.name + "-elements"
2048
- res = ERB.new(aggtype_attribute)
2049
- t = res.result(binding)
2050
- file.puts t
2051
-
2052
- res = ERB.new(multiplicity,0,"<>")
2053
- t = res.result(binding)
2054
- if !t.nil? && t.size>0
2055
- file.puts t
2056
- end
2057
-
2058
- res = ERB.new(attribute_end)
2059
- t = res.result(binding)
2060
- file.puts t
2061
-
2062
- res = ERB.new(type_end_template)
2063
- t = res.result(binding)
2064
- file.puts t
2065
-
2066
- if associationNeeded
2067
- res = ERB.new(aggtype_association)
2068
- t = res.result(binding)
2069
- file.puts t
2070
- end
2071
- end
2072
-
2073
- # Evaluate and write SCHEMA end template
2074
- res = ERB.new(schema_end_template)
2075
- t = res.result(binding)
2076
- file.puts t
2077
- end
2078
-
2079
- if schema_list.size > 1
2080
- res = ERB.new(package_end)
2081
- t = res.result(binding)
2082
- file.puts t
2083
- end
2084
-
2085
- # Map EXPRESS Entity Types to blocks
2086
- for schema in schema_list
2087
- prefix = get_prefix.call(schema)
2088
-
2089
- entity_list = schema.contents.find_all{ |e| e.kind_of? EXPSM::Entity }
2090
-
2091
- for entity in entity_list
2092
- # Evaluate and write ENTITY Block template
2093
- baseClass = prefix + entity.name
2094
- xmiid = baseClass + '-Block'
2095
- res = ERB.new(entity_block_template)
2096
- t = res.result(binding)
2097
- file.puts t
2098
- end
2099
-
2100
- type_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::TypeEnum}
2101
- for type in type_list
2102
- # Evaluate and write TYPE ValueType template
2103
- baseType = prefix + type.name
2104
- xmiid = baseType + '-ValueType'
2105
- res = ERB.new(valuetype_template)
2106
- t = res.result(binding)
2107
- file.puts t
2108
- end
2109
-
2110
- type_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::Type and e.isBuiltin}
2111
- for type in type_list
2112
- # Evaluate and write TYPE ValueType template
2113
- baseType = prefix + type.name
2114
- xmiid = baseType + '-ValueType'
2115
- res = ERB.new(valuetype_template)
2116
- t = res.result(binding)
2117
- file.puts t
2118
- end
2119
-
2120
- type_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::Type and !e.isBuiltin}
2121
- for type in type_list
2122
- superselect = NamedType.find_by_name( type.domain )
2123
- if !superselect.kind_of? EXPSM::TypeSelect
2124
- # Evaluate and write TYPE ValueType template
2125
- baseType = prefix + type.name
2126
- xmiid = baseType + '-ValueType'
2127
- res = ERB.new(valuetype_template)
2128
- t = res.result(binding)
2129
- file.puts t
2130
- end
2131
- end
2132
- end
2133
-
2134
- for select in all_select_list
2135
- case selectTypeType[select.name]
2136
- when "Type"
2137
- # Evaluate and write TYPE ValueType template
2138
- baseType = prefix + select.name
2139
- xmiid = baseType + '-ValueType'
2140
- res = ERB.new(valuetype_template)
2141
- t = res.result(binding)
2142
- file.puts t
2143
- xmiid = baseType + '-Auxiliary'
2144
- res = ERB.new(select_stereotype_template)
2145
- t = res.result(binding)
2146
- file.puts t
2147
- when "Remove"
2148
- # do nothing
2149
- else
2150
- # Evaluate and write ENTITY Block template
2151
- baseClass = prefix + select.name
2152
- xmiid = baseClass + '-Block'
2153
- res = ERB.new(entity_block_template)
2154
- t = res.result(binding)
2155
- file.puts t
2156
- xmiid = baseClass + '-Auxiliary'
2157
- res = ERB.new(select_stereotype_template)
2158
- t = res.result(binding)
2159
- file.puts t
2160
- end
2161
- end
2162
-
2163
- selectSubset.each_key do |select|
2164
- if selectSubs[select].nil?
2165
- case selectTypeType[select]
2166
- when "Type"
2167
- # Evaluate and write TYPE ValueType template
2168
- baseType = prefix + select
2169
- xmiid = baseType + '-ValueType'
2170
- res = ERB.new(valuetype_template)
2171
- t = res.result(binding)
2172
- file.puts t
2173
- xmiid = baseType + '-Auxiliary'
2174
- res = ERB.new(select_stereotype_template)
2175
- t = res.result(binding)
2176
- file.puts t
2177
- when "Remove"
2178
- # do nothing
2179
- else
2180
- # Evaluate and write ENTITY Block template
2181
- baseClass = prefix + select
2182
- xmiid = baseClass + '-Block'
2183
- res = ERB.new(entity_block_template)
2184
- t = res.result(binding)
2185
- file.puts t
2186
- xmiid = baseClass + '-Auxiliary'
2187
- res = ERB.new(select_stereotype_template)
2188
- t = res.result(binding)
2189
- file.puts t
2190
- end
2191
- end
2192
- end
2193
-
2194
- typeProxies.each_value do |type|
2195
- # Evaluate and write ENTITY Block template
2196
- baseClass = prefix + type.name + "_Proxy"
2197
- xmiid = baseClass + '-Block'
2198
- res = ERB.new(entity_block_template)
2199
- t = res.result(binding)
2200
- file.puts t
2201
- xmiid = baseClass + '-Type'
2202
- res = ERB.new(type_stereotype_template)
2203
- t = res.result(binding)
2204
- file.puts t
2205
- end
2206
-
2207
- aggTypes.each_value do |type|
2208
- # Evaluate and write ENTITY Block template
2209
- baseClass = prefix + type.name
2210
- xmiid = baseClass + '-Block'
2211
- res = ERB.new(entity_block_template)
2212
- t = res.result(binding)
2213
- file.puts t
2214
- xmiid = baseClass + '-Type'
2215
- res = ERB.new(type_stereotype_template)
2216
- t = res.result(binding)
2217
- file.puts t
2218
- end
2219
-
2220
- nestedTypes.each_key do |type_name|
2221
- # Evaluate and write ENTITY Block template
2222
- baseClass = prefix + type_name
2223
- xmiid = baseClass + '-Block'
2224
- res = ERB.new(entity_block_template)
2225
- t = res.result(binding)
2226
- file.puts t
2227
- xmiid = baseClass + '-Type'
2228
- res = ERB.new(type_stereotype_template)
2229
- t = res.result(binding)
2230
- file.puts t
2231
- end
2232
-
2233
- if dtHandle != "ignore"
2234
- if dtHandle == "export"
2235
- if !uuidSafe.nil?
2236
- tmp = uuidSafe
2237
- uuidSafe = $uuidxml
2238
- $uuidxml = tmp
2239
- tmp = uuidOldSafe
2240
- uuidOldSafe = $olduuids
2241
- $olduuids = tmp
2242
- end
2243
- end
2244
- res = ERB.new(data_type_stereos)
2245
- t = res.result(binding)
2246
- dtfile.puts t
2247
- if dtHandle == "export"
2248
- res = ERB.new(overall_end_template)
2249
- t = res.result(binding)
2250
- dtfile.puts t
2251
- if !uuidSafe.nil?
2252
- for uuidmap in $olduuids
2253
- uuidmap.remove
2254
- end
2255
- File.open("DataTypes_UUIDs.xml","w"){|file| $uuidxml.write_xml_to file}
2256
- $uuidxml = uuidSafe
2257
- $olduuids = uuidOldSafe
2258
- end
2259
- dtfile.close
2260
- end
2261
- end
2262
-
2263
- # Evaluate and write file end template
2264
- res = ERB.new(overall_end_template)
2265
- t = res.result(binding)
2266
- file.puts t
2267
-
2268
- file.close
2269
-
2270
- if $uuidsRequired
2271
- for uuidmap in $olduuids
2272
- uuidmap.remove
2273
- end
2274
- File.open("UUIDs.xml","w"){|file| $uuidxml.write_xml_to file}
2275
- end
2276
-
2277
- if !$wherexml.nil?
2278
- File.open("WhereRuleMapping.xml","w"){|file| $wherexml.write_xml_to file}
2279
- end
2280
- end
2281
-