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.
Files changed (183) hide show
  1. checksums.yaml +7 -0
  2. data/.cross_rubies +30 -0
  3. data/.github/workflows/rake.yml +45 -0
  4. data/.github/workflows/release.yml +84 -0
  5. data/.gitignore +17 -0
  6. data/.gitmodules +3 -0
  7. data/.rspec +2 -0
  8. data/.rubocop.yml +508 -0
  9. data/Gemfile +4 -0
  10. data/README.adoc +147 -0
  11. data/Rakefile +11 -0
  12. data/bin/console +12 -0
  13. data/bin/rspec +29 -0
  14. data/bin/setup +8 -0
  15. data/demo.rb +18 -0
  16. data/docs/development.md +90 -0
  17. data/exe/expressir +20 -0
  18. data/exe/generate-parser +48 -0
  19. data/expressir.gemspec +43 -0
  20. data/lib/expressir.rb +21 -0
  21. data/lib/expressir/cli.rb +27 -0
  22. data/lib/expressir/cli/ui.rb +36 -0
  23. data/lib/expressir/config.rb +23 -0
  24. data/lib/expressir/express.rb +11 -0
  25. data/lib/expressir/express/aggregate_dimension.rb +38 -0
  26. data/lib/expressir/express/attribute.rb +15 -0
  27. data/lib/expressir/express/comment.rb +7 -0
  28. data/lib/expressir/express/defined_type.rb +36 -0
  29. data/lib/expressir/express/derived.rb +65 -0
  30. data/lib/expressir/express/derived_aggregate.rb +43 -0
  31. data/lib/expressir/express/entity.rb +137 -0
  32. data/lib/expressir/express/explicit.rb +70 -0
  33. data/lib/expressir/express/explicit_aggregate.rb +46 -0
  34. data/lib/expressir/express/explicit_or_derived.rb +16 -0
  35. data/lib/expressir/express/global_rule.rb +44 -0
  36. data/lib/expressir/express/interface_specification.rb +51 -0
  37. data/lib/expressir/express/interfaced_item.rb +38 -0
  38. data/lib/expressir/express/inverse.rb +46 -0
  39. data/lib/expressir/express/inverse_aggregate.rb +37 -0
  40. data/lib/expressir/express/model_element.rb +7 -0
  41. data/lib/expressir/express/named_type.rb +19 -0
  42. data/lib/expressir/express/remark.rb +8 -0
  43. data/lib/expressir/express/repository.rb +306 -0
  44. data/lib/expressir/express/schema_definition.rb +96 -0
  45. data/lib/expressir/express/subtype_constraint.rb +14 -0
  46. data/lib/expressir/express/type.rb +26 -0
  47. data/lib/expressir/express/type_aggregate.rb +42 -0
  48. data/lib/expressir/express/type_enum.rb +29 -0
  49. data/lib/expressir/express/type_parser.rb +45 -0
  50. data/lib/expressir/express/type_select.rb +82 -0
  51. data/lib/expressir/express/unique_rule.rb +35 -0
  52. data/lib/expressir/express/where_rule.rb +32 -0
  53. data/lib/expressir/express_exp/2.4/express_parser.so +0 -0
  54. data/lib/expressir/express_exp/2.5/express_parser.so +0 -0
  55. data/lib/expressir/express_exp/2.6/express_parser.so +0 -0
  56. data/lib/expressir/express_exp/2.7/express_parser.so +0 -0
  57. data/lib/expressir/express_exp/3.0/express_parser.so +0 -0
  58. data/lib/expressir/express_exp/formatter.rb +1450 -0
  59. data/lib/expressir/express_exp/parser.rb +41 -0
  60. data/lib/expressir/express_exp/visitor.rb +2464 -0
  61. data/lib/expressir/express_parser.rb +30 -0
  62. data/lib/expressir/model.rb +65 -0
  63. data/lib/expressir/model/attribute.rb +27 -0
  64. data/lib/expressir/model/constant.rb +17 -0
  65. data/lib/expressir/model/entity.rb +46 -0
  66. data/lib/expressir/model/enumeration_item.rb +11 -0
  67. data/lib/expressir/model/expressions/aggregate_initializer.rb +13 -0
  68. data/lib/expressir/model/expressions/aggregate_item.rb +15 -0
  69. data/lib/expressir/model/expressions/attribute_reference.rb +15 -0
  70. data/lib/expressir/model/expressions/binary_expression.rb +40 -0
  71. data/lib/expressir/model/expressions/call.rb +15 -0
  72. data/lib/expressir/model/expressions/entity_constructor.rb +15 -0
  73. data/lib/expressir/model/expressions/group_reference.rb +15 -0
  74. data/lib/expressir/model/expressions/index_reference.rb +17 -0
  75. data/lib/expressir/model/expressions/interval.rb +21 -0
  76. data/lib/expressir/model/expressions/query_expression.rb +26 -0
  77. data/lib/expressir/model/expressions/simple_reference.rb +13 -0
  78. data/lib/expressir/model/expressions/unary_expression.rb +19 -0
  79. data/lib/expressir/model/function.rb +62 -0
  80. data/lib/expressir/model/identifier.rb +10 -0
  81. data/lib/expressir/model/interface.rb +18 -0
  82. data/lib/expressir/model/literals/binary.rb +13 -0
  83. data/lib/expressir/model/literals/integer.rb +13 -0
  84. data/lib/expressir/model/literals/logical.rb +17 -0
  85. data/lib/expressir/model/literals/real.rb +13 -0
  86. data/lib/expressir/model/literals/string.rb +15 -0
  87. data/lib/expressir/model/parameter.rb +17 -0
  88. data/lib/expressir/model/procedure.rb +60 -0
  89. data/lib/expressir/model/renamed_ref.rb +13 -0
  90. data/lib/expressir/model/repository.rb +19 -0
  91. data/lib/expressir/model/rule.rb +62 -0
  92. data/lib/expressir/model/schema.rb +67 -0
  93. data/lib/expressir/model/scope.rb +17 -0
  94. data/lib/expressir/model/statements/alias.rb +26 -0
  95. data/lib/expressir/model/statements/assignment.rb +15 -0
  96. data/lib/expressir/model/statements/call.rb +15 -0
  97. data/lib/expressir/model/statements/case.rb +17 -0
  98. data/lib/expressir/model/statements/case_action.rb +15 -0
  99. data/lib/expressir/model/statements/compound.rb +13 -0
  100. data/lib/expressir/model/statements/escape.rb +8 -0
  101. data/lib/expressir/model/statements/if.rb +17 -0
  102. data/lib/expressir/model/statements/null.rb +8 -0
  103. data/lib/expressir/model/statements/repeat.rb +34 -0
  104. data/lib/expressir/model/statements/return.rb +13 -0
  105. data/lib/expressir/model/statements/skip.rb +8 -0
  106. data/lib/expressir/model/subtype_constraint.rb +27 -0
  107. data/lib/expressir/model/type.rb +24 -0
  108. data/lib/expressir/model/types/aggregate.rb +17 -0
  109. data/lib/expressir/model/types/array.rb +21 -0
  110. data/lib/expressir/model/types/bag.rb +17 -0
  111. data/lib/expressir/model/types/binary.rb +15 -0
  112. data/lib/expressir/model/types/boolean.rb +8 -0
  113. data/lib/expressir/model/types/enumeration.rb +19 -0
  114. data/lib/expressir/model/types/generic.rb +13 -0
  115. data/lib/expressir/model/types/generic_entity.rb +13 -0
  116. data/lib/expressir/model/types/integer.rb +8 -0
  117. data/lib/expressir/model/types/list.rb +19 -0
  118. data/lib/expressir/model/types/logical.rb +8 -0
  119. data/lib/expressir/model/types/number.rb +8 -0
  120. data/lib/expressir/model/types/real.rb +13 -0
  121. data/lib/expressir/model/types/select.rb +21 -0
  122. data/lib/expressir/model/types/set.rb +17 -0
  123. data/lib/expressir/model/types/string.rb +15 -0
  124. data/lib/expressir/model/unique.rb +15 -0
  125. data/lib/expressir/model/variable.rb +17 -0
  126. data/lib/expressir/model/where.rb +15 -0
  127. data/lib/expressir/parser.rb +6 -0
  128. data/lib/expressir/parser/owl_parser.rb +8 -0
  129. data/lib/expressir/version.rb +3 -0
  130. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.exp +9589 -0
  131. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.owl +36619 -0
  132. data/original/examples/ap233/ap233e1_arm_lf_stepmod-2010-11-12.xml +13294 -0
  133. data/original/examples/employment/eclipse/.project +17 -0
  134. data/original/examples/employment/eclipse/Export/Employment.png +0 -0
  135. data/original/examples/employment/eclipse/Express/employment_schema.exp +33 -0
  136. data/original/examples/employment/eclipse/Express/employment_schema.xmi +77 -0
  137. data/original/examples/employment/eclipse/Express/employment_schema.xml +93 -0
  138. data/original/examples/employment/eclipse/Models/Employment.uml +4 -0
  139. data/original/examples/employment/eclipse/Models/Employment.umldi +240 -0
  140. data/original/examples/employment/eclipse/readme.txt +7 -0
  141. data/original/examples/employment/employment_schema.exp +33 -0
  142. data/original/examples/employment/employment_schema.rb +232 -0
  143. data/original/examples/employment/employment_schema.xml +93 -0
  144. data/original/examples/employment/employment_schema___module.rb +46 -0
  145. data/original/examples/employment/employment_schema___p28attr.rb +126 -0
  146. data/original/examples/employment/employment_schema___p28inst.rb +26 -0
  147. data/original/examples/employment/example_employment_data.xml +1 -0
  148. data/original/examples/employment/example_employment_data_copy.xml +1 -0
  149. data/original/examples/employment/example_employment_reader.rb +30 -0
  150. data/original/examples/employment/example_employment_writer.rb +51 -0
  151. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.exp +3710 -0
  152. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.owl +35880 -0
  153. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xmi +15357 -0
  154. data/original/examples/plcs/ap239e1_arm_lf_dexlib_2010-01-06.xml +9468 -0
  155. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.exp +8404 -0
  156. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.owl +43147 -0
  157. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xmi +18341 -0
  158. data/original/examples/plcs/ap239e2_arm_lf_stepmod-2010-01-25.xml +11632 -0
  159. data/original/examples/syntax/remark.exp +146 -0
  160. data/original/examples/syntax/remark_formatted.exp +175 -0
  161. data/original/examples/syntax/syntax.exp +311 -0
  162. data/original/examples/syntax/syntax_formatted.exp +1191 -0
  163. data/original/exp2ruby.rb +525 -0
  164. data/original/expsm.rb +34 -0
  165. data/original/mapping_owl.rb +1018 -0
  166. data/original/mapping_sysml.rb +2281 -0
  167. data/original/mapping_uml2.rb +599 -0
  168. data/original/mapping_uml2_eclipse.rb +433 -0
  169. data/original/reeper.rb +134 -0
  170. data/rakelib/cross-ruby.rake +308 -0
  171. data/spec/acceptance/express_to_owl_spec.rb +18 -0
  172. data/spec/acceptance/version_spec.rb +12 -0
  173. data/spec/expressir/express/repository_spec.rb +25 -0
  174. data/spec/expressir/express_exp/ap233_spec.rb +22 -0
  175. data/spec/expressir/express_exp/format_remark_spec.rb +28 -0
  176. data/spec/expressir/express_exp/format_syntax_spec.rb +28 -0
  177. data/spec/expressir/express_exp/parse_remark_spec.rb +346 -0
  178. data/spec/expressir/express_exp/parse_syntax_spec.rb +3003 -0
  179. data/spec/expressir/model/find_spec.rb +110 -0
  180. data/spec/expressr_spec.rb +5 -0
  181. data/spec/spec_helper.rb +17 -0
  182. data/spec/support/console_helper.rb +29 -0
  183. metadata +357 -0
