xmimodel 0.1.0
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.
- data/lib/xmimodel.rb +205 -0
- data/lib/xmimodel/action_state.rb +17 -0
- data/lib/xmimodel/activity_graph.rb +81 -0
- data/lib/xmimodel/association.rb +26 -0
- data/lib/xmimodel/attribute.rb +76 -0
- data/lib/xmimodel/clazz.rb +123 -0
- data/lib/xmimodel/data_type.rb +21 -0
- data/lib/xmimodel/final_state.rb +13 -0
- data/lib/xmimodel/generalization.rb +36 -0
- data/lib/xmimodel/namespace.rb +373 -0
- data/lib/xmimodel/operation.rb +51 -0
- data/lib/xmimodel/package.rb +84 -0
- data/lib/xmimodel/parameter.rb +55 -0
- data/lib/xmimodel/pseudo_state.rb +16 -0
- data/lib/xmimodel/signal_event.rb +41 -0
- data/lib/xmimodel/state.rb +66 -0
- data/lib/xmimodel/stereotype.rb +52 -0
- data/lib/xmimodel/tagged_value.rb +41 -0
- data/lib/xmimodel/transition.rb +64 -0
- data/lib/xmimodel/use_case.rb +85 -0
- data/lib/xmimodel/xmihelper.rb +683 -0
- metadata +66 -0
@@ -0,0 +1,84 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'xmimodel/clazz'
|
4
|
+
require 'xmimodel/use_case'
|
5
|
+
require 'xmimodel/namespace'
|
6
|
+
|
7
|
+
class Package
|
8
|
+
|
9
|
+
attr_reader :xml
|
10
|
+
|
11
|
+
attr_reader :name
|
12
|
+
attr_reader :full_name
|
13
|
+
attr_reader :parent_package
|
14
|
+
|
15
|
+
attr_reader :namespace
|
16
|
+
|
17
|
+
def initialize(xml, parent)
|
18
|
+
|
19
|
+
@xml = xml
|
20
|
+
@parent_package = parent.parent unless parent.nil?
|
21
|
+
|
22
|
+
@name = xml.attribute("name").to_s
|
23
|
+
@full_name = XmiHelper.full_package_name(xml)
|
24
|
+
|
25
|
+
if XmiHelper.has_namespace?(xml)
|
26
|
+
namespace = XmiHelper.namespace(xml)
|
27
|
+
@namespace = Namespace.new(namespace, self) unless namespace.nil?
|
28
|
+
end
|
29
|
+
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
def activity_graphs
|
34
|
+
return Array.new if @namespace.nil?
|
35
|
+
@namespace.activity_graphs
|
36
|
+
end
|
37
|
+
|
38
|
+
def classes
|
39
|
+
return Array.new if @namespace.nil?
|
40
|
+
@namespace.classes
|
41
|
+
end
|
42
|
+
|
43
|
+
def class_by_name(name)
|
44
|
+
return nil if @namespace.nil?
|
45
|
+
clazz = @namespace.classes.select{|c| c.name == name}
|
46
|
+
return clazz[0] if !clazz.nil? && clazz.size > 0
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
|
50
|
+
def packages
|
51
|
+
return Array.new if @namespace.nil?
|
52
|
+
@namespace.packages
|
53
|
+
end
|
54
|
+
|
55
|
+
def use_cases
|
56
|
+
return Array.new if @namespace.nil?
|
57
|
+
@namespace.use_cases
|
58
|
+
end
|
59
|
+
|
60
|
+
def use_case_by_name(name)
|
61
|
+
return nil if @namespace.nil?
|
62
|
+
use_case = @namespace.use_cases.select{|u| u.name == name}
|
63
|
+
return use_case[0] if !use_case.nil? && use_case.size > 0
|
64
|
+
nil
|
65
|
+
end
|
66
|
+
|
67
|
+
def <=>(obj)
|
68
|
+
@full_name <=> obj.full_name
|
69
|
+
end
|
70
|
+
|
71
|
+
def ==(obj)
|
72
|
+
return false if obj.nil?
|
73
|
+
if String == obj.class
|
74
|
+
@full_name == obj
|
75
|
+
else
|
76
|
+
@full_name == obj.full_name
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def to_s
|
81
|
+
"Package[#{@full_name}]"
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
|
2
|
+
class Parameter
|
3
|
+
|
4
|
+
attr_reader :xml
|
5
|
+
attr_reader :owner
|
6
|
+
|
7
|
+
attr_reader :id
|
8
|
+
attr_reader :name
|
9
|
+
attr_reader :kind
|
10
|
+
|
11
|
+
attr_reader :stereotypes
|
12
|
+
attr_reader :tagged_values
|
13
|
+
|
14
|
+
def initialize(xml, owner)
|
15
|
+
@xml = xml
|
16
|
+
@owner = owner
|
17
|
+
|
18
|
+
@id = xml.attribute("xmi:id").to_s
|
19
|
+
@name = xml.attribute("name").to_s
|
20
|
+
@kind = xml.attribute("kind").to_s
|
21
|
+
|
22
|
+
@stereotypes = Array.new
|
23
|
+
XmiHelper.stereotypes(xml).each do |uml_stereotype|
|
24
|
+
stereotype = Stereotype.new(uml_stereotype, self)
|
25
|
+
@stereotypes << stereotype
|
26
|
+
end
|
27
|
+
|
28
|
+
@tagged_values = Array.new
|
29
|
+
XmiHelper.tagged_values(xml).each do |uml_tagged_value|
|
30
|
+
tagged_value = TaggedValue.new(uml_tagged_value, self)
|
31
|
+
@tagged_values << tagged_value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def tagged_value_by_name(tagged_value_name)
|
36
|
+
tagged_value = @tagged_values.select{|obj| obj.name == tagged_value_name}
|
37
|
+
return tagged_value[0] if !tagged_value.nil? && tagged_value.size > 0
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def stereotype_by_name(name)
|
42
|
+
stereotype = @stereotypes.select{|obj| obj.name == name}
|
43
|
+
return stereotype[0] if !stereotype.nil? && stereotype.size > 0
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
|
47
|
+
def full_name
|
48
|
+
return "#{@owner.full_name}::#{@kind}" if (@name.nil? || @name.empty?)
|
49
|
+
return "#{@owner.full_name}::#{@name}"
|
50
|
+
end
|
51
|
+
|
52
|
+
def to_s
|
53
|
+
"Parameter[#{full_name}]"
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'xmimodel/parameter'
|
2
|
+
|
3
|
+
class SignalEvent
|
4
|
+
|
5
|
+
attr_reader :xml
|
6
|
+
|
7
|
+
attr_reader :id
|
8
|
+
attr_reader :name
|
9
|
+
|
10
|
+
attr_reader :parameters
|
11
|
+
|
12
|
+
attr_reader :use_case
|
13
|
+
|
14
|
+
def initialize(xml, use_case)
|
15
|
+
@xml = xml
|
16
|
+
@use_case = use_case.parent
|
17
|
+
|
18
|
+
@id = xml.attribute("xmi:id").to_s
|
19
|
+
@name = xml.attribute("name").to_s
|
20
|
+
|
21
|
+
@parameters = Array.new
|
22
|
+
XmiHelper.parameters(xml).each do |uml_parameter|
|
23
|
+
parameter = Parameter.new(uml_parameter, self)
|
24
|
+
@parameters << parameter
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def parameter_by_name(name)
|
29
|
+
parameter = @parameters.select{|obj| obj.name == name}
|
30
|
+
return parameter[0] if !parameter.nil? && parameter.size > 0
|
31
|
+
nil
|
32
|
+
end
|
33
|
+
|
34
|
+
def full_name
|
35
|
+
"#{use_case.full_name}::#{name}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_s
|
39
|
+
"SignalEvent[#{full_name}]"
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
|
2
|
+
class State
|
3
|
+
|
4
|
+
attr_reader :xml
|
5
|
+
attr_reader :activity_graph
|
6
|
+
|
7
|
+
attr_reader :id
|
8
|
+
attr_reader :name
|
9
|
+
|
10
|
+
attr_reader :stereotypes
|
11
|
+
attr_reader :tagged_values
|
12
|
+
|
13
|
+
def initialize(xml, activity_graph)
|
14
|
+
@xml = xml
|
15
|
+
@activity_graph = activity_graph
|
16
|
+
|
17
|
+
@id = xml.attribute("xmi.id").to_s
|
18
|
+
@name = xml.attribute("name").to_s
|
19
|
+
|
20
|
+
if @name.nil? || @name.empty?
|
21
|
+
|
22
|
+
if xml.name == "Pseudostate"
|
23
|
+
if xml.attribute("kind").to_s == "initial"
|
24
|
+
@name = "Initial State"
|
25
|
+
else
|
26
|
+
@name = "Decision Point"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
@name = "Final State" if xml.name == "FinalState"
|
30
|
+
elsif xml.name == "FinalState"
|
31
|
+
@name = "Final State [#{@name}]"
|
32
|
+
end
|
33
|
+
|
34
|
+
@stereotypes = Array.new
|
35
|
+
XmiHelper.stereotypes(xml).each do |uml_stereotype|
|
36
|
+
stereotype = Stereotype.new(uml_stereotype, self)
|
37
|
+
@stereotypes << stereotype
|
38
|
+
end
|
39
|
+
|
40
|
+
@tagged_values = Array.new
|
41
|
+
XmiHelper.tagged_values(xml).each do |uml_tagged_value|
|
42
|
+
tagged_value = TaggedValue.new(uml_tagged_value, self)
|
43
|
+
@tagged_values << tagged_value
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def stereotype_by_name(name)
|
48
|
+
stereotype = @stereotypes.select{|obj| obj.name == name}
|
49
|
+
return stereotype[0] if !stereotype.nil? && stereotype.size > 0
|
50
|
+
nil
|
51
|
+
end
|
52
|
+
|
53
|
+
def tagged_value_by_name(tagged_value_name)
|
54
|
+
tagged_value = @tagged_values.select{|obj| obj.name == tagged_value_name}
|
55
|
+
return tagged_value[0] if !tagged_value.nil? && tagged_value.size > 0
|
56
|
+
nil
|
57
|
+
end
|
58
|
+
|
59
|
+
def full_name
|
60
|
+
"#{@activity_graph.full_name} {'#{@name}'}"
|
61
|
+
end
|
62
|
+
|
63
|
+
def to_s
|
64
|
+
"State[#{full_name}]"
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
|
2
|
+
class Stereotype
|
3
|
+
|
4
|
+
attr_reader :xml
|
5
|
+
attr_reader :href
|
6
|
+
|
7
|
+
def initialize(xml, owner)
|
8
|
+
@xml = xml
|
9
|
+
@owner = owner
|
10
|
+
|
11
|
+
@id = xml.attribute("xmi.id").to_s
|
12
|
+
@name = xml.attribute("name").to_s
|
13
|
+
@href = xml.attribute("href").to_s
|
14
|
+
@idref = xml.attribute("xmi.idref").to_s
|
15
|
+
end
|
16
|
+
|
17
|
+
def <=>(obj)
|
18
|
+
href <=> obj.href
|
19
|
+
end
|
20
|
+
|
21
|
+
def name
|
22
|
+
return @name unless (@name.nil? or @name.empty?)
|
23
|
+
|
24
|
+
@name = XmiHelper.extension_referent_path_value(xml)
|
25
|
+
|
26
|
+
if @name.empty?
|
27
|
+
# Se 'xmi.idref' não for null, o documento irá apontar para o id de outra tag
|
28
|
+
# UML:Stereotype (que estará dentro de UML:Namespace.ownedElement e não UML:ModelElement.stereotype)
|
29
|
+
id = @idref.empty? ? @href : @idref
|
30
|
+
xml = XmiHelper.stereotype_by_id(@xml, id)
|
31
|
+
if !xml.nil?
|
32
|
+
@id = xml.attribute("xmi.id").to_s
|
33
|
+
@name = xml.attribute("name").to_s
|
34
|
+
@isSpecification = xml.attribute("isSpecification").to_s
|
35
|
+
@isRoot = xml.attribute("isRoot").to_s
|
36
|
+
@isLeaf = xml.attribute("isLeaf").to_s
|
37
|
+
@isAbstract = xml.attribute("isAbstract").to_s
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
if @name.empty?
|
42
|
+
App.logger.warn "Stereotype not found. Id: #{@id}"
|
43
|
+
@name = @href
|
44
|
+
end
|
45
|
+
|
46
|
+
@name
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_s
|
50
|
+
"Stereotype[#{name}]"
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
|
2
|
+
class TaggedValue
|
3
|
+
|
4
|
+
attr_reader :xml
|
5
|
+
|
6
|
+
attr_reader :id
|
7
|
+
attr_reader :name
|
8
|
+
attr_reader :value
|
9
|
+
|
10
|
+
def initialize(xml, owner)
|
11
|
+
@xml = xml
|
12
|
+
@owner = owner
|
13
|
+
|
14
|
+
@id = xml.attribute("xmi.id").to_s
|
15
|
+
@name = xml.attribute("name").to_s
|
16
|
+
|
17
|
+
if @name.nil? or @name.empty?
|
18
|
+
tag_definition = XmiHelper.taggeg_value_tag_definition(xml)
|
19
|
+
tag_definition_id_ref = tag_definition.attribute("xmi.idref").to_s
|
20
|
+
tag_definition = XmiHelper.tag_definition_by_id(xml, tag_definition_id_ref)
|
21
|
+
@name = tag_definition.attribute("name").to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
@value = XmiHelper.taggeg_value_data_value(xml)
|
25
|
+
@value = XmiHelper.taggeg_value_reference_value(xml) if (@value.nil? || @value.empty?)
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def ==(obj)
|
30
|
+
return false if obj.nil?
|
31
|
+
if String == obj.class
|
32
|
+
return "#{@name}=#{@value}".eql?(obj)
|
33
|
+
else
|
34
|
+
return @name.eql?(obj.name) && @value.eql?(obj.value)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_s
|
39
|
+
"TaggedValue[#{@name}=#{@value}]"
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'xmimodel/stereotype'
|
2
|
+
require 'xmimodel/tagged_value'
|
3
|
+
|
4
|
+
class Transition
|
5
|
+
|
6
|
+
attr_reader :xml
|
7
|
+
attr_reader :id
|
8
|
+
|
9
|
+
attr_reader :activity_graph
|
10
|
+
|
11
|
+
attr_reader :trigger
|
12
|
+
attr_reader :source
|
13
|
+
attr_reader :target
|
14
|
+
|
15
|
+
attr_reader :stereotypes
|
16
|
+
attr_reader :tagged_values
|
17
|
+
|
18
|
+
attr_reader :guard_condition
|
19
|
+
|
20
|
+
def initialize(xml, activity_graph)
|
21
|
+
@xml = xml
|
22
|
+
@activity_graph = activity_graph
|
23
|
+
|
24
|
+
@id = xml.attribute("xmi.id").to_s
|
25
|
+
@trigger = xml.attribute("trigger").to_s
|
26
|
+
@source = xml.attribute("source").to_s
|
27
|
+
@target = xml.attribute("target").to_s
|
28
|
+
|
29
|
+
@stereotypes = Array.new
|
30
|
+
XmiHelper.stereotypes(xml).each do |uml_stereotype|
|
31
|
+
stereotype = Stereotype.new(uml_stereotype, self)
|
32
|
+
@stereotypes << stereotype
|
33
|
+
end
|
34
|
+
|
35
|
+
@tagged_values = Array.new
|
36
|
+
XmiHelper.tagged_values(xml).each do |uml_tagged_value|
|
37
|
+
tagged_value = TaggedValue.new(uml_tagged_value, self)
|
38
|
+
@tagged_values << tagged_value
|
39
|
+
end
|
40
|
+
|
41
|
+
guard_condition = XmiHelper.guard_condition(xml)
|
42
|
+
@guard_condition = guard_condition.attribute("body").to_s unless guard_condition.nil?
|
43
|
+
end
|
44
|
+
|
45
|
+
def stereotype_by_name(name)
|
46
|
+
stereotype = @stereotypes.select{|s| s.name == name}
|
47
|
+
return stereotype[0] if !stereotype.nil? && stereotype.size > 0
|
48
|
+
nil
|
49
|
+
end
|
50
|
+
|
51
|
+
def tagged_value_by_name(tagged_value_name)
|
52
|
+
tagged_value = @tagged_values.select{|t| t.name == tagged_value_name}
|
53
|
+
return tagged_value[0] if !tagged_value.nil? && tagged_value.size > 0
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
|
57
|
+
def full_name
|
58
|
+
"#{@activity_graph.full_name} #{@source} --> #{@target}"
|
59
|
+
end
|
60
|
+
|
61
|
+
def to_s
|
62
|
+
"Transition[#{full_name}]"
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'xmimodel/activity_graph'
|
2
|
+
require 'xmimodel/stereotype'
|
3
|
+
require 'xmimodel/signal_event'
|
4
|
+
require 'xmimodel/tagged_value'
|
5
|
+
|
6
|
+
class UseCase
|
7
|
+
|
8
|
+
attr_reader :xml
|
9
|
+
attr_reader :package
|
10
|
+
|
11
|
+
attr_reader :id
|
12
|
+
attr_reader :name
|
13
|
+
|
14
|
+
attr_reader :stereotypes
|
15
|
+
attr_reader :tagged_values
|
16
|
+
|
17
|
+
#UML:CallEvent
|
18
|
+
|
19
|
+
def initialize(xml, parent)
|
20
|
+
@xml = xml
|
21
|
+
@package = parent.parent
|
22
|
+
|
23
|
+
@id = xml.attribute("xmi:id").to_s
|
24
|
+
@name = xml.attribute("name").to_s
|
25
|
+
|
26
|
+
if XmiHelper.has_namespace?(xml)
|
27
|
+
namespace = XmiHelper.namespace(xml)
|
28
|
+
@namespace = Namespace.new(namespace, self) unless namespace.nil?
|
29
|
+
end
|
30
|
+
|
31
|
+
@stereotypes = Array.new
|
32
|
+
XmiHelper.stereotypes(xml).each do |uml_stereotype|
|
33
|
+
stereotype = Stereotype.new(uml_stereotype, self)
|
34
|
+
@stereotypes << stereotype
|
35
|
+
end
|
36
|
+
|
37
|
+
@tagged_values = Array.new
|
38
|
+
XmiHelper.tagged_values(xml).each do |uml_tagged_value|
|
39
|
+
tagged_value = TaggedValue.new(uml_tagged_value, self)
|
40
|
+
@tagged_values << tagged_value
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def activity_graphs
|
45
|
+
return Array.new if @namespace.nil?
|
46
|
+
@namespace.activity_graphs
|
47
|
+
end
|
48
|
+
|
49
|
+
def activity_graphs_by_name(name)
|
50
|
+
activity_graph = activity_graphs.select{|obj| obj.name == name}
|
51
|
+
return activity_graph[0] if !activity_graph.nil? && activity_graph.size > 0
|
52
|
+
nil
|
53
|
+
end
|
54
|
+
|
55
|
+
def signal_event_by_name(name)
|
56
|
+
signal_event = signal_events.select{|obj| obj.name == name}
|
57
|
+
return signal_event[0] if !signal_event.nil? && signal_event.size > 0
|
58
|
+
nil
|
59
|
+
end
|
60
|
+
|
61
|
+
def signal_events
|
62
|
+
return Array.new if @namespace.nil?
|
63
|
+
@namespace.signal_events
|
64
|
+
end
|
65
|
+
|
66
|
+
def stereotype_by_name(name)
|
67
|
+
stereotype = @stereotypes.select{|s| s.name == name}
|
68
|
+
return stereotype[0] if !stereotype.nil? && stereotype.size > 0
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
|
72
|
+
def tagged_value_by_name(tagged_value_name)
|
73
|
+
tagged_value = @tagged_values.select{|t| t.name == tagged_value_name}
|
74
|
+
return tagged_value[0] if !tagged_value.nil? && tagged_value.size > 0
|
75
|
+
nil
|
76
|
+
end
|
77
|
+
|
78
|
+
def full_name
|
79
|
+
"#{package.full_name}.#{name}"
|
80
|
+
end
|
81
|
+
|
82
|
+
def to_s
|
83
|
+
"UseCase[#{full_name}]"
|
84
|
+
end
|
85
|
+
end
|