xmimodel 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6eedac5a14ed62e48491ffb7ebacffcfd42cdaa4
4
+ data.tar.gz: 4bc59859d307c43b49fb2a3d6cffd0b4960d9622
5
+ SHA512:
6
+ metadata.gz: 35fc123beab06f777a05cc4961734588f961e35665243c87bd26e162b719962bd6b94c13ec4ad450e03f89023ea061ffd008460f3593479ed12c16f449ff7a96
7
+ data.tar.gz: 632da159972894e7d5a66b726752537d33d7d9e3ed6c6d6b909fcad9eeaf5597da925c87d20481fadf803e4de3b76ad8c505bcfdb97a1d755b4e347eb37e3342
@@ -26,12 +26,16 @@ class XmiModel
26
26
  # @return [Array<Association>] All model associations.
27
27
  attr_reader :associations
28
28
 
29
+ attr_reader :model_file_name
30
+
29
31
  ##
30
32
  # Constructor.
31
33
  #
32
34
  # @param [String, #read] Path of model.
33
35
  def initialize(model_file_name)
34
36
 
37
+ @model_file_name = model_file_name
38
+
35
39
  # Obtem a tag 'XMI.content' que contém todos os objetos que serão tratados
36
40
  f = File.open(model_file_name)
37
41
  doc = Nokogiri::XML(f)
@@ -51,7 +55,7 @@ class XmiModel
51
55
  uml_package.attribute('name').to_s.empty? ||
52
56
  uml_package.attribute('name').to_s.strip == "Component View" ||
53
57
  uml_package.attribute('name').to_s.strip == "Data types")
54
- p = Package.new(uml_package, nil)
58
+ p = Package.new(uml_package, self)
55
59
  @packages << p
56
60
  end
57
61
  end
@@ -70,12 +74,29 @@ class XmiModel
70
74
 
71
75
  @associations = Array.new
72
76
  XmiHelper.all_associations(xmi_content).each do |xml|
73
- @associations << Association.new(xml, self)
77
+
78
+ association = Association.new(xml, self)
79
+
80
+ association.end_a.participant.associations << association.end_b
81
+ association.end_b.participant.associations << association.end_a
82
+
83
+ @associations << association
74
84
  end
75
85
 
76
86
  true
77
87
  end
78
88
 
89
+ ##
90
+ # Get the object of type 'Association' by id.
91
+ #
92
+ # @param [String, #read] Id of the state in model file.
93
+ # @return [Association]
94
+ def association_by_id(id)
95
+ raise ArgumentError.new("Parameter 'id' cannot be empty.") if id.nil? or id.empty?
96
+ objs = @associations.select{|obj| obj.id == id}
97
+ (!objs.nil? && objs.size > 0) ? objs[0] : nil
98
+ end
99
+
79
100
  ##
80
101
  # Get the object of type 'Clazz' by full name of class.
81
102
  #
@@ -188,10 +209,26 @@ class XmiModel
188
209
  @states
189
210
  end
190
211
 
212
+
213
+ def id_exists?(id)
214
+ tag = XmiHelper.tag_by_id(@document, '*', id)
215
+ return !tag.nil?
216
+ end
217
+
191
218
  def to_s
192
219
  "'XmiModel #{exporter} #{exporter_version} [Packages: #{packages.size}, Classes: #{classes.size}]'"
193
220
  end
194
221
 
222
+ def to_xml
223
+ @document.to_xml
224
+ end
225
+
226
+ def save(model_file_name=@model_file_name)
227
+ f = File.open(model_file_name, 'w')
228
+ f.write(@document.to_xml)
229
+ f.close
230
+ end
231
+
195
232
  private
196
233
 
197
234
  def add_package(packages)
@@ -200,6 +237,6 @@ class XmiModel
200
237
  @all_packages << p
201
238
  add_package(p.packages) unless p.packages.nil?
202
239
  end
203
- end
240
+ end
204
241
 
205
242
  end
@@ -1,4 +1,7 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'xmimodel/state'
4
+ require 'xmimodel/tag'
2
5
 
3
6
  class ActionState < State
4
7
 
@@ -1,6 +1,9 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'xmimodel/action_state'
2
4
  require 'xmimodel/final_state'
3
5
  require 'xmimodel/pseudo_state'
6
+ require 'xmimodel/tag'
4
7
  require 'xmimodel/transition'
5
8
 
6
9
  ##
@@ -8,11 +11,8 @@ require 'xmimodel/transition'
8
11
  # It's represented by tag diagram inside of XMI.extension.
9
12
  #
10
13
  #
11
- class ActivityGraph
14
+ class ActivityGraph < Tag
12
15
 
13
- attr_reader :xml
14
-
15
- attr_reader :id
16
16
  attr_reader :name
17
17
 
18
18
  attr_reader :pseudo_states
@@ -20,9 +20,10 @@ class ActivityGraph
20
20
  attr_reader :final_states