@@ -0,0 +1,70 @@
1
+ require "expressir/express/explicit_or_derived"
2
+
3
+ module Expressir
4
+ module Express
5
+ class Explicit < ExplicitOrDerived
6
+ attr_accessor :isOptional
7
+
8
+ def initialize(options = {})
9
+ @isOptional = false
10
+ @options = options
11
+ @entity = options.fetch(:entity, nil)
12
+ end
13
+
14
+ def parse
15
+ document = options.fetch(:document)
16
+ extract_common_attributes(document)
17
+ extract_type_specific_attributes(document)
18
+
19
+ self
20
+ end
21
+
22
+ def self.parse(document, entity)
23
+ new(document: document, entity: entity).parse
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :options
29
+
30
+ def extract_type_specific_attributes(document); end
31
+
32
+ def extract_common_attributes(document)
33
+ @name = document.attributes["name"].to_s
34
+ @domain = extract_domain_name(document.xpath("typename"))
35
+ @isOptional = document.attributes["optional"].to_s == "YES"
36
+
37
+ extract_builtintype_attributes(document)
38
+ extract_redeclaration_attributes(document)
39
+ end
40
+
41
+ def extract_domain_name(typename)
42
+ unless typename.empty?
43
+ typename.first.attributes["name"].to_s
44
+ end
45
+ end
46
+
47
+ def extract_builtintype_attributes(document)
48
+ builtin_type = document.xpath("builtintype").first
49
+
50
+ if builtin_type
51
+ @isBuiltin = true
52
+ @domain = builtin_type.attributes["type"].to_s
53
+ @width = builtin_type.attributes["width"].to_s
54
+ @fixed = builtin_type.attributes["fixed"] == "YES"
55
+ @precision = builtin_type.attributes["precision"].to_s
56
+ end
57
+ end
58
+
59
+ def extract_redeclaration_attributes(document)
60
+ redeclaration = document.xpath("redeclaration").first
61
+
62
+ if redeclaration
63
+ @redeclare_entity = redeclaration.attributes["entity-ref"].to_s
64
+ old_name = redeclaration.attributes["old_name"]
65
+ @redeclare_oldname = old_name.to_s if old_name
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,46 @@
1
+ require "expressir/express/aggregate_dimension"
2
+
3
+ module Expressir
4
+ module Express
5
+ class ExplicitAggregate < Explicit
6
+ attr_accessor :rank, :dimensions
7
+
8
+ def initialize(options = {})
9
+ @rank = 0
10
+ @dimensions = []
11
+ @isOptional = false
12
+
13
+ super(options)
14
+ end
15
+
16
+ private
17
+
18
+ def extract_type_specific_attributes(document)
19
+ @dimensions = document.xpath("aggregate").map do |aggregate|
20
+ Express::AggregateDimension.parse(aggregate)
21
+ end
22
+
23
+ @rank = @dimensions.size
24
+ extract_inverse_aggregate(document)
25
+ end
26
+
27
+ # @todo: Non existance attributes
28
+ #
29
+ # In the codebase, they are trying to add couple of aggregate
30
+ # dimensions related attributes that was never a part of the
31
+ # Explict class, but for consistency we are keeping those as
32
+ # it is for now. let's revist those later and fix it.
33
+ #
34
+ def extract_inverse_aggregate(document)
35
+ aggregates = document.xpath("inverse.aggregate")
36
+
37
+ if !aggregates.empty?
38
+ dimension = Express::AggregateDimension.parse(aggregates.first)
39
+ @aggrtype = dimension.aggrtype
40
+ @lower = dimension.lower
41
+ @upper = dimension.upper
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,16 @@
1
+ require "expressir/express/attribute"
2
+
3
+ module Expressir
4
+ module Express
5
+ class ExplicitOrDerived < Attribute
6
+ attr_accessor :isBuiltin, :isFixed, :width, :precision
7
+
8
+ def initialize
9
+ @isBuiltin = false
10
+ @isFixed = false
11
+ @width = nil
12
+ @precision = nil
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,44 @@
1
+ require "expressir/express/model_element"
2
+
3
+ module Expressir
4
+ module Express
5
+ class GlobalRule < ModelElement
6
+ attr_accessor :name, :entities, :algorithm, :wheres,
7
+ :schema, :entities_array
8
+
9
+ def initialize(options = {})
10
+ @entities_array = []
11
+ @wheres = []
12
+
13
+ @options = options
14
+ @schema = options.fetch(:schema, nil)
15
+ end
16
+
17
+ def parse
18
+ document = @options.fetch(:document)
19
+ extract_rule_attributes(document)
20
+
21
+ self
22
+ end
23
+
24
+ def self.parse(document, schema)
25
+ new(document: document, schema: schema).parse
26
+ end
27
+
28
+ private
29
+
30
+ def extract_rule_attributes(document)
31
+ @wheres = extract_where_rules(document)
32
+ @name = document.attributes["name"].to_s
33
+ @entities = document.attributes["appliesto"].to_s
34
+ @algorithm = document.attributes["algorithm"]
35
+ end
36
+
37
+ def extract_where_rules(document)
38
+ document.xpath("where").map do |where|
39
+ Express::WhereRule.parse(where)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,51 @@
1
+ require "expressir/express/model_element"
2
+
3
+ module Expressir
4
+ module Express
5
+ class InterfaceSpecification < ModelElement
6
+ attr_accessor :kind, :current_schema, :explicit_items,
7
+ :current_schema_id, :foreign_schema_id, :foreign_schema
8
+
9
+ def initialize(attributes = {})
10
+ @explicit_items = []
11
+ @attributes = attributes
12
+ end
13
+
14
+ def parse
15
+ extract_attributes(@attributes)
16
+ end
17
+
18
+ def self.parse(document, schema)
19
+ new(document: document, schema: schema).parse
20
+ end
21
+
22
+ private
23
+
24
+ # Note:
25
+ #
26
+ # The the old version was passing around the whole instance
27
+ # of the schema, and that might be one of the reason why the
28
+ # parsing was super slow.
29
+ #
30
+ # So, we are not passing around an instnace anymore, but the
31
+ # name of the schema, and later if we find out there is actually
32
+ # a reason to do that then we wil add it back.
33
+ #
34
+ def extract_attributes(document, options)
35
+ @foreign_schema = options.fetch("schema")
36
+ @foreign_schema_id = foreign_schema&.name&.to_s
37
+ @current_schema = foreign_schema
38
+ @foreign_schema_id = foreign_schema_id
39
+
40
+ @kind = document.attributes["kind"].to_s
41
+ @explicit_items = extract_items(document, foreign_schema)
42
+ end
43
+
44
+ def extract_items(document, schema)
45
+ document.xpath("interfaced.item").map do |item|
46
+ InterfacedItem.parse(document, schema)
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,38 @@
1
+ module Expressir
2
+ module Express
3
+ class InterfacedItem
4
+ attr_accessor :name, :original_name, :foreign_schema, :foreign_type
5
+
6
+ def initialize(attributes = {})
7
+ @original_name = nil
8
+ @attributes = attributes
9
+ end
10
+
11
+ def parse
12
+ schema = attributes.extract(:schema, nil)
13
+ document = attributes.extract(:document, nil)
14
+
15
+ extract_attributes(document, schema)
16
+ end
17
+
18
+ def self.parse(document, schema)
19
+ new(document: document, schema: schema).parse
20
+ end
21
+
22
+ private
23
+
24
+ attr_reader :attributes
25
+
26
+ def extract_attributes(document, schema)
27
+ @foreign_schema = schema
28
+ @name = document.attributes["name"].to_s
29
+
30
+ if document.attributes["alias"] != nil
31
+ @name = document.attributes["alias"].to_s
32
+ @original_name = document.attributes["name"].to_s
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+
@@ -0,0 +1,46 @@
1
+ module Expressir
2
+ module Express
3
+ class Inverse < Attribute
4
+ attr_accessor :reverseAttr_id, :reverseAttr, :reverseEntity
5
+
6
+ def initialize(options = {})
7
+ @options = options
8
+ @entity = options.fetch(:entity, nil)
9
+ end
10
+
11
+ def parse
12
+ document = @options.fetch(:document)
13
+ extract_common_attributes(document)
14
+ extract_type_specific_attributes(document)
15
+
16
+ self
17
+ end
18
+
19
+ def self.parse(document, entity)
20
+ new(document: document, entity: entity).parse
21
+ end
22
+
23
+ private
24
+
25
+ def extract_type_specific_attributes(document); end
26
+
27
+ def extract_common_attributes(document)
28
+ @name = document.attributes["name"].to_s
29
+ @reverseAttr_id = document.attributes["attribute"]
30
+ @domain = document.attributes["entity"].to_s
31
+
32
+ extract_redeclaration_attributes(document)
33
+ end
34
+
35
+ def extract_redeclaration_attributes(document)
36
+ redeclaration = document.xpath("redeclaration").first
37
+
38
+ if redeclaration
39
+ @redeclare_entity = redeclaration.attributes["entity-ref"].to_s
40
+ old_name = redeclaration.attributes["old_name"]
41
+ @redeclare_oldname = old_name.to_s if old_name
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,37 @@
1
+ module Expressir
2
+ module Express
3
+ class InverseAggregate < Inverse
4
+ attr_accessor :aggrtype, :lower, :upper
5
+
6
+ def initialize(options = {})
7
+ @aggrtype = "SET"
8
+ @lower = "0"
9
+ @upper = "?"
10
+
11
+ super(options)
12
+ end
13
+
14
+ private
15
+
16
+ def extract_type_specific_attributes(document)
17
+ @dimensions = document.xpath("aggregate").map do |aggregate|
18
+ Express::AggregateDimension.parse(aggregate)
19
+ end
20
+
21
+
22
+ extract_inverse_aggregate(document)
23
+ end
24
+
25
+ def extract_inverse_aggregate(document)
26
+ aggregates = document.xpath("inverse.aggregate")
27
+
28
+ if !aggregates.empty?
29
+ dimension = Express::AggregateDimension.parse(aggregates.first)
30
+ @aggrtype = dimension.aggrtype
31
+ @lower = dimension.lower
32
+ @upper = dimension.upper
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,7 @@
1
+ module Expressir
2
+ module Express
3
+ class ModelElement
4
+ attr_accessor :definition
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,19 @@
1
+ require "expressir/express/model_element"
2
+
3
+ module Expressir
4
+ module Express
5
+ class NamedType < ModelElement
6
+ attr_accessor :name, :schema, :wheres, :selectedBy
7
+
8
+ def self.find_by_name(name)
9
+ found = nil
10
+
11
+ ObjectSpace.each_object(NamedType) do |obj|
12
+ found = obj if obj.name == name
13
+ end
14
+
15
+ found
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,8 @@
1
+ require "expressir/express/comment"
2
+
3
+ module Expressir
4
+ module Express
5
+ class Remark < Comment
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,306 @@
1
+ require "expressir/express/interface_specification"
2
+
3
+ module Expressir
4
+ module Express
5
+ class Repository
6
+ @@next_integer_id = 0
7
+ attr_accessor :name, :schemas
8
+
9
+ def initialize(options = {}) @file = options.fetch(:file, nil)
10
+ @schemas = options.fetch(:schemas, [])
11
+ end
12
+
13
+ # @todo Existing Code
14
+ #
15
+ # Please revisit this soon, and check if this is necessary
16
+ # after our recent restrucutre, if not then delegate this
17
+ # behavior to the respective instanace.
18
+ #
19
+ def get_next_integer
20
+ @@next_integer_id += 1
21
+ @@next_integer_id
22
+ end
23
+
24
+ # @todo Existing Code
25
+ #
26
+ # Please revisit this soon, and check if this is necessary
27
+ # after our recent restrucutre, if not then delegate this
28
+ # behavior to the respective instanace.
29
+ #
30
+ def get_xmlid(thing)
31
+ if !thing.class.name.include? "::"
32
+ "id-" + thing.class.name + "-" + get_next_integer.to_s
33
+ else
34
+ thing_type = thing.class.name.split("::")
35
+ "id-" + thing_type[1] + "-" + get_next_integer.to_s
36
+ end
37
+ end
38
+
39
+ # @todo Existing Code
40
+ #
41
+ # Please revisit this soon, and check if this is necessary
42
+ # after our recent restrucutre, if not then delegate this
43
+ # behavior to the respective instanace.
44
+ #
45
+ def find_namedtype_by_name(typename)
46
+ foundtype = nil
47
+
48
+ while foundtype == nil
49
+ schemas.each do |schema|
50
+ foundtype = schema.find_namedtype_by_name(typename)
51
+ break unless foundtype.nil?
52
+ end
53
+ end
54
+
55
+ foundtype
56
+ end
57
+
58
+ def parse
59
+ @name = document.xpath("//express/schema/@name").to_s
60
+
61
+ @schemas = document.xpath("//express/schema").map do |schema|
62
+ Expressir::Express::SchemaDefinition.new(schema)
63
+ end
64
+
65
+ # @todo: Disabling for now
66
+ #
67
+ #post_process_repository
68
+ self
69
+ end
70
+
71
+ def self.from_xml(file)
72
+ new(file: file).parse
73
+ end
74
+
75
+ private
76
+
77
+ def document
78
+ @document ||= File.open(@file) { |fpath| Nokogiri::XML(fpath) }
79
+ end
80
+
81
+ # @todo Existing Code
82
+ #
83
+ # Please revisit this soon, and check if this is necessary
84
+ # after our recent restrucutre, if not then delegate this
85
+ # behavior to the respective instanace.
86
+ #
87
+ def post_process_repository
88
+ schemas.each do |schema|
89
+ schema.all_schema_array = get_all_interfaced_schemas(schema)
90
+
91
+ schema.contents.each do |content|
92
+ post_process_schema_content(content, schema)
93
+ end
94
+
95
+ # @todo: Copying existing code
96
+ #
97
+ # I'm not sure why we are running the content loop again, when
98
+ # we already had that one once, but I'm keeping it as it for now
99
+ # since this might be something we actually need to run after the
100
+ # initial pointer/linking setup, but please revisit and clean this
101
+ # up once we have more visibility.
102
+ #
103
+ schema.contents.each do |content|
104
+ if content.is_a?(Express::Entity)
105
+ content.attributes.each do |attr|
106
+ if attr.is_a?(Express::Inverse)
107
+ attr_to_find = attr.reverseAttr_id
108
+ attr.reverseEntity = schema.find_namedtype_by_name(attr.domain)
109
+ attr.reverseAttr = attr.reverseEntity.find_attr_by_name_full(
110
+ attr_to_find
111
+ )
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ # @todo: Existing Code
120
+ #
121
+ # We are just copying over this method from the existing codebase
122
+ # please revisit this one soon, this is recursively calling itself
123
+ # and this might be one of the potential reason for slow parsing
124
+ #
125
+ def get_all_interfaced_schemas(schema, schema_list = [])
126
+ ispec_list = schema.contents.select do |content|
127
+ content.is_a? Express::InterfaceSpecification
128
+ end
129
+
130
+ if !ispec_list&.nil?
131
+ ispec_list.each do |ispec|
132
+ if !(schema_list.include? ispec.foreign_schema)
133
+ schema_list.push ispec.foreign_schema
134
+ end
135
+
136
+ get_all_interfaced_schemas(ispec.foreign_schema, schema_list)
137
+ end
138
+ end
139
+
140
+ schema_list
141
+ end
142
+
143
+ def post_process_schema_content(content, schema)
144
+ post_process_interface_specification(content)
145
+ post_process_type_select(content, schema)
146
+ post_process_golbal_rules(content, schema)
147
+ post_process_entity(content, schema)
148
+ end
149
+
150
+ # @todo: Existing Code
151
+ #
152
+ # Neeed to double check if this is actually necessary in the long
153
+ # run, or use the new strucutre to handle these kind of linking.
154
+ #
155
+ def post_process_interface_specification(content)
156
+ if content.is_a? Express::InterfaceSpecification
157
+ content.explicit_items.each do |item|
158
+ name_to_find = item.original_name || item.name
159
+ type = content.foreign_schema.find_namedtype_by_name(name_to_find)
160
+ item.foreign_type = type if type
161
+ end
162
+ end
163
+ end
164
+
165
+ # @todo: Existing Code
166
+ #
167
+ # Need to be double check, and see if what's the actually point
168
+ # of having those linked into the instances, and if there are then
169
+ # we should also look for ways to handle those with the classes.
170
+ #
171
+ def post_process_type_select(content, schema)
172
+ if content.is_a?(Express::TypeSelect)
173
+ if !content.extends.nil?
174
+ content.extends_item = schema.find_namedtype_by_name(content.extends)
175
+ end
176
+
177
+ if !content.selectitems.nil?
178
+ select_temp = content.selectitems.to_s.scan(/\w+/)
179
+
180
+ select_temp.each do |name|
181
+ thetype = schema.find_namedtype_by_name(name)
182
+
183
+ if thetype
184
+ content.selectitems_array.push(thetype)
185
+ thetype.selectedBy.push(content)
186
+ else
187
+ Expressir.ui.error("ERROR : SELECT Item Not Found : " + name)
188
+ end
189
+ end
190
+ end
191
+ end
192
+ end
193
+
194
+ # @todo: Existing Code
195
+ #
196
+ # Please revisit this soon, and investigate the actual necessity
197
+ # of this post processing, and if there are anything we can do with
198
+ # the actual instance, specially when we are extracting the instance
199
+ #
200
+ def post_process_golbal_rules(content, schema)
201
+ if content.is_a?(Express::GlobalRule)
202
+ ent_temp = content.entities.to_s.scan(/\w+/)
203
+
204
+ ent_temp.each do |name|
205
+ thetype = schema.find_namedtype_by_name(name.to_s)
206
+
207
+ if thetype
208
+ content.entities_array.push(thetype)
209
+ else
210
+ Expressir.ui.error("ERROR : Rule Entity Not Found : " + name)
211
+ end
212
+ end
213
+ end
214
+ end
215
+
216
+ # @todo: Existing Code
217
+ #
218
+ # Please revisit this soon, and investigate the actual necessity
219
+ # of this post processing, and if there are anything we can do with
220
+ # the actual instance, specially when we are extracting the instance
221
+ #
222
+ def post_process_entity(content, schema)
223
+ if content.is_a?(Express::Entity)
224
+ if content.supertypes
225
+ supername_array = content.supertypes.to_s.scan(/\w+/)
226
+
227
+ supername_array.each do |supername|
228
+ thetype = schema.find_namedtype_by_name(supername)
229
+
230
+ if thetype
231
+ content.supertypes_array.push(thetype)
232
+ else
233
+ Expressir.ui.error(
234
+ "ERROR : SUPERTYPE Item Not Found : " + supername,
235
+ )
236
+ end
237
+ end
238
+ end
239
+
240
+ if content.supertypes
241
+ content.supertypes_all = get_all_supertypes(content, "")
242
+ end
243
+
244
+ if content.supertypes_all
245
+ all_supername_array = content.supertypes_all.scan(/\w+/)
246
+
247
+ all_supername_array.each do |supername|
248
+ supertype = schema.find_namedtype_by_name(supername)
249
+
250
+ supertype.attributes.each do |superattr|
251
+ content.attributes_all_array.push(superattr)
252
+ end
253
+ end
254
+ end
255
+
256
+ content.attributes.each do |localattr|
257
+ content.attributes_all_array.push(localattr)
258
+ end
259
+
260
+ attributes_to_remove = []
261
+
262
+ content.attributes_all_array.each do |next_attr|
263
+ if next_attr.redeclare_entity
264
+ the_entity = schema.find_namedtype_by_name(
265
+ next_attr.redeclare_entity,
266
+ )
267
+
268
+ redattr_name = next_attr.redeclare_oldname || next_attr.name
269
+ the_attr = the_entity.find_attr_by_name(redattr_name)
270
+ attributes_to_remove.push(the_attr)
271
+ end
272
+ end
273
+
274
+ attributes_to_remove.each do |attribute_remove|
275
+ content.attributes_all_array.delete(attribute_remove)
276
+ end
277
+
278
+ subarray = schema.contents.select do |con|
279
+ con.is_a?(Express::Entity) && con.supertypes
280
+ end
281
+
282
+ subarray.each do |subptr|
283
+ subname_array = subptr.supertypes.to_s.scan(/\w+/)
284
+ if subname_array.include?(content.name)
285
+ content.subtypes_array.push(subptr)
286
+ end
287
+ end
288
+ end
289
+ end
290
+
291
+ # @todo: Existing Code
292
+ #
293
+ def get_all_supertypes(content, superlist)
294
+ if content.supertypes != nil
295
+ superlist = content.supertypes.to_s + " " + superlist
296
+
297
+ content.supertypes_array.each do |sup|
298
+ superlist = get_all_supertypes(sup, superlist)
299
+ end
300
+ end
301
+
302
+ superlist.lstrip
303
+ end
304
+ end
305
+ end
306
+ end