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,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,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,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
|