21
21
  attr_reader :transitions
22
22
 
23
- def initialize(xml, parent)
24
- @xml = xml
25
- @use_case = parent.parent
23
+ def initialize(xml, parent_tag)
24
+ super(xml, parent_tag)
25
+
26
+ @use_case = parent_tag.parent_tag
26
27
 
27
28
  @id = xml.attribute("xmi.id").to_s
28
29
  @name = xml.attribute("name").to_s
@@ -1,24 +1,35 @@
1
+ # encoding: utf-8
1
2
 
2
- class Association
3
+ require 'xmimodel/association_end'
4
+ require 'xmimodel/tag'
3
5
 
4
- attr_reader :xml
5
- attr_reader :parent
6
+ class Association < Tag
6
7
 
7
- attr_reader :id
8
8
  attr_reader :name
9
+
10
+ attr_reader :end_a
11
+ attr_reader :end_b
9
12
 
10
- # TODO Build AssociationEnd class
11
13
  def initialize(xml, parent)
12
- @xml = xml
13
- @parent = parent
14
+ super(xml, parent)
14
15
 
15
- @id = xml.attribute("xmi.id").to_s
16
16
  @name = xml.attribute("name").to_s.strip
17
17
 
18
- #association_end_a
19
- #association_end_b
18
+ association_end = xml.xpath('./UML:Association.connection/UML:AssociationEnd')
19
+
20
+ @end_a = AssociationEnd.new(association_end, 0, self)
21
+ @end_b = AssociationEnd.new(association_end, 1, self)
20
22
  end
21
23
 
24
+ # @return [String]
25
+ def full_name
26
+ if @name.nil? or @name.empty?
27
+ "#{@end_a.name}[#{@end_a.participant.full_name}] - #{@end_b.name}[#{@end_b.participant.full_name}]"
28
+ else
29
+ "#{@name}(#{@end_a.name}[#{@end_a.participant.full_name}] - #{@end_b.name}[#{@end_b.participant.full_name}])"
30
+ end
31
+ end
32
+
22
33
  def to_s
23
34
  "Association[#{@name}]"
24
35
  end
@@ -0,0 +1,131 @@
1
+ # encoding: utf-8
2
+
3
+ require 'xmimodel/tag'
4
+
5
+ class AssociationEnd < Tag
6
+
7
+ # @return [String]
8
+ attr_reader :name
9
+
10
+ # @return [String]
11
+ attr_reader :visibility
12
+
13
+ # @return [String]
14
+ attr_reader :is_navigable
15
+
16
+ # @return [String]
17
+ attr_reader :is_specification
18
+
19
+ # @return [String]
20
+ attr_reader :multiplicity_range
21
+
22
+ # @return [String]
23
+ attr_reader :ordering
24
+
25
+ # @return [String]
26
+ attr_reader :aggregation
27
+
28
+ # @return [String]
29
+ attr_reader :target_scope
30
+
31
+ # @return [String]
32
+ attr_reader :changeability
33
+
34
+ # @return [Array<Stereotype>] Association end stereotypes.
35
+ attr_reader :stereotypes
36
+
37
+ # @return [Array<TaggedValue>] Association end tagged values.
38
+ attr_reader :tagged_values
39
+
40
+ def initialize(xmls, index, parent_tag)
41
+ super(xmls[index], parent_tag)
42
+
43
+ @xml_a = xmls[0]
44
+ @xml_b = xmls[1]
45
+
46
+ @xmi_model = parent_tag.parent_tag
47
+
48
+ @participant_id = @xml.attribute("participant").to_s
49
+
50
+ # argoUML
51
+ if @participant_id.nil? or @participant_id.empty?
52
+ c = @xml.at_xpath("./UML:AssociationEnd.participant/UML:Class")
53
+ @participant_id = c.attribute("xmi.idref").to_s unless c.nil?
54
+ end
55
+
56
+ @name = @xml.attribute("name").to_s
57
+
58
+ if @name.empty?
59
+ @name = index == 0 ? "EndA" : "EndB"
60
+ end
61
+
62
+ @visibility = @xml.attribute("visibility").to_s
63
+ @is_navigable = @xml.attribute("isNavigable").to_s
64
+ @is_specification = @xml.attribute("isSpecification").to_s
65
+ @ordering = @xml.attribute("ordering").to_s
66
+ @aggregation = @xml.attribute("aggregation").to_s
67
+ @target_scope = @xml.attribute("targetScope").to_s
68
+ @changeability = @xml.attribute("changeability").to_s
69
+
70
+ @multiplicity_range = XmiHelper.multiplicity_range(@xml)
71
+
72
+ @stereotypes = Array.new
73
+ stereotype_id = @xml.attribute("stereotype").to_s
74
+ if !stereotype_id.empty?
75
+ stereotype = XmiHelper.stereotype_by_id(@xml, stereotype_id)
76
+ stereotype = Stereotype.new(stereotype, self)
77
+ @stereotypes << stereotype
78
+ end
79
+ XmiHelper.stereotypes(@xml).each do |uml_stereotype|
80
+ stereotype = Stereotype.new(uml_stereotype, self)
81
+ @stereotypes << stereotype
82
+ end
83
+
84
+ @tagged_values = Array.new
85
+ XmiHelper.tagged_values(@xml).each do |uml_tagged_value|
86
+ tagged_value = TaggedValue.new(uml_tagged_value, self)
87
+ @tagged_values << tagged_value
88
+ end
89
+ end
90
+
91
+ # @return [Clazz]
92
+ def participant
93
+ return nil if @participant_id.nil? or @participant_id.empty?
94
+ participant = @xmi_model.class_by_id(@participant_id)
95
+ end
96
+
97
+ def ==(obj)
98
+ return false if obj.nil?
99
+ if String == obj.class
100
+ @name == obj
101
+ elsif AssociationEnd == obj.class
102
+ @name == obj.name && participant.full_name == obj.participant.full_name
103
+ else
104
+ return false
105
+ end
106
+ end
107
+
108
+ # @return [Stereotype]
109
+ def stereotype_by_name(name)
110
+ stereotype = @stereotypes.select{|obj| obj == name}
111
+ return stereotype[0] if !stereotype.nil? && stereotype.size > 0
112
+ nil
113
+ end
114
+
115
+ # @return [TaggedValue]
116
+ def tagged_value_by_name(tagged_value_name)
117
+ tagged_value = @tagged_values.select{|obj| obj.name == tagged_value_name}
118
+ return tagged_value[0] if !tagged_value.nil? && tagged_value.size > 0
119
+ nil
120
+ end
121
+
122
+ # @return [String]
123
+ def full_name
124
+ "#{@parent_tag.full_name}::#{@name}"
125
+ end
126
+
127
+ # @return [String]
128
+ def to_s
129
+ "AssociationEnd[#{name} (#{participant.full_name}])"
130
+ end
131
+ end
@@ -1,11 +1,11 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'xmimodel/stereotype'
4
+ require 'xmimodel/tag'
2
5
  require 'xmimodel/tagged_value'
