ontomde-uml2 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,104 @@
1
+
2
+
3
+
4
+ module Mrdf_Model
5
+ def umlx_mapMultipleInheritanceToInterface!
6
+ nl=Set.new
7
+ umlx_classesWithMultipleInheritance.each {|c|
8
+ c.umlx_mapMultipleInheritanceToInterface!(nl)
9
+ }
10
+
11
+ end
12
+ def umlx_classesWithMultipleInheritance(ret=Set.new)
13
+ uml_Class_all.each {|c|
14
+ next if c.kind_of?(Muml_Interface) || c.kind_of?(Muml_Enumeration)
15
+ next if c.uml_generalization.length <2
16
+ ret << c
17
+ }
18
+ return ret
19
+ end
20
+ end
21
+
22
+
23
+ module Muml_Class
24
+ #nl : no loop
25
+ def umlx_mapMultipleInheritanceToInterface!(nl)
26
+ if nl.include?(self)
27
+ log.error {"umlx_mapMultipleInheritanceToInterface!: multiple call detected for #{self}" }
28
+ return
29
+ end
30
+ nl<< self
31
+ log.debug { "umlx_mapMultipleInheritanceToInterface! #{self}::#{self.class.name}" }
32
+ #Create an interface to replace this class
33
+ #Interface will have the name of the class
34
+ #Class implements the interface
35
+ i=umlx_owner_one.umlx_createAndAddInterface("#{self.rdf_uri}_interface",self.uml_name.to_s)
36
+ self.umlx_createAndAddImplementation(i)
37
+
38
+ #Obviously The class name must change to avoid a name clash.
39
+ self.uml_name="#{self.uml_name}_Implem"
40
+
41
+ #process type 3 elements (refer to diagram)
42
+ #(type 3 are handled as type 1 from the other extremity)
43
+ #Change classes this class generalize to interface
44
+ ug_copy=Array.new ; uml_generalization.each {|g| ug_copy<< g }
45
+ ug_copy.each { |general|
46
+ t=general.uml_general_one
47
+ #log.debug { "mi recursing trough generalization from #{self} to #{t}"}
48
+ i2=t.umlx_mapMultipleInheritanceToInterface!(nl)
49
+ i.umlx_createAndAddGeneralization(i2)
50
+ }
51
+
52
+
53
+
54
+ #process type 2 elements (refer to diagram)
55
+ #replace this class as attribute with interface i everywhere in model
56
+ uml_type_inv.each {|m|
57
+ #log.debug { "Changing attribut #{m} type from #{self} to #{i}" }
58
+ m.uml_type=i
59
+ }
60
+
61
+ #process type 1 elements (refer to diagram)
62
+ #replace this class generalization with i interface implementation
63
+ uml_general_inv.each { |general|
64
+ general.uml_generalization_inv.each {|cgen|
65
+ #log.debug { "Changing #{cgen} generalization #{self} to implement #{i}" }
66
+ #create new implementation
67
+ cgen.umlx_createAndAddImplementation(i)
68
+ #remove old generalization
69
+ cgen.uml_generalization.delete(general)
70
+ }
71
+ }
72
+
73
+ #process type 4 and 5 elements (refer to diagram)
74
+ #copy property from this class to interface i
75
+ uml_ownedAttribute.each { |a|
76
+ #log.debug { "Copy property #{a} to interface #{i}" }
77
+ na=i.umlx_createAndAddProperty("#{a.rdf_uri}_interface",a.uml_name.to_s);
78
+ a.umlx_copyToAttributeProperty(na)
79
+ }
80
+
81
+ #process type 7 elements (refer to diagram)
82
+ #copy method from this class to interface i
83
+ uml_ownedOperation.each { |op|
84
+ #log.debug { "Copy operation #{op} to interface #{i}" }
85
+ nop=i.umlx_createAndAddOperation("#{op.rdf_uri}_interface",op.uml_name.to_s)
86
+ #copy parameter
87
+ op.uml_ownedParameter.each { |p|
88
+ np=nop.umlx_createAndAddParameter("#{p.rdf_uri}_interface",p.uml_name.to_s)
89
+ p.umlx_copyToAttributeProperty(np)
90
+ }
91
+ #copy return parameter
92
+ op.uml_returnResult.each { |p|
93
+ np=nop.umlx_createAndAddReturnParameter("#{p.rdf_uri}_interface",p.uml_name.to_s)
94
+ p.umlx_copyToAttributeProperty(np)
95
+ }
96
+ }
97
+
98
+
99
+ return i
100
+ end
101
+
102
+
103
+ end
104
+
@@ -0,0 +1,28 @@
1
+ #!/bin/bash
2
+ (
3
+ echo "("
4
+ echo "echo \"#!ontomdx\""
5
+
6
+ echo "cat uml2.rdfs.nt.org | sed '"
7
+ (
8
+ cat uml2.rdfs.nt.org | grep 'rdf-syntax-ns#Property' | sed 's/^<\([^<>]*\)> <\([^<>]*\)>.*/URI=\1/g' | uniq
9
+ #cat uml2.rdfs.nt.org | sed 's/^<\([^<>]*\)> <\([^<>]*\)>.*/URI=\2/g' | uniq
10
+ #cat uml2.rdfs.nt.org | sed 's/^<\([^<>]*\)> <\([^<>]*\)> <\([^<>]*\)>.*/URI=\3/g'
11
+ ) \
12
+ | grep URI \
13
+ | sort | uniq \
14
+ | sed 's/.*#\(.*\)_\(.*\)/s\/\\(http:\\\/\\\/uml\\\/2#\\)\1_\2\/\\1\2\/g/g' \
15
+
16
+ echo "' \\"
17
+ # removes duplicate declaration (became homonyms)
18
+ echo ") | sort | uniq \\"
19
+ echo " > uml2.rdfs.nt_tmp"
20
+
21
+ ) > nt_old_to_nt_new_tmp.sh
22
+
23
+ ./nt_old_to_nt_new_tmp.sh
24
+ mv uml2.rdfs.nt_tmp uml2.rdfs.nt
25
+ #cat uml2.rdfs.nt.org | sort | uniq > tmp2
26
+ #diff uml2.rdfs.nt.org uml2.rdfs.nt
27
+
28
+ rm -f uml2.rdfs.nt.rb
@@ -0,0 +1,61 @@
1
+
2
+ module Muml_Package
3
+ def umlx_owner_one
4
+ #return uml_ownedMember_inv_one0
5
+ ext_isReferencedBy.each { |res|
6
+ return res if res.respond_to?(:uml_ownedMember) && res.uml_ownedMember.include?(self)
7
+ }
8
+ return nil
9
+ end
10
+ def umlx_owner=(p)
11
+ old=umlx_owner_one
12
+ old.uml_ownedMember.delete(self) unless old.nil?
13
+ p.uml_ownedMember_add(self)
14
+ ext_isReferencedBy_add(p)
15
+ end
16
+ end
17
+
18
+ module Muml_Classifier
19
+ def umlx_owner_one
20
+ #return uml_ownedMember_inv_one0
21
+ ext_isReferencedBy.each { |res|
22
+ return res if res.respond_to?(:uml_ownedMember) && res.uml_ownedMember.include?(self)
23
+ }
24
+ return nil
25
+ end
26
+ def umlx_owner=(p)
27
+ old=umlx_owner_one
28
+ old.uml_ownedMember.delete(self) unless old.nil?
29
+ p.uml_ownedMember_add(self)
30
+ ext_isReferencedBy_add(p)
31
+ end
32
+ end
33
+
34
+ module Muml_Operation
35
+ #returns element owner if found, nil otherwise
36
+ def umlx_owner_one
37
+ ext_isReferencedBy.each { |res|
38
+ next unless res.kind_of?(Muml_Classifier)
39
+ next if res.kind_of?(Muml_Association)
40
+ next unless res.uml_ownedOperation.include?(self)
41
+ return res
42
+ }
43
+ log.error("umlx_owner_one not found for #{self.class} #{self}")
44
+ return nil
45
+ end
46
+ end
47
+
48
+ module Muml_Property
49
+ #returns element owner if found, nil otherwise
50
+ def umlx_owner_one(donotlog=false)
51
+ ext_isReferencedBy.each { |res|
52
+ next unless res.kind_of?(Muml_Classifier)
53
+ next if res.kind_of?(Muml_Association)
54
+ next unless res.uml_ownedAttribute.include?(self)
55
+ return res
56
+ }
57
+ log.error("umlx_owner_one not found for #{self.class} #{self}") unless donotlog
58
+ return nil
59
+ end
60
+ end
61
+
@@ -0,0 +1,71 @@
1
+
2
+
3
+
4
+
5
+ module Mrdf_Model
6
+ # Tries to fix a broken UML model.
7
+ # This feature is not meant for serious work
8
+ # and should only be used for quick demonstration.
9
+ def umlx_tryToSalvageErrors!
10
+ return unless context[:salvage,false]
11
+ log.error { <<END
12
+
13
+ ************ salvage mode is on ***************
14
+ Salvage mode should only be used for quick
15
+ demonstration purposes and never for any serious
16
+ work.
17
+ ************ salvage mode is on ***************
18
+ END
19
+ }
20
+ each { |k,v|
21
+ # fix untyped property
22
+ if v.kind_of?(Muml_Property)
23
+ v.uml_type=v.umlx_owner_one.umlx_dataType_string if v.uml_type.empty?
24
+ # id is generated if persistence is enabled
25
+ v.uml_name="business Id" if context[:db] && v.uml_name.to_s=="id"
26
+ end
27
+
28
+ #fix blank or missing names
29
+ if v.kind_of?(Muml_NamedElement)
30
+ v.uml_name="missing_name_in_model_"+v.rdf_uri if v.uml_name.empty? || v.uml_name.to_s==""
31
+ end
32
+ }
33
+ each { |k,v|
34
+
35
+ #fix visibility (force to public)
36
+ if v.respond_to?(:uml_visibility)
37
+ v.uml_visibility=::Cuml_VisibilityKind::Public
38
+ end
39
+
40
+
41
+ # ejb service should not be abstract
42
+ if v.kind_of?(Muml_Class) && v.umlx_hasStereotype?("Service")
43
+ v.uml_isAbstract="false"
44
+ end
45
+
46
+ #no duplicate attribute (in one single class)
47
+ if v.kind_of?(Muml_Class)
48
+ names=Set.new
49
+ i=1
50
+ v.uml_ownedAttribute.each { |a|
51
+ n=a.uml_name.to_s
52
+ if a.respond_to?(:java_Name)
53
+ #in case java is loaded
54
+ n=a.java_Name.to_s
55
+ end
56
+
57
+ if names.include?(n)
58
+ i=i+1
59
+ a.uml_name="#{v.uml_name}_duplicate_#{i}"
60
+ else
61
+ names.add(n)
62
+ end
63
+ }
64
+
65
+ end
66
+ }
67
+
68
+
69
+ end
70
+ end
71
+
@@ -0,0 +1,85 @@
1
+ # utility methods to select parts of a model
2
+ #
3
+ module Mrdf_Model
4
+ #search and returns every uml model
5
+ def uml_Model_all
6
+ return @typeIndex[Muml_Model]
7
+ ret=Array.new
8
+ each { |k,m|
9
+ next unless m.kind_of?(Muml_Model)
10
+ ret << m
11
+ }
12
+ return ret
13
+ end
14
+ def uml_Class_all(ret=Set.new)
15
+ #return @typeIndex[Muml_Class]
16
+ uml_Model_all.each { |m|
17
+ m.uml_Class_all(ret)
18
+ }
19
+ return ret
20
+ end
21
+ end
22
+
23
+ module Muml_Model
24
+ #search and returns evry uml class contained in the current model.
25
+ #NOTE: inner classes are not included
26
+ def uml_Class_all(ret=Set.new)
27
+ uml_ownedMember.each { |n|
28
+ if n.kind_of?(Muml_Enumeration)||n.kind_of?(Muml_Interface) || (n.kind_of?(Muml_Class) && n.umlx_isReallyAClass?)
29
+ ret << n
30
+ elsif n.kind_of?(Muml_Package) && !n.kind_of?(Muml_Profile)
31
+ n.uml_Class_all(ret)
32
+ else
33
+ #log.debug { "uml_Class_all ignored #{n.class.name} #{n}" }
34
+ end
35
+ }
36
+ return ret
37
+ end
38
+ #search and returns evry uml class contained in the current model.
39
+ #NOTE: inner classes are not included
40
+ def uml_UseCase_all(ret=Array.new)
41
+ uml_ownedMember.each { |n|
42
+ if n.kind_of?(Muml_UseCase)
43
+ ret << n
44
+ elsif n.kind_of?(Muml_Package) && !n.kind_of?(Muml_Profile)
45
+ n.uml_UseCase_all(ret)
46
+ else
47
+ #log.debug { "ignored #{n}" }
48
+ end
49
+ }
50
+ return ret
51
+ end
52
+ end
53
+ module Muml_Package
54
+ #search and returns evry uml class contained in the current package.
55
+ #NOTE: inner classes are not included
56
+ def uml_Class_all(ret=Array.new)
57
+ uml_ownedMember.each { |n|
58
+ if n.kind_of?(Muml_Enumeration)||n.kind_of?(Muml_Interface) || (n.kind_of?(Muml_Class) && n.umlx_isReallyAClass?)
59
+ ret << n
60
+ elsif n.kind_of?(Muml_Package) && !n.kind_of?(Muml_Profile)
61
+ n.uml_Class_all(ret)
62
+ else
63
+ #log.debug { "ignored #{n}" }
64
+ end
65
+ }
66
+ return ret
67
+ end
68
+ #search and returns evry uml class contained in the current package.
69
+ #NOTE: inner classes are not included
70
+ def uml_UseCase_all(ret=Array.new)
71
+ uml_ownedMember.each { |n|
72
+ if n.kind_of?(Muml_UseCase)
73
+ ret << n
74
+ next
75
+ end
76
+ if n.kind_of?(Muml_Package) && !n.kind_of?(Muml_Profile)
77
+ n.uml_UseCase_all(ret)
78
+ next
79
+ end
80
+ #log.debug { "ignored #{n}" }
81
+ }
82
+ return ret
83
+ end
84
+
85
+ end
@@ -0,0 +1,27 @@
1
+ #Handle shortcuts (from a namespace to a model)
2
+
3
+ module Mrdf_Model
4
+ #Transform a set of UML models with links into a
5
+ #single model with uml ownedMember.
6
+ def umlx_processShortcuts!
7
+ each_value { |s|
8
+ next unless s.respond_to?(:umlx_shortcut)
9
+ next if s.umlx_shortcut.nil?
10
+
11
+ s.umlx_shortcut.each {|p|
12
+ #remove link with package
13
+ p.uml_ownedMember_inv.each { |m|
14
+ m.uml_ownedMember.delete(p)
15
+ }
16
+
17
+ #replace shortcut with ownership
18
+ s.uml_ownedMember_add(p)
19
+ }
20
+
21
+
22
+
23
+
24
+ }
25
+
26
+ end
27
+ end
@@ -0,0 +1,236 @@
1
+ require 'singleton'
2
+
3
+ class Crdf_Model
4
+ # Loads UML2 metamodel.
5
+ def loadUml2
6
+ loadMetaModelFromFile("#{File.dirname(__FILE__)}/uml2.rdfs.nt");
7
+ addTypeIndex(Muml_Class)
8
+ addTypeIndex(Muml_Model)
9
+ end
10
+ end
11
+
12
+ module Muml_Classifier
13
+ # Returns in a Set any class this class inherit froms, both directly and indirectly (trough other classes)
14
+ #parameter is used internaly for recursion and should not be used.
15
+ def umlx_classifier_generalization_indirect(s=Set.new)
16
+ self.uml_generalization.each { |gene|
17
+ gene.uml_general.each{ |c|
18
+ recurse=!s.include?(c) # anti boucle infinie sur modele KO
19
+ s.add(c)
20
+ c.umlx_classifier_generalization_indirect(s) if recurse
21
+ }
22
+ }
23
+ return s
24
+ end
25
+ end
26
+
27
+ module Muml_Namespace
28
+ # Returns containing package.
29
+ # NOTE: Returns null if containing package is a Model.
30
+ def umlx_package
31
+ #TODO: utiliser relation inverse when available
32
+ p=umlx_owner_one
33
+ return nil if p.kind_of?(Cuml_Model)
34
+ return p
35
+ end
36
+
37
+ # Internal use.
38
+ #
39
+ # Kept for possible future use.
40
+ def _computePackage_notUsed
41
+ rdf_model.each { |a,x|
42
+ if(x.class==Cuml_Class)
43
+ x.uml_nestedClassifier {
44
+ return x if e==self
45
+ }
46
+ end
47
+ if(x.class==Cuml_Package)
48
+ x.uml_ownedMember.each { |e|
49
+ return x if e==self
50
+ }
51
+ end
52
+ }
53
+ return nil
54
+ end
55
+ end
56
+ module Muml_Namespace
57
+ #Returns the chain of namespace owning this element including this element
58
+ def umlx_hierarchy
59
+ p=umlx_package
60
+ if(p==nil) # || p.kind_of?(Muml_Model))
61
+ r=Array.new()
62
+ else
63
+ r=p.umlx_hierarchy
64
+ end
65
+ r.push(self) if !self.kind_of?(Muml_Model)
66
+ return r
67
+ end
68
+
69
+ #Returns the chain of namespace owning this element *NOT* including this element
70
+ def umlx_sub_hierarchy
71
+ p=umlx_package
72
+ if(p==nil)
73
+ r=Array.new()
74
+ else
75
+ r=p.umlx_hierarchy
76
+ end
77
+ return r
78
+ end
79
+ end
80
+
81
+ module ::Muml_NamedElement
82
+ #Internal use
83
+ #
84
+ #Used by web server
85
+ def to_s
86
+ s=uml_name.to_s
87
+ return s if s.length>0
88
+ super
89
+ end
90
+ end
91
+ module ::Muml_Generalization
92
+ #Internal use
93
+ #
94
+ #Used by web server
95
+ def to_s
96
+ return "->#{uml_general.to_s}"
97
+ end
98
+ end
99
+ module ::Muml_Implementation
100
+ #Internal use
101
+ #
102
+ #Used by web server
103
+ def to_s
104
+ return "->#{uml_realizingClassifier.to_s}"
105
+ end
106
+ end
107
+
108
+ module ::Muml_Association
109
+ #Internal use
110
+ #
111
+ #Used by web server
112
+ def to_s
113
+ return "#{uml_ownedEnd}->#{uml_memberEnd}"
114
+ end
115
+ end
116
+ module ::Muml_LiteralUnlimitedNatural
117
+ def to_s
118
+ return uml_value.to_s if uml_value.to_s.length>0
119
+ super
120
+ end
121
+ def umlx_to_i
122
+ return 0 if to_s.nil?
123
+ return to_s.to_i;
124
+ end
125
+
126
+ end
127
+ module ::Muml_LiteralInteger
128
+ def to_s
129
+ return uml_value.to_s if uml_value.to_s.length>0
130
+ super
131
+ end
132
+ def umlx_to_i
133
+ return 0 if to_s.nil?
134
+ return to_s.to_i;
135
+ end
136
+ end
137
+
138
+ module ::Muml_Property
139
+ #Returns the other end of the association this property is linked to.
140
+ #NOTES:
141
+ # Returns nil if this class is not part of an association
142
+ # Returns nil if other en is not navigable.
143
+ def umlx_otherEnd
144
+ self.uml_association.each { |ass|
145
+ ass.uml_memberEnd.each { |p|
146
+ return p if p!=self
147
+ }
148
+ }
149
+ return nil
150
+ end
151
+ end
152
+
153
+ module ::Muml_Class
154
+ # returns ownedAttribute including non navigable ones.
155
+ def umlx_ownedAttribute
156
+ ret=Array.new
157
+ ext_isReferencedBy.each { |res|
158
+ next if !res.kind_of?(Cuml_Property)
159
+ ##log.debug "referencedBy : #{res.class.name}"
160
+ next if res.uml_type_one!=self
161
+ ret << res
162
+ }
163
+ return ret
164
+ end
165
+
166
+ # returns true if this class is a direct composante member end of a composition.
167
+ # NOTE:
168
+ # This method returns direct relations only.
169
+ # cf: umlx_isComposanteRec? for recursive
170
+ def umlx_isComposante?
171
+ #(self.umlx_ownedAttribute-self.uml_ownedAttribute).each { |a|
172
+ (self.umlx_ownedAttribute).each { |a|
173
+ next if self.uml_ownedAttribute.include?(a)
174
+ #next if !p.kind_of?(Cuml_Property)
175
+ #log.debug "#{self.uml_name} --> #{a.umlx_otherEnd.class.name}"
176
+ #[a, a.umlx_otherEnd].each { |p|
177
+ [a].each { |p|
178
+
179
+ return true if (!p.nil?) && (!p.uml_aggregation_one0.nil?)&& (p.uml_aggregation_one.isComposite?)
180
+ }}
181
+ return false
182
+ end
183
+
184
+ # returns true if this class is this class or one of its inheriting class is a direct composante member end of a composition.
185
+ # cf: umlx_isComposante? for non recursive behavior.
186
+ def umlx_isComposanteRec?
187
+ return true if umlx_isComposante?
188
+ self.umlx_classifier_generalization_indirect.each {|c|
189
+ return true if c.umlx_isComposanteRec?
190
+ }
191
+ return false
192
+ end
193
+
194
+ # returns true if this class carries directly a composition
195
+ # cf umlx_carryCompositionRec? for recursive behavior.
196
+ def umlx_carryComposition?
197
+ (self.uml_ownedAttribute+self.umlx_ownedAttribute).each { |a|
198
+ #next if !p.kind_of?(Cuml_Property)
199
+ #log.debug "#{self.uml_name} --> #{a.umlx_otherEnd.class.name}"
200
+ [a, a.umlx_otherEnd].each { |p|
201
+
202
+ return true if (!p.nil?) && (!p.uml_aggregation_one0.nil?)&& (p.uml_aggregation_one.isComposite?)
203
+ }}
204
+ return false
205
+ end
206
+ #
207
+ # returns true if this class or one of its inherited classes carries directly a composition
208
+ # cf umlx_carryComposition? for non recursive behavior.
209
+ def umlx_carryCompositionRec?
210
+ return true if umlx_carryComposition?
211
+ self.umlx_classifier_generalization_indirect.each {|c|
212
+ return true if c.umlx_carryCompositionRec?
213
+ }
214
+ return false
215
+ end
216
+ end
217
+
218
+ module Muml_Operation
219
+ #retrieve operation return parameter if any (nil otherwise)
220
+ def umlx_returnResult_one0
221
+ fp=nil
222
+ uml_returnResult.each { |p|
223
+ #pour RSM (non conformite de l'export)
224
+ next unless p.uml_direction_one.isReturn?
225
+ fp=p
226
+ }
227
+ uml_ownedParameter.each { |p|
228
+ next unless p.uml_direction_one.isReturn?
229
+ fp=p
230
+ }
231
+ return fp
232
+ end
233
+ end
234
+
235
+
236
+ #end # ProfileCoreUML