expressir 1.2.1-arm64-darwin → 1.2.5-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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/.cross_rubies +3 -6
  3. data/.github/workflows/rake.yml +223 -19
  4. data/.github/workflows/release.yml +1 -0
  5. data/.gitignore +7 -1
  6. data/.gitmodules +4 -1
  7. data/.rubocop.yml +13 -4
  8. data/Rakefile +4 -1
  9. data/bin/console +0 -1
  10. data/bin/rspec +3 -3
  11. data/exe/expressir +4 -2
  12. data/exe/format +1 -1
  13. data/exe/format-test +25 -25
  14. data/exe/generate-parser +16 -13
  15. data/expressir.gemspec +13 -11
  16. data/lib/expressir/config.rb +1 -1
  17. data/lib/expressir/express/2.7/express_parser.bundle +0 -0
  18. data/lib/expressir/express/3.0/express_parser.bundle +0 -0
  19. data/lib/expressir/express/3.1/express_parser.bundle +0 -0
  20. data/lib/expressir/express/parser.rb +18 -15
  21. data/lib/expressir/express/visitor.rb +7 -3
  22. data/lib/expressir/model.rb +78 -78
  23. data/lib/expressir/version.rb +1 -1
  24. data/rakelib/antlr4-native.rake +63 -0
  25. data/rakelib/cross-ruby.rake +216 -157
  26. data/spec/acceptance/version_spec.rb +7 -2
  27. data/spec/expressir/express/cache_spec.rb +8 -5
  28. data/spec/expressir/express/formatter_spec.rb +16 -8
  29. data/spec/expressir/express/parser_spec.rb +17 -11
  30. data/spec/expressir/model/model_element_spec.rb +154 -146
  31. metadata +55 -63
  32. data/demo.rb +0 -18
  33. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +0 -9589
  34. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +0 -36619
  35. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +0 -13294
  36. data/original/examples/employment/eclipse/.project +0 -17
  37. data/original/examples/employment/eclipse/Export/Employment.png +0 -0
  38. data/original/examples/employment/eclipse/Express/employment_schema.exp +0 -33
  39. data/original/examples/employment/eclipse/Express/employment_schema.xmi +0 -77
  40. data/original/examples/employment/eclipse/Express/employment_schema.xml +0 -93
  41. data/original/examples/employment/eclipse/Models/Employment.uml +0 -4
  42. data/original/examples/employment/eclipse/Models/Employment.umldi +0 -240
  43. data/original/examples/employment/eclipse/readme.txt +0 -7
  44. data/original/examples/employment/employment_schema.exp +0 -33
  45. data/original/examples/employment/employment_schema.rb +0 -232
  46. data/original/examples/employment/employment_schema.xml +0 -93
  47. data/original/examples/employment/employment_schema___module.rb +0 -46
  48. data/original/examples/employment/employment_schema___p28attr.rb +0 -126
  49. data/original/examples/employment/employment_schema___p28inst.rb +0 -26
  50. data/original/examples/employment/example_employment_data.xml +0 -1
  51. data/original/examples/employment/example_employment_data_copy.xml +0 -1
  52. data/original/examples/employment/example_employment_reader.rb +0 -30
  53. data/original/examples/employment/example_employment_writer.rb +0 -51
  54. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +0 -3710
  55. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +0 -35880
  56. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +0 -15357
  57. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +0 -9468
  58. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +0 -8404
  59. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +0 -43147
  60. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +0 -18341
  61. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +0 -11632
  62. data/original/exp2ruby.rb +0 -525
  63. data/original/expsm.rb +0 -34
  64. data/original/mapping_owl.rb +0 -1018
  65. data/original/mapping_sysml.rb +0 -2281
  66. data/original/mapping_uml2.rb +0 -599
  67. data/original/mapping_uml2_eclipse.rb +0 -433
  68. data/original/reeper.rb +0 -134
  69. data/spec/expressr_spec.rb +0 -5