3
6
 
4
- class Attribute
5
-
6
- attr_reader :xml
7
+ class Attribute < Tag
7
8
 
8
- attr_reader :id
9
9
  attr_reader :name
10
10
  attr_reader :type
11
11
  attr_reader :visibility
@@ -17,16 +17,17 @@ class Attribute
17
17
  attr_reader :stereotypes
18
18
  attr_reader :tagged_values
19
19
 
20
- def initialize(xml, clazz)
21
- @xml = xml
22
- @clazz = clazz
20
+ def initialize(xml, parent_tag)
21
+ super(xml, parent_tag)
22
+
23
+ @clazz = parent_tag
23
24
 
24
- @id = xml.attribute("xmi:id").to_s
25
25
  @name = xml.attribute("name").to_s.strip
26
26
  @visibility = xml.attribute("visibility").to_s
27
27
  @visibility = "private" if @visibility == ""
28
28
 
29
- @type = XmiHelper.attribute_type_name(xml)
29
+ @obj_type = XmiHelper.attribute_type(xml)
30
+ @type = XmiHelper.attribute_type_name(xml)
30
31
 
31
32
  @initial_value = XmiHelper.attribute_initial_value(xml)
32
33
  @multiplicity_range = XmiHelper.multiplicity_range(xml)
@@ -44,6 +45,44 @@ class Attribute
44
45
  end
45
46
  end
46
47
 
48
+ def add_xml_tagged_value(xml)
49
+ model_element_tagged_value().inner_html = model_element_tagged_value().inner_html + xml
50
+ end
51
+
52
+ =begin
53
+ def add_tagged_value(name, value)
54
+ if tagged_values.include? name
55
+ tag = tagged_value_by_name name
56
+ else
57
+ tagged_value = Nokogiri::XML::Node.new('TaggedValue', self.xml.document)
58
+ tagged_value['xmi.id'] =
59
+ tagged_value['name'] = name
60
+ model_element_tagged_value() << tagged_value
61
+ end
62
+ tag.value = value
63
+ end
64
+ =end
65
+
66
+ def is_enum?
67
+ return false if @obj_type.nil?
68
+ if @obj_type.class == Nokogiri::XML::Element
69
+ return true if @obj_type.name == "Enumeration"
70
+
71
+ if @obj_type.name == "Class"
72
+ id = @obj_type.attribute('xmi.id').to_s
73
+ @enum_obj = xml_root.class_by_id(id)
74
+ return @enum_obj.stereotypes.include?("org.andromda.profile::Enumeration")
75
+ end
76
+ end
77
+ false
78
+ end
79
+
80
+ def enum_obj
81
+ return @enum_obj unless @enum_obj.nil?
82
+ is_enum?
83
+ @enum_obj
84
+ end
85
+
47
86
  def full_name
48
87
  "#{@clazz.full_name}::#{@name}"
49
88
  end
@@ -73,4 +112,16 @@ class Attribute
73
112
  "Attribute[#{full_name}]"
74
113
  end
75
114
 
115
+ private
116
+
117
+ def model_element_tagged_value
118
+ return @model_element_tagged_value unless @model_element_tagged_value.nil?
119
+ @model_element_tagged_value = self.xml.at_xpath('./UML:ModelElement.taggedValue')
120
+ if @model_element_tagged_value.nil?
121
+ @model_element_tagged_value = Nokogiri::XML::Node.new('ModelElement.taggedValue', self.xml.document)
122
+ self.xml << model_element_tagged_value
123
+ end
124
+ @model_element_tagged_value
125
+ end
126
+
76
127
  end
@@ -1,15 +1,13 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'xmimodel/attribute'
4
- require 'xmimodel/stereotype'
5
- require 'xmimodel/tagged_value'
6
4
  require 'xmimodel/operation'
5
+ require 'xmimodel/tag'
6
+ require 'xmimodel/tagged_value'
7
+ require 'xmimodel/stereotype'
7
8
 
8
- class Clazz
9
-
10
- attr_reader :xml
9
+ class Clazz < Tag
11
10
 
12
- attr_reader :id
13
11
  attr_reader :name
14
12
 
15
13
  # @return [String] Full Package name of class.
@@ -18,26 +16,31 @@ class Clazz
18
16
  # @return [Array<Attribute>] Class attributes.
19
17
  attr_reader :attributes
20
18
 
21
- # @return [Array<String>] Class associations.
19
+ # @return [Array<Stereotype>] Class stereotypes.
22
20
  attr_reader :stereotypes
23
21
 
22
+ # @return [Array<TaggedValue>] Class tagged values.
24
23
  attr_reader :tagged_values
24
+
25
25
  attr_reader :operations
26
26
 
27
27
  attr_accessor :children
28
28
  attr_accessor :parent
29
29
 
30
- def initialize(xml, parent)
31
- @xml = xml
32
- @package = parent.parent
33
-
34
- @id = xml.attribute("xmi.id").to_s
30
+ # @return [Array<AssociationEnd>] Class associations end.
31
+ attr_reader :associations
32
+
33
+ def initialize(xml, parent_tag)
34
+ super(xml, parent_tag)
35
+
36
+ @package = parent_tag.parent_tag
37
+
35
38
  @name = xml.attribute("name").to_s.strip
36
39
 
37
40
  @attributes = Array.new
38
41
  XmiHelper.attributes(xml).each do |uml_attribute|
39
42
  attribute = Attribute.new(uml_attribute, self)
40
- @attributes << attribute
43
+ @attributes << attribute
41
44
  end
42
45
 
43
46
  @stereotypes = Array.new
@@ -67,8 +70,53 @@ class Clazz
67
70
  # Será povoado quando tratar dos objetos do tipo Genezalization
68
71
  @children = Array.new
69
72
 
73
+ @associations = Array.new
74
+
70
75
  end
71
76
 
77
+ def add_xml_attribute(xml_attribute)
78
+ parent = self.xml.at_xpath('./UML:Classifier.feature')
79
+ if parent.nil?
80
+ parent = Nokogiri::XML::Node.new('Classifier.feature', self.xml.document)
81
+ self.xml << parent
82
+ end
83
+ parent.inner_html = parent.inner_html + xml_attribute
84
+
85
+ @attributes << Attribute.new(uml_attribute, self)
86
+ end
87
+
88
+ ##
89
+ # @param xml [Nokogiri::XML::Element, #read]
90
+ def add_xml_stereotype(xml)
91
+ parent = self.xml.at_xpath('./UML:ModelElement.stereotype')
92
+ if parent.nil?
93
+ parent = Nokogiri::XML::Node.new('ModelElement.stereotype', self.xml.document)
94
+ self.xml << parent
95
+ end
96
+ parent.inner_html = parent.inner_html + xml.to_xml
97
+
98
+ stereotype = Stereotype.new(xml, self)
99
+ @stereotypes << stereotype
100
+ return stereotype
101
+ end
102
+
103
+ ##
104
+ # @param [String, #read] associations_end_name
105
+ # @param [Clazz, #read] participant
106
+ # @return [AssociationEnd]
107
+ def association_end_by_name_and_participant(associations_end_name, participant)
108
+ obj = @associations.select{|obj| obj.name == associations_end_name && obj.participant == participant}
109
+ return obj[0] if !obj.nil? && obj.size > 0
110
+ nil
111
+ end
112
+
113
+ ##
114
+ # @param [Clazz, #read] participant
115
+ # @return [Array<AssociationEnd>]
116
+ def associations_end_by_participant(participant)
117
+ obj = @associations.select{|obj| obj.participant == participant}
118
+ end
119
+
72
120
  def attribute_by_id(attribute_id)
