expressir 0.2.7-arm64-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 (183) hide show
  1. checksums.yaml +7 -0
  2. data/.cross_rubies +30 -0
  3. data/.github/workflows/rake.yml +45 -0
  4. data/.github/workflows/release.yml +84 -0
  5. data/.gitignore +17 -0
  6. data/.gitmodules +3 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +508 -0
  9. data/Gemfile +4 -0
  10. data/README.adoc +147 -0
  11. data/Rakefile +11 -0
  12. data/bin/console +12 -0
  13. data/bin/rspec +29 -0
  14. data/bin/setup +8 -0
  15. data/demo.rb +18 -0
  16. data/docs/development.md +90 -0
  17. data/exe/expressir +20 -0
  18. data/exe/generate-parser +48 -0
  19. data/expressir.gemspec +43 -0
  20. data/lib/expressir.rb +21 -0
  21. data/lib/expressir/cli.rb +27 -0
  22. data/lib/expressir/cli/ui.rb +36 -0
  23. data/lib/expressir/config.rb +23 -0
  24. data/lib/expressir/express.rb +11 -0
  25. data/lib/expressir/express/aggregate_dimension.rb +38 -0
  26. data/lib/expressir/express/attribute.rb +15 -0
  27. data/lib/expressir/express/comment.rb +7 -0
  28. data/lib/expressir/express/defined_type.rb +36 -0
  29. data/lib/expressir/express/derived.rb +65 -0
  30. data/lib/expressir/express/derived_aggregate.rb +43 -0
  31. data/lib/expressir/express/entity.rb +137 -0
  32. data/lib/expressir/express/explicit.rb +70 -0
  33. data/lib/expressir/express/explicit_aggregate.rb +46 -0
  34. data/lib/expressir/express/explicit_or_derived.rb +16 -0
  35. data/lib/expressir/express/global_rule.rb +44 -0
  36. data/lib/expressir/express/interface_specification.rb +51 -0
  37. data/lib/expressir/express/interfaced_item.rb +38 -0
  38. data/lib/expressir/express/inverse.rb +46 -0
  39. data/lib/expressir/express/inverse_aggregate.rb +37 -0
  40. data/lib/expressir/express/model_element.rb +7 -0
  41. data/lib/expressir/express/named_type.rb +19 -0
  42. data/lib/expressir/express/remark.rb +8 -0
  43. data/lib/expressir/express/repository.rb +306 -0
  44. data/lib/expressir/express/schema_definition.rb +96 -0
  45. data/lib/expressir/express/subtype_constraint.rb +14 -0
  46. data/lib/expressir/express/type.rb +26 -0
  47. data/lib/expressir/express/type_aggregate.rb +42 -0
  48. data/lib/expressir/express/type_enum.rb +29 -0
  49. data/lib/expressir/express/type_parser.rb +45 -0
  50. data/lib/expressir/express/type_select.rb +82 -0
  51. data/lib/expressir/express/unique_rule.rb +35 -0
  52. data/lib/expressir/express/where_rule.rb +32 -0
  53. data/lib/expressir/express_exp/2.4/express_parser.bundle +0 -0
  54. data/lib/expressir/express_exp/2.5/express_parser.bundle +0 -0
  55. data/lib/expressir/express_exp/2.6/express_parser.bundle +0 -0
  56. data/lib/expressir/express_exp/2.7/express_parser.bundle +0 -0
  57. data/lib/expressir/express_exp/3.0/express_parser.bundle +0 -0
  58. data/lib/expressir/express_exp/formatter.rb +1450 -0
  59. data/lib/expressir/express_exp/parser.rb +41 -0
  60. data/lib/expressir/express_exp/visitor.rb +2464 -0
  61. data/lib/expressir/express_parser.rb +30 -0
  62. data/lib/expressir/model.rb +65 -0
  63. data/lib/expressir/model/attribute.rb +27 -0
  64. data/lib/expressir/model/constant.rb +17 -0
  65. data/lib/expressir/model/entity.rb +46 -0
  66. data/lib/expressir/model/enumeration_item.rb +11 -0
  67. data/lib/expressir/model/expressions/aggregate_initializer.rb +13 -0
  68. data/lib/expressir/model/expressions/aggregate_item.rb +15 -0
  69. data/lib/expressir/model/expressions/attribute_reference.rb +15 -0
  70. data/lib/expressir/model/expressions/binary_expression.rb +40 -0
  71. data/lib/expressir/model/expressions/call.rb +15 -0
  72. data/lib/expressir/model/expressions/entity_constructor.rb +15 -0
  73. data/lib/expressir/model/expressions/group_reference.rb +15 -0
  74. data/lib/expressir/model/expressions/index_reference.rb +17 -0
  75. data/lib/expressir/model/expressions/interval.rb +21 -0
  76. data/lib/expressir/model/expressions/query_expression.rb +26 -0
  77. data/lib/expressir/model/expressions/simple_reference.rb +13 -0
  78. data/lib/expressir/model/expressions/unary_expression.rb +19 -0
  79. data/lib/expressir/model/function.rb +62 -0
  80. data/lib/expressir/model/identifier.rb +10 -0
  81. data/lib/expressir/model/interface.rb +18 -0
  82. data/lib/expressir/model/literals/binary.rb +13 -0
  83. data/lib/expressir/model/literals/integer.rb +13 -0
  84. data/lib/expressir/model/literals/logical.rb +17 -0
  85. data/lib/expressir/model/literals/real.rb +13 -0
  86. data/lib/expressir/model/literals/string.rb +15 -0
  87. data/lib/expressir/model/parameter.rb +17 -0
  88. data/lib/expressir/model/procedure.rb +60 -0
  89. data/lib/expressir/model/renamed_ref.rb +13 -0
  90. data/lib/expressir/model/repository.rb +19 -0
  91. data/lib/expressir/model/rule.rb +62 -0
  92. data/lib/expressir/model/schema.rb +67 -0
  93. data/lib/expressir/model/scope.rb +17 -0
  94. data/lib/expressir/model/statements/alias.rb +26 -0
  95. data/lib/expressir/model/statements/assignment.rb +15 -0
  96. data/lib/expressir/model/statements/call.rb +15 -0
  97. data/lib/expressir/model/statements/case.rb +17 -0
  98. data/lib/expressir/model/statements/case_action.rb +15 -0
  99. data/lib/expressir/model/statements/compound.rb +13 -0
  100. data/lib/expressir/model/statements/escape.rb +8 -0
  101. data/lib/expressir/model/statements/if.rb +17 -0
  102. data/lib/expressir/model/statements/null.rb +8 -0
  103. data/lib/expressir/model/statements/repeat.rb +34 -0
  104. data/lib/expressir/model/statements/return.rb +13 -0
  105. data/lib/expressir/model/statements/skip.rb +8 -0
  106. data/lib/expressir/model/subtype_constraint.rb +27 -0
  107. data/lib/expressir/model/type.rb +24 -0
  108. data/lib/expressir/model/types/aggregate.rb +17 -0
  109. data/lib/expressir/model/types/array.rb +21 -0
  110. data/lib/expressir/model/types/bag.rb +17 -0
  111. data/lib/expressir/model/types/binary.rb +15 -0
  112. data/lib/expressir/model/types/boolean.rb +8 -0
  113. data/lib/expressir/model/types/enumeration.rb +19 -0
  114. data/lib/expressir/model/types/generic.rb +13 -0
  115. data/lib/expressir/model/types/generic_entity.rb +13 -0
  116. data/lib/expressir/model/types/integer.rb +8 -0
  117. data/lib/expressir/model/types/list.rb +19 -0
  118. data/lib/expressir/model/types/logical.rb +8 -0
  119. data/lib/expressir/model/types/number.rb +8 -0
  120. data/lib/expressir/model/types/real.rb +13 -0
  121. data/lib/expressir/model/types/select.rb +21 -0
  122. data/lib/expressir/model/types/set.rb +17 -0
  123. data/lib/expressir/model/types/string.rb +15 -0
  124. data/lib/expressir/model/unique.rb +15 -0
  125. data/lib/expressir/model/variable.rb +17 -0
  126. data/lib/expressir/model/where.rb +15 -0
  127. data/lib/expressir/parser.rb +6 -0
  128. data/lib/expressir/parser/owl_parser.rb +8 -0
  129. data/lib/expressir/version.rb +3 -0
  130. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +9589 -0
  131. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +36619 -0
  132. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +13294 -0
  133. data/original/examples/employment/eclipse/.project +17 -0
  134. data/original/examples/employment/eclipse/Export/Employment.png +0 -0
  135. data/original/examples/employment/eclipse/Express/employment_schema.exp +33 -0
  136. data/original/examples/employment/eclipse/Express/employment_schema.xmi +77 -0
  137. data/original/examples/employment/eclipse/Express/employment_schema.xml +93 -0
  138. data/original/examples/employment/eclipse/Models/Employment.uml +4 -0
  139. data/original/examples/employment/eclipse/Models/Employment.umldi +240 -0
  140. data/original/examples/employment/eclipse/readme.txt +7 -0
  141. data/original/examples/employment/employment_schema.exp +33 -0
  142. data/original/examples/employment/employment_schema.rb +232 -0
  143. data/original/examples/employment/employment_schema.xml +93 -0
  144. data/original/examples/employment/employment_schema___module.rb +46 -0
  145. data/original/examples/employment/employment_schema___p28attr.rb +126 -0
  146. data/original/examples/employment/employment_schema___p28inst.rb +26 -0
  147. data/original/examples/employment/example_employment_data.xml +1 -0
  148. data/original/examples/employment/example_employment_data_copy.xml +1 -0
  149. data/original/examples/employment/example_employment_reader.rb +30 -0
  150. data/original/examples/employment/example_employment_writer.rb +51 -0
  151. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +3710 -0
  152. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +35880 -0
  153. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +15357 -0
  154. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +9468 -0
  155. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +8404 -0
  156. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +43147 -0
  157. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +18341 -0
  158. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +11632 -0
  159. data/original/examples/syntax/remark.exp +146 -0
  160. data/original/examples/syntax/remark_formatted.exp +175 -0
  161. data/original/examples/syntax/syntax.exp +311 -0
  162. data/original/examples/syntax/syntax_formatted.exp +1191 -0
  163. data/original/exp2ruby.rb +525 -0
  164. data/original/expsm.rb +34 -0
  165. data/original/mapping_owl.rb +1018 -0
  166. data/original/mapping_sysml.rb +2281 -0
  167. data/original/mapping_uml2.rb +599 -0
  168. data/original/mapping_uml2_eclipse.rb +433 -0
  169. data/original/reeper.rb +134 -0
  170. data/rakelib/cross-ruby.rake +308 -0
  171. data/spec/acceptance/express_to_owl_spec.rb +18 -0
  172. data/spec/acceptance/version_spec.rb +12 -0
  173. data/spec/expressir/express/repository_spec.rb +25 -0
  174. data/spec/expressir/express_exp/ap233_spec.rb +22 -0
  175. data/spec/expressir/express_exp/format_remark_spec.rb +28 -0
  176. data/spec/expressir/express_exp/format_syntax_spec.rb +28 -0
  177. data/spec/expressir/express_exp/parse_remark_spec.rb +346 -0
  178. data/spec/expressir/express_exp/parse_syntax_spec.rb +3003 -0
  179. data/spec/expressir/model/find_spec.rb +110 -0
  180. data/spec/expressr_spec.rb +5 -0
  181. data/spec/spec_helper.rb +17 -0
  182. data/spec/support/console_helper.rb +29 -0
  183. metadata +357 -0
