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.
- checksums.yaml +7 -0
- data/.cross_rubies +30 -0
- data/.github/workflows/rake.yml +45 -0
- data/.github/workflows/release.yml +84 -0
- data/.gitignore +17 -0
- data/.gitmodules +3 -0
- data/.rspec +2 -0
- data/.rubocop.yml +508 -0
- data/Gemfile +4 -0
- data/README.adoc +147 -0
- data/Rakefile +11 -0
- data/bin/console +12 -0
- data/bin/rspec +29 -0
- data/bin/setup +8 -0
- data/demo.rb +18 -0
- data/docs/development.md +90 -0
- data/exe/expressir +20 -0
- data/exe/generate-parser +48 -0
- data/expressir.gemspec +43 -0
- data/lib/expressir.rb +21 -0
- data/lib/expressir/cli.rb +27 -0
- data/lib/expressir/cli/ui.rb +36 -0
- data/lib/expressir/config.rb +23 -0
- data/lib/expressir/express.rb +11 -0
- data/lib/expressir/express/aggregate_dimension.rb +38 -0
- data/lib/expressir/express/attribute.rb +15 -0
- data/lib/expressir/express/comment.rb +7 -0
- data/lib/expressir/express/defined_type.rb +36 -0
- data/lib/expressir/express/derived.rb +65 -0
- data/lib/expressir/express/derived_aggregate.rb +43 -0
- data/lib/expressir/express/entity.rb +137 -0
- data/lib/expressir/express/explicit.rb +70 -0
- data/lib/expressir/express/explicit_aggregate.rb +46 -0
- data/lib/expressir/express/explicit_or_derived.rb +16 -0
- data/lib/expressir/express/global_rule.rb +44 -0
- data/lib/expressir/express/interface_specification.rb +51 -0
- data/lib/expressir/express/interfaced_item.rb +38 -0
- data/lib/expressir/express/inverse.rb +46 -0
- data/lib/expressir/express/inverse_aggregate.rb +37 -0
- data/lib/expressir/express/model_element.rb +7 -0
- data/lib/expressir/express/named_type.rb +19 -0
- data/lib/expressir/express/remark.rb +8 -0
- data/lib/expressir/express/repository.rb +306 -0
- data/lib/expressir/express/schema_definition.rb +96 -0
- data/lib/expressir/express/subtype_constraint.rb +14 -0
- data/lib/expressir/express/type.rb +26 -0
- data/lib/expressir/express/type_aggregate.rb +42 -0
- data/lib/expressir/express/type_enum.rb +29 -0
- data/lib/expressir/express/type_parser.rb +45 -0
- data/lib/expressir/express/type_select.rb +82 -0
- data/lib/expressir/express/unique_rule.rb +35 -0
- data/lib/expressir/express/where_rule.rb +32 -0
- data/lib/expressir/express_exp/2.4/express_parser.bundle +0 -0
- data/lib/expressir/express_exp/2.5/express_parser.bundle +0 -0
- data/lib/expressir/express_exp/2.6/express_parser.bundle +0 -0
- data/lib/expressir/express_exp/2.7/express_parser.bundle +0 -0
- data/lib/expressir/express_exp/3.0/express_parser.bundle +0 -0
- data/lib/expressir/express_exp/formatter.rb +1450 -0
- data/lib/expressir/express_exp/parser.rb +41 -0
- data/lib/expressir/express_exp/visitor.rb +2464 -0
- data/lib/expressir/express_parser.rb +30 -0
- data/lib/expressir/model.rb +65 -0
- data/lib/expressir/model/attribute.rb +27 -0
- data/lib/expressir/model/constant.rb +17 -0
- data/lib/expressir/model/entity.rb +46 -0
- data/lib/expressir/model/enumeration_item.rb +11 -0
- data/lib/expressir/model/expressions/aggregate_initializer.rb +13 -0
- data/lib/expressir/model/expressions/aggregate_item.rb +15 -0
- data/lib/expressir/model/expressions/attribute_reference.rb +15 -0
- data/lib/expressir/model/expressions/binary_expression.rb +40 -0
- data/lib/expressir/model/expressions/call.rb +15 -0
- data/lib/expressir/model/expressions/entity_constructor.rb +15 -0
- data/lib/expressir/model/expressions/group_reference.rb +15 -0
- data/lib/expressir/model/expressions/index_reference.rb +17 -0
- data/lib/expressir/model/expressions/interval.rb +21 -0
- data/lib/expressir/model/expressions/query_expression.rb +26 -0
- data/lib/expressir/model/expressions/simple_reference.rb +13 -0
- data/lib/expressir/model/expressions/unary_expression.rb +19 -0
- data/lib/expressir/model/function.rb +62 -0
- data/lib/expressir/model/identifier.rb +10 -0
- data/lib/expressir/model/interface.rb +18 -0
- data/lib/expressir/model/literals/binary.rb +13 -0
- data/lib/expressir/model/literals/integer.rb +13 -0
- data/lib/expressir/model/literals/logical.rb +17 -0
- data/lib/expressir/model/literals/real.rb +13 -0
- data/lib/expressir/model/literals/string.rb +15 -0
- data/lib/expressir/model/parameter.rb +17 -0
- data/lib/expressir/model/procedure.rb +60 -0
- data/lib/expressir/model/renamed_ref.rb +13 -0
- data/lib/expressir/model/repository.rb +19 -0
- data/lib/expressir/model/rule.rb +62 -0
- data/lib/expressir/model/schema.rb +67 -0
- data/lib/expressir/model/scope.rb +17 -0
- data/lib/expressir/model/statements/alias.rb +26 -0
- data/lib/expressir/model/statements/assignment.rb +15 -0
- data/lib/expressir/model/statements/call.rb +15 -0
- data/lib/expressir/model/statements/case.rb +17 -0
- data/lib/expressir/model/statements/case_action.rb +15 -0
- data/lib/expressir/model/statements/compound.rb +13 -0
- data/lib/expressir/model/statements/escape.rb +8 -0
- data/lib/expressir/model/statements/if.rb +17 -0
- data/lib/expressir/model/statements/null.rb +8 -0
- data/lib/expressir/model/statements/repeat.rb +34 -0
- data/lib/expressir/model/statements/return.rb +13 -0
- data/lib/expressir/model/statements/skip.rb +8 -0
- data/lib/expressir/model/subtype_constraint.rb +27 -0
- data/lib/expressir/model/type.rb +24 -0
- data/lib/expressir/model/types/aggregate.rb +17 -0
- data/lib/expressir/model/types/array.rb +21 -0
- data/lib/expressir/model/types/bag.rb +17 -0
- data/lib/expressir/model/types/binary.rb +15 -0
- data/lib/expressir/model/types/boolean.rb +8 -0
- data/lib/expressir/model/types/enumeration.rb +19 -0
- data/lib/expressir/model/types/generic.rb +13 -0
- data/lib/expressir/model/types/generic_entity.rb +13 -0
- data/lib/expressir/model/types/integer.rb +8 -0
- data/lib/expressir/model/types/list.rb +19 -0
- data/lib/expressir/model/types/logical.rb +8 -0
- data/lib/expressir/model/types/number.rb +8 -0
- data/lib/expressir/model/types/real.rb +13 -0
- data/lib/expressir/model/types/select.rb +21 -0
- data/lib/expressir/model/types/set.rb +17 -0
- data/lib/expressir/model/types/string.rb +15 -0
- data/lib/expressir/model/unique.rb +15 -0
- data/lib/expressir/model/variable.rb +17 -0
- data/lib/expressir/model/where.rb +15 -0
- data/lib/expressir/parser.rb +6 -0
- data/lib/expressir/parser/owl_parser.rb +8 -0
- data/lib/expressir/version.rb +3 -0
- data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +9589 -0
- data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +36619 -0
- data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +13294 -0
- data/original/examples/employment/eclipse/.project +17 -0
- data/original/examples/employment/eclipse/Export/Employment.png +0 -0
- data/original/examples/employment/eclipse/Express/employment_schema.exp +33 -0
- data/original/examples/employment/eclipse/Express/employment_schema.xmi +77 -0
- data/original/examples/employment/eclipse/Express/employment_schema.xml +93 -0
- data/original/examples/employment/eclipse/Models/Employment.uml +4 -0
- data/original/examples/employment/eclipse/Models/Employment.umldi +240 -0
- data/original/examples/employment/eclipse/readme.txt +7 -0
- data/original/examples/employment/employment_schema.exp +33 -0
- data/original/examples/employment/employment_schema.rb +232 -0
- data/original/examples/employment/employment_schema.xml +93 -0
- data/original/examples/employment/employment_schema___module.rb +46 -0
- data/original/examples/employment/employment_schema___p28attr.rb +126 -0
- data/original/examples/employment/employment_schema___p28inst.rb +26 -0
- data/original/examples/employment/example_employment_data.xml +1 -0
- data/original/examples/employment/example_employment_data_copy.xml +1 -0
- data/original/examples/employment/example_employment_reader.rb +30 -0
- data/original/examples/employment/example_employment_writer.rb +51 -0
- data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +3710 -0
- data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +35880 -0
- data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +15357 -0
- data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +9468 -0
- data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +8404 -0
- data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +43147 -0
- data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +18341 -0
- data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +11632 -0
- data/original/examples/syntax/remark.exp +146 -0
- data/original/examples/syntax/remark_formatted.exp +175 -0
- data/original/examples/syntax/syntax.exp +311 -0
- data/original/examples/syntax/syntax_formatted.exp +1191 -0
- data/original/exp2ruby.rb +525 -0
- data/original/expsm.rb +34 -0
- data/original/mapping_owl.rb +1018 -0
- data/original/mapping_sysml.rb +2281 -0
- data/original/mapping_uml2.rb +599 -0
- data/original/mapping_uml2_eclipse.rb +433 -0
- data/original/reeper.rb +134 -0
- data/rakelib/cross-ruby.rake +308 -0
- data/spec/acceptance/express_to_owl_spec.rb +18 -0
- data/spec/acceptance/version_spec.rb +12 -0
- data/spec/expressir/express/repository_spec.rb +25 -0
- data/spec/expressir/express_exp/ap233_spec.rb +22 -0
- data/spec/expressir/express_exp/format_remark_spec.rb +28 -0
- data/spec/expressir/express_exp/format_syntax_spec.rb +28 -0
- data/spec/expressir/express_exp/parse_remark_spec.rb +346 -0
- data/spec/expressir/express_exp/parse_syntax_spec.rb +3003 -0
- data/spec/expressir/model/find_spec.rb +110 -0
- data/spec/expressr_spec.rb +5 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/support/console_helper.rb +29 -0
- 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
|
data/original/reeper.rb
ADDED
@@ -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)
|