73
121
  attribute = @attributes.select{|obj| obj.id == attribute_id}
74
122
  return attribute[0] if !attribute.nil? && attribute.size > 0
@@ -1,17 +1,14 @@
1
+ # encoding: utf-8
1
2
 
2
- class DataType
3
+ require 'xmimodel/tag'
3
4
 
4
- attr_reader :xml
5
- attr_reader :parent
5
+ class DataType < Tag
6
6
 
7
- attr_reader :id
8
7
  attr_reader :name
9
8
 
10
- def initialize(xml, parent)
11
- @xml = xml
12
- @parent = parent
9
+ def initialize(xml, parent_tag)
10
+ super(xml, parent_tag)
13
11
 
14
- @id = xml.attribute("xmi.id").to_s
15
12
  @name = xml.attribute("name").to_s.strip
16
13
  end
17
14
 
@@ -1,9 +1,11 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'xmimodel/state'
2
4
 
3
5
  class FinalState < State
4
6
 
5
- def initialize(xml, activity_graph)
6
- super(xml, activity_graph)
7
+ def initialize(xml, parent_tag)
8
+ super(xml, parent_tag)
7
9
  end
8
10
 
9
11
  def to_s
@@ -1,32 +1,29 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require 'xmimodel/tag'
4
+
3
5
  ##
4
6
  # UML:Generalization
5
- class Generalization
7
+ class Generalization < Tag
6
8
 
7
- attr_reader :xml
8
-
9
- attr_reader :id
10
9
  attr_reader :child
11
10
  attr_reader :parent
12
11
 
13
- def initialize(xml, xmi_model)
14
- @xml = xml
15
- @xmi_model = xmi_model
12
+ def initialize(xml, parent_tag)
13
+ super(xml, parent_tag)
16
14
 
17
- @id = xml.attribute("xmi.id").to_s
18
15
  @child = XmiHelper.generalization_child(xml)
19
16
  @parent = XmiHelper.generalization_parent(xml)
20
17
  end
21
18
 
22
19
  def child_obj
23
20
  return nil if @child.nil? or @child.empty?
24
- @child_obj = @xmi_model.class_by_id(@child)
21
+ @child_obj = xml_root.class_by_id(@child)
25
22
  end
26
23
 
27
24
  def parent_obj
28
25
  return nil if @parent.nil? or @parent.empty?
29
- @parent_obj = @xmi_model.class_by_id(@parent)
26
+ @parent_obj = xml_root.class_by_id(@parent)
30
27
  end
31
28
 
32
29
  def to_s
@@ -1,15 +1,15 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'xmimodel/association'
2
4
  require 'xmimodel/attribute'
3
5
  require 'xmimodel/clazz'
4
6
  require 'xmimodel/data_type'
5
7
  require 'xmimodel/use_case'
6
8
  require 'xmimodel/package'
9
+ require 'xmimodel/tag'
7
10
 
8
11
  # UML:Namespace.ownedElement
9
- class Namespace
10
-
11
- attr_reader :xml
12
- attr_reader :parent
12
+ class Namespace < Tag
13
13
 
14
14
  attr_reader :activity_graphs
15
15
 
@@ -323,9 +323,8 @@ class Namespace
323
323
  attr_reader :Partition
324
324
  =end
325
325
 
326
- def initialize(xml, parent)
327
- @xml = xml
328
- @parent = parent
326
+ def initialize(xml, parent_tag)
327
+ super(xml, parent_tag)
329
328
 
330
329
  @activity_graphs = Array.new
331
330
  XmiHelper.activity_graphs(xml).each do |obj|
@@ -369,5 +368,8 @@ class Namespace
369
368
  @packages << obj
370
369
  end
371
370
  end
372
-
371
+
372
+ def to_s
373
+ "Namespace"
374
+ end
373
375
  end
@@ -1,20 +1,20 @@
1
- require 'xmimodel/parameter'
1
+ # encoding: utf-8
2
2
 
3
- class Operation
3
+ require 'xmimodel/parameter'
4
+ require 'xmimodel/tag'
4
5
 
5
- attr_reader :xml
6
+ class Operation < Tag
6
7
 
7
- attr_reader :id
8
8
  attr_reader :name
9
9
  attr_reader :visibility
10
10
 
11
11
  attr_reader :parameters
12
12
 
13
- def initialize(xml, clazz)
14
- @xml = xml
15
- @clazz = clazz
13
+ def initialize(xml, parent)
14
+ super(xml, parent)
15
+
16
+ @clazz = parent
16
17
 
17
- @id = xml.attribute("xmi:id").to_s
18
18
  @name = xml.attribute("name").to_s
19
19
  @visibility = xml.attribute("visibility").to_s
20
20
  @visibility = "private" if @visibility == ""