@@ -0,0 +1,433 @@
1
+ require 'erb'
2
+ # EXPRESS to UML 2 Mapping - Topcased and Eclipse UML version
3
+ # Version 0.2, contribution by Engisis
4
+ #
5
+ # This function navigates the EXPRESS STEPMod Model and performs a structural EXPRESS-to-UML2 (2.1.2) mapping using Ruby ERB templates.
6
+ # 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.
7
+ # This XMI file is then compatible with the open source Eclipse UML implementation (www.eclipse.org/uml2/) and the open source UML2 tools based
8
+ # on top of it (TopCased, Papyrus, etc.)
9
+ #
10
+ # Integer, Boolean, String, Real, Number, Binary, Logical -> 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 Partial Support (REMOVED for now)
22
+ # USE or REFERENCE (even with named items) -> UML PackageImport between Packages
23
+ #
24
+ #######################################################################################
25
+
26
+ def map_from_express( mapinput )
27
+
28
+ # Enter file name here to override defaults (<schema>.xmi if one schema, and Model.xmi if more than one)
29
+ output_xmi_filename = nil
30
+
31
+ # XMI File Start Template (includes datatypes for builtin with no direct UML equivalent)
32
+ prim_types = ['STRING', 'NUMBER', 'BINARY', 'REAL', 'LOGICAL', 'INTEGER', 'BOOLEAN']
33
+ overall_start_template = %{<?xml version="1.0" encoding="UTF-8"?>
34
+ <uml:Model xmi:version = "2.1" xmlns:xmi = "http://schema.omg.org/spec/XMI/2.1" xmlns:uml = "http://www.eclipse.org/uml2/3.0.0/UML" name = "UMLfromEXPRESS" xmi:id = "_0">
35
+ <packagedElement xmi:type="uml:PrimitiveType" xmi:id="REAL" name="Real" />
36
+ <packagedElement xmi:type="uml:PrimitiveType" xmi:id="NUMBER" name="Number" />
37
+ <packagedElement xmi:type="uml:PrimitiveType" xmi:id="BINARY" name="Binary" />
38
+ <packagedElement xmi:type="uml:PrimitiveType" xmi:id="LOGICAL" name="Logical" />
39
+ <packagedElement xmi:type="uml:PrimitiveType" xmi:id="STRING" name="String" />
40
+ <packagedElement xmi:type="uml:PrimitiveType" xmi:id="INTEGER" name="Integer" />
41
+ <packagedElement xmi:type="uml:PrimitiveType" xmi:id="BOOLEAN" name="Boolean" />}
42
+
43
+ # XMI File End Template
44
+ overall_end_template = %{ </uml:Model>}
45
+
46
+ # SCHEMA Start Template
47
+ schema_start_template = %{<packagedElement xmi:type = "uml:Package" xmi:id = "_1_<%= schema.name %>" name = "<%= schema.name %>" visibility = "public">}
48
+
49
+ # SCHEMA INTERFACE Template
50
+ 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 %>'/>}
51
+
52
+ # SCHEMA End Template
53
+ schema_end_template = %{</packagedElement>}
54
+
55
+ # ENTITY Start Template
56
+ entity_start_template = %{<packagedElement xmi:type = "uml:Class" xmi:id = "<%= xmiid %>" name = "<%= entity.name %>" isAbstract = "FALSE" visibility = "public">}
57
+
58
+ # SUBTYPE OF Template
59
+ supertype_template = %{<generalization xmi:type="uml:Generalization" xmi:id="<%= xmiid %>" general="<%= xmiid_supertype %>"/>}
60
+
61
+ # ENTITY End Template
62
+ entity_end_template = %{</packagedElement>}
63
+
64
+ # ENUMERATION Start Template
65
+ enum_start_template = %{<packagedElement xmi:type = "uml:Enumeration" xmi:id = "<%= type_xmiid %>" name = "<%= enum.name %>">}
66
+
67
+ # ENUMERATION ITEM Template
68
+ enum_item_template = %{<ownedLiteral xmi:type="uml:EnumerationLiteral" xmi:id="<%= enumitem_xmiid %>" name="<%= enumitem %>" classifier="<%= type_xmiid %>" enumeration="<%= enumitem_xmiid %>">
69
+ <specification xmi:type="uml:LiteralInteger" xmi:id="<%= enumitem_xmiid + '_specification' %> "/>
70
+ </ownedLiteral>}
71
+
72
+ # ENUMERATION End Template
73
+ enum_end_template = %{</packagedElement>}
74
+
75
+ # SELECT Start Template
76
+ select_start_template = %{<packagedElement xmi:type = "uml:Interface" xmi:id = "<%= xmiid %>" name = "<%= select.name %>" isAbstract = "TRUE" visibility = "public">}
77
+
78
+ # SELECT ITEM IS ENTITY Template
79
+ selectitem_entity_template = %{ <interfaceRealization xmi:type="uml:InterfaceRealization" xmi:id="<%= xmiid %>" supplier="<%= xmiid_supplier %>" client="<%= xmiid_client %>" contract="<%= xmiid_supplier %>" implementingClassifier="<%= xmiid_client %>"/>}
80
+
81
+ # SELECT ITEM IS SELECT Template
82
+ selectitem_select_template = %{ <interfaceRealization xmi:type="uml:InterfaceRealization" xmi:id="<%= xmiid %>" supplier="<%= xmiid_supplier %>" client="<%= xmiid_client %>" contract="<%= xmiid_supplier %>" implementingClassifier="<%= xmiid_client %>"/>}
83
+
84
+ # SELECT End Template
85
+ select_end_template = %{</packagedElement>}
86
+
87
+ # Template covering abstract entity types
88
+ abstract_entity_template = %{}
89
+
90
+ # Template covering the output file contents for each attribute that is an aggregate
91
+ attribute_aggregate_template = %{}
92
+
93
+ # Template covering the output file contents for each attribute that is an aggregate of select of entity
94
+ attribute_aggregate_entity_select_template = %{}
95
+
96
+ # Template covering the output file contents for each attribute that is a select of entity
97
+ attribute_entity_select_template = %{}
98
+
99
+ # Template covering the output file contents for each attribute that is an entity
100
+ # the complex entities are not specified as a property but as an ownedEnd - Eclipse UML needs them in the association
101
+ attribute_entity_template = %{
102
+ <% if prim_types.include? domain_xmiid %> <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 %>>
103
+ <% if lower == '0' %><lowerValue xmi:type="uml:LiteralInteger" xmi:id="<%= xmiid %>-lowerValue"/><% end %>
104
+ <% if lower != '0' and lower != '1' %><lowerValue xmi:type="uml:LiteralInteger" xmi:id="<%= xmiid %>-lowerValue" value="<%= lower %>"/><% end %>
105
+ <% if upper != '1' %><upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="<%= xmiid %>-upperValue" value="<%= upper %>"/><% end %>
106
+ </ownedAttribute>
107
+ <% end %>
108
+ }
109
+
110
+
111
+ # add Association attributes here
112
+ # EXPLICIT ATTRIBUTE ENTITY Create Association Template
113
+ # add a ownerEnd containing the complex entity
114
+ attribute_entity_association_template = %{<packagedElement xmi:type="uml:Association" xmi:id="<%= xmiid %>" name="" visibility='public' isLeaf='false' isAbstract='false' isDerived='false' memberEnd="<%= domain_prop_xmiid %> <%= attr_prop_xmiid %>" navigableOwnedEnd="<%= domain_prop_xmiid %>">
115
+ <ownedEnd xmi:type="uml:Property" xmi:id="<%= domain_prop_xmiid %>" type="<%= domain_xmiid %>" name="<%= domain_attr_name %>" association="<%= xmiid %>" visibility='public'>
116
+ <% if lower == '0' %><lowerValue xmi:type="uml:LiteralInteger" xmi:id="<%= domain_prop_xmiid %>-lowerValue"/>
117
+ <% elsif lower != '0' and lower != '1' %><lowerValue xmi:type="uml:LiteralInteger" xmi:id="<%= domain_prop_xmiid %>-lowerValue" value="<%= lower %>"/>
118
+ <% else %><lowerValue xmi:type="uml:LiteralInteger" xmi:id="<%= domain_prop_xmiid %>-lowerValue" value="1"/>
119
+ <% end %>
120
+ <% if upper != '1' %><upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="<%= domain_prop_xmiid %>-upperValue" value="<%= upper %>"/>
121
+ <% else %><upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="<%= domain_prop_xmiid %>-upperValue" value="1"/>
122
+ <% end %>
123
+ </ownedEnd>
124
+ <ownedEnd xmi:type="uml:Property" xmi:id="<%= attr_prop_xmiid %>" type="<%= attr_type %>" name="" association="<%= xmiid %>" visibility='public'>
125
+ <lowerValue xmi:type="uml:LiteralInteger" xmi:id="<%= attr_prop_xmiid %>-lowerValue" value="1"/>
126
+ <upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="<%= attr_prop_xmiid %>-upperValue" value="1"/>
127
+ </ownedEnd>
128
+ </packagedElement>}
129
+
130
+
131
+ # Template covering the output file contents for each attribute
132
+ attribute_template = %{}
133
+
134
+ # EXPLICIT ATTRIBUTE SIMPLE TYPE Template
135
+ attribute_builtin_template = %{ <ownedAttribute xmi:type="uml:Property" xmi:id="<%= xmiid %>" name="<%= attr.name %>" visibility="public" type="<%= attr.domain %>" <% if attr.redeclare_entity %>redefinedProperty="<%= redefined_xmiid %>"<% end %>>
136
+ <% if lower == '0' or attr.isOptional == TRUE %><lowerValue xmi:type="uml:LiteralInteger" xmi:id="<%= xmiid %>-lowerValue"/><% end %>
137
+ <% if lower != '0' and lower != '1' %><lowerValue xmi:type="uml:LiteralInteger" xmi:id="<%= xmiid %>-lowerValue" value="<%= lower %>"/><% end %>
138
+ <% if upper != '1' %><upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="<%= xmiid %>-upperValue" value="<%= upper %>"/><% end %>
139
+ </ownedAttribute>}
140
+
141
+ # EXPLICIT ATTRIBUTE ENUM and TYPE Template
142
+ attribute_enum_type_template = %{ <ownedAttribute xmi:type="uml:Property" xmi:id="_<%= xmiid %>" name="<%= attr.name %>" visibility="public" type="<%= type_xmiid %>" isOrdered='<%= islist %>' isUnique='<%= isset %>' >
143
+ <% if lower == '0' or attr.isOptional == TRUE %><lowerValue xmi:type="uml:LiteralInteger" xmi:id="<%= xmiid %>-lowerValue"/><% end %>
144
+ <% if lower != '0' and lower != '1' %><lowerValue xmi:type="uml:LiteralInteger" xmi:id="<%= xmiid %>-lowerValue" value="<%= lower %>"/><% end %>
145
+ <% if upper != '1' %><upperValue xmi:type="uml:LiteralUnlimitedNatural" xmi:id="<%= xmiid %>-upperValue" value="<%= upper %>"/><% end %>
146
+ </ownedAttribute>}
147
+
148
+ # TYPE Template
149
+ type_template = %{<packagedElement xmi:type="uml:PrimitiveType" xmi:id="_<%= schema.name %>-<%= type.name %>" name="<%= type.name %>" >
150
+ <generalization xmi:type="uml:Generalization" xmi:id="_supertype_<%= schema.name %>-<%= type.name %>" general="<%= type.domain %>"/>
151
+ </packagedElement>}
152
+
153
+
154
+ #############################################################################################
155
+ # Set up list of schemas to process, input may be a repository containing schemas or a single schema
156
+ #############################################################################################
157
+
158
+ if mapinput.kind_of? EXPSM::Repository
159
+ schema_list = mapinput.schemas
160
+ elsif mapinput.kind_of? EXPSM::SchemaDefinition
161
+ schema_list = [mapinput]
162
+ else
163
+ puts "ERROR : map_from_express input no Repository instance or Schema instance"
164
+ exit
165
+ end
166
+
167
+ # Set up XMI output file
168
+
169
+ if schema_list.size == 1 and output_xmi_filename == nil
170
+ schema = schema_list[0]
171
+ output_xmi_filename = schema.name.to_s + ".xmi"
172
+ elsif output_xmi_filename == nil
173
+ output_xmi_filename = 'Model.xmi'
174
+ end
175
+
176
+ file = File.new(output_xmi_filename, "w")
177
+ puts 'reeper : Writing output to file ' + output_xmi_filename
178
+
179
+ # Evaluate and write file start template
180
+ res = ERB.new(overall_start_template)
181
+ t = res.result(binding)
182
+ file.puts t
183
+
184
+ for schema in schema_list
185
+
186
+ # Evaluate and write schema start template
187
+ res = ERB.new(schema_start_template)
188
+ t = res.result(binding)
189
+ file.puts t
190
+
191
+ interfaced_schema_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::InterfaceSpecification}
192
+
193
+ for interfaced_schema in interfaced_schema_list
194
+
195
+ # Evaluate and write schema interface template
196
+ res = ERB.new(schema_interface_template)
197
+ t = res.result(binding)
198
+ file.puts t
199
+
200
+ end
201
+
202
+ # Map EXPRESS TYPE of Builtin
203
+ type_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::Type and e.isBuiltin}
204
+ for type in type_list
205
+ xmiid = '_' + schema.name + '-' + type.name
206
+ res = ERB.new(type_template)
207
+ t = res.result(binding)
208
+ file.puts t
209
+ end
210
+
211
+ # Map EXPRESS Enumeration Types
212
+ enum_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::TypeEnum }
213
+ for enum in enum_list
214
+
215
+ # Evaluate and write TYPE Enum start template
216
+ type_xmiid = '_' + schema.name + '-' + enum.name
217
+ res = ERB.new(enum_start_template)
218
+ t = res.result(binding)
219
+ file.puts t
220
+
221
+ # Evaluate and write Enum Item template for each item
222
+ enumitem_name_list = enum.items.scan(/\w+/)
223
+ for enumitem in enumitem_name_list
224
+ enumitem_xmiid = '_1_enumitem_' + schema.name + '-' + enum.name + '-' + enumitem
225
+ res = ERB.new(enum_item_template)
226
+ t = res.result(binding)
227
+ file.puts t
228
+ end
229
+
230
+ # Evaluate and write TYPE Enum end template
231
+ res = ERB.new(enum_end_template)
232
+ t = res.result(binding)
233
+ file.puts t
234
+ end
235
+
236
+ # Map EXPRESS TYPE Selects
237
+ select_list = schema.contents.find_all{ |e| e.instance_of? EXPSM::TypeSelect }
238
+ for select in select_list
239
+
240
+ # Evaluate and write TYPE Select start template
241
+ xmiid = '_' + schema.name + '-' + select.name
242
+ res = ERB.new(select_start_template)
243
+ t = res.result(binding)
244
+ file.puts t
245
+
246
+ # Evaluate and write Select Item template for each item (maps to UML same as EXPRESS supertype)
247
+ for superselect in select_list
248
+ if superselect.selectitems_array.include?(select)
249
+ xmiid = '_2_superselect_' + schema.name + '-' + select.name + '-' + superselect.name
250
+ xmiid_supertype = '_' + schema.name + '-' + superselect.name
251
+ res = ERB.new(supertype_template)
252
+ t = res.result(binding)
253
+ file.puts t
254
+ end
255
+ end
256
+
257
+ # Evaluate and write TYPE Select end template
258
+ res = ERB.new(select_end_template)
259
+ t = res.result(binding)
260
+ file.puts t
261
+ end
262
+
263
+ entity_list = schema.contents.find_all{ |e| e.kind_of? EXPSM::Entity }
264
+
265
+ # Map EXPRESS Explicit Attribute resulting UML Association (the Association is referenced from Class resulting from Entity)
266
+ for entity in entity_list
267
+ attr_list = entity.attributes.find_all{ |e| e.kind_of? EXPSM::Explicit }
268
+ for attr in attr_list
269
+
270
+ if NamedType.find_by_name( attr.domain ).kind_of? EXPSM::Entity or NamedType.find_by_name( attr.domain ).kind_of? EXPSM::TypeSelect
271
+ xmiid = '_1_association_' + schema.name + '-' + entity.name + '-' + attr.name
272
+ attr_xmiid = '_2_attr_' + schema.name + '-' + entity.name + '-' + attr.name
273
+ attr_prop_xmiid = '_2_attr_' + schema.name + '-' + entity.name + '-' + attr.name + "-end"
274
+
275
+ # type of the entity
276
+ attr_type = '_' + schema.name + '-' + entity.name
277
+
278
+ # type of the domain
279
+ domain_xmiid = '_' + schema.name + '-' + NamedType.find_by_name( attr.domain ).name
280
+ domain_prop_xmiid = '_' + schema.name + '-' + NamedType.find_by_name( attr.domain ).name + '-' + attr.name + "-end"
281
+ # name of the attr
282
+ domain_attr_name = attr.name
283
+
284
+ owner_xmiid = '_' + schema.name + '-' + entity.name
285
+
286
+ # association lower/upper
287
+ lower = '1'
288
+ upper = '1'
289
+ isset = 'true'
290
+ islist = 'false'
291
+ if attr.instance_of? EXPSM::ExplicitAggregate and attr.rank == 1
292
+ upper = attr.dimensions[0].upper
293
+ if upper == '?'
294
+ upper = '*'
295
+ end
296
+ lower = attr.dimensions[0].lower
297
+ if attr.dimensions[0].aggrtype == 'LIST'
298
+ islist = 'true'
299
+ end
300
+ if attr.dimensions[0].aggrtype == 'BAG'
301
+ isset = 'false'
302
+ end
303
+ if attr.dimensions[0].aggrtype == 'LIST' and !attr.dimensions[0].isUnique
304
+ isset = 'false'
305
+ end
306
+ end
307
+ if attr.isOptional == TRUE
308
+ lower = '0'
309
+ end
310
+
311
+ res = ERB.new(attribute_entity_association_template)
312
+ t = res.result(binding)
313
+ file.puts t
314
+ end
315
+ end
316
+ end
317
+
318
+ # Map EXPRESS Entity Types
319
+ for entity in entity_list
320
+
321
+ # Evaluate and write ENTITY start template
322
+ xmiid = '_' + schema.name + '-' + entity.name
323
+ res = ERB.new(entity_start_template)
324
+ t = res.result(binding)
325
+ file.puts t
326
+
327
+ # Map Entity is SUBTYPE OF (i.e. list of supertypes)
328
+ for supertype in entity.supertypes_array
329
+ xmiid = '_2_supertype_' + schema.name + '-' + entity.name + '-' + supertype.name
330
+ xmiid_supertype = '_' + schema.name + '-' + supertype.name
331
+ res = ERB.new(supertype_template)
332
+ t = res.result(binding)
333
+ file.puts t
334
+ end
335
+
336
+ # Map TYPE Select has Entity as item
337
+ for select in select_list
338
+ if select.selectitems_array.include?(entity)
339
+ xmiid = '_2_selectitem_' + schema.name + '-' + entity.name + '-' + select.name
340
+ xmiid_supplier = '_' + schema.name + '-' + select.name
341
+ xmiid_client = '_' + schema.name + '-' + entity.name
342
+ res = ERB.new(selectitem_entity_template)
343
+ t = res.result(binding)
344
+ file.puts t
345
+ end
346
+ end
347
+
348
+ # Map EXPRESS Explicit Attributes
349
+ attr_list = entity.attributes.find_all{ |e| e.kind_of? EXPSM::Explicit }
350
+ for attr in attr_list
351
+ xmiid = '_2_attr_' + schema.name + '-' + entity.name + '-' + attr.name
352
+
353
+ # set up references resulting from attribute being a redeclaration
354
+ if attr.redeclare_entity
355
+ if attr.redeclare_oldname
356
+ redefined_xmiid = '_2_attr_' + schema.name + '-' + attr.redeclare_entity + '-' + attr.redeclare_oldname
357
+ else
358
+ redefined_xmiid = '_2_attr_' + schema.name + '-' + attr.redeclare_entity + '-' + attr.name
359
+ end
360
+ end
361
+
362
+ # initialize default cardinailty constraints
363
+ lower = '1'
364
+ upper = '1'
365
+ isset = 'true'
366
+ islist = 'false'
367
+
368
+ # set up cardinailty constraints from attribute being a 1-D aggregate
369
+ if attr.instance_of? EXPSM::ExplicitAggregate and attr.rank == 1
370
+ upper = attr.dimensions[0].upper
371
+ if upper == '?'
372
+ upper = '*'
373
+ end
374
+ lower = attr.dimensions[0].lower
375
+ if attr.dimensions[0].aggrtype == 'LIST'
376
+ islist = 'true'
377
+ end
378
+ if attr.dimensions[0].aggrtype == 'BAG'
379
+ isset = 'false'
380
+ end
381
+ if attr.dimensions[0].aggrtype == 'LIST' and !attr.dimensions[0].isUnique
382
+ isset = 'false'
383
+ end
384
+ end
385
+ if attr.isOptional == TRUE
386
+ lower = '0'
387
+ end
388
+
389
+ # Map EXPRESS Explicit Attributes of Builtin
390
+ if attr.isBuiltin
391
+ res = ERB.new(attribute_builtin_template)
392
+ t = res.result(binding)
393
+ file.puts t
394
+ end
395
+
396
+ # Map EXPRESS Explicit Attributes of TYPE and TYPE Enum
397
+ if NamedType.find_by_name( attr.domain ).kind_of? EXPSM::Type or NamedType.find_by_name( attr.domain ).kind_of? EXPSM::TypeEnum
398
+ type_xmiid = '_' + schema.name + '-' + NamedType.find_by_name( attr.domain ).name
399
+ res = ERB.new(attribute_enum_type_template)
400
+ t = res.result(binding)
401
+ file.puts t
402
+ end
403
+
404
+ # Map EXPRESS Explicit Attributes of Entity and Select
405
+ if NamedType.find_by_name( attr.domain ).kind_of? EXPSM::Entity or NamedType.find_by_name( attr.domain ).kind_of? EXPSM::TypeSelect
406
+ domain_xmiid = '_' + schema.name + '-' + NamedType.find_by_name( attr.domain ).name
407
+ assoc_xmiid = '_1_association_' + schema.name + '-' + entity.name + '-' + attr.name
408
+ res = ERB.new(attribute_entity_template)
409
+ t = res.result(binding)
410
+ file.puts t
411
+ end
412
+
413
+ end
414
+
415
+
416
+ # Evaluate and write ENTITY end template
417
+ res = ERB.new(entity_end_template)
418
+ t = res.result(binding)
419
+ file.puts t
420
+ end
421
+
422
+ # Evaluate and write SCHEMA end template
423
+ res = ERB.new(schema_end_template)
424
+ t = res.result(binding)
425
+ file.puts t
426
+
427
+ end
428
+
429
+ # Evaluate and write file end template
430
+ res = ERB.new(overall_end_template)
431
+ t = res.result(binding)
432
+ file.puts t
433
+ end
@@ -0,0 +1,134 @@
1
+ require 'rexml/document'
2
+ require './expsm'
3
+ require 'yaml'
4
+ include REXML
5
+ include EXPSM
6
+ ## reeper
7
+ ## Release 0.3
8
+ ## 2015-06-26
9
+ ##
10
+ ## MAIN PROCESS STARTS HERE
11
+ ## Parse input options
12
+ ##
13
+ expxml_input = " "
14
+ map_input = " "
15
+ schema_input = " "
16
+ descxml_input = " "
17
+ debug = false
18
+ passedArgs = []
19
+ for arg in ARGV
20
+ argarray = arg.split('=')
21
+ case argarray[0]
22
+ when "expxml" then expxml_input = argarray[1]
23
+ when "map" then map_input = argarray[1]
24
+ when "schema" then schema_input = argarray[1]
25
+ when "descxml" then descxml_input = argarray[1]
26
+ when "debug" then debug = true
27
+ when "help", "-help", "--help", "-h", "--h"
28
+ puts "reeper Version 0.1"
29
+ puts " "
30
+ puts "Usage parameters : expxml=<schema.xml> (map=<mymap.rb>) (schema=<name>) (descxml=<desc.xml>)"
31
+ puts " "
32
+ puts " <schema.xml> required input EXPRESS as XML file"
33
+ puts " <mymap.rb> optional input mapping as Ruby file, default is filename ''mapping.rb''"
34
+ puts " <name> optional EXPRESS schema to map, default is all schemas in XML file"
35
+ puts " <desc.xml> optional input descriptions as XML file (may be same as expxml)"
36
+ exit
37
+ else
38
+ passedArgs.push arg
39
+ end
40
+ end
41
+ if expxml_input == " "
42
+ puts "reeper Version 0.1"
43
+ puts " "
44
+ puts "ERROR : No EXPRESS as XML input"
45
+ puts "Usage parameters : expxml=<schema.xml> map=<mapping.rb> (schema=<name>) (descxml=<desc.xml>)"
46
+ exit
47
+ end
48
+ if FileTest.exist?(expxml_input) != true
49
+ puts "reeper Version 0.1"
50
+ puts " "
51
+ puts "ERROR : EXPRESS as XML input file not found : #{expxml_input}"
52
+ exit
53
+ end
54
+ if map_input == " " and FileTest.exist?('mapping.rb') != true
55
+ puts "reeper Version 0.1"
56
+ puts " "
57
+ puts "ERROR : No Ruby Mapping File as input, default 'mapping.rb' not found"
58
+ puts "Usage parameters : expxml=<schema.xml> (map=<mymap.rb>) (schema=<name>) (descxml=<desc.xml>)"
59
+ exit
60
+ end
61
+ if map_input != " " and FileTest.exist?(map_input) != true
62
+ puts "reeper Version 0.1"
63
+ puts " "
64
+ puts "ERROR : Ruby Mapping input file not found : #{map_input}"
65
+ exit
66
+ end
67
+ if descxml_input != " " and FileTest.exist?(descxml_input) != true
68
+ puts "reeper Version 0.1"
69
+ puts " "
70
+ puts "ERROR : Descriptions input file not found : #{descxml_input}"
71
+ exit
72
+ end
73
+ ##
74
+ ## Set up EXPRESS XML File and new output files
75
+ ##
76
+ stime = Time.now.to_i
77
+ expxmlfile = File.new(expxml_input, "r")
78
+ exp = REXML::Document.new(expxmlfile)
79
+ schemaname_list = []
80
+
81
+ XPath.each( exp, '//express/schema/@name' ) { |n| schemaname_list.push n.to_s }
82
+
83
+ if schema_input != " " and !schemaname_list.include?(schema_input)
84
+ puts "reeper Version 0.1"
85
+ puts " "
86
+ puts "ERROR : File contains no schema named : #{schema_input}"
87
+ expxmlfile.close
88
+ exit
89
+ end
90
+
91
+ schema_list = exp.elements.to_a("//express/schema")
92
+ if schema_list.size == 0
93
+ puts "reeper Version 0.1"
94
+ puts " "
95
+ puts "ERROR : File contains no 'schema' XML elements : #{expxml_input}, may not be EXPRESS as XML"
96
+ expxmlfile.close
97
+ exit
98
+ end
99
+
100
+ puts "reeper : Creating EXPRESS Dictionary"
101
+ therepos = load_dictionary_express( exp, expxml_input )
102
+ expxmlfile.close
103
+
104
+ if descxml_input != " "
105
+ descxmlfile = File.new(descxml_input, "r")
106
+ descxml = REXML::Document.new(descxmlfile)
107
+ load_descriptions( descxml, therepos )
108
+ descxmlfile.close
109
+ end
110
+
111
+ if debug == true
112
+ debug_file = File.new("debug.txt", "w")
113
+ debug_file.puts YAML.dump( therepos )
114
+ debug_file.close
115
+ end
116
+ ##
117
+ ## include the Ruby mapping code
118
+ if map_input != " "
119
+ require map_input
120
+ puts "reeper : Using input mapping file #{map_input}"
121
+ else
122
+ require 'mapping.rb'
123
+ puts "reeper : Using default mapping file 'mapping.rb'"
124
+ end
125
+ ##
126
+ ## call the mapping code passing either the repository or a single schema as input
127
+
128
+ if schema_input != " "
129
+ mapthing = therepos.schemas.detect { |s| s.name == schema_input }
130
+ else
131
+ mapthing = therepos
132
+ end
133
+
134
+ map_from_express(mapthing, passedArgs)