@@ -1,1018 +0,0 @@
1
- require 'erb'
2
- # EXPRESS to OWL Structural Mapping
3
- # Version 0.5
4
- # This function navigates the EXPRESS STEPMod Model Ruby Classes
5
- # and performs a structural EXPRESS-to-OWL mapping using Ruby ERB templates.
6
- # The output is in OWL RDF/XML abbreviated syntax.
7
- # Mapping summary reports constructs where mapping is not sufficient (i.e. may need editing) or uses newer OWL capabilities
8
- #
9
- # Configurable items are:
10
- # If file named definitions.csv is found, definitions of items are read from that CSV.
11
- # Double quotes around ITEM and DEFINITION column values is required
12
- # include_dublin_core - If true, import of the Dublin Core OWL is included. Set to true if dc used in annotation_list
13
- # annotation_list - added to each construct created if found. Annotations are added if not 'nil'.
14
- # usr_base of namespace for OWL constructs
15
- # top_class - if not nil, makes every OWL class created a subclass if this class which is added to output
16
- # thing_attributes - if specified, OWL DatatypeProperty domain is set to OWL Thing and range set to string
17
- # datatype_hash - sets mappings for EXPRESS builtin to XSD datatypes
18
- # post_processed_schema - If true, write post-processed schema data (e.g. propety hash) for inclusion in other program or script
19
- #
20
- # Mappings are:
21
- # Entity Types and Subtypes are mapped to OWL Class hierarchy.
22
- # Entity Type SUPERTYPE OF ONEOF( list-of-EntityTypes ) are mapped to OWL disjoint between Classes
23
- # Select Types that resolve to all Entity Types are mapped to OWL Class hierarchy.
24
- # Select Types that resolve to all Type are mapped to RDFS Datatype.
25
- # Select Types that resolve to mixed Entity Types and Type are mapped to OWL Class hierarchy, so may need cleanup
26
- # Enumeration Types are mapped to OWL Enumerated Classes
27
- # Type = builtin are mapped to RDFS Datatypes that subtype XSD datatypes
28
- # Type of Type of ... that ultimately resolve to builtin are mapped to datatype subtype hierarchy
29
- # Explicit attrs of Type = builtin are mapped to OWL DatatypeProperties
30
- # Type = AGGR are mapped to subClassOf rdf:List and type of element not specified
31
-
32
- # Explicit attrs of 1-D LIST/ARRAY OF builtin/Type = builtin mapped to OWL ObjectProperty and subClassOf rdf:List and cardinality 1
33
- # Explicit attrs of n-D AGGR mapped to OWL ObjectProperty and subClassOf rdf:List, type of element not specified, and cardinality 1
34
-
35
- # Inverse attrs are mapped to OWL DatatypeProperties with inverseOf set, except inverse of inherited not mapped
36
- # BOOLEAN attributes are mapped to OWL DatatypeProperties.
37
-
38
- # Attribute redeclarations that ref Entity/Select are mapped to ObjectProperty that is subproperty of that it redeclares
39
- # Attribute redeclarations that ref builting simple types are mapped to DatatypeProperty that is subproperty of that it redeclares
40
- # Type = type that is a select are mapped to Class subclass of referenced select Class
41
- # Single Attribute OPTIONAL or not maps to cardinality restriction on Class owning attribute
42
- # 1D SET/BAG Attribute bound maps to cardinality restriction on Class owning attribute
43
- # n-dimensional aggregates map to rdf List with no internal structure and type of element not specified
44
-
45
-
46
- #
47
- def map_from_express( mapinput )
48
- puts ' '
49
- puts 'EXPRESS to OWL Structural Mapping V0.5'
50
- puts ' '
51
-
52
- ######### Mapping Configuration Starts Here ##############
53
-
54
- # Set the base of the URI (i.e. the namespace) for OWL constructs created during the mapping
55
- uri_base = 'http://www.reeper.org'
56
-
57
- # Add RDFS andor Dublin Core basic annotations
58
-
59
- # Set to true if any annotation_list elements use Dublin Core (dc: or dcterms:)
60
- include_dublin_core = false
61
-
62
- annotation_list = Array.new
63
- # rdfs:comment must be position 0 as definition assignment hardcoded there
64
- #annotation_list[0] = ['rdfs:comment', nil]
65
- #annotation_list[1] = ['owl:versionInfo', '1']
66
- #annotation_list[2] = ['dc:creator', 'David Price, TopQuadrant Limited']
67
- #annotation_list[3] = ['dcterms:created','2010-10-22']
68
- #annotation_list[4] = ['dc:source', '{ iso standard 10303 part(214) version(2) object(1) automotive-design-schema(1) }']
69
-
70
- # Read definitions from csv file if found
71
- definition_hash = Hash.new
72
- if FileTest.exist?('definitions.csv')
73
- require 'csv'
74
- puts '-- Definitions CSV File Found'
75
- CSV.open('definitions.csv', 'r') do |row|
76
- definition_hash[row[0].downcase] = row[1]
77
- end
78
- end
79
-
80
- # set to class name (e.g. 'TOP-THING') to make all created OWL Classes subclasses of a topmost class
81
- top_class = 'AP233-ARM-THING'
82
-
83
- # add common string attributes to use OWL Thing as domain rather than schema classes
84
- thing_attributes = []
85
- #thing_attributes.push 'id'
86
- #thing_attributes.push 'name'
87
- #thing_attributes.push 'description'
88
-
89
- # datatypes for simple and aggregates of simple type
90
- datatype_hash = Hash.new
91
- datatype_hash["INTEGER"] = 'http://www.w3.org/2001/XMLSchema#integer'
92
- datatype_hash["REAL"] = 'http://www.w3.org/2001/XMLSchema#float'
93
- datatype_hash["NUMBER"] = 'http://www.w3.org/2001/XMLSchema#float'
94
- datatype_hash["BINARY"] = 'http://www.w3.org/2001/XMLSchema#hexBinary'
95
- datatype_hash["BOOLEAN"] = 'http://www.w3.org/2001/XMLSchema#boolean'
96
- datatype_hash["LOGICAL"] = 'http://www.w3.org/2001/XMLSchema#boolean'
97
- datatype_hash["STRING"] = 'http://www.w3.org/2001/XMLSchema#string'
98
-
99
- # Write the property_type_hash for inclusion in other scripts or not
100
- post_processed_schema = false
101
- post_processed_schema_file_name = 'postprocessed_schema.rb'
102
- post_processed_schema_file = File.new(post_processed_schema_file_name,'w') if post_processed_schema
103
-
104
- ######### Mapping Configuration Ends Here ##############
105
-
106
-
107
- # Template covering the start of the output file
108
- overall_start_template = %{<rdf:RDF
109
- xmlns:owl="http://www.w3.org/2002/07/owl#"
110
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
111
- xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
112
- xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
113
- <% if include_dublin_core %>
114
- xmlns:dc="http://purl.org/dc/elements/1.1/"
115
- xmlns:dcterms="http://purl.org/dc/terms/"
116
- <% end %>
117
- }
118
-
119
- # Template covering the output file contents for each schema start
120
- schema_start_template = %{xmlns="<%= uri_base %>/<%= schema.name %>#"
121
- xml:base="<%= uri_base %>/<%= schema.name %>#" >
122
-
123
- <owl:Ontology rdf:about='' rdfs:label='<%= schema.name %>' >
124
- <% annotation_list.each do |i| %><% if i[1] != nil and i[1] != '' %><<%= i[0] %> rdf:datatype="http://www.w3.org/2001/XMLSchema#string"><%= i[1] %></<%= i[0] %>><% end %>
125
- <% end %>
126
- <% if include_dublin_core %>
127
- <owl:imports rdf:resource="http://purl.org/dc/terms/"/>
128
- <owl:imports rdf:resource="http://purl.org/dc/elements/1.1/"/>
129
- <% end %>
130
- </owl:Ontology>
131
- <% if top_class != nil %>
132
- <owl:Class rdf:ID='<%= top_class %>' />
133
- <% end %>
134
- }
135
-
136
- # Template covering the output file contents for each entity type start or start of type = type that is a select
137
- entity_start_template = %{
138
- <owl:Class rdf:ID='<%= class_name %>' >
139
- <% annotation_list.each do |i| %><% if i[1] != nil and i[1] != '' %><<%= i[0] %> rdf:datatype="http://www.w3.org/2001/XMLSchema#string"><%= i[1] %></<%= i[0] %>><% end %>
140
- <% end %>
141
- }
142
- # Template covering the output file contents for each entity type end or end of type = type that is a select
143
- entity_end_template = %{
144
- <% if top_class != nil %>
145
- <rdfs:subClassOf rdf:resource='#<%= top_class %>' />
146
- <% end %>
147
- </owl:Class>
148
- }
149
-
150
- # Template covering the output file contents for end of type = type that is a select
151
- class_end_template = %{</owl:Class>}
152
-
153
- # Template covering the output file contents for each select type start
154
- select_start_template = %{
155
- <owl:Class rdf:ID='<%= select.name %>' >
156
- <% annotation_list.each do |i| %><% if i[1] != nil and i[1] != '' %><<%= i[0] %> rdf:datatype="http://www.w3.org/2001/XMLSchema#string"><%= i[1] %></<%= i[0] %>><% end %>
157
- <% end %>
158
- }
159
- # Template covering the output file contents for each select type end
160
- select_end_template = %{<% if top_class != nil %>
161
- <rdfs:subClassOf rdf:resource='#<%= top_class %>' />
162
- <% end %>
163
- </owl:Class>
164
- }
165
-
166
- # Template covering the supertype(s) for each entity type and type = type that is a select
167
- supertype_template = %{<rdfs:subClassOf rdf:resource='#<%= superclass_name %>' />
168
- }
169
-
170
- # Template covering OWL collections of class contents
171
- class_collection_template = %{<owl:Class><owl:unionOf rdf:parseType="Collection">
172
- <% item_name_list.each do |name| %>
173
- <rdf:Description rdf:about='#<%= name %>'/>
174
- <% end %>
175
- </owl:unionOf>
176
- </owl:Class>}
177
-
178
- # Template covering OWL collections of RDFS datatypes
179
- datatype_collection_template = %{<rdfs:Datatype rdf:ID='<%= type_name %>'>
180
- <owl:equivalentClass><rdfs:Datatype><owl:unionOf rdf:parseType="Collection">
181
- <% type_name_list.each do |name| %>
182
- <rdf:Description rdf:about='#<%= name %>' />
183
- <% end %>
184
- </owl:unionOf>
185
- </rdfs:Datatype></owl:equivalentClass>
186
- </rdfs:Datatype>}
187
-
188
- # Template covering abstract entity types
189
- abstract_entity_template = %{<rdfs:subClassOf rdf:resource='#<%= supertype.name %>' />
190
- }
191
-
192
- # Template covering the output file contents for each defined type of builtin datatype
193
- type_builtin_template = %{
194
- <rdfs:Datatype rdf:ID='<%= datatype_name %>'>
195
- <rdfs:subClassOf rdf:resource='<%= superdatatype_name %>'/>
196
- </rdfs:Datatype>
197
- }
198
-
199
- # Template covering the mappings to rdf list
200
- rdflist_template = %{<rdfs:Class rdf:ID='<%= list_name %>'>
201
- <rdfs:subClassOf rdf:resource='<%= superlist_name %>'/>
202
- </rdfs:Class>}
203
-
204
- # Template covering the output file contents for each attribute that is an aggregate
205
- attribute_aggregate_template = %{}
206
-
207
- # Template covering the output file contents for each attribute that is an aggregate of select of entity
208
- attribute_aggregate_entity_select_template = %{}
209
-
210
- # Template covering the output file contents for each attribute that is a select of entity
211
- attribute_entity_select_template = %{}
212
-
213
- # Template covering the output file contents for each attribute
214
- attribute_template = %{}
215
-
216
- # Template covering the output file contents for each attribute that is builtin datatype
217
- attribute_builtin_template = %{<owl:DatatypeProperty rdf:ID='<%= owl_property_name %>'>
218
- <% if owl_property_domain != nil %>
219
- <rdfs:domain rdf:resource='#<%= owl_property_domain %>' />
220
- <% end %>
221
- <rdfs:range rdf:resource='<%= owl_property_range %>' />
222
- <% annotation_list.each do |i| %><% if i[1] != nil and i[1] != '' %><<%= i[0] %> rdf:datatype="http://www.w3.org/2001/XMLSchema#string"><%= i[1] %></<%= i[0] %>><% end %>
223
- <% end %>
224
- <% if owl_super_property_name != nil %>
225
- <rdfs:subPropertyOf rdf:resource='#<%= owl_super_property_name %>' />
226
- <% end %>
227
- </owl:DatatypeProperty>
228
- }
229
-
230
- # Template covering the output file contents for each attribute that is type that is builtin datatype
231
- attribute_typebuiltin_template = %{<owl:DatatypeProperty rdf:ID='<%= owl_property_name %>'>
232
- <% if owl_property_domain != nil %>
233
- <rdfs:domain rdf:resource='#<%= owl_property_domain %>' />
234
- <% end %>
235
- <rdfs:range rdf:resource='#<%= owl_property_range %>' />
236
- <% annotation_list.each do |i| %><% if i[1] != nil and i[1] != '' %><<%= i[0] %> rdf:datatype="http://www.w3.org/2001/XMLSchema#string"><%= i[1] %></<%= i[0] %>><% end %>
237
- <% end %>
238
- </owl:DatatypeProperty>
239
- }
240
-
241
- # Template covering the output file contents for each attribute that is entity or select type
242
- attribute_entity_template = %{<owl:ObjectProperty rdf:ID='<%= owl_property_name %>'>
243
- <rdfs:domain rdf:resource='#<%= owl_property_domain %>' />
244
- <rdfs:range rdf:resource='#<%= owl_property_range %>' />
245
- <% annotation_list.each do |i| %><% if i[1] != nil and i[1] != '' %><<%= i[0] %> rdf:datatype="http://www.w3.org/2001/XMLSchema#string"><%= i[1] %></<%= i[0] %>><% end %>
246
- <% end %>
247
- </owl:ObjectProperty>
248
- }
249
-
250
- # Template covering the output file contents for each attribute that is entity or select type
251
- inverse_entity_template = %{<owl:ObjectProperty rdf:ID='<%= owl_property_name %>'>
252
- <rdfs:domain rdf:resource='#<%= owl_property_domain %>' />
253
- <rdfs:range rdf:resource='#<%= owl_property_range %>' />
254
- <% annotation_list.each do |i| %><% if i[1] != nil and i[1] != '' %><<%= i[0] %> rdf:datatype="http://www.w3.org/2001/XMLSchema#string"><%= i[1] %></<%= i[0] %>><% end %>
255
- <% end %>
256
- <owl:inverseOf rdf:resource="#<%= owl_inverted_property_name %>"/>
257
- </owl:ObjectProperty>
258
- }
259
-
260
- # Template covering the output file contents for each attribute that is a redeclaration and reference to an entity or select type
261
- attribute_redeclare_entity_template = %{<owl:ObjectProperty rdf:ID='<%= owl_property_name %>'>
262
- <rdfs:domain rdf:resource='#<%= owl_property_domain %>' />
263
- <rdfs:range rdf:resource='#<%= owl_property_range %>' />
264
- <rdfs:subPropertyOf rdf:resource='#<%= owl_super_property_name %>' />
265
- <% annotation_list.each do |i| %><% if i[1] != nil and i[1] != '' %><<%= i[0] %> rdf:datatype="http://www.w3.org/2001/XMLSchema#string"><%= i[1] %></<%= i[0] %>><% end %>
266
- <% end %>
267
- </owl:ObjectProperty>
268
- }
269
-
270
-
271
-
272
- # Template covering the output file contents for each attribute that is enum datatype
273
- class_enum_template = %{<owl:Class rdf:ID='<%= owl_class_name %>'>
274
- <rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
275
- <owl:oneOf rdf:parseType="Collection">
276
- <% enumitem_name_list.each do |name| %>
277
- <rdf:Description rdf:ID="<%= owl_class_name + '.' + name %>"/>
278
- <% end %>
279
- </owl:oneOf>
280
- </owl:Class>}
281
-
282
-
283
- # Template covering the output file contents for each attribute that is enum datatype
284
- attribute_enum_template = %{<owl:DatatypeProperty rdf:ID='<%= owl_property_name %>'>
285
- <rdfs:domain rdf:resource='#<%= owl_property_domain %>' />
286
- <rdfs:range><owl:DataRange><owl:oneOf><rdf:List>
287
- <% enumitem_name_list.each do |name| %>
288
- <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#string"><%= name %></rdf:first>
289
- <% if enumitem_name_list[enumitem_name_list.size-1] != name %>
290
- <rdf:rest><rdf:List>
291
- <% end %>
292
- <% if enumitem_name_list[enumitem_name_list.size-1] == name %>
293
- <rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/> </rdf:List>
294
- <% end %>
295
- <% end %>
296
- <% (1..enumitem_name_list.size-1).each do %>
297
- </rdf:rest></rdf:List>
298
- <% end %>
299
- </owl:oneOf></owl:DataRange></rdfs:range>
300
- <% annotation_list.each do |i| %><% if i[1] != nil and i[1] != '' %><<%= i[0] %> rdf:datatype="http://www.w3.org/2001/XMLSchema#string"><%= i[1] %></<%= i[0] %>><% end %>
301
- <% end %>
302
- </owl:DatatypeProperty>}
303
-
304
-
305
-
306
- # Template covering min cardinality
307
- min_cardinality_template = %{<rdf:Description rdf:about='#<%= class_name %>'>
308
- <rdfs:subClassOf>
309
- <owl:Restriction>
310
- <owl:onProperty rdf:resource='#<%= owl_property_name %>'/>
311
- <owl:minCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger"><%= min_cardinality %></owl:minCardinality>
312
- </owl:Restriction>
313
- </rdfs:subClassOf>
314
- </rdf:Description>}
315
-
316
-
317
- # Template covering max cardinality
318
- max_cardinality_template = %{<rdf:Description rdf:about='#<%= class_name %>'>
319
- <rdfs:subClassOf>
320
- <owl:Restriction>
321
- <owl:onProperty rdf:resource='#<%= owl_property_name %>'/>
322
- <owl:maxCardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger"><%= max_cardinality %></owl:maxCardinality>
323
- </owl:Restriction>
324
- </rdfs:subClassOf>
325
- </rdf:Description>}
326
-
327
- # Template covering cardinality
328
- cardinality_template = %{<rdf:Description rdf:about='#<%= class_name %>'>
329
- <rdfs:subClassOf>
330
- <owl:Restriction>
331
- <owl:onProperty rdf:resource='#<%= owl_property_name %>'/>
332
- <owl:cardinality rdf:datatype="http://www.w3.org/2001/XMLSchema#nonNegativeInteger"><%= min_cardinality %></owl:cardinality>
333
- </owl:Restriction>
334
- </rdfs:subClassOf>
335
- </rdf:Description>}
336
-
337
- # Template covering the output file contents for each schema end
338
- disjoint_template = %{
339
- <rdf:Description rdf:about='#<%= first_class_name %>'>
340
- <owl:disjointWith rdf:resource="#<%= disjoint_class_name %>"/>
341
- </rdf:Description>}
342
-
343
-
344
- # Template covering the output file contents for each schema end
345
- schema_end_template = %{}
346
-
347
- # Template covering the end of the output file
348
- overall_end_template = %{ </rdf:RDF>}
349
-
350
-
351
- def post_process_entity(entity, post_processed_schema_file, datatype_hash)
352
- attribute_list = entity.attributes_all_array.find_all{ |a| a.kind_of? EXPSM::Explicit}
353
-
354
- for attribute in attribute_list
355
-
356
- express_attribute_domain = nil
357
- if !attribute.isBuiltin
358
- express_attribute_domain = NamedType.find_by_name( attribute.domain )
359
- end
360
- p28_property_name = entity.name.capitalize + '.' + attribute.name.capitalize
361
- property_quoted = false
362
- property_list = false
363
- property_type = '"' + attribute.domain + '"'
364
- if attribute.isBuiltin
365
- property_type = '"' + datatype_hash[attribute.domain] + '"'
366
- end
367
- if attribute.isBuiltin and attribute.domain == 'STRING'
368
- property_quoted = true
369
- end
370
- if (!attribute.redeclare_entity and express_attribute_domain.instance_of? EXPSM::Type and express_attribute_domain.isBuiltin and express_attribute_domain == 'STRING')
371
- property_quoted = true
372
- property_type = '"' + datatype_hash[express_attribute_domain.domain] + '"'
373
- end
374
- if ( attribute.isBuiltin and attribute.instance_of? EXPSM::ExplicitAggregate and attribute.rank == 1 and attribute.dimensions[0].aggrtype = 'LIST')
375
- property_list = true
376
- property_type = '"' + datatype_hash[attribute.domain] + '"'
377
- end
378
-
379
- if (express_attribute_domain.instance_of? EXPSM::Type and express_attribute_domain.isBuiltin and attribute.instance_of? EXPSM::ExplicitAggregate and attribute.rank == 1 and attribute.dimensions[0].aggrtype = 'LIST')
380
- property_list = true
381
- property_type = '"' + datatype_hash[express_attribute_domain.domain] + '"'
382
- end
383
-
384
- property_type = property_type.gsub('http://www.w3.org/2001/XMLSchema#','xsd:')
385
- post_processed_schema_file.puts 'property_range_hash["' + p28_property_name + '"] = [' + property_quoted.to_s + ',' + property_list.to_s + ',' + property_type.to_s + ']'
386
- end
387
- end
388
-
389
-
390
- # A recursive function to return complete set of items, following nested selects, for a select that are not selects themselves
391
- def get_all_selections( item_list )
392
- select_items = item_list.find_all{ |a| a.kind_of? EXPSM::TypeSelect}
393
- if select_items.size == 0
394
- return item_list
395
- end
396
- temp_item_list = item_list
397
- for select in select_items
398
- temp_item_list.delete( select )
399
- temp_item_list = temp_item_list + select.selectitems_array
400
- end
401
- final_list = get_all_selections( temp_item_list )
402
- end
403
-
404
- # A recursive function to return the ultimate underlying type of a type
405
- def is_utlimate_type_builtin( the_type )
406
- return true if the_type.isBuiltin
407
- base_type = NamedType.find_by_name( the_type.domain )
408
- case
409
- when (base_type.instance_of? EXPSM::TypeSelect or base_type.instance_of? EXPSM::Entity)
410
- return false
411
- when (base_type.kind_of? EXPSM::Type and base_type.isBuiltin)
412
- return true
413
- else
414
- return is_utlimate_type_builtin( base_type )
415
- end
416
- end
417
-
418
- # Set up list of schemas to process, input may be a repository containing schemas or a single schema
419
- if mapinput.kind_of? EXPSM::Repository
420
- schema_list = mapinput.schemas
421
- elsif mapinput.kind_of? EXPSM::SchemaDefinition
422
- schema_list = [mapinput]
423
- else
424
- puts "ERROR : map_from_express input no Repository instance or Schema instance"
425
- exit
426
- end
427
-
428
-
429
- for schema in schema_list
430
-
431
- type_mapped_list = []
432
- entity_mapped_list = []
433
- explicit_mapped_list = []
434
- inverse_mapped_list = []
435
- thing_attr_mapped_list = []
436
- superexpression_mapped_list = []
437
- list_mapped_attr_list = []
438
- list_mapped_type_list = []
439
- type_union_mapped_list = []
440
- mixed_select_list = []
441
- all_explicit_list = []
442
- all_derived_list = []
443
- all_inverse_list = []
444
- all_superexpression_list = []
445
-
446
- # Set up separate file for each schema
447
- filename = schema.name.to_s + ".owl"
448
- file = File.new(filename, "w")
449
-
450
- # Evaluate and write file start template
451
- res = ERB.new(overall_start_template)
452
- t = res.result(binding)
453
- file.puts t
454
-
455
- # Evaluate and write schema start template
456
- res = ERB.new(schema_start_template)
457
- t = res.result(binding)
458
- file.puts t
459
-
460
- select_list = schema.contents.find_all{ |e| e.kind_of? EXPSM::TypeSelect }
461
- entity_list = schema.contents.find_all{ |e| e.kind_of? EXPSM::Entity }
462
- defined_type_list = schema.contents.find_all{ |e| e.kind_of? EXPSM::Type }
463
- enum_type_list = schema.contents.find_all{ |e| e.kind_of? EXPSM::TypeEnum }
464
- defined_type_not_builtin_list = defined_type_list.find_all{ |e| !e.isBuiltin }
465
- defined_type_builtin_list = defined_type_list.find_all{ |e| e.isBuiltin }
466
-
467
- # Handle enumeration type maps to RDFS Datatype string
468
-
469
- for type_enum in enum_type_list
470
- type_mapped_list.push type_enum
471
- owl_class_name = type_enum.name
472
- enumitem_name_list = type_enum.items.scan(/\w+/)
473
- res = ERB.new(class_enum_template)
474
- t = res.result(binding)
475
- file.puts t
476
- end
477
-
478
-
479
- # Handle defined type maps to RDFS Datatype
480
-
481
- for type_builtin in defined_type_builtin_list
482
-
483
- # Handle defined type maps to RDFS Datatype
484
- if !type_builtin.instance_of? EXPSM::TypeAggregate
485
- type_mapped_list.push type_builtin
486
- datatype_name = type_builtin.name
487
- superdatatype_name = datatype_hash[type_builtin.domain]
488
- res = ERB.new(type_builtin_template)
489
- t = res.result(binding)
490
- file.puts t
491
- # Handle defined type maps to RDF List
492
- else
493
- list_mapped_type_list.push type_builtin
494
- type_mapped_list.push type_builtin
495
- list_name = type_builtin.name
496
- superlist_name = "http://www.w3.org/1999/02/22-rdf-syntax-ns#List"
497
- res = ERB.new(rdflist_template)
498
- t = res.result(binding)
499
- file.puts t
500
- end
501
- end
502
-
503
-
504
- for type_not_builtin in defined_type_not_builtin_list
505
-
506
- type_domain = NamedType.find_by_name( type_not_builtin.domain )
507
- type_is_builtin = is_utlimate_type_builtin( type_not_builtin )
508
-
509
- case
510
-
511
- # Handle simple defined type refining simple defined type of builtin map to RDFS Datatype
512
- when (!type_not_builtin.instance_of? EXPSM::TypeAggregate and type_is_builtin and !type_domain.instance_of? EXPSM::TypeAggregate)
513
- type_mapped_list.push type_not_builtin
514
- datatype_name = type_not_builtin.name
515
- superdatatype_name = '#' + type_domain.name
516
- res = ERB.new(type_builtin_template)
517
- t = res.result(binding)
518
- file.puts t
519
-
520
- # Handle simple defined type of aggr defined type of builtin map to RDF List
521
- when (!type_not_builtin.instance_of? EXPSM::TypeAggregate and type_domain.instance_of? EXPSM::TypeAggregate and type_is_builtin)
522
- type_mapped_list.push type_not_builtin
523
- list_mapped_type_list.push type_not_builtin
524
- list_name = type_not_builtin.name
525
- superlist_name = '#' + type_domain.name
526
- res = ERB.new(rdflist_template)
527
- t = res.result(binding)
528
- file.puts t
529
-
530
- # Handle aggr defined type of simple defined type of builtin map to RDF List
531
- when (type_not_builtin.instance_of? EXPSM::TypeAggregate and type_domain.instance_of? EXPSM::Type and type_is_builtin)
532
- type_mapped_list.push type_not_builtin
533
- list_mapped_type_list.push type_not_builtin
534
- list_name = type_not_builtin.name
535
- superlist_name = "http://www.w3.org/1999/02/22-rdf-syntax-ns#List"
536
- res = ERB.new(rdflist_template)
537
- t = res.result(binding)
538
- file.puts t
539
-
540
- # Handle aggr of entity/select type map to RDF List
541
- when (type_not_builtin.instance_of? EXPSM::TypeAggregate and (type_domain.instance_of? EXPSM::Entity or type_domain.instance_of? EXPSM::TypeSelect))
542
- type_mapped_list.push type_not_builtin
543
- list_mapped_type_list.push type_not_builtin
544
- list_name = type_not_builtin.name
545
- superlist_name = "http://www.w3.org/1999/02/22-rdf-syntax-ns#List"
546
- res = ERB.new(rdflist_template)
547
- t = res.result(binding)
548
- file.puts t
549
-
550
- # Handle defined type that are type = type that is a select
551
- when (type_domain.kind_of? EXPSM::TypeSelect)
552
- type_mapped_list.push type_not_builtin
553
- superclass_name = type_not_builtin.domain
554
- class_name = type_not_builtin.name
555
- res = ERB.new(entity_start_template)
556
- t = res.result(binding)
557
- file.puts t
558
-
559
- superclass_name = type_not_builtin.domain
560
- res = ERB.new(supertype_template)
561
- t = res.result(binding)
562
- file.puts t
563
-
564
- res = ERB.new(class_end_template)
565
- t = res.result(binding)
566
- file.puts t
567
-
568
- else
569
- puts 'ERROR : Not mapped = ' + type_not_builtin.name
570
- end
571
- end
572
-
573
-
574
- # Handle EXPRESS SELECT Type mapping to OWL Class hierarchy and RDFS Datatypes
575
-
576
- for select in select_list
577
-
578
- item_name_list = select.selectitems.scan(/\w+/)
579
-
580
- this_select_all_items = get_all_selections( select.selectitems_array )
581
- this_select_type_items = this_select_all_items.find_all{ |a| a.kind_of? EXPSM::Type}
582
-
583
- case
584
-
585
- # Handle case of select items resolving to containing only items that are non-select Type
586
- when this_select_type_items.size == this_select_all_items.size
587
- type_mapped_list.push select
588
- type_union_mapped_list.push select
589
- type_name_list = item_name_list
590
- type_name = select.name
591
- res = ERB.new(datatype_collection_template)
592
- t = res.result(binding)
593
- file.puts t
594
-
595
- # Handle case of select items resolving to containing no item that is a non-select Type
596
- else
597
- type_mapped_list.push select
598
-
599
- res = ERB.new(select_start_template)
600
- t = res.result(binding)
601
- file.puts t
602
- file.puts '<owl:equivalentClass>'
603
-
604
- res = ERB.new(class_collection_template)
605
- t = res.result(binding)
606
- file.puts t
607
- file.puts '</owl:equivalentClass>'
608
-
609
- res = ERB.new(select_end_template)
610
- t = res.result(binding)
611
- file.puts t
612
- if (this_select_type_items.size != 0 and this_select_type_items.size != this_select_all_items.size)
613
- mixed_select_list.push select
614
- end
615
-
616
- end
617
- end
618
-
619
- # Handle EXPRESS Entity mappings to OWL Class hierarchy
620
-
621
- for entity in entity_list
622
-
623
- if definition_hash[entity.name.downcase] != nil
624
- annotation_list[0] = ['rdfs:comment', definition_hash[entity.name.downcase]]
625
- else
626
- annotation_list[0] = ['rdfs:comment', nil]
627
- end
628
-
629
- entity_mapped_list.push entity
630
-
631
- class_name = entity.name
632
- res = ERB.new(entity_start_template)
633
- t = res.result(binding)
634
- file.puts t
635
-
636
- for supertype in entity.supertypes_array
637
- superclass_name = supertype.name
638
- res = ERB.new(supertype_template)
639
- t = res.result(binding)
640
- file.puts t
641
- end
642
-
643
- res = ERB.new(entity_end_template)
644
- t = res.result(binding)
645
- file.puts t
646
-
647
- # Post-process the entity
648
- post_process_entity(entity, post_processed_schema_file, datatype_hash) if post_processed_schema
649
-
650
-
651
- if entity.superexpression != nil
652
- all_superexpression_list.push entity
653
-
654
- # Handle simple case of one ONEOF in supertype expression mapped to disjoint between listed subclasses
655
- case
656
- # when (entity.superexpression.include?('ONEOF') and !entity.superexpression.include?('ANDOR') and !entity.superexpression.include?('TOTAL_OVER') and !entity.superexpression.include?('AND') and !entity.superexpression.include?('ABSTRACT'))
657
-
658
- when (entity.superexpression.include?('ONEOF'))
659
- superexpression_mapped_list.push entity
660
- tempexpression = entity.superexpression
661
- if entity.superexpression.index('ONEOF') != 0
662
- puts 'WARNING: ' + entity.name + ' supertype mapping may be incomplete, only ONEOFs processed'
663
- end
664
- while (tempexpression.include?('ONEOF'))
665
- posoneof = tempexpression.index('ONEOF')
666
- tempexpression = tempexpression[posoneof + 5,tempexpression.length - 5]
667
- posclose = tempexpression.index(')')
668
- oneof_name_list = tempexpression[0,posclose].scan(/\w+/)
669
- while oneof_name_list.size != 0
670
- first_class_name = oneof_name_list[0]
671
- oneof_name_list.delete(first_class_name)
672
- for disjoint_class_name in oneof_name_list
673
- res = ERB.new(disjoint_template)
674
- t = res.result(binding)
675
- file.puts t
676
- end
677
- end
678
- end
679
- else
680
- end
681
-
682
- end
683
-
684
-
685
- end
686
-
687
- # Handle mapping common string attributes to OWL DatatypeProperties of OWL Thing
688
-
689
- for thing_attribute in thing_attributes
690
- owl_property_name = thing_attribute
691
- owl_property_range = 'http://www.w3.org/2001/XMLSchema#string'
692
- owl_property_domain = nil
693
- owl_super_property_name = nil
694
- res = ERB.new(attribute_builtin_template)
695
- t = res.result(binding)
696
- file.puts t
697
- end
698
-
699
- # Handle EXPRESS attributes on an entity-by-entity basis
700
- for entity in entity_list
701
-
702
- class_name = entity.name
703
-
704
- attribute_list = entity.attributes.find_all{ |a| a.kind_of? EXPSM::Explicit and !thing_attributes.include?(a.name)}
705
- thing_attr_list = entity.attributes.find_all{ |a| a.kind_of? EXPSM::Explicit and thing_attributes.include?(a.name)}
706
- inverse_list = entity.attributes.find_all{ |a| a.kind_of? EXPSM::Inverse and !thing_attributes.include?(a.name)}
707
-
708
- thing_attr_mapped_list = thing_attr_mapped_list + thing_attr_list
709
-
710
- all_explicit_list = all_explicit_list + entity.attributes.find_all{ |a| a.kind_of? EXPSM::Explicit}
711
- all_derived_list = all_derived_list + entity.attributes.find_all{ |a| a.kind_of? EXPSM::Derived}
712
-
713
- all_inverse_list = all_inverse_list + inverse_list
714
-
715
- # Handle EXPRESS inverse attribute mapping to OWL inverse property
716
- for attribute in inverse_list
717
- if attribute.reverseAttr != []
718
- inverse_mapped_list.push attribute
719
- owl_property_range = attribute.domain
720
- owl_property_name = entity.name + '.' + attribute.name
721
- owl_property_domain = entity.name
722
- owl_inverted_property_name = attribute.reverseEntity.name + '.' + attribute.reverseAttr.name
723
- res = ERB.new(inverse_entity_template)
724
- t = res.result(binding)
725
- file.puts t
726
- end
727
- end
728
-
729
- # Handle EXPRESS explicit attribute mapping to OWL property
730
- for attribute in attribute_list
731
-
732
- express_attribute_domain = nil
733
- type_is_builtin = false
734
- if !attribute.isBuiltin
735
- express_attribute_domain = NamedType.find_by_name( attribute.domain )
736
- if express_attribute_domain.instance_of? EXPSM::Type
737
- type_is_builtin = is_utlimate_type_builtin( express_attribute_domain )
738
- end
739
- end
740
-
741
- case
742
-
743
- # Handle EXPRESS explicit attributes of LIST of built-in simple type, including redeclaration
744
- when (attribute.isBuiltin and attribute.instance_of? EXPSM::ExplicitAggregate and attribute.rank == 1 and attribute.dimensions[0].aggrtype = 'LIST')
745
- explicit_mapped_list.push attribute
746
- list_mapped_attr_list.push attribute
747
- list_name = entity.name + '.' + attribute.name + '-' + attribute.domain.to_s + '-List'
748
- superlist_name = "http://www.w3.org/1999/02/22-rdf-syntax-ns#List"
749
- res = ERB.new(rdflist_template)
750
- t = res.result(binding)
751
- file.puts t
752
- owl_property_name = entity.name + '.' + attribute.name
753
- owl_property_domain = entity.name
754
- owl_property_range = list_name
755
- res = ERB.new(attribute_entity_template)
756
- t = res.result(binding)
757
- file.puts t
758
-
759
- # Handle EXPRESS explicit attributes of ARRAY of built-in simple type, including redeclaration
760
- when (attribute.isBuiltin and attribute.instance_of? EXPSM::ExplicitAggregate and attribute.rank == 1 and attribute.dimensions[0].aggrtype = 'ARRAY')
761
- explicit_mapped_list.push attribute
762
- list_mapped_attr_list.push attribute
763
- list_name = entity.name + '.' + attribute.name + '-' + attribute.domain.to_s + '-Array'
764
- superlist_name = "http://www.w3.org/1999/02/22-rdf-syntax-ns#List"
765
- res = ERB.new(rdflist_template)
766
- t = res.result(binding)
767
- file.puts t
768
- owl_property_name = entity.name + '.' + attribute.name
769
- owl_property_domain = entity.name
770
- owl_property_range = list_name
771
- res = ERB.new(attribute_entity_template)
772
- t = res.result(binding)
773
- file.puts t
774
-
775
- # Handle EXPRESS explicit attributes of LIST of TYPE that is built-in simple type, including redeclaration
776
- when (express_attribute_domain.instance_of? EXPSM::Type and type_is_builtin and attribute.instance_of? EXPSM::ExplicitAggregate and attribute.rank == 1 and attribute.dimensions[0].aggrtype = 'LIST')
777
- explicit_mapped_list.push attribute
778
- list_mapped_attr_list.push attribute
779
- list_name = entity.name + '.' + attribute.name + '-' + attribute.domain.to_s + '-List'
780
- superlist_name = "http://www.w3.org/1999/02/22-rdf-syntax-ns#List"
781
- res = ERB.new(rdflist_template)
782
- t = res.result(binding)
783
- file.puts t
784
- owl_property_name = entity.name + '.' + attribute.name
785
- owl_property_domain = entity.name
786
- owl_property_range = list_name
787
- res = ERB.new(attribute_entity_template)
788
- t = res.result(binding)
789
- file.puts t
790
-
791
- # Handle EXPRESS explicit attributes of ARRAY of TYPE that is built-in simple type, including redeclaration
792
- when (express_attribute_domain.instance_of? EXPSM::Type and type_is_builtin and attribute.instance_of? EXPSM::ExplicitAggregate and attribute.rank == 1 and attribute.dimensions[0].aggrtype = 'ARRAY')
793
- explicit_mapped_list.push attribute
794
- list_mapped_attr_list.push attribute
795
- list_name = entity.name + '.' + attribute.name + '-' + attribute.domain.to_s + '-Array'
796
- superlist_name = "http://www.w3.org/1999/02/22-rdf-syntax-ns#List"
797
- res = ERB.new(rdflist_template)
798
- t = res.result(binding)
799
- file.puts t
800
- owl_property_name = entity.name + '.' + attribute.name
801
- owl_property_domain = entity.name
802
- owl_property_range = list_name
803
- res = ERB.new(attribute_entity_template)
804
- t = res.result(binding)
805
- file.puts t
806
-
807
-
808
- # Handle EXPRESS explicit attributes of built-in simple type, including redeclaration
809
- when (attribute.isBuiltin)
810
- explicit_mapped_list.push attribute
811
- owl_property_range = datatype_hash[attribute.domain]
812
- owl_property_name = entity.name + '.' + attribute.name
813
- owl_property_domain = entity.name
814
- owl_super_property_name = nil
815
- if attribute.redeclare_entity != nil
816
- if attribute.redeclare_oldname == nil
817
- owl_super_property_name = attribute.redeclare_entity + '.' + attribute.name
818
- else
819
- owl_super_property_name = attribute.redeclare_entity + '.' + attribute.redeclare_oldname
820
- end
821
- end
822
- res = ERB.new(attribute_builtin_template)
823
- t = res.result(binding)
824
- file.puts t
825
-
826
- # Handle EXPRESS explicit attribute, not redeclaration, refers to Type that is Type = builtin datatype
827
- when (!attribute.redeclare_entity and express_attribute_domain.instance_of? EXPSM::Type and type_is_builtin)
828
- explicit_mapped_list.push attribute
829
- owl_property_range = attribute.domain
830
- owl_property_name = entity.name + '.' + attribute.name
831
- owl_property_domain = entity.name
832
- res = ERB.new(attribute_typebuiltin_template)
833
- t = res.result(binding)
834
- file.puts t
835
-
836
- # Handle EXPRESS explicit attributes of enum type, ignoring redeclarations
837
- when (express_attribute_domain.kind_of? EXPSM::TypeEnum)
838
- explicit_mapped_list.push attribute
839
- owl_property_name = entity.name + '.' + attribute.name
840
- owl_property_domain = entity.name
841
- owl_property_range = attribute.domain
842
- res = ERB.new(attribute_entity_template)
843
-
844
- # if !type_mapped_list.include?(express_attribute_domain)
845
- # type_mapped_list.push express_attribute_domain
846
- # end
847
- # enumitem_name_list = express_attribute_domain.items.scan(/\w+/)
848
- # res = ERB.new(attribute_enum_template)
849
-
850
- t = res.result(binding)
851
- file.puts t
852
- if attribute.redeclare_entity
853
- puts 'WARNING: ' + entity.name + ' ' + attribute.name + ' Attribute redeclaration for Enumerations not mapped'
854
- end
855
-
856
- # Handle EXPRESS explicit attribute, not redeclaration, and only refer to EXPRESS Select or Entity
857
- when (!attribute.redeclare_entity and (express_attribute_domain.kind_of? EXPSM::Entity or express_attribute_domain.kind_of? EXPSM::TypeSelect))
858
- explicit_mapped_list.push attribute
859
- owl_property_range = attribute.domain
860
- owl_property_name = entity.name + '.' + attribute.name
861
- owl_property_domain = entity.name
862
- res = ERB.new(attribute_entity_template)
863
- t = res.result(binding)
864
- file.puts t
865
-
866
- # Handle EXPRESS explicit attribute, redeclaration, and only refer to EXPRESS Select or Entity
867
- when (attribute.redeclare_entity and (express_attribute_domain.kind_of? EXPSM::Entity or express_attribute_domain.kind_of? EXPSM::TypeSelect))
868
- explicit_mapped_list.push attribute
869
- owl_property_range = attribute.domain
870
- owl_property_name = entity.name + '.' + attribute.name
871
- if attribute.redeclare_oldname == nil
872
- owl_super_property_name = attribute.redeclare_entity + '.' + attribute.name
873
- else
874
- owl_super_property_name = attribute.redeclare_entity + '.' + attribute.redeclare_oldname
875
- end
876
- owl_property_domain = entity.name
877
- res = ERB.new(attribute_redeclare_entity_template)
878
- t = res.result(binding)
879
- file.puts t
880
-
881
- # Handle EXPRESS explicit attribute of EXPRESS Type = A Type name that is a Select
882
- when (express_attribute_domain.kind_of? EXPSM::Type and NamedType.find_by_name( express_attribute_domain.domain ).kind_of? EXPSM::TypeSelect)
883
- explicit_mapped_list.push attribute
884
- owl_property_range = attribute.domain
885
- owl_property_name = entity.name + '.' + attribute.name
886
- owl_property_domain = entity.name
887
- res = ERB.new(attribute_entity_template)
888
- t = res.result(binding)
889
- file.puts t
890
-
891
- # Handle EXPRESS explicit attribute, redeclaration, and only refer to EXPRESS Type = A Type name that is a Select
892
- when (attribute.redeclare_entity and (express_attribute_domain.kind_of? EXPSM::Type and NamedType.find_by_name( express_attribute_domain.domain ).kind_of? EXPSM::TypeSelect))
893
-
894
- explicit_mapped_list.push attribute
895
- owl_property_range = attribute.domain
896
- owl_property_name = entity.name + '.' + attribute.name
897
- if attribute.redeclare_oldname == nil
898
- owl_super_property_name = attribute.redeclare_entity + '.' + attribute.name
899
- else
900
- owl_super_property_name = attribute.redeclare_entity + '.' + attribute.redeclare_oldname
901
- end
902
- owl_property_domain = entity.name
903
- res = ERB.new(attribute_redeclare_entity_template)
904
- t = res.result(binding)
905
- file.puts t
906
-
907
- else
908
- puts 'WARNING: ' + entity.name + ' ' + attribute.name + ' Attribute type not yet mapped'
909
- end
910
-
911
- min_cardinality = 1
912
- max_cardinality = 1
913
-
914
- if attribute.isOptional == true
915
- min_cardinality = 0
916
- end
917
-
918
- if (attribute.instance_of? EXPSM::ExplicitAggregate and attribute.rank == 1 and attribute.dimensions[0].aggrtype != 'LIST' and attribute.dimensions[0].aggrtype != 'ARRAY')
919
- if attribute.isOptional == false
920
- min_cardinality = attribute.dimensions[0].lower.to_i
921
- end
922
- if attribute.dimensions[0].upper == '?'
923
- max_cardinality = -1
924
- else
925
- max_cardinality = attribute.dimensions[0].upper.to_i
926
- end
927
- if attribute.rank > 1
928
- puts 'WARNING: ' + owl_property_name + ' n-dimensional aggregate attribute cardinalities not mapped '
929
- max_cardinality = -1
930
- end
931
- end
932
-
933
- if min_cardinality == max_cardinality
934
- res = ERB.new(cardinality_template)
935
- t = res.result(binding)
936
- file.puts t
937
- else
938
- res = ERB.new(min_cardinality_template)
939
- t = res.result(binding)
940
- file.puts t
941
- if max_cardinality != -1
942
- res = ERB.new(max_cardinality_template)
943
- t = res.result(binding)
944
- file.puts t
945
- end
946
- end
947
-
948
-
949
- if (attribute.redeclare_entity and !(express_attribute_domain.kind_of? EXPSM::Entity or express_attribute_domain.kind_of? EXPSM::TypeSelect))
950
- if (attribute.redeclare_entity and !(express_attribute_domain.kind_of? EXPSM::Type and NamedType.find_by_name( express_attribute_domain.domain ).kind_of? EXPSM::TypeSelect))
951
- if (attribute.redeclare_entity and !attribute.isBuiltin)
952
- puts 'WARNING: ' + entity.name + ' ' + attribute.name + ' Attribute redeclaration may need hand editing'
953
- end
954
- end
955
- end
956
-
957
- end
958
-
959
- end
960
-
961
-
962
- res = ERB.new(schema_end_template)
963
- t = res.result(binding)
964
- file.puts t
965
-
966
- puts ' '
967
- puts 'Schema Mapping Summary for : ' + schema.name
968
- all_type_list = schema.contents.find_all{ |e| e.kind_of? EXPSM::DefinedType }
969
-
970
-
971
- puts ' ENTITYs mapped = ' + entity_mapped_list.size.to_s + ' of ' + entity_list.size.to_s
972
- puts ' - ' + superexpression_mapped_list.size.to_s + ' of ' + all_superexpression_list.size.to_s + ' ENTITY SUPERTYPE expressions mapped (only simple ONEOF supported)'
973
- for t in all_superexpression_list - superexpression_mapped_list
974
- puts ' Not mapped: ' + t.name
975
- end
976
- puts ' - ' + inverse_mapped_list.size.to_s + ' of ' + all_inverse_list.size.to_s + ' inverse attributes mapped (inverse of inherited not supported)'
977
- notmapped_list = all_inverse_list - inverse_mapped_list
978
- for t in notmapped_list
979
- puts ' Not mapped: ' + t.entity.name + '.' + t.name
980
- end
981
- puts ' - ' + thing_attr_mapped_list.size.to_s + ' of ' + all_explicit_list.size.to_s + ' explicit attributes mapped with owl:Thing as domain (configurable)'
982
- puts ' - ' + explicit_mapped_list.size.to_s + ' of ' + all_explicit_list.size.to_s + ' explicit attributes mapped'
983
- for t in list_mapped_attr_list
984
- puts ' rdf:List mapped: ' + t.name
985
- end
986
-
987
- notmapped_list = all_explicit_list - explicit_mapped_list - thing_attr_mapped_list
988
- for t in notmapped_list
989
- puts ' Not mapped: ' + t.entity.name + '.' + t.name
990
- end
991
- puts ' - ' + all_derived_list.size.to_s + ' derived attributes not mapped, not supported'
992
- puts ' TYPEs mapped = ' + type_mapped_list.size.to_s + ' of ' + all_type_list.size.to_s
993
- for t in list_mapped_type_list
994
- puts ' rdf:List mapped: ' + t.name
995
- end
996
- for t in mixed_select_list
997
- puts ' Select of entity & type Class mapped: ' + t.name
998
- end
999
- for t in type_union_mapped_list
1000
- puts ' Select RDFS Datatype owl:unionOf mapped: ' + t.name
1001
- end
1002
- notmapped_list = all_type_list - type_mapped_list
1003
- for t in notmapped_list
1004
- puts ' Not mapped: ' + t.name
1005
- end
1006
- puts ' '
1007
- puts 'Wrote post-processed schema to file: ' + post_processed_schema_file_name if post_processed_schema
1008
-
1009
-
1010
- end
1011
-
1012
- res = ERB.new(overall_end_template)
1013
- t = res.result(binding)
1014
- file.puts t
1015
-
1016
- post_processed_schema_file.close if post_processed_schema
1017
-
1018
- end