xmimerge 0.0.1
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/bin/xmimerge +61 -0
- data/lib/xmimerge.rb +53 -0
- data/lib/xmimerge/app.rb +47 -0
- data/lib/xmimerge/commands_file.rb +46 -0
- data/lib/xmimerge/merge.rb +40 -0
- data/lib/xmimerge/merge_action_states.rb +10 -0
- data/lib/xmimerge/merge_activity_graphs.rb +91 -0
- data/lib/xmimerge/merge_associations.rb +116 -0
- data/lib/xmimerge/merge_associations_end.rb +59 -0
- data/lib/xmimerge/merge_attributes.rb +125 -0
- data/lib/xmimerge/merge_call_events.rb +39 -0
- data/lib/xmimerge/merge_classes.rb +122 -0
- data/lib/xmimerge/merge_final_states.rb +9 -0
- data/lib/xmimerge/merge_multiplicity.rb +35 -0
- data/lib/xmimerge/merge_operations.rb +83 -0
- data/lib/xmimerge/merge_packages.rb +81 -0
- data/lib/xmimerge/merge_parameters.rb +89 -0
- data/lib/xmimerge/merge_pseudo_states.rb +9 -0
- data/lib/xmimerge/merge_signal_events.rb +71 -0
- data/lib/xmimerge/merge_states.rb +81 -0
- data/lib/xmimerge/merge_stereotypes.rb +82 -0
- data/lib/xmimerge/merge_tagged_values.rb +75 -0
- data/lib/xmimerge/merge_transitions.rb +98 -0
- data/lib/xmimerge/merge_use_cases.rb +89 -0
- data/lib/xmimerge/util.rb +48 -0
- metadata +69 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
3
|
+
require File.join(File.dirname(__FILE__), 'merge.rb')
|
|
4
|
+
require File.join(File.dirname(__FILE__), 'merge_stereotypes.rb')
|
|
5
|
+
require File.join(File.dirname(__FILE__), 'merge_tagged_values.rb')
|
|
6
|
+
require File.join(File.dirname(__FILE__), 'merge_multiplicity.rb')
|
|
7
|
+
|
|
8
|
+
class MergeAssociationEnd < Merge
|
|
9
|
+
|
|
10
|
+
def initialize(name, from_association_end, to_association_end)
|
|
11
|
+
super()
|
|
12
|
+
@name = name
|
|
13
|
+
@from_association_end = from_association_end
|
|
14
|
+
@to_association_end = to_association_end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def verify
|
|
18
|
+
|
|
19
|
+
# Visibility
|
|
20
|
+
check_change_propertie("visibility", @from_association_end, @to_association_end, "AssociationVisibility")
|
|
21
|
+
|
|
22
|
+
# IsNavegable
|
|
23
|
+
check_change_propertie("is_navigable", @from_association_end, @to_association_end, "AssociationIsNavegable")
|
|
24
|
+
|
|
25
|
+
# Initial Value
|
|
26
|
+
check_change_propertie("is_specification", @from_association_end, @to_association_end, "AssociationIsSpecification")
|
|
27
|
+
|
|
28
|
+
# Ordering
|
|
29
|
+
check_change_propertie("ordering", @from_association_end, @to_association_end, "AssociationOrdering")
|
|
30
|
+
|
|
31
|
+
# Aggregation
|
|
32
|
+
check_change_propertie("aggregation", @from_association_end, @to_association_end, "AssociationAggregation")
|
|
33
|
+
|
|
34
|
+
# Initial Value
|
|
35
|
+
check_change_propertie("target_scope", @from_association_end, @to_association_end, "AssociationTargetScope")
|
|
36
|
+
|
|
37
|
+
# Changeability
|
|
38
|
+
check_change_propertie("changeability", @from_association_end, @to_association_end, "AssociationChangeability")
|
|
39
|
+
|
|
40
|
+
# Multiplicity
|
|
41
|
+
merge = MergeMultiplicity.new("Attribute", @from_association_end, @to_association_end)
|
|
42
|
+
@only_check ? merge.check : merge.merge
|
|
43
|
+
|
|
44
|
+
# Stereotypes
|
|
45
|
+
merge = MergeStereotypes.new("Association", @from_association_end, @to_association_end)
|
|
46
|
+
@only_check ? merge.check : merge.merge
|
|
47
|
+
|
|
48
|
+
# TaggedValues
|
|
49
|
+
t = MergeTaggedValues.new("Association", @from_association_end, @to_association_end)
|
|
50
|
+
@only_check ? t.check : t.merge
|
|
51
|
+
|
|
52
|
+
# TODO
|
|
53
|
+
|
|
54
|
+
# Type Modifier
|
|
55
|
+
# Scope
|
|
56
|
+
# Documentation
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'merge.rb')
|
|
2
|
+
require File.join(File.dirname(__FILE__), 'util.rb')
|
|
3
|
+
require File.join(File.dirname(__FILE__), 'merge_stereotypes.rb')
|
|
4
|
+
require File.join(File.dirname(__FILE__), 'merge_tagged_values.rb')
|
|
5
|
+
require File.join(File.dirname(__FILE__), 'merge_multiplicity.rb')
|
|
6
|
+
|
|
7
|
+
class MergeAttribute < Merge
|
|
8
|
+
|
|
9
|
+
def initialize(from_class, to_class)
|
|
10
|
+
super()
|
|
11
|
+
@from_class = from_class
|
|
12
|
+
@to_class = to_class
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def verify
|
|
16
|
+
|
|
17
|
+
initial_buffer_size = @commands.buffer_size
|
|
18
|
+
|
|
19
|
+
@from_class.attributes.each do |from_attribute|
|
|
20
|
+
check_changes(from_attribute)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
check_removed
|
|
24
|
+
|
|
25
|
+
@commands.buffer_size != initial_buffer_size
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def check_changes(from_attribute)
|
|
29
|
+
|
|
30
|
+
@log.debug("Checking attribute: #{@from_class.full_name}::#{from_attribute.name}") if @only_check
|
|
31
|
+
|
|
32
|
+
# Localiza o atributo no modelo destino pelo nome
|
|
33
|
+
to_attribute = @to_class.attribute_by_name(from_attribute.name)
|
|
34
|
+
if to_attribute.nil?
|
|
35
|
+
# Se não encontrou é poque é um novo atributo
|
|
36
|
+
new_attribute from_attribute
|
|
37
|
+
else
|
|
38
|
+
# Atributo já existe, verifica se houve alterações
|
|
39
|
+
check_existing_attribute(from_attribute, to_attribute)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def check_removed
|
|
44
|
+
@to_class.attributes.each do |to_attribute|
|
|
45
|
+
|
|
46
|
+
ok = false
|
|
47
|
+
@from_class.attributes.each do |from_attribute|
|
|
48
|
+
|
|
49
|
+
if from_attribute.name == to_attribute.name
|
|
50
|
+
ok = true
|
|
51
|
+
break
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
if !ok
|
|
55
|
+
command = "\t- Attribute #{@from_class.full_name}::#{to_attribute.name}"
|
|
56
|
+
@commands.add_command_to_buffer(command)
|
|
57
|
+
unless @only_check
|
|
58
|
+
if @commands.has_command?(command)
|
|
59
|
+
@log.info "[OK] #{command}"
|
|
60
|
+
else
|
|
61
|
+
#@log.warn "[NOT] #{command}"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def new_attribute(from_attribute)
|
|
69
|
+
@log.debug("New Attribute") if @only_check
|
|
70
|
+
|
|
71
|
+
command = "\t+ Attribute #{@from_class.full_name}::#{from_attribute.name}"
|
|
72
|
+
@commands.add_command_to_buffer(command)
|
|
73
|
+
|
|
74
|
+
unless @only_check
|
|
75
|
+
if @commands.has_command?(command)
|
|
76
|
+
@to_class.add_xml_attribute(from_attribute.xml.to_xml)
|
|
77
|
+
@log.info "[OK] #{command}"
|
|
78
|
+
else
|
|
79
|
+
#@log.warn "[NOT] #{command}"
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def check_existing_attribute(from_attribute, to_attribute)
|
|
85
|
+
|
|
86
|
+
from_full_attribute_name = "#{@from_class.full_name}::#{from_attribute.name}"
|
|
87
|
+
|
|
88
|
+
# Name
|
|
89
|
+
#changes = Util.check_change_by_method("name", from_attribute, to_attribute)
|
|
90
|
+
#check_change_propertie(changes, "AttributeName", from_attribute.full_name)
|
|
91
|
+
|
|
92
|
+
# Visibility
|
|
93
|
+
check_change_propertie("visibility", from_attribute, to_attribute, "AttributeVisibility")
|
|
94
|
+
|
|
95
|
+
# Type
|
|
96
|
+
check_change_propertie("type", from_attribute, to_attribute, "AttributeType")
|
|
97
|
+
|
|
98
|
+
# Initial Value
|
|
99
|
+
check_change_propertie("initial_value", from_attribute, to_attribute, "AttributeInitialValue")
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
# Multiplicity
|
|
103
|
+
merge = MergeMultiplicity.new("Attribute", from_attribute, to_attribute)
|
|
104
|
+
@only_check ? merge.check : merge.merge
|
|
105
|
+
|
|
106
|
+
# Stereotypes
|
|
107
|
+
merge = MergeStereotypes.new("Attribute", from_attribute, to_attribute)
|
|
108
|
+
@only_check ? merge.check : merge.merge
|
|
109
|
+
|
|
110
|
+
# TaggedValues
|
|
111
|
+
t = MergeTaggedValues.new("Attribute", from_attribute, to_attribute)
|
|
112
|
+
@only_check ? t.check : t.merge
|
|
113
|
+
|
|
114
|
+
# TODO
|
|
115
|
+
|
|
116
|
+
# Type Modifier
|
|
117
|
+
# Changeability
|
|
118
|
+
# Ordering
|
|
119
|
+
# Scope
|
|
120
|
+
# Documentation
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
|
|
2
|
+
class MergeCallEvents < Merge
|
|
3
|
+
|
|
4
|
+
def initialize(from_use_case, to_use_case)
|
|
5
|
+
super()
|
|
6
|
+
@from_use_case = from_use_case
|
|
7
|
+
@to_use_case = to_use_case
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def verify
|
|
11
|
+
@from_use_case.call_events.each do |from_call_event|
|
|
12
|
+
check_changes(from_call_event)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
check_removed
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def check_changes(from_call_event)
|
|
19
|
+
@log.debug("Checking Call Event #{from_call_event.name}")
|
|
20
|
+
|
|
21
|
+
# Encontra a operação no modelo de origem pelo id
|
|
22
|
+
from_xmi_content = @from_use_case.document.at_xpath("./XMI/XMI.content")
|
|
23
|
+
from_operation = XmiHelper.operation_by_id(from_xmi_content, from_call_event.operation)
|
|
24
|
+
|
|
25
|
+
# Encontra a operação no modelo destino pelo nome
|
|
26
|
+
to_operation = XmiHelper.operation_by_id(to_xmi_content, from_call_event.operation)
|
|
27
|
+
|
|
28
|
+
to_call_event = @to_use_case.call_event_by_operation_id(from_call_event.name)
|
|
29
|
+
|
|
30
|
+
if to_call_event.nil?
|
|
31
|
+
new_obj from_call_event
|
|
32
|
+
else
|
|
33
|
+
check_existing(from_call_event, to_call_event)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def check_removed
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'merge.rb')
|
|
2
|
+
require File.join(File.dirname(__FILE__), 'merge_attributes.rb')
|
|
3
|
+
require File.join(File.dirname(__FILE__), 'merge_operations.rb')
|
|
4
|
+
require File.join(File.dirname(__FILE__), 'merge_stereotypes.rb')
|
|
5
|
+
require File.join(File.dirname(__FILE__), 'merge_tagged_values.rb')
|
|
6
|
+
require File.join(File.dirname(__FILE__), 'merge_associations.rb')
|
|
7
|
+
|
|
8
|
+
class MergeClasses < Merge
|
|
9
|
+
|
|
10
|
+
def initialize(from_package, to_package)
|
|
11
|
+
super()
|
|
12
|
+
@from_package = from_package
|
|
13
|
+
@to_package = to_package
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def verify
|
|
17
|
+
|
|
18
|
+
@from_package.classes.each do |from_class|
|
|
19
|
+
check_changes(from_class)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
check_removed
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def check_changes(from_class)
|
|
27
|
+
|
|
28
|
+
to_class = @to_package.class_by_name(from_class.name)
|
|
29
|
+
|
|
30
|
+
@log.info("Checking Class #{from_class.full_name}") if @only_check
|
|
31
|
+
|
|
32
|
+
if to_class.nil?
|
|
33
|
+
new_class from_class
|
|
34
|
+
else
|
|
35
|
+
check_existing_class(from_class, to_class)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def check_removed
|
|
40
|
+
|
|
41
|
+
@log.debug("Checking Removed Classes on package #{@to_package.full_name}...") if @only_check
|
|
42
|
+
|
|
43
|
+
@to_package.classes.each do |to_class|
|
|
44
|
+
|
|
45
|
+
ok = false
|
|
46
|
+
@from_package.classes.each do |from_class|
|
|
47
|
+
|
|
48
|
+
if from_class.full_name == to_class.full_name
|
|
49
|
+
ok = true
|
|
50
|
+
break
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
if !ok
|
|
54
|
+
@log.info("Class Removed: #{to_class.full_name}") if @only_check
|
|
55
|
+
command = "- Class #{to_class.full_name}"
|
|
56
|
+
@commands.add_command_to_buffer(command)
|
|
57
|
+
unless @only_check
|
|
58
|
+
if @commands.has_command?(command)
|
|
59
|
+
@log.info "[OK] #{command}"
|
|
60
|
+
else
|
|
61
|
+
#@log.info "[NOT] #{command}"
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def new_class(from_class)
|
|
69
|
+
@log.debug("New class") if @only_check
|
|
70
|
+
command = "+ Class #{from_class.full_name}"
|
|
71
|
+
@commands.add_command_to_buffer(command)
|
|
72
|
+
|
|
73
|
+
unless @only_check
|
|
74
|
+
if @commands.has_command?(command)
|
|
75
|
+
@to_package.add_xml_class(from_class.xml.to_xml)
|
|
76
|
+
@log.info "[OK] #{command}"
|
|
77
|
+
else
|
|
78
|
+
@log.debug "[NOT] #{command}"
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
from_class.attributes.each do |from_attribute|
|
|
83
|
+
command = "\t+ Attribute #{from_class.full_name}::#{from_attribute.name}"
|
|
84
|
+
@commands.add_command_to_buffer(command)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def check_existing_class(from_class, to_class)
|
|
89
|
+
|
|
90
|
+
@log.debug("Checking Existing Class: #{from_class.full_name}") if @only_check
|
|
91
|
+
|
|
92
|
+
command = "* Class #{from_class.full_name}"
|
|
93
|
+
@commands.add_command_to_buffer(command)
|
|
94
|
+
|
|
95
|
+
# Attributes
|
|
96
|
+
merge = MergeAttribute.new(from_class, to_class)
|
|
97
|
+
@only_check ? merge.check : merge.merge
|
|
98
|
+
|
|
99
|
+
# Stereotypes
|
|
100
|
+
merge = MergeStereotypes.new("Class", from_class, to_class)
|
|
101
|
+
@only_check ? merge.check : merge.merge
|
|
102
|
+
|
|
103
|
+
# TaggedValues
|
|
104
|
+
merge = MergeTaggedValues.new("Class", from_class, to_class)
|
|
105
|
+
@only_check ? merge.check : merge.merge
|
|
106
|
+
|
|
107
|
+
# TODO
|
|
108
|
+
|
|
109
|
+
# Generalization
|
|
110
|
+
|
|
111
|
+
# Associations
|
|
112
|
+
merge = MergeAssociations.new(from_class, to_class)
|
|
113
|
+
@only_check ? merge.check : merge.merge
|
|
114
|
+
|
|
115
|
+
# Operations
|
|
116
|
+
merge = MergeOperations.new(from_class, to_class)
|
|
117
|
+
@only_check ? merge.check : merge.merge
|
|
118
|
+
|
|
119
|
+
@commands.remove_if_is_last_command(command)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'merge.rb')
|
|
2
|
+
|
|
3
|
+
class MergeMultiplicity < Merge
|
|
4
|
+
|
|
5
|
+
def initialize(name, from_tag, to_tag)
|
|
6
|
+
super()
|
|
7
|
+
@name = name
|
|
8
|
+
@from_tag = from_tag
|
|
9
|
+
@to_tag = to_tag
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def verify
|
|
13
|
+
|
|
14
|
+
from_value = @from_tag.multiplicity_range
|
|
15
|
+
to_value = @to_tag.multiplicity_range
|
|
16
|
+
|
|
17
|
+
if !from_value.nil? && to_value.nil?
|
|
18
|
+
|
|
19
|
+
command = "+ #{@name}Multiplicity #{@from_tag.full_name} '#{from_value}'"
|
|
20
|
+
@commands.add_command_to_buffer(command)
|
|
21
|
+
|
|
22
|
+
elsif from_value.nil? && !to_value.nil?
|
|
23
|
+
|
|
24
|
+
command = "- #{@name}Multiplicity #{@from_tag.full_name} '#{to_value}'"
|
|
25
|
+
@commands.add_command_to_buffer(command)
|
|
26
|
+
|
|
27
|
+
elsif (!from_value.nil? && !to_value.nil?) && to_value != from_value
|
|
28
|
+
|
|
29
|
+
command = "* #{@name}Multiplicity #{@from_tag.full_name} '#{to_value}' --> '#{from_value}'"
|
|
30
|
+
@commands.add_command_to_buffer(command)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'merge.rb')
|
|
2
|
+
|
|
3
|
+
class MergeOperations < Merge
|
|
4
|
+
|
|
5
|
+
def initialize(from_class, to_class)
|
|
6
|
+
super()
|
|
7
|
+
@from_class = from_class
|
|
8
|
+
@to_class = to_class
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def verify
|
|
12
|
+
@from_class.operations.each do |from_operation|
|
|
13
|
+
check_changes(from_operation)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
check_removed
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def check_changes(from_operation)
|
|
20
|
+
|
|
21
|
+
@log.debug("Checking operation: #{@from_class.full_name}::#{from_operation.name}")
|
|
22
|
+
|
|
23
|
+
to_operation = @to_class.operation_by_name(from_operation.name)
|
|
24
|
+
if to_operation.nil?
|
|
25
|
+
new_operation from_operation
|
|
26
|
+
else
|
|
27
|
+
check_existing(from_operation, to_operation)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def check_removed
|
|
32
|
+
to_operations = @to_class.operations.each do |to_operation|
|
|
33
|
+
|
|
34
|
+
ok = false
|
|
35
|
+
@from_class.operations.each do |from_operation|
|
|
36
|
+
|
|
37
|
+
if from_operation.name == to_operation.name
|
|
38
|
+
ok = true
|
|
39
|
+
break
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
if !ok
|
|
43
|
+
command = "\t- Operation #{@from_class.full_name}::#{to_operation.name}"
|
|
44
|
+
@commands.add_command_to_buffer(command)
|
|
45
|
+
unless @only_check
|
|
46
|
+
if @commands.has_command?(command)
|
|
47
|
+
@log.info "[OK] #{command}"
|
|
48
|
+
else
|
|
49
|
+
#@log.info "[NOT] #{command}"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def new_operation(from_operation)
|
|
57
|
+
@log.debug("New operation")
|
|
58
|
+
|
|
59
|
+
command = "\t+ Operation #{@from_class.full_name}::#{from_operation.name}"
|
|
60
|
+
@commands.add_command_to_buffer(command)
|
|
61
|
+
|
|
62
|
+
unless @only_check
|
|
63
|
+
if @commands.has_command?(command)
|
|
64
|
+
@log.info "[OK] #{command}"
|
|
65
|
+
else
|
|
66
|
+
@log.info "[NOT] #{command}"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def check_existing(from_operation, to_operation)
|
|
72
|
+
|
|
73
|
+
from_full_operation_name = "#{@from_class.full_name}::#{from_operation.name}"
|
|
74
|
+
|
|
75
|
+
# Visibility
|
|
76
|
+
check_change_propertie("visibility", from_operation, to_operation, "OperationVisibility")
|
|
77
|
+
|
|
78
|
+
# Parameters
|
|
79
|
+
merge = MergeParameters.new("Operation", from_operation, to_operation)
|
|
80
|
+
@only_check ? merge.check : merge.merge
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|