xmimerge 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|