@@ -1,12 +1,11 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'xmimodel/clazz'
4
- require 'xmimodel/use_case'
5
4
  require 'xmimodel/namespace'
5
+ require 'xmimodel/tag'
6
+ require 'xmimodel/use_case'
6
7
 
7
- class Package
8
-
9
- attr_reader :xml
8
+ class Package < Tag
10
9
 
11
10
  attr_reader :name
12
11
  attr_reader :full_name
@@ -14,10 +13,10 @@ class Package
14
13
 
15
14
  attr_reader :namespace
16
15
 
17
- def initialize(xml, parent)
16
+ def initialize(xml, parent_tag)
17
+ super(xml, parent_tag)
18
18
 
19
- @xml = xml
20
- @parent_package = parent.parent unless parent.nil?
19
+ @parent_package = parent_tag.parent_tag unless parent_tag.nil? or parent_tag.class == XmiModel
21
20
 
22
21
  @name = xml.attribute("name").to_s
23
22
  @full_name = XmiHelper.full_package_name(xml)
@@ -30,6 +29,11 @@ class Package
30
29
  self
31
30
  end
32
31
 
32
+ def add_xml_class(xml)
33
+ add_namespace() if !XmiHelper.has_namespace?(self.xml)
34
+ @namespace.xml.inner_html = @namespace.xml.inner_html + xml
35
+ end
36
+
33
37
  def activity_graphs
34
38
  return Array.new if @namespace.nil?
35
39
  @namespace.activity_graphs
@@ -79,6 +83,13 @@ class Package
79
83
 
80
84
  def to_s
81
85
  "Package[#{@full_name}]"
82
- end
86
+ end
87
+
88
+ private
89
+
90
+ def add_namespace
91
+ xml_namespace = XmiHelper.add_namespace(self.xml)
92
+ @namespace = Namespace.new(xml_namespace, self)
93
+ end
83
94
 
84
95
  end
@@ -1,19 +1,17 @@
1
+ # encoding: utf-8
1
2
 
2
- class Parameter
3
-
4
- attr_reader :xml
5
- attr_reader :owner
3
+ require 'xmimodel/tag'
6
4
 
7
- attr_reader :id
5
+ class Parameter < Tag
6
+
8
7
  attr_reader :name
9
8
  attr_reader :kind
10
9
 
11
10
  attr_reader :stereotypes
12
11
  attr_reader :tagged_values
13
12
 
14
- def initialize(xml, owner)
15
- @xml = xml
16
- @owner = owner
13
+ def initialize(xml, parent_tag)
14
+ super(xml, parent_tag)
17
15
 
18
16
  @id = xml.attribute("xmi:id").to_s
19
17
  @name = xml.attribute("name").to_s
@@ -45,8 +43,8 @@ class Parameter
45
43
  end
46
44
 
47
45
  def full_name
48
- return "#{@owner.full_name}::#{@kind}" if (@name.nil? || @name.empty?)
49
- return "#{@owner.full_name}::#{@name}"
46
+ return "#{@parent_tag.full_name}::#{@kind}" if (@name.nil? || @name.empty?)
47
+ return "#{@parent_tag.full_name}::#{@name}"
50
48
  end
51
49
 
52
50
  def to_s
@@ -1,11 +1,14 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'xmimodel/state'
4
+ require 'xmimodel/tag'
2
5
 
3
6
  class PseudoState < State
4
7
 
5
8
  attr_reader :kind
6
9
 
7
- def initialize(xml, activity_graph)
8
- super(xml, activity_graph)
10
+ def initialize(xml, parent_tag)
11
+ super(xml, parent_tag)
9
12
 
10
13
  @kind = xml.attribute("kind").to_s
11
14
  end
@@ -1,21 +1,20 @@
1
- require 'xmimodel/parameter'
1
+ # encoding: utf-8
2
2
 
3
- class SignalEvent
3
+ require 'xmimodel/parameter'
4
+ require 'xmimodel/tag'
4
5
 
5
- attr_reader :xml
6
+ class SignalEvent < Tag
6
7
 
7
- attr_reader :id
8
8
  attr_reader :name
9
9
 
10
10
  attr_reader :parameters
11
11
 
12
12
  attr_reader :use_case
13
13
 
14
- def initialize(xml, use_case)
15
- @xml = xml
16
- @use_case = use_case.parent
14
+ def initialize(xml, parent_tag)
15
+ super(xml, parent_tag)
16
+ @use_case = parent_tag.parent_tag
17
17
 
18
- @id = xml.attribute("xmi:id").to_s
19
18
  @name = xml.attribute("name").to_s
20
19
 
21
20
  @parameters = Array.new
@@ -1,20 +1,21 @@
1
+ # encoding: utf-8
1
2
 
2
- class State
3
+ require 'xmimodel/tag'
4
+
5
+ class State < Tag
3
6
 
4
- attr_reader :xml
5
7
  attr_reader :activity_graph
6
8
 
7
- attr_reader :id
8
9
  attr_reader :name
9
10
 
10
11
  attr_reader :stereotypes
11
12
  attr_reader :tagged_values
12
13
 
13
- def initialize(xml, activity_graph)
14
- @xml = xml
15
- @activity_graph = activity_graph
14
+ def initialize(xml, parent_tag)
15
+ super(xml, parent_tag)
16
+
17
+ @activity_graph = parent_tag
16
18
 
17
- @id = xml.attribute("xmi.id").to_s
18
19
  @name = xml.attribute("name").to_s
19
20
 
20
21
  if @name.nil? || @name.empty?
@@ -1,23 +1,32 @@
1
+ # encoding: utf-8
1
2
 
2
- class Stereotype
3
+ require 'xmimodel/tag'
4
+
5
+ class Stereotype < Tag
3
6
 
4
- attr_reader :xml
5
7
  attr_reader :href
6
8
 
7
- def initialize(xml, owner)
8
- @xml = xml
9
- @owner = owner
9
+ def initialize(xml, parent_tag)
10
+ super(xml, parent_tag)
10
11
 
11
- @id = xml.attribute("xmi.id").to_s
12
12
  @name = xml.attribute("name").to_s
13
13
  @href = xml.attribute("href").to_s
14
14
  @idref = xml.attribute("xmi.idref").to_s
15
15
  end
16
16
 
17
17
  def <=>(obj)
18
- href <=> obj.href
18
+ name <=> obj.name
19
19
  end
20
20
 
21
+ def ==(obj)
22
+ return false if obj.nil?
23
+ if String == obj.class
24
+ name == obj
25
+ else
26
+ name == obj.name
27
+ end
28
+ end
29
+
21
30
  def name
22
31
  return @name unless (@name.nil? or @name.empty?)
23
32
 
@@ -0,0 +1,36 @@
1
+ # encoding: utf-8
2
+
3
+ class Tag
4
+
5
+ # @return [Nokogiri::XML::Element]
6
+ attr_reader :xml
7
+
8
+ # @return [Tag]
9
+ attr_reader :parent_tag
10
+
11
+ # @return [String]
12
+ attr_reader :id
13
+
14
+ ##
15
+ # Constructor.
16
+ #
17
+ # @param xml [Nokogiri::XML::Element]
18
+ # @param parent_tag [Tag]
19
+ def initialize(xml, parent_tag)
20
+
21
+ raise "Diferente de Tag. #{parent_tag.class}" if !parent_tag.kind_of?(Tag) && parent_tag.class != XmiModel
22
+
23
+ @xml = xml
24
+ @parent_tag = parent_tag
25
+
26
+ @id = xml.attribute("xmi.id").to_s
27
+ end
28
+
29
+ def xml_root
30
+ parent_tag = @parent_tag
31
+ until parent_tag.class == XmiModel
32
+ parent_tag = parent_tag.parent_tag
33
+ end
34
+ parent_tag
35
+ end
36
+ end
@@ -1,17 +1,15 @@
1
+ # encoding: utf-8
1
2
 
2
- class TaggedValue
3
+ require 'xmimodel/tag'
3
4
 
4
- attr_reader :xml
5
+ class TaggedValue < Tag
5
6
 
6
- attr_reader :id
7
7
  attr_reader :name
8
8
  attr_reader :value
9
9
 
10
- def initialize(xml, owner)
11
- @xml = xml
12
- @owner = owner
10
+ def initialize(xml, parent_tag)
11
+ super(xml, parent_tag)
13
12
 
14
- @id = xml.attribute("xmi.id").to_s
15
13
  @name = xml.attribute("name").to_s
16
14
 
17
15
  if @name.nil? or @name.empty?
@@ -26,12 +24,19 @@ class TaggedValue
26
24
 
27
25
  end
28
26
 
27
+ def value=(new_value)
28
+ # testar para outros tipos que não sejam o Magic Draw
29
+ tag = @xml.at_xpath("./UML:TaggedValue.dataValue")
30
+ tag.inner_html = new_value
31
+ @value = new_value
32
+ end
33
+
29
34
  def ==(obj)
30
35
  return false if obj.nil?
31
36
  if String == obj.class
32
- return "#{@name}=#{@value}".eql?(obj)
37
+ return "#{@name}".eql?(obj)
33
38
  else
34
- return @name.eql?(obj.name) && @value.eql?(obj.value)
39
+ return @name.eql?(obj.name)
35
40
  end
36
41
  end
37
42
 
@@ -1,10 +1,10 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'xmimodel/stereotype'
4
+ require 'xmimodel/tag'
2
5
  require 'xmimodel/tagged_value'
3
6
 
4
- class Transition
5
-
6
- attr_reader :xml
7
- attr_reader :id
7
+ class Transition < Tag
8
8
 
