xmimodel 0.1.0 → 0.2.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.
@@ -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: