ontomde-core 1.0.2

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,70 @@
1
+ #:include: ../shared/license.rdoc
2
+
3
+ require "set"
4
+
5
+ #This class is a singleton used for storing locations of model source files.
6
+ class Crdf_loader
7
+ include Singleton
8
+ attr_reader :rdf_model
9
+ attr_reader :availableProfiles,:activeProfiles
10
+ #attr_writer :availableProfiles,:activeProfiles
11
+ attr_reader :sourceFiles
12
+
13
+ def profiles
14
+ end
15
+
16
+ # Add fn file to the list of model source files and loads it.
17
+ # Note:
18
+ # source file is stored internaly as full path (expanded)
19
+ # because running program current directory is subject to change
20
+ # especialy when rails server is used.
21
+ def addModelFile(fn)
22
+ fn=File.expand_path(fn)
23
+ @sourceFiles << fn if !@sourceFiles.include?(fn)
24
+ @rdf_model.loadModelFromFile(fn)
25
+ #log.debug "fn=#{fn}"
26
+ #TODO: enlever les fragments
27
+ end
28
+
29
+ # clear current model and reloads it from file
30
+ def reset
31
+ @rdf_model=Crdf_Model.new
32
+ #TODO: supprimer adh�rence UML
33
+ @rdf_model.loadUml2
34
+ @sourceFiles.each { |fn|
35
+ @rdf_model.loadModelFromFile(fn)
36
+ }
37
+ end
38
+
39
+ def initialize
40
+ log.debug "Crdf_loader: initialisation singleton"
41
+
42
+ #TODO: REWRITE (currently KO)
43
+ @sourceFiles=Array.new()
44
+ @availableProfiles=Set.new()
45
+ @availableProfiles.add("uml2/uml2.rb")
46
+ @availableProfiles.add("java/java.rb")
47
+ #@availableProfiles[2]="java/hibernate.rb"
48
+ @activeProfiles=Set.new()
49
+ log.debug "Crdf_loader: fin initialisation singleton"
50
+ reset
51
+ end
52
+ ## def loadProfile
53
+ ## log.warn "TODO: reecrire"
54
+ ## return
55
+ ## log.debug "loadProfile ...."
56
+ ## @availableProfiles.each { |prof|
57
+ ## if @activeProfiles.include?(prof)
58
+ ## #c=cookies[:user_name]
59
+ ## log.debug "load profile #{prof}"
60
+ ## require prof
61
+ ## else
62
+ ## log.debug "skip profile #{prof}"
63
+ ## require prof
64
+ ## end
65
+ ## }
66
+ ## load "uml2/uml2.rdfs.nt.rb"
67
+ ## end
68
+ end
69
+
70
+ #Crdf_loader.instance
@@ -0,0 +1,32 @@
1
+ #log use:
2
+ #
3
+ #log.debug("Created logger")
4
+ #log.info("Program started")
5
+ #log.warn("Nothing to do!")
6
+ #log<<"essai"
7
+ # http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc/
8
+
9
+ require 'logger'
10
+
11
+ class Object
12
+ @@log = Logger.new(STDOUT)
13
+ #@@log.level = Logger::DEBUG
14
+ @@log.level = Logger::INFO
15
+ #@@log.datetime_format="%H:%M:%S"
16
+ @@log.datetime_format=""
17
+
18
+ def log
19
+ @@log
20
+ end
21
+ end
22
+
23
+ class Logger::Formatter
24
+ XMDA_Format="-- %-5s-- %s\n"
25
+ #overide standard logger method
26
+ alias :call_base :call
27
+ def call(severity, time, progname, msg)
28
+ XMDA_Format % [severity, msg2str(msg)]
29
+ end
30
+ end
31
+
32
+
@@ -0,0 +1,316 @@
1
+ #:include: ../shared/license.rdoc
2
+
3
+ #require "ontomde-core/exceptions.rb"
4
+ require "singleton"
5
+
6
+ # Helper methods to handle rdf ressources as object.
7
+ module IteratorOrSingleElement
8
+ def to_s
9
+ r=""
10
+ sep=""
11
+ self.each{ |elt|
12
+ r=r+sep+(elt.to_s)
13
+ sep=" "
14
+ }
15
+ return r
16
+ end
17
+ def isFalse?
18
+ return !isTrue?
19
+ end
20
+ def +(array)
21
+ return self if array.kind_of?(ArrayOrSingleElementEmpty)
22
+ return super(array)
23
+ end
24
+
25
+ STRING_TO_BOOLEAN_HASH={ "false" => false, "true" => true}
26
+ def other_implem_isTrue?
27
+ return false if length==0
28
+ raise Warning.new,"bad data for isTrue?(length=#{length}>1)" if length>1
29
+ ret=STRING_TO_BOOLEAN_HASH[self[0]]
30
+ return ret unless ret.nil?
31
+ raise Warning.new,"bad data for isTrue?(#{self[0]})" if length>1
32
+ end
33
+ def isTrue?
34
+ #return false if length==0
35
+ return false if empty?
36
+ raise Warning.new,"bad data for isTrue?(length=#{length}>1)" if length>1
37
+ return false if self[0]=="false"
38
+ return true if self[0]=="true"
39
+ raise Warning.new,"bad data for isTrue?(#{self[0]})" if length>1
40
+
41
+ end
42
+ end
43
+ class ArrayOrSingleElement < Array
44
+ include IteratorOrSingleElement
45
+ end
46
+ class SetOrSingleElement < Set
47
+ include IteratorOrSingleElement end
48
+
49
+ # Singleton of an empty ArrayOrSingleElement
50
+ # Note:
51
+ # This object is used for performance enhancement.
52
+ class ArrayOrSingleElementEmpty #< ArrayOrSingleElement
53
+ include Singleton
54
+
55
+ # Size of an empty Array (always 0)
56
+ def size
57
+ 0
58
+ end
59
+
60
+ # Size of an empty Array (always 0)
61
+ def length
62
+ 0
63
+ end
64
+
65
+ # Iterator (does nothing)
66
+ def each
67
+ end
68
+
69
+ # returns self as
70
+ def select
71
+ # quelque-soit le critere
72
+ # de selection le retour est tout aussi vide
73
+ return self;
74
+ end
75
+
76
+ # returns array
77
+ def +(array)
78
+ return array
79
+ end
80
+
81
+ # returns !isTrue?
82
+ def isFalse?
83
+ return !isTrue?
84
+ end
85
+
86
+ # returns false
87
+ def isTrue?
88
+ return false
89
+ end
90
+
91
+ # returns ""
92
+ def to_s
93
+ return ""
94
+ end
95
+
96
+ #return true
97
+ def empty?
98
+ return true
99
+ end
100
+
101
+ #returns false
102
+ def include?(elt)
103
+ return false
104
+ end
105
+
106
+ def delete(elt)
107
+ return nil
108
+ end
109
+
110
+ def sort(&block)
111
+ return self
112
+ end
113
+ end
114
+
115
+
116
+
117
+ module Kernel
118
+ #Creates accessors for rdf property passed as argument.
119
+ #
120
+ #Example:
121
+ # for rdf_safe_attr_reader_many uml_abcde_efgh
122
+ # the following methods are generated
123
+ #
124
+ # def uml_abcd_efgh ()
125
+ # returns an Array of reference elements.
126
+ # (This array is READ-ONLY)
127
+ #
128
+ # def uml_efgh ()
129
+ # same as uml_abcd_efgh
130
+ # in case of name clashing use long version.
131
+ #
132
+ # def uml_efgh_one()
133
+ # Returns nil if array is empty
134
+ # Triggers an error if array contains more than one element.
135
+ # returns the first element of array
136
+ #
137
+ # def uml_efgh=(x)
138
+ # reset array and add x
139
+ #
140
+ # def uml_efgh_add(x)
141
+ # add x to the existing array
142
+ #
143
+ # def uml_efgh?
144
+ # returns uml_efgh.isTrue?()
145
+ #
146
+ def rdf_safe_attr_reader_many(*syms)
147
+ #attr_reader(*args)
148
+ # TODO: ne pas crer un objet vide syst�matiquement.
149
+ syms.each do |sym|
150
+ #sym_array=sym.to_s.split("_",3)
151
+ #sym_short=""
152
+ #if sym_array[0]=="uml" && sym_array[2]!=""
153
+ # sym_short="#{sym_array[0]}_#{sym_array[2]}"
154
+ #else
155
+ sym_short=sym
156
+ #end
157
+ #version normale
158
+ #TODO: supprimer la version normale
159
+ # ou raccourcir les nom en amont
160
+ #class_eval %{def #{sym}
161
+ # log.warn "method #{sym} is deprecated. Use #{sym_short} instead"
162
+ # @#{sym}.nil? ? ::ArrayOrSingleElementEmpty.instance : @#{sym}
163
+ #end}
164
+ #version courte
165
+
166
+ #log.debug "sym_short: >#{sym_array[0]}< >#{sym_array[1]}< >#{sym_array[2]}<"
167
+ #log.debug sym_short
168
+ class_eval %{def #{sym_short}
169
+ @#{sym}.nil? ? ::ArrayOrSingleElementEmpty.instance : @#{sym}
170
+ end}
171
+
172
+ Crdf_Resource.class_eval %{def #{sym_short}_inv
173
+ ret=nil
174
+ ext_isReferencedBy.each { |g|
175
+ next unless g.respond_to?(:#{sym_short})
176
+ next unless g.#{sym_short}.include?(self)
177
+ ret=::ArrayOrSingleElement.new if ret.nil?
178
+ next if ret.include?(g)
179
+ ret << g
180
+ }
181
+ ret.nil? ? ::ArrayOrSingleElementEmpty.instance : ret
182
+ end}
183
+
184
+ Crdf_Resource.class_eval %{def #{sym_short}_inv_one(warn=true)
185
+ i=#{sym_short}_inv
186
+ if i.nil? || i.size==0
187
+ log_error_nil_one("#{sym_short}_inv") if warn
188
+ return nil
189
+ end
190
+ return i[0] if i.length==1
191
+ log.error "#{sym_short}_inv_one used with multi-value (class=\#{self.class.name})(uri=\#{rdf_uri})(length=\#{@#{sym}.length})(value=(\#{@#{sym}.to_s}) Returning first one found as workaround : (\#{@#{sym}[0]})"
192
+ return i[0]
193
+ end}
194
+
195
+ class_eval %{def #{sym_short}?
196
+ return #{sym_short}.isTrue?
197
+ end}
198
+
199
+ class_eval %{def #{sym_short}_one(warn=true)
200
+ if @#{sym}.nil? || @#{sym}.size==0
201
+ log_error_nil_one("#{sym_short}") if warn
202
+ return nil
203
+ end
204
+ return @#{sym}[0] if @#{sym}.length==1
205
+ #log.error Warning.new,"#{sym_short}_one used with multi-value (class=\#{self.class.name})(uri=\#{rdf_uri})(length=\#{@#{sym}.length})(value=(\#{@#{sym}.to_s})"
206
+ log.error "#{sym_short}_one used with multi-value (class=\#{self.class.name})(uri=\#{rdf_uri})(length=\#{@#{sym}.length})(value=(\#{@#{sym}.to_s}) Returning first one found as workaround : (\#{@#{sym}[0]})"
207
+ return @#{sym}[0]
208
+ end}
209
+
210
+ class_eval %{def #{sym_short}_one0()
211
+ #{sym_short}_one(false)
212
+ end}
213
+
214
+
215
+ inv=(sym_short.to_s=="ext_isReferencedBy") ? "" : "item.ext_isReferencedBy_add(self) if item.respond_to?(:ext_isReferencedBy_add) "
216
+
217
+ #puts "sym_short=#{sym_short} #{inv}"
218
+
219
+ #puts "adding method def #{sym_short}=(v) for #{self.name}"
220
+ class_eval %{def #{sym_short}=(v)
221
+ if v.nil?
222
+ @#{sym}=nil
223
+ elsif v.kind_of?(ArrayOrSingleElement) || v.kind_of?(Array) || v.kind_of?(ArrayOrSingleElementEmpty)
224
+ @#{sym}= ArrayOrSingleElement.new
225
+ v.each { |item|
226
+ @#{sym}.push(item)
227
+ #{inv}
228
+ }
229
+ else
230
+ @#{sym}= ArrayOrSingleElement.new
231
+ @#{sym}.push(v)
232
+ item=v
233
+ #{inv}
234
+ end
235
+ end}
236
+
237
+ class_eval %{def #{sym_short}_add(item)
238
+ if !item.nil?
239
+ #log.debug @#{sym}.size+1000
240
+ if @#{sym}.nil?
241
+ #log.debug "reset @#{sym}"
242
+ @#{sym}= ArrayOrSingleElement.new
243
+ end
244
+ @#{sym}.push(item)
245
+ #{inv}
246
+ end
247
+ end}
248
+
249
+
250
+ end
251
+ end
252
+ end
253
+
254
+ module Mrdf_Model
255
+ def mtk_object_message
256
+ return ""
257
+ end
258
+ def mtk_related_message
259
+ return ""
260
+ end
261
+ end
262
+
263
+ module Mrdf_Resource
264
+ #return a string describing this object
265
+ #(used for error log messages)
266
+ def mtk_object_message
267
+ return <<END
268
+ ** uri =#{rdf_uri}
269
+ ** type=#{self.class.name}
270
+ ** to_s=#{self.to_s}
271
+ END
272
+ end
273
+ #return a string describing object related to this object
274
+ #(used for error log messages)
275
+ def mtk_related_message
276
+ related=""
277
+ ext_isReferencedBy.each { |g|
278
+ related=related+"** (#{g.class.name}) #{g}\n"
279
+ }
280
+ return related
281
+ end
282
+
283
+
284
+ # generates an error message used when
285
+ # "meth" returns unexpectedly no data.
286
+ def log_error_nil_one(meth)
287
+ return if log_already_displayed?("#{rdf_uri}__#{meth}")
288
+ log.error {
289
+
290
+ <<-END
291
+ #{meth}_one nil for #{self}::#{self.class.name} (uri=#{rdf_uri})
292
+ ********* INVALID DATA DETECTED **********
293
+ ** This software expects the model element specified bellow
294
+ **#{mtk_object_message}
295
+ ** to have exactly one "#{meth}".
296
+ **
297
+ ** This is most likely caused by a missing data in source model.
298
+ ** Please check that previous element has a #{meth} defined.
299
+ **
300
+ ** This model element is related to these other model elements:
301
+ #{mtk_related_message}
302
+ ********* INVALID DATA DETECTED **********
303
+ END
304
+ }
305
+ raise Warning.new,"#{meth}_one nil null" if context[:failOnEmptyCallto_one,true]
306
+ end
307
+ end
308
+
309
+ #List of error message keys already displayed
310
+ MDA_LOG_ALREADY_DISPLAYED=Array.new
311
+
312
+ def log_already_displayed?(key)
313
+ return true if MDA_LOG_ALREADY_DISPLAYED.include?(key)
314
+ MDA_LOG_ALREADY_DISPLAYED<< key
315
+ return false
316
+ end
@@ -0,0 +1,62 @@
1
+ #:include: ../shared/license.rdoc
2
+
3
+ require 'singleton'
4
+
5
+ class ProfilDefault
6
+ end
7
+
8
+ class ProfilDefaultSingleton < ProfilDefault
9
+ include Singleton
10
+ end
11
+
12
+ #Profil racine.
13
+ #Toutes les extensions doivent �tre sous cet espace de nom.
14
+ module Mmtk_Profil
15
+ end
16
+
17
+ class Module
18
+ #Inclure le module courant dans le module principal de la m�taclasse correspondante. (sucre syntaxique)
19
+ #
20
+ #Exemple:
21
+ #module ProfileJava
22
+ #module Muml_NamedElement
23
+ # def doThis
24
+ # end
25
+ #end
26
+ def method_added(a)
27
+ #log.debug "method added!! #{a} #{name}"
28
+ #Module.nesting.each { |n| print("#{n.name},") }
29
+ #super
30
+ mtk_register if(a!=:mtk_register && a!=:method_added)
31
+ end
32
+ def mtk_register
33
+ n=""; (ns=name.split(/::/)).each { |n| }
34
+ #log.debug "registering #{name} #{ns[0]}"
35
+ return if ns[0]!="Mmtk_Profil"
36
+ @mtk_registered|=false
37
+ return if @mtk_registered
38
+ @mtk_registered=true
39
+
40
+ cn=n.clone ; cn[0]="C"
41
+ log.debug "Registering #{name} in #{n}"
42
+
43
+ cmd="module #{name}\ndef mtk_hello\nprint(\"\\n>#{name}\")\nsuper\nend\nend\n"
44
+ cmd=cmd+"module ::#{n}\ninclude #{name}\nend\n"
45
+ if( :"#{cn}"==:Crdf_Resource )
46
+ #TODO: HACK: module dynamique
47
+ #log.debug "Re-Registering #{cn} in #{n}"
48
+ sc= (:"#{cn}"!=:Crdf_Resource) ? "< ::Crdfs_Class ":""
49
+ #log.debug "sc : #{sc} #{cn}"
50
+ cmd=cmd+"class ::#{cn}\ninclude ::#{n}\nend\n"
51
+ #log.debug "class ::#{cn}\ninclude ::#{n}\nend\n"
52
+ end
53
+ eval(cmd)
54
+ end
55
+ end
56
+
57
+ class Crdf_Resource
58
+ def mtk_hello
59
+ log.debug "\n>#{self.class.name}->Crdf_Resource::mtk_hello"
60
+ end
61
+ end
62
+