9
9
  attr_reader :activity_graph
10
10
 
@@ -17,11 +17,11 @@ class Transition
17
17
 
18
18
  attr_reader :guard_condition
19
19
 
20
- def initialize(xml, activity_graph)
21
- @xml = xml
22
- @activity_graph = activity_graph
20
+ def initialize(xml, parent_tag)
21
+ super(xml, parent_tag)
22
+
23
+ @activity_graph = parent_tag
23
24
 
24
- @id = xml.attribute("xmi.id").to_s
25
25
  @trigger = xml.attribute("trigger").to_s
26
26
  @source = xml.attribute("source").to_s
27
27
  @target = xml.attribute("target").to_s
@@ -1,14 +1,15 @@
1
+ # encoding: utf-8
2
+
1
3
  require 'xmimodel/activity_graph'
2
4
  require 'xmimodel/stereotype'
3
5
  require 'xmimodel/signal_event'
6
+ require 'xmimodel/tag'
4
7
  require 'xmimodel/tagged_value'
5
8
 
6
- class UseCase
9
+ class UseCase < Tag
7
10
 
8
- attr_reader :xml
9
11
  attr_reader :package
10
12
 
11
- attr_reader :id
12
13
  attr_reader :name
13
14
 
14
15
  attr_reader :stereotypes
@@ -16,11 +17,11 @@ class UseCase
16
17
 
17
18
  #UML:CallEvent
18
19
 
19
- def initialize(xml, parent)
20
- @xml = xml
21
- @package = parent.parent
20
+ def initialize(xml, parent_tag)
21
+ super(xml, parent_tag)
22
+
23
+ @package = parent_tag.parent_tag
22
24
 
23
- @id = xml.attribute("xmi:id").to_s
24
25
  @name = xml.attribute("name").to_s
25
26
 
26
27
  if XmiHelper.has_namespace?(xml)
@@ -1,4 +1,5 @@
1
1
  # encoding: utf-8
2
+
2
3
  require 'nokogiri'
3
4
 
4
5
  ##
@@ -48,7 +49,16 @@ class XmiHelper
48
49
  # Returns a object Nokogiri::XML::Element of type 'UML:ActivityGraph'.
49
50
  def self.activity_graphs(tag)
50
51
  namespace(tag).xpath('./UML:ActivityGraph')
51
- end
52
+ end
53
+
54
+ ##
55
+ # Add a tag UML:Namespace.ownedElement to the parameter xml
56
+ #
57
+ def self.add_namespace(xml)
58
+ xml_namespace = Nokogiri::XML::Node.new('Namespace.ownedElement', xml.document)
59
+ xml << xml_namespace
60
+ return xml_namespace
61
+ end
52
62
 
53
63
  ##
54
64
  # Get all the Associations in the model.
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xmimodel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
5
- prerelease:
4
+ version: 0.2.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Marcus Siqueira
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-02-03 00:00:00.000000000 Z
11
+ date: 2013-08-28 00:00:00.000000000 Z
13
12
  dependencies: []
14
13
  description: A helper gem for working with XMI files
15
14
  email: marvinsiq@gmail.com
@@ -30,37 +29,38 @@ files:
30
29
  - lib/xmimodel/transition.rb
31
30
  - lib/xmimodel/stereotype.rb
32
31
  - lib/xmimodel/data_type.rb
32
+ - lib/xmimodel/association_end.rb
33
33
  - lib/xmimodel/parameter.rb
34
34
  - lib/xmimodel/xmihelper.rb
35
35
  - lib/xmimodel/association.rb
36
36
  - lib/xmimodel/action_state.rb
37
+ - lib/xmimodel/tag.rb
37
38
  - lib/xmimodel/pseudo_state.rb
38
39
  - lib/xmimodel/tagged_value.rb
39
40
  - lib/xmimodel/clazz.rb
40
41
  - lib/xmimodel/state.rb
41
42
  homepage: https://github.com/marvinsiq/xmimodel
42
43
  licenses: []
44
+ metadata: {}
43
45
  post_install_message:
44
46
  rdoc_options: []
45
47
  require_paths:
46
48
  - lib
47
49
  required_ruby_version: !ruby/object:Gem::Requirement
48
- none: false
49
50
  requirements:
50
51
  - - ! '>='
51
52
  - !ruby/object:Gem::Version
52
53
  version: '0'
53
54
  required_rubygems_version: !ruby/object:Gem::Requirement
54
- none: false
55
55
  requirements:
56
56
  - - ! '>='
57
57
  - !ruby/object:Gem::Version
58
58
  version: '0'
59
59
  requirements: []
60
60
  rubyforge_project:
61
- rubygems_version: 1.8.24
61
+ rubygems_version: 2.0.7
62
62
  signing_key:
63
- specification_version: 3
63
+ specification_version: 4
64
64
  summary: Xmi Model!
65
65
  test_files: []
66
66
  has_rdoc: