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,272 @@
1
+ # Core RDF resource management
2
+ #:include: ../shared/license.rdoc
3
+
4
+ RDF_TRUE="true"
5
+ RDF_FALSE="false"
6
+
7
+ module Mrdf_Resource
8
+ # Debug method
9
+ # Dumps to screen the current object.
10
+ def dump
11
+ log.debug("\n#{self} dump #{self.class}>\n")
12
+ instance_variables.each {
13
+ |c|
14
+ log.debug("-#{c}- #{instance_variable_get(c).to_s}\n" )
15
+ }
16
+ log.debug('methods: ( ')
17
+ #out.write('methods: ( ')
18
+ public_methods.each { |m|
19
+ log.debug( "#{m}, " )
20
+ }
21
+ log.debug('<\n')
22
+ end
23
+ end
24
+
25
+ class Crdf_Resource #< Crdfs_Resource
26
+ include Mrdf_Resource
27
+ attr_reader :uri
28
+ attr_reader :nbrItem
29
+ attr_reader :rdf_model
30
+ @@nbrItem=0
31
+
32
+ # Utiliser pour un hack
33
+ def force_rdf_model=(m)
34
+ @rdf_model=m
35
+ end
36
+
37
+ # Returns a new empty attribute array
38
+ def createEmptyAttributeValue
39
+ return ArrayOrSingleElement.new()
40
+ end
41
+
42
+ #initialize a new resource and adds it to the current model.
43
+ #if uri is nil, a temporary uri is automaticaly generated.
44
+ #NOTE:
45
+ # This uri is not suitable for use by mtk_protected.
46
+ #TODO: ??? add a detection for prexisting uri ???
47
+ def initialize(model,uri)
48
+ uri="_transient_#{object_id}" if uri.nil?
49
+ model[uri]=self
50
+ @rdf_model=model
51
+ @uri=uri
52
+ @@nbrItem=@@nbrItem+1
53
+ end
54
+
55
+ #List of non restable variables
56
+ @@NonResetableVariables=['@rdf_model','@rdf_type','@uri']
57
+
58
+ #Return true if v is a restable property.
59
+ def isResetable?(v)
60
+ return ! @@NonResetableVariables.include?(v)
61
+ end
62
+
63
+ # Force reset of this object properties
64
+ # Every resetable property is set to nil.
65
+ def forceReset!
66
+ #log.debug "forceReset #{self}"
67
+ instance_variables.each { |v|
68
+ if(isResetable?(v))
69
+ #log.debug "reset #{v}"
70
+ instance_variable_set(v,nil)
71
+ end
72
+ }
73
+ end
74
+
75
+ #suppress warning
76
+ alias :nbrItem_org :nbrItem
77
+ #Number of item loaded since the initilization of the program
78
+ #Used for monitoring.
79
+ def nbrItem
80
+ @@nbrItem
81
+ end
82
+
83
+ #Internal use
84
+ #
85
+ def set(var,val)
86
+ #TODO: cout: 65s -> 82 sur CRX
87
+ #TODO: 21.8s -> 25,8s -> 19,5s (19/6) sur SID
88
+ raise Warning.new,'null val in set' if val.nil?
89
+ raise Warning.new,'null var in set' if var.nil?
90
+ core_set(:"@#{var}",val)
91
+ val.core_set(:@ext_isReferencedBy,self) if(val.kind_of?(Crdf_Resource))
92
+ end
93
+
94
+
95
+ #Internal use
96
+ #
97
+ def core_set(ivar,val)
98
+ old=instance_variable_get(ivar)
99
+ if old.nil?
100
+ old=createEmptyAttributeValue
101
+ instance_variable_set(ivar,old)
102
+ end
103
+ old.push(val)
104
+ end
105
+ end
106
+
107
+ class Crdf_Resource
108
+ attr_reader :rdf_type, :rdfs_label
109
+ rdf_safe_attr_reader_many :rdfs_subClassOf
110
+ attr_writer :rdf_type, :rdfs_label
111
+
112
+ rdf_safe_attr_reader_many :ext_isReferencedBy
113
+
114
+ #TODO: use ??
115
+ #@rubyName
116
+
117
+ def to_yaml
118
+ 'empty'
119
+ end
120
+
121
+ def set_rdfIsRelated(rel)
122
+ end
123
+
124
+ # Internal use
125
+ #
126
+ # sets resource uri
127
+ def rdf_uri=(new_uri)
128
+ @uri=new_uri
129
+ end
130
+
131
+ #returns resource uri
132
+ def rdf_uri
133
+ return @uri
134
+ end
135
+
136
+ #default string converter. Returns uri
137
+ def to_s
138
+ return @uri.to_s #"#{@uri}"
139
+ end
140
+
141
+ #Internal use
142
+ #
143
+ #Returns the ruby module name corresponding to this ressource
144
+ def getRubyModuleName
145
+ return "M#{getRubyName}"
146
+ end
147
+
148
+ #Internal use
149
+ #
150
+ #Returns the ruby class name corresponding to this ressource
151
+ def getRubyClassName
152
+ return "C#{getRubyName}"
153
+ end
154
+
155
+ #Retrieves a uri from a ruby identifier
156
+ def getRubyNameInverse(identifier)
157
+ found=nil
158
+ rdf_model.each { |k,c|
159
+ next if c.getRubyName!=identifier.to_s
160
+ log.error("Ruby name clash for #{identifier} and #{k}") unless found.nil?
161
+ found=k
162
+ }
163
+ log.error("No uri found for ruby identifier #{identifier} ") if found.nil?
164
+ return found
165
+ end
166
+
167
+ #Transforms a uri to a valid ruby identifier.
168
+ #cf. getRubyNameInverse
169
+ def getRubyName
170
+ return @uri.tr('^a-zA-Z0-9','_')
171
+ #return @rdf_label if @rdf_label
172
+ #return self.class.to_s # bootstrap
173
+ end
174
+
175
+ #Internal use
176
+ def isBootstrap?
177
+ return self.class.to_s==self.getRubyClassName
178
+ end
179
+
180
+ #Internal use
181
+ def getRubyAttributeDefinition(model)
182
+ #todo qqchos pour renvoyer valeur non nil
183
+ cmd1=''
184
+ sep1=' rdf_safe_attr_reader_many :'
185
+ cmd2=''
186
+ sep2=' rdf_safe_attr_reader_one :'
187
+
188
+ model.each { |tbl,prop|
189
+ next unless prop.kind_of?(Crdf_Property)
190
+ next if prop.rdfs_domain.nil?
191
+ next unless prop.rdfs_domain.include?(self)
192
+
193
+ #log.debug "res2=#{prop.uri} #{prop}"
194
+ #res.instance_variables.each { |var| log.debug " > #{var} #{res.instance_variable_get(var)}" }
195
+ if(true)
196
+ #toujours disponible
197
+ cmd1+=sep1+prop.getRubyName
198
+ sep1=', :'
199
+ end
200
+ if(false)
201
+ #TODO
202
+ cmd2+=sep2+prop.getRubyName
203
+ sep2=', :'
204
+ end
205
+ }
206
+ cmd1+="\n"
207
+ cmd2+="\n"
208
+ return cmd1+cmd2
209
+ end
210
+
211
+ # Internal use
212
+ #
213
+ # Creates a skeleton minimal ruby class for immediate use.
214
+ def createRubyClassMinimal(model)
215
+ return if @mtk_rubyClassGenerated
216
+ return if isBootstrap?
217
+ eval("class ::#{getRubyClassName} < ::Crdfs_Class\nend\n")
218
+ end
219
+
220
+ # Liste des classes dont la classe courante d�rive (directe et indirecte)
221
+ def rdfs_subClassOfRecursive(ret=Array.new)
222
+ rdfs_subClassOf.each { |sub|
223
+ next if ret.contains(sub)
224
+ ret.push(sub)
225
+ sub.rdfs_subClassOfRecursive(ret)
226
+ }
227
+ return ret
228
+ end
229
+
230
+ # Creates a ruby structure for this element.
231
+ # NOTE:
232
+ # generates ruby class named getRubyClassName
233
+ # generates ruby modules named getRubyModuleName
234
+ # multiple inheritance is handled trough multiple module inclusion.
235
+ def createRubyClass(model)
236
+ cmd=''
237
+ return cmd if @mtk_rubyClassGenerated
238
+ return cmd if isBootstrap?
239
+ @mtk_rubyClassGenerated=true
240
+
241
+ rdfs_subClassOf.each { |sub|
242
+ cmd+=sub.createRubyClass(model)
243
+ }
244
+
245
+ cmd+="module ::#{self.getRubyModuleName}\n"
246
+ cmd+=getRubyAttributeDefinition(model)
247
+ rdfs_subClassOf.each { |sub|
248
+ cmd+=' include ::' +(sub.getRubyModuleName)+"\n"
249
+ }
250
+ cmd+="end\n\n"
251
+ cmd+="class ::#{getRubyClassName} < ::Crdfs_Class\n"
252
+ cmd+=' include ' +self.getRubyModuleName+"\n"
253
+
254
+ #rdfs_subClassOfRecursive.uniq.each { |c|
255
+ # cmd+=' include ' +(c.getRubyModuleName)+'\n'
256
+ #}
257
+ cmd+="end\n\n"
258
+
259
+ #log.debug "cmd -->#---------\n#{cmd}\n#---------------"
260
+ eval(cmd)
261
+
262
+ return cmd
263
+ end
264
+ end
265
+
266
+ module Mrdf_Resource
267
+ # returns this object uri converted to a dot/graphviz compatible identifier.
268
+ def dotId
269
+ return rdf_uri.tr('^a-zA-Z0-9','_')
270
+ end
271
+ end
272
+
@@ -0,0 +1,173 @@
1
+ #:include: ../shared/license.rdoc
2
+
3
+ module Mrdf_Model
4
+ end
5
+
6
+ class Crdf_Resource
7
+ #True if resource is a bootstrap resource.
8
+ #A bootstrap resource is a resource existing prior to model creation (not loaded from external configuration file).
9
+ #Loaded resources are built using bootstrap resouces as references.
10
+ rdf_safe_attr_reader_many :ext_isBootstrap
11
+ end
12
+
13
+ #Class meant to store every element of a model.
14
+ class Crdf_Model #< Hash
15
+ include Mrdf_Model
16
+ attr_reader :updateCount
17
+ def length
18
+ @resourceSet.length
19
+ end
20
+ def empty?
21
+ return @resourceSet.empty?
22
+ end
23
+ def to_s
24
+ log.debug 'Model'
25
+ end
26
+
27
+ # Returns the ressource associated to the uri key.
28
+ def [](key)
29
+ return @resourceSet[key]
30
+ end
31
+
32
+ # Internal use
33
+ def []=(key,res)
34
+ @resourceSet[key]=res
35
+ end
36
+
37
+ # Standard each iterator
38
+ def each(&block_expr)
39
+ @resourceSet.each &block_expr
40
+ end
41
+
42
+ # Standard find_all iterator
43
+ def find_all(&block_expr)
44
+ @resourceSet.find_all &block_expr
45
+ end
46
+
47
+ # Standard each_value iterator
48
+ def each_value(&block_expr)
49
+ @resourceSet.each_value &block_expr
50
+ end
51
+ #
52
+ # Standard reject iterator
53
+ def reject(&block_expr)
54
+ @resourceSet.reject &block_expr
55
+ end
56
+
57
+ # Initialize model internal structures.
58
+ def initialize
59
+ super
60
+ @resourceSet=Hash.new
61
+ #@fileGenerated=Array.new
62
+ @updateCount=0
63
+ #@@mtk_out=nil
64
+
65
+ #bootstrap
66
+ Crdf_Resource.new(self,'rdf_Resource');
67
+ Crdf_Resource.new(self,'rdfs_Resource'); # le p�re des h�ritages
68
+ Crdf_Resource.new(self,'rdfs_Class');
69
+ Crdf_Resource.new(self,'rdf_Property');
70
+ Crdf_Resource.new(self,'rdfs_Literal');
71
+
72
+ #bootstrap pour module kb
73
+ Crdf_Resource.new(self,'kb_UML_METACLASS');
74
+ Crdf_Resource.new(self,'kb_UML_SLOT');
75
+
76
+ self.each {|k,c| c.ext_isBootstrap='true'}
77
+ end
78
+
79
+ #returns ressource associated to uri stored in model
80
+ def getRes(uri)
81
+ raise Warning.new,'nil uri' if uri.nil?
82
+ obj=self[uri]
83
+ raise WarningURIundefined.new(uri),"--uri undefined \"#{uri}\" " if obj.nil?
84
+ return obj
85
+ end
86
+
87
+ # internal use
88
+ def parse(nt,modeData)
89
+ if modeData
90
+ parseModeData(nt)
91
+ else
92
+ parseModeResource(nt)
93
+ end
94
+ end
95
+
96
+ # internal use
97
+ @@RDF_type=['rdf_type']
98
+
99
+ # internal use
100
+ def predicat_isRDFTYPE(predicat)
101
+ return @@RDF_type.include?(predicat)
102
+ end
103
+
104
+ # internal use
105
+ def dynNewInstance(value_res,about_uri)
106
+ cmd=value_res.getRubyClassName+'.new(self,about_uri)'
107
+ return eval(cmd)
108
+ end
109
+
110
+ # internal use
111
+ def parseModeResource(nt)
112
+ return if !predicat_isRDFTYPE(nt.predicat_uri)
113
+
114
+ about_res=self[nt.about_uri]
115
+ if about_res
116
+ about_res.forceReset!()
117
+ else
118
+ value_res=self.getRes(nt.value_uri)
119
+ begin
120
+ self[nt.about_uri]=about_res=dynNewInstance(value_res,nt.about_uri)
121
+ about_res.rdf_type=value_res
122
+ #about_res.set(rubyIdentifier(predicat_uri),value_res) # ref
123
+ rescue => e
124
+ log.debug "e-->#{e}"
125
+ #TODO: cause probable
126
+ raise WarningRubyTypeUndefined.new(nt.about_uri,value_res),"Ruby Type #{value_res.getRubyClassName} Undefined (cause probable!)"
127
+ end
128
+ return
129
+ end
130
+ end
131
+
132
+ # internal use
133
+ def parseModeData(nt)
134
+ return if predicat_isRDFTYPE(nt.predicat_uri)
135
+ subject=self.getRes(nt.about_uri)
136
+ if nt.valueIsReference?
137
+ subject.set(rubyIdentifier(nt.predicat_uri),self.getRes(nt.value_uri))
138
+ else
139
+ subject.set(rubyIdentifier(nt.predicat_uri),nt.value_litteral)
140
+ end
141
+
142
+ end
143
+
144
+ # internal use
145
+ def rubyIdentifier(str)
146
+ return str.tr('^a-zA-Z0-9','_')
147
+ end
148
+
149
+ # internal use
150
+ def generateClassesFromMetamodel(outRubyModelFileName)
151
+ log.info("ecriture du metamodele dans: #{outRubyModelFileName}")
152
+ #f=File.open(outRubyModelFileName,File::CREAT|File::TRUNC|File::RDWR, 0644)
153
+ mtk_default_context(:logFileWrite => false) { mtk_writeSession(outRubyModelFileName) {
154
+ f=self
155
+ f.write("# Debut du fichier #{outRubyModelFileName}\n")
156
+ f.write("# Ce fichier a ete genere automatiquement\n")
157
+ f.write("# Genere le:#{Time.now}\n")
158
+ self.
159
+ find_all { |a,x|
160
+ x.kind_of?(Crdfs_Class)
161
+ }.
162
+ each { |a,x|
163
+ #log.debug "gen -> #{x} #{x.class}"
164
+ cmd=x.createRubyClass(self)
165
+ f.write(cmd)
166
+ }
167
+ f.write("# Fin du fichier #{outRubyModelFileName}\n")
168
+ }} #f.close
169
+
170
+ end
171
+
172
+
173
+ end
@@ -0,0 +1,161 @@
1
+ #:include: ../shared/license.rdoc
2
+
3
+ require "singleton"
4
+
5
+ class UriNamespace
6
+ include Singleton
7
+ def initialize
8
+ # Les 1er sont prioritaire pour unalias ??
9
+ @urialiases=Hash.new(nil)
10
+ @urialiases["http:\/\/uml\/2"]="uml"
11
+ #@urialiases["http:\/\/uml\/1.4"]="uml"
12
+ @urialiases["http:\/\/www.w3.org\/2000\/01\/rdf-schema"]="rdfs"
13
+ @urialiases["http:\/\/www.w3.org\/1999\/02\/22-rdf-syntax-ns"]="rdf"
14
+ @urialiases["http:\/\/protege.stanford.edu\/system"]="sys"
15
+ @urialiases["http:\/\/protege.stanford.edu\/kb"]="kb"
16
+ @urialiases["http:\/\/ft\/uml\/2"]="umlx"
17
+ @urialiases["http:\/\/kb"]="ukb"
18
+ @urialiases["http:\/\/orange-ftgroup.com\/2007\/rd\/xmda\/bpm"]="bpm"
19
+ end
20
+
21
+ # Returns unaliases uri for uri
22
+ # Used by magic draw export plugin
23
+ # NOTE:
24
+ # raises an error if alias is unknown.
25
+ # Example:
26
+ # unalias("rdf_XYZ") return @urialises("rdf")+"#"+"XYZ"
27
+ def unalias(uri)
28
+ n=uri.split('_',2)
29
+ @urialiases.each {|k,v|
30
+ next if v!=n[0]
31
+ return k+"#"+n[1]
32
+ }
33
+ # no alias is ok
34
+ return uri
35
+ #raise "unalias failed for #{uri}"
36
+ end
37
+
38
+ # Returns the alias associated to ns.
39
+ # NOTE:
40
+ # uri of the form http://orange-ft.com/[0-9]+/XyZ are aliases xyz
41
+ def getNamespaceAlias(ns)
42
+ _alias=@urialiases[ns]
43
+ return _alias if _alias
44
+
45
+ md=/^http:\/\/orange-ft.com\/[0-9]+\/([a-z0-9A-Z]+)$/.match(ns)
46
+ if md.nil?
47
+ _alias="ns_#{@urialiases.length.to_s}"
48
+ else
49
+ # La premi�re lettre doit �tre minuscule
50
+ _alias=md[1].downcase
51
+ end
52
+ addAliasHelp(_alias,ns)
53
+ addAlias(_alias,ns)
54
+ return _alias
55
+
56
+ end
57
+
58
+ def addAliasHelp(_alias,ns)
59
+ #return if context[:displayAddAliasHelp,true]
60
+ log.debug <<-ENDMSG
61
+
62
+ **********************************************************
63
+ ** An unknown rdf namespace has been found and a random
64
+ ** alias has been generated for it : '#{_alias}'
65
+ **
66
+ ** Using a random alias is OK if you do not need to
67
+ ** reference a namespace somewhere in your code.
68
+ **
69
+ ** If, for example, you need to declare methods
70
+ ** for elements of this namespace
71
+ ** (for generating code for example),
72
+ ** you will need a fix namespace alias.
73
+ **
74
+ ** Run the following ruby code once in your ruby
75
+ ** program to declare a new alias:
76
+ **
77
+ ** YourCode.rb
78
+ ** require 'ontomde-core'
79
+ ** (...)
80
+ ** UriNamespace.instance.addAlias('yourAlias',
81
+ ** '#{ns.gsub(/\//,'\\\/')}'
82
+ ** )
83
+ **
84
+ ** Note: beware of \\/ ruby string escaping)
85
+ **********************************************************
86
+ ENDMSG
87
+ end
88
+
89
+ #adds an alias to the predefined list of aliases.
90
+ def addAlias(_alias,ns)
91
+ log.debug { "Creation d'un alias de namespace xmlns:"+_alias+"=\""+ns+"#\"" }
92
+ @urialiases[ns]=_alias
93
+ return nil
94
+ end
95
+
96
+ #compute aliases name for given uri
97
+ #exemple alias('http://foo#bar') --> 'ns1:bar'
98
+ #Note:
99
+ # method added for uml2_kb which stores unaliased uri in kb text field for back reference to uml model.
100
+ def urialias(uri)
101
+ a=uri.split("#",2)
102
+ return uri if a[1].nil?
103
+ ns=getNamespaceAlias(a[0])
104
+ #puts "uri=#{ns}_#{a[1]}"
105
+ return "#{ns}_#{a[1]}"
106
+ end
107
+ end
108
+
109
+ #RDF triplet handling.
110
+ class NTriple
111
+ attr_reader :about_uri, :predicat_uri, :value_uri, :value_litteral
112
+ def valueIsReference?
113
+ end
114
+
115
+ # Initialization of internal cache (performance enchancement)
116
+ def initialize
117
+ # Le cache est remis � z�ro � chaque fichier.
118
+ # Les essais avec SID.nt montrent un gain de performance
119
+ # de 10% sur la m�thode urialias, les fichiers �tant largement disjoints.
120
+ #@@cacheUse=1
121
+ #@@cacheMiss=100
122
+ #log.debug "initialize triplet"
123
+ @uriMappingCache=Hash.new(nil)
124
+ end
125
+
126
+ # Returns an aliases uri
127
+ # uri is in ntriple format: '<http://foo#bar>'
128
+ # Optimize for ntriple file handling
129
+ def urialias(uri)
130
+ #log.debug "#{uri} ??"
131
+ #return nil if uri == nil
132
+ ret=@uriMappingCache[uri]
133
+ #log.debug "cache miss %=#{1.0*@@cacheMiss/@@cacheUse*100} cacheUse=#{@@cacheUse}"
134
+ #@@cacheUse=@@cacheUse+1
135
+ return ret unless ret.nil?
136
+ #log.debug "cache miss"
137
+ #@@cacheMiss=@@cacheMiss+1
138
+ @uriMappingCache[uri]=ret=compute_urialias(uri)
139
+ #log.debug "#{uri} -> #{ret}"
140
+ return ret
141
+ end
142
+
143
+ # Internal use
144
+ def compute_urialias(uri)
145
+ #renvoi une uri apres avoir remplacer le chemin par son alias
146
+ raise Warning.new,"Bad NT URI (#{uri})" if uri.nil? || (uri[0] != 60)
147
+ #uri=uri[1,uri.length-2]
148
+ #log.debug "uri[0,1] -> '#{uri[0,1]}'"
149
+ uri=uri[1,uri.length].split(">",2)[0]
150
+ #log.debug "uri-->#{uri}"
151
+ return ::UriNamespace.instance.urialias(uri)
152
+
153
+ #a=uri.split("#",2)
154
+ #return uri if a[1].nil?
155
+ #r=::UriNamespace.instance.getNamespaceAlias(a[0])
156
+ #log.debug "urialias="+r+"_"+a[1]
157
+ #return r+"_"+a[1]
158
+ #return "#{r}_#{a[1]}"
159
+ end
160
+
161
+ end