expressir 0.2.7-x86-mingw32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.so +0 -0
- data/lib/expressir/express_exp/2.5/express_parser.so +0 -0
- data/lib/expressir/express_exp/2.6/express_parser.so +0 -0
- data/lib/expressir/express_exp/2.7/express_parser.so +0 -0
- data/lib/expressir/express_exp/3.0/express_parser.so +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,525 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
include REXML
|
3
|
+
##
|
4
|
+
## Set global variable for XML namespace prefix to use (including the colon)
|
5
|
+
$xnspre = ""
|
6
|
+
##
|
7
|
+
## Set global variable that is the name of the Ruby module containing the resulting EXPRESS-based classes (make uppercase)
|
8
|
+
$modname = ""
|
9
|
+
##
|
10
|
+
## Set up Part 28 writer functions for attributes of simple, aggregates of simple, instance reference and aggregate of instance reference
|
11
|
+
##
|
12
|
+
def write_attribute_text_p28writer(rubyfile, attribute_name)
|
13
|
+
rubyfile.puts " a___" + attribute_name + ".text = " + attribute_name
|
14
|
+
end
|
15
|
+
def write_member_text_p28writer(rubyfile, attribute_name, attr_type,attr_aggr_dim)
|
16
|
+
rubyfile.puts " for " + attribute_name + "___member in " + attribute_name
|
17
|
+
rubyfile.puts " amember___" + attribute_name + " = a___" + attribute_name + ".add_element(" + "'ex:" + attr_type.downcase + "-wrapper'" + ")"
|
18
|
+
rubyfile.puts " amember___" + attribute_name + ".text = " + attribute_name + "___member"
|
19
|
+
rubyfile.puts " end"
|
20
|
+
end
|
21
|
+
def write_attribute_id_p28writer(rubyfile, attribute_name)
|
22
|
+
rubyfile.puts " a___" + attribute_name + " = a___" + attribute_name + ".add_element(" + attribute_name + ".getP28entity)"
|
23
|
+
rubyfile.puts " a___" + attribute_name + ".attributes['ref'] = " + attribute_name + ".getP28id"
|
24
|
+
rubyfile.puts " a___" + attribute_name + ".attributes['xsi:nil'] = 'true'"
|
25
|
+
end
|
26
|
+
def write_member_id_p28writer(rubyfile, attribute_name,attr_aggr_dim)
|
27
|
+
rubyfile.puts " for " + attribute_name + "___member in " + attribute_name
|
28
|
+
rubyfile.puts " amember___" + attribute_name + " = a___" + attribute_name + ".add_element(" + attribute_name + "___member.getP28entity)"
|
29
|
+
rubyfile.puts " amember___" + attribute_name + ".attributes['ref'] = " + attribute_name + "___member" + ".getP28id"
|
30
|
+
rubyfile.puts " amember___" + attribute_name + ".attributes['xsi:nil'] = 'true'"
|
31
|
+
rubyfile.puts " end"
|
32
|
+
end
|
33
|
+
##
|
34
|
+
## this function handles the output related to EXPRESS explicit attributes
|
35
|
+
def handle_explicit(rubyfile, exp, attribute)
|
36
|
+
attr_redecl = attribute.elements["redeclaration"]
|
37
|
+
if attr_redecl == nil
|
38
|
+
rubyfile.puts " if " + attribute.attributes["name"].downcase + " != nil"
|
39
|
+
rubyfile.puts " a___" + attribute.attributes["name"].downcase + " = e___added.add_element('" + attribute.attributes["name"].capitalize + "'" + ")"
|
40
|
+
attr_builtintype = attribute.elements["builtintype"]
|
41
|
+
attr_type = attribute.elements["typename"]
|
42
|
+
attr_aggr = attribute.elements["aggregate"]
|
43
|
+
attr_aggr_dim = attribute.elements.size - 1
|
44
|
+
if attr_builtintype != nil
|
45
|
+
if attr_aggr == nil
|
46
|
+
write_attribute_text_p28writer(rubyfile, attribute.attributes["name"].downcase)
|
47
|
+
else
|
48
|
+
attr_datatype = attr_builtintype.attributes["type"]
|
49
|
+
write_member_text_p28writer(rubyfile, attribute.attributes["name"].downcase, attr_datatype,attr_aggr_dim)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
if attr_type != nil
|
53
|
+
attr_type_name = attr_type.attributes["name"]
|
54
|
+
xp = "//schema/entity[@name = " + "'" + attr_type_name + "'" + "]"
|
55
|
+
attr_type_entity = exp.root.elements[xp]
|
56
|
+
if attr_type_entity != nil
|
57
|
+
if attr_aggr != nil
|
58
|
+
write_member_id_p28writer(rubyfile, attribute.attributes["name"].downcase,attr_aggr_dim)
|
59
|
+
else
|
60
|
+
write_attribute_id_p28writer(rubyfile, attribute.attributes["name"].downcase)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
xp = "//schema/type[@name = " + "'" + attr_type_name + "'" + "]"
|
64
|
+
attr_type_type = exp.root.elements[xp]
|
65
|
+
if attr_type_type != nil
|
66
|
+
attr_type_type_builtin = attr_type_type.elements["builtintype"]
|
67
|
+
if attr_type_type_builtin != nil
|
68
|
+
write_attribute_text_p28writer(rubyfile, attribute.attributes["name"].downcase)
|
69
|
+
end
|
70
|
+
attr_type_type_enum = attr_type_type.elements["enumeration"]
|
71
|
+
if attr_type_type_enum != nil
|
72
|
+
if attr_aggr != nil
|
73
|
+
write_member_text_p28writer(rubyfile, attribute.attributes["name"].downcase, attr_datatype,attr_aggr_dim)
|
74
|
+
else
|
75
|
+
write_attribute_text_p28writer(rubyfile, attribute.attributes["name"].downcase)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
attr_type_type_select = attr_type_type.elements["select"]
|
80
|
+
if attr_type_type_select != nil
|
81
|
+
if attr_aggr != nil
|
82
|
+
write_member_id_p28writer(rubyfile, attribute.attributes["name"].downcase,attr_aggr_dim)
|
83
|
+
else
|
84
|
+
write_attribute_id_p28writer(rubyfile, attribute.attributes["name"].downcase)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
rubyfile.puts " end"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
##
|
93
|
+
## this function handles the p28 reader related to EXPRESS explicit attributes
|
94
|
+
def handle_attr_p28read(rubyp28attr, exp, attribute)
|
95
|
+
attr_redecl = attribute.elements["redeclaration"]
|
96
|
+
if attr_redecl == nil
|
97
|
+
attr_builtintype = attribute.elements["builtintype"]
|
98
|
+
attr_type = attribute.elements["typename"]
|
99
|
+
attr_aggr = attribute.elements["aggregate"]
|
100
|
+
if attr_builtintype != nil
|
101
|
+
if attr_aggr == nil
|
102
|
+
write_attribute_text_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
|
103
|
+
else
|
104
|
+
attr_datatype = attr_builtintype.attributes["type"]
|
105
|
+
write_member_text_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
if attr_type != nil
|
109
|
+
attr_type_name = attr_type.attributes["name"]
|
110
|
+
xp = "//schema/entity[@name = " + "'" + attr_type_name + "'" + "]"
|
111
|
+
attr_type_entity = exp.root.elements[xp]
|
112
|
+
if attr_type_entity != nil
|
113
|
+
if attr_aggr != nil
|
114
|
+
write_member_id_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
|
115
|
+
else
|
116
|
+
write_attribute_id_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
xp = "//schema/type[@name = " + "'" + attr_type_name + "'" + "]"
|
120
|
+
attr_type_type = exp.root.elements[xp]
|
121
|
+
if attr_type_type != nil
|
122
|
+
attr_type_type_builtin = attr_type_type.elements["builtintype"]
|
123
|
+
if attr_type_type_builtin != nil
|
124
|
+
write_attribute_text_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
|
125
|
+
end
|
126
|
+
|
127
|
+
attr_type_type_enum = attr_type_type.elements["enumeration"]
|
128
|
+
if attr_type_type_enum != nil
|
129
|
+
write_attribute_text_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
|
130
|
+
end
|
131
|
+
|
132
|
+
attr_type_type_select = attr_type_type.elements["select"]
|
133
|
+
if attr_type_type_select != nil
|
134
|
+
if attr_aggr != nil
|
135
|
+
write_member_id_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
|
136
|
+
else
|
137
|
+
write_attribute_id_p28reader(rubyp28attr, attribute.attributes["name"].downcase)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
def get_all_supertypes(exp)
|
145
|
+
if $todo_array.size == 0
|
146
|
+
return
|
147
|
+
end
|
148
|
+
temp_array = $todo_array
|
149
|
+
new_name_array = []
|
150
|
+
temp_array.reverse_each do |super_name|
|
151
|
+
$name_array.push super_name
|
152
|
+
new_name_array.push super_name
|
153
|
+
$todo_array.pop
|
154
|
+
end
|
155
|
+
new_name_array.reverse_each do |super_name|
|
156
|
+
xp = "//schema/entity[@name = " + "'" + super_name + "'" + "]"
|
157
|
+
entity = exp.root.elements[xp]
|
158
|
+
supertypes = entity.attributes["supertypes"]
|
159
|
+
if supertypes != nil
|
160
|
+
supertype_names = supertypes.split
|
161
|
+
supertype_names.each do |super_name|
|
162
|
+
$todo_array.push super_name
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
get_all_supertypes(exp)
|
167
|
+
end
|
168
|
+
def write_read_P28_entity_instance_read(rubyp28inst, name)
|
169
|
+
rubyp28inst.puts " if entity.name == " + "'" + name + "'"
|
170
|
+
rubyp28inst.puts " r = " + $modname + "::" + name + ".new"
|
171
|
+
rubyp28inst.puts " m.model_elements.push r"
|
172
|
+
rubyp28inst.puts " r.putP28id(id.to_s)"
|
173
|
+
rubyp28inst.puts " end"
|
174
|
+
end
|
175
|
+
def write_read_P28_attribute_value_read(rubyp28attr, ename, exp)
|
176
|
+
rubyp28attr.puts " if entity.name == " + "'" + ename + "'"
|
177
|
+
rubyp28attr.puts " for child in entity.elements"
|
178
|
+
xp = "//schema/entity[@name = " + "'" + ename + "'" + "]"
|
179
|
+
current_entity = exp.root.elements[xp]
|
180
|
+
supertypes = current_entity.attributes["supertypes"]
|
181
|
+
$name_array = []
|
182
|
+
$todo_array = []
|
183
|
+
if supertypes != nil
|
184
|
+
supertype_names = supertypes.split
|
185
|
+
supertype_names.each do |super_name|
|
186
|
+
$todo_array.push super_name
|
187
|
+
end
|
188
|
+
end
|
189
|
+
get_all_supertypes(exp)
|
190
|
+
$name_array.reverse_each do |super_name|
|
191
|
+
xp = "//schema/entity[@name = " + "'" + super_name + "'" + "]"
|
192
|
+
super_entity = exp.root.elements[xp]
|
193
|
+
for super_attribute in super_entity.elements.to_a("./explicit")
|
194
|
+
## aname = super_attribute.attributes["name"]
|
195
|
+
handle_attr_p28read(rubyp28attr, exp, super_attribute)
|
196
|
+
## write_attribute_text_p28reader(rubyp28attr,aname)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
for current_attribute in current_entity.elements.to_a("./explicit")
|
200
|
+
## aname = current_attribute.attributes["name"]
|
201
|
+
## write_attribute_text_p28reader(rubyp28attr,aname)
|
202
|
+
handle_attr_p28read(rubyp28attr, exp, current_attribute)
|
203
|
+
end
|
204
|
+
rubyp28attr.puts " end"
|
205
|
+
rubyp28attr.puts " end"
|
206
|
+
end
|
207
|
+
def write_attribute_text_p28reader(rubyp28attr, attribute_name)
|
208
|
+
rubyp28attr.puts " if child.name == '" + attribute_name.capitalize + "'"
|
209
|
+
rubyp28attr.puts " r." + attribute_name.downcase + "= child.text()"
|
210
|
+
rubyp28attr.puts " end"
|
211
|
+
end
|
212
|
+
def write_member_text_p28reader(rubyp28attr, attribute_name)
|
213
|
+
rubyp28attr.puts " if child.name == '" + attribute_name.capitalize + "'"
|
214
|
+
rubyp28attr.puts " memlist = []"
|
215
|
+
rubyp28attr.puts " for member in child.elements"
|
216
|
+
rubyp28attr.puts " memlist.push member.text()"
|
217
|
+
rubyp28attr.puts " end"
|
218
|
+
rubyp28attr.puts " r." + attribute_name.downcase + "= memlist"
|
219
|
+
rubyp28attr.puts " end"
|
220
|
+
end
|
221
|
+
def write_member_id_p28reader(rubyp28attr, attribute_name)
|
222
|
+
rubyp28attr.puts " if child.name == '" + attribute_name.capitalize + "'"
|
223
|
+
rubyp28attr.puts " memlist = []"
|
224
|
+
rubyp28attr.puts " for member in child.elements"
|
225
|
+
rubyp28attr.puts " ref = member.attribute('ref')"
|
226
|
+
rubyp28attr.puts " i = 0"
|
227
|
+
rubyp28attr.puts " while i != -1"
|
228
|
+
rubyp28attr.puts " tempid = m.model_elements[i].getP28id.to_s"
|
229
|
+
rubyp28attr.puts " if tempid == ref.to_s"
|
230
|
+
rubyp28attr.puts " p = m.model_elements[i]"
|
231
|
+
rubyp28attr.puts " i = -2"
|
232
|
+
rubyp28attr.puts " end"
|
233
|
+
rubyp28attr.puts " i = i + 1"
|
234
|
+
rubyp28attr.puts " end"
|
235
|
+
rubyp28attr.puts " memlist.push p"
|
236
|
+
rubyp28attr.puts " end"
|
237
|
+
rubyp28attr.puts " r." + attribute_name.downcase + "= memlist"
|
238
|
+
rubyp28attr.puts " end"
|
239
|
+
end
|
240
|
+
def write_attribute_id_p28reader(rubyp28attr, attribute_name)
|
241
|
+
rubyp28attr.puts " if child.name == '" + attribute_name.capitalize + "'"
|
242
|
+
rubyp28attr.puts " ref = child.elements[1].attribute('ref')"
|
243
|
+
rubyp28attr.puts " i = 0"
|
244
|
+
rubyp28attr.puts " while i != -1"
|
245
|
+
rubyp28attr.puts " tempid = m.model_elements[i].getP28id.to_s"
|
246
|
+
rubyp28attr.puts " if tempid == ref.to_s"
|
247
|
+
rubyp28attr.puts " p = m.model_elements[i]"
|
248
|
+
rubyp28attr.puts " i = -2"
|
249
|
+
rubyp28attr.puts " end"
|
250
|
+
rubyp28attr.puts " i = i + 1"
|
251
|
+
rubyp28attr.puts " end"
|
252
|
+
rubyp28attr.puts " r." + attribute_name.downcase + "= p"
|
253
|
+
rubyp28attr.puts " end"
|
254
|
+
end
|
255
|
+
## exp2ruby
|
256
|
+
## Version 0.1
|
257
|
+
## 2006-09-07
|
258
|
+
##
|
259
|
+
## Parse input options : exp=<filename> prefix=<shortname> are required
|
260
|
+
##
|
261
|
+
exp_input = " "
|
262
|
+
prefix_input = " "
|
263
|
+
for arg in ARGV
|
264
|
+
argarray = arg.split('=')
|
265
|
+
if argarray[0] == "exp"
|
266
|
+
exp_input = argarray[1]
|
267
|
+
end
|
268
|
+
if argarray[0] == "prefix"
|
269
|
+
prefix_input = argarray[1]
|
270
|
+
end
|
271
|
+
if argarray[0] == "help" or argarray[0] == "-help" or argarray[0] == "--help"
|
272
|
+
puts "exp2ruby Version 0.1"
|
273
|
+
puts " "
|
274
|
+
puts "Usage : exp2ruby exp=<schema.xml> prefix=<shortname>"
|
275
|
+
puts " "
|
276
|
+
puts " <schema.xml> required input EXPRESS as XML file"
|
277
|
+
puts " <shortname> required XML Namespace prefix shortname (case sensitive) and Ruby module name (automatic upcase)"
|
278
|
+
puts "Example: exp2ruby exp=Model.XML prefix=ap233 results in ap233 for XML prefix and AP233 for Ruby module name for EXPRESS in Model.XML file"
|
279
|
+
exit
|
280
|
+
end
|
281
|
+
end
|
282
|
+
if exp_input == " "
|
283
|
+
puts "ERROR : No Schema XML input file (exp=<schema.xml>)"
|
284
|
+
exit
|
285
|
+
end
|
286
|
+
if prefix_input == " "
|
287
|
+
puts "ERROR : No XML Prefix and Ruby module name specified (prefix=<shortname>)"
|
288
|
+
exit
|
289
|
+
end
|
290
|
+
if FileTest.exist?(exp_input) != true
|
291
|
+
puts "ERROR : Schema XML input file not found : " + exp_input
|
292
|
+
exit
|
293
|
+
end
|
294
|
+
$modname = prefix_input.upcase
|
295
|
+
$xnspre = prefix_input + ':'
|
296
|
+
puts "exp2ruby : XML prefix = " + prefix_input
|
297
|
+
puts "exp2ruby : Ruby module name = " + $modname
|
298
|
+
##
|
299
|
+
## Set up EXPRESS XML File and new Ruby files
|
300
|
+
##
|
301
|
+
expxmlfile = File.new(exp_input, "r")
|
302
|
+
exp = Document.new(expxmlfile)
|
303
|
+
schema_element = exp.elements["//schema[1]"]
|
304
|
+
schema_name = schema_element.attributes["name"]
|
305
|
+
puts "exp2ruby : EXPRESS SCHEMA = " + schema_name.to_s
|
306
|
+
rubyfile = File.new(schema_name + ".rb", "w")
|
307
|
+
rubyfile.puts "require " + '"' + schema_name + "___module" + '"'
|
308
|
+
rubyfile.puts "require " + '"' + schema_name + "___p28inst" + '"'
|
309
|
+
rubyfile.puts "require " + '"' + schema_name + "___p28attr" + '"'
|
310
|
+
rubyfile.puts "module " + $modname
|
311
|
+
rubymodule = File.new(schema_name + "___module.rb", "w")
|
312
|
+
##
|
313
|
+
## Set up P28 E2 instance reader code
|
314
|
+
rubyp28inst = File.new(schema_name + "___p28inst.rb", "w")
|
315
|
+
rubyp28inst.puts "def read_P28_entity_instances(p28doc,m)"
|
316
|
+
rubyp28inst.puts " uos = p28doc.root"
|
317
|
+
rubyp28inst.puts " for entity in uos.elements.to_a()"
|
318
|
+
rubyp28inst.puts " id = entity.attribute('id')"
|
319
|
+
##
|
320
|
+
## Set up P28 E2 attribute reader code
|
321
|
+
rubyp28attr = File.new(schema_name + "___p28attr.rb", "w")
|
322
|
+
rubyp28attr.puts "def read_P28_attribute_values(p28doc,m)"
|
323
|
+
rubyp28attr.puts " uos = p28doc.root"
|
324
|
+
rubyp28attr.puts " for entity in uos.elements.to_a()"
|
325
|
+
rubyp28attr.puts " id = entity.attribute('id')"
|
326
|
+
rubyp28attr.puts " i = 0"
|
327
|
+
rubyp28attr.puts " if entity.name != 'header'"
|
328
|
+
rubyp28attr.puts " while i != -1"
|
329
|
+
rubyp28attr.puts " tempid = m.model_elements[i].getP28id"
|
330
|
+
rubyp28attr.puts " if tempid == id.to_s"
|
331
|
+
rubyp28attr.puts " r = m.model_elements[i]"
|
332
|
+
rubyp28attr.puts " i = -2"
|
333
|
+
rubyp28attr.puts " end"
|
334
|
+
rubyp28attr.puts " i = i + 1"
|
335
|
+
rubyp28attr.puts " end"
|
336
|
+
rubyp28attr.puts " end"
|
337
|
+
##
|
338
|
+
## Global arrays used to deal with supertypes
|
339
|
+
$name_array = []
|
340
|
+
$todo_array = []
|
341
|
+
##
|
342
|
+
## WRITE a Ruby module for each entity type and include each locally-defined attribute
|
343
|
+
##
|
344
|
+
stime = Time.now
|
345
|
+
ne = 0
|
346
|
+
entity_list = exp.elements.to_a("//schema/entity")
|
347
|
+
ce = entity_list.size
|
348
|
+
for entity in entity_list
|
349
|
+
ne = ne + 1
|
350
|
+
puts "Entity " + ne.to_s + " of " + ce.to_s + " = " + entity.attributes["name"].to_s + " (after " + ((Time.now - stime)/60).to_s + " minutes"
|
351
|
+
rubymodule.puts "module " + entity.attributes["name"].capitalize + "___module"
|
352
|
+
##
|
353
|
+
## write accessor (reader and writer) for each locally defined explicit attribute
|
354
|
+
##
|
355
|
+
mandatory_attribute_name_list = []
|
356
|
+
for attribute in entity.elements.to_a("./explicit")
|
357
|
+
attr_redecl = attribute.elements["redeclaration"]
|
358
|
+
if attr_redecl == nil
|
359
|
+
rubymodule.puts " attr_accessor :" + attribute.attributes["name"].downcase
|
360
|
+
if attribute.attributes["optional"] == nil or attribute.attributes["optional"].to_s == 'NO'
|
361
|
+
mandatory_attribute_name_list.push attribute.attributes["name"].downcase
|
362
|
+
end
|
363
|
+
end
|
364
|
+
end
|
365
|
+
if mandatory_attribute_name_list.size != 0
|
366
|
+
rubymodule.puts ' def isValid' + entity.attributes["name"].capitalize + "___module"
|
367
|
+
rubymodule.puts ' return case'
|
368
|
+
for mp in mandatory_attribute_name_list
|
369
|
+
rubymodule.puts ' when ' + mp + ' == nil : false'
|
370
|
+
end
|
371
|
+
rubymodule.puts ' else true'
|
372
|
+
rubymodule.puts ' end'
|
373
|
+
rubymodule.puts ' end'
|
374
|
+
else
|
375
|
+
rubymodule.puts ' def isValid' + entity.attributes["name"].capitalize + "___module"
|
376
|
+
rubymodule.puts ' return true'
|
377
|
+
rubymodule.puts ' end'
|
378
|
+
end
|
379
|
+
rubymodule.puts "end"
|
380
|
+
##
|
381
|
+
## WRITE P28 READER for each entity instance and attribute value
|
382
|
+
write_read_P28_entity_instance_read(rubyp28inst, entity.attributes["name"])
|
383
|
+
write_read_P28_attribute_value_read(rubyp28attr, entity.attributes["name"], exp)
|
384
|
+
##
|
385
|
+
## WRITE a Ruby class for each entity type, include module for it and each supertype
|
386
|
+
##
|
387
|
+
rubyfile.puts "class " + entity.attributes["name"].capitalize
|
388
|
+
supertypes = entity.attributes["supertypes"]
|
389
|
+
$name_array = []
|
390
|
+
$todo_array = []
|
391
|
+
if supertypes != nil
|
392
|
+
supertype_names = supertypes.split
|
393
|
+
supertype_names.each do |super_name|
|
394
|
+
$todo_array.push super_name
|
395
|
+
end
|
396
|
+
end
|
397
|
+
get_all_supertypes(exp)
|
398
|
+
$name_array.reverse_each do |super_name|
|
399
|
+
rubyfile.puts " include " + super_name.capitalize + "___module"
|
400
|
+
end
|
401
|
+
rubyfile.puts " include " + entity.attributes["name"].capitalize + "___module"
|
402
|
+
##
|
403
|
+
## write class variables containing the entity type and attribute names from the schema
|
404
|
+
##
|
405
|
+
rubyfile.puts " @@entity = " + "'" + entity.attributes["name"].capitalize + "'"
|
406
|
+
for attribute in entity.elements.to_a("./explicit")
|
407
|
+
attr_redecl = attribute.elements["redeclaration"]
|
408
|
+
if attr_redecl == nil
|
409
|
+
rubyfile.puts " @@attr___" + attribute.attributes["name"].downcase + " = " + "'" + attribute.attributes["name"].capitalize + "'"
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
##
|
414
|
+
## initialize the count of the number of instances of the class for the entity type
|
415
|
+
## increment the count each time a new instance is created and use it to define a Part 28 E2 XML ID for the instance
|
416
|
+
##
|
417
|
+
rubyfile.puts " @@" + entity.attributes["name"].capitalize + "___count = 0"
|
418
|
+
rubyfile.puts " def initialize"
|
419
|
+
rubyfile.puts " @@" + entity.attributes["name"].capitalize + "___count += 1"
|
420
|
+
rubyfile.puts " @p28id = " + "'" + "id-" + entity.attributes["name"].upcase + "-" + "' + " + "@@" + entity.attributes["name"].capitalize+ "___count.to_s"
|
421
|
+
rubyfile.puts " end"
|
422
|
+
##
|
423
|
+
## add the method to check validity of instance
|
424
|
+
##
|
425
|
+
rubyfile.puts ' def isValid'
|
426
|
+
rubyfile.puts ' return case'
|
427
|
+
rubyfile.puts ' when !isValid' + entity.attributes["name"].capitalize + '___module : false'
|
428
|
+
$name_array.reverse_each do |super_name|
|
429
|
+
rubyfile.puts ' when !isValid' + super_name.capitalize + '___module : false'
|
430
|
+
end
|
431
|
+
rubyfile.puts ' else true'
|
432
|
+
rubyfile.puts ' end'
|
433
|
+
rubyfile.puts ' end'
|
434
|
+
##
|
435
|
+
## add the method to write the Part 28 Edition 2 file content for the entity instance
|
436
|
+
##
|
437
|
+
rubyfile.puts " def writeP28 p28file"
|
438
|
+
rubyfile.puts " e___added = p28file.root.add_element(" + "\'" + $xnspre + entity.attributes["name"].capitalize + "\', " + "{\'id\' => @p28id})"
|
439
|
+
##
|
440
|
+
$name_array = []
|
441
|
+
$todo_array = []
|
442
|
+
if supertypes != nil
|
443
|
+
supertype_names = supertypes.split
|
444
|
+
supertype_names.each do |super_name|
|
445
|
+
$todo_array.push super_name
|
446
|
+
end
|
447
|
+
end
|
448
|
+
get_all_supertypes(exp)
|
449
|
+
$name_array.reverse_each do |super_name|
|
450
|
+
xp = "//entity[@name = " + "'" + super_name + "'" + "]"
|
451
|
+
super_entity = exp.root.elements[xp]
|
452
|
+
for super_attribute in super_entity.elements.to_a("./explicit")
|
453
|
+
handle_explicit(rubyfile, exp, super_attribute)
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
457
|
+
for attribute in entity.elements.to_a("./explicit")
|
458
|
+
handle_explicit(rubyfile, exp, attribute)
|
459
|
+
end
|
460
|
+
|
461
|
+
rubyfile.puts " end"
|
462
|
+
rubyfile.puts " def getP28id"
|
463
|
+
rubyfile.puts " @p28id"
|
464
|
+
rubyfile.puts " end"
|
465
|
+
rubyfile.puts " def putP28id(the_id)"
|
466
|
+
rubyfile.puts " @p28id = the_id"
|
467
|
+
rubyfile.puts " end"
|
468
|
+
rubyfile.puts " def getP28entity"
|
469
|
+
rubyfile.puts " return(" + "'" + $xnspre + "'" + " + @@entity)"
|
470
|
+
rubyfile.puts " end"
|
471
|
+
rubyfile.puts "end"
|
472
|
+
end
|
473
|
+
rubyfile.puts "class Model___data"
|
474
|
+
rubyfile.puts " attr_reader :model_elements, :model_name, :namespace, :originating_system, :preprocessor_version"
|
475
|
+
rubyfile.puts " attr_writer :model_elements, :model_name, :namespace, :originating_system, :preprocessor_version"
|
476
|
+
rubyfile.puts " def initialize"
|
477
|
+
rubyfile.puts " @model_elements = []"
|
478
|
+
rubyfile.puts " @namespace = '" + $xnspre.chop + "'"
|
479
|
+
rubyfile.puts " end"
|
480
|
+
rubyfile.puts " def readP28e2 p28doc"
|
481
|
+
rubyfile.puts " puts 'Reading P28E2 XML'"
|
482
|
+
rubyfile.puts " read_P28_entity_instances(p28doc,self)"
|
483
|
+
rubyfile.puts " read_P28_attribute_values(p28doc,self)"
|
484
|
+
rubyfile.puts " end"
|
485
|
+
rubyfile.puts " require 'time'"
|
486
|
+
rubyfile.puts " def writeP28e2 p28file"
|
487
|
+
rubyfile.puts " puts 'Writing P28E2 with XML namespace = ' + namespace"
|
488
|
+
rubyfile.puts " @p28file = p28file"
|
489
|
+
rubyfile.puts " p28file << XMLDecl.new"
|
490
|
+
rubyfile.puts " the_ns = 'xmlns:' + namespace"
|
491
|
+
rubyfile.puts " the_uos = namespace + ':uos'"
|
492
|
+
rubyfile.puts " uos = p28file.add_element(the_uos, {the_ns => 'urn:iso10303-28:schema/" + schema_name.capitalize + "'})"
|
493
|
+
rubyfile.puts " uos.add_namespace('xsi','http://www.w3.org/2001/XMLSchema-instance')"
|
494
|
+
rubyfile.puts " uos.add_namespace('ex','urn:iso:std:iso:10303:28:ed-2:2005:schema:common')"
|
495
|
+
rubyfile.puts " uos.add_namespace('exp','urn:iso:std:iso:10303:28:ed-2:2005:schema:common')"
|
496
|
+
rubyfile.puts " uos.add_attribute('xsi:schemaLocation','urn:iso10303-28:schema/" + schema_name.capitalize + " " + schema_name.capitalize + ".xsd')"
|
497
|
+
rubyfile.puts " header = p28file.root.add_element('exp:header')"
|
498
|
+
rubyfile.puts " t = header.add_element('time_stamp')"
|
499
|
+
rubyfile.puts " t.text = Time.now.xmlschema()"
|
500
|
+
rubyfile.puts " if self.originating_system != nil"
|
501
|
+
rubyfile.puts " t = header.add_element('preprocessor_version')"
|
502
|
+
rubyfile.puts " t.text = self.preprocessor_version"
|
503
|
+
rubyfile.puts " end"
|
504
|
+
rubyfile.puts " if self.originating_system != nil"
|
505
|
+
rubyfile.puts " t = header.add_element('originating_system')"
|
506
|
+
rubyfile.puts " t.text = self.originating_system"
|
507
|
+
rubyfile.puts " end"
|
508
|
+
rubyfile.puts " i = 1"
|
509
|
+
rubyfile.puts " for e in model_elements"
|
510
|
+
rubyfile.puts " puts i"
|
511
|
+
rubyfile.puts " e.writeP28(p28file)"
|
512
|
+
rubyfile.puts " i = i + 1"
|
513
|
+
rubyfile.puts " end"
|
514
|
+
rubyfile.puts " end"
|
515
|
+
rubyfile.puts "end"
|
516
|
+
rubyfile.puts "end"
|
517
|
+
rubyp28inst.puts " end"
|
518
|
+
rubyp28inst.puts "end"
|
519
|
+
rubyp28attr.puts " end"
|
520
|
+
rubyp28attr.puts "end"
|
521
|
+
expxmlfile.close
|
522
|
+
rubyfile.close
|
523
|
+
rubymodule.close
|
524
|
+
rubyp28inst.close
|
525
|
+
rubyp28attr.close
|