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.
- data/History.txt +5 -0
- data/Manifest.txt +37 -0
- data/README.txt +48 -0
- data/Rakefile +19 -0
- data/bin/ontomde-core +0 -0
- data/lib/ontomde-core.rb +35 -0
- data/lib/ontomde-core/bootstrap_rdfs.rb +37 -0
- data/lib/ontomde-core/clone.rb +73 -0
- data/lib/ontomde-core/context.rb +115 -0
- data/lib/ontomde-core/customERB.rb +842 -0
- data/lib/ontomde-core/custom_method_missing.rb +53 -0
- data/lib/ontomde-core/delayed.rb +20 -0
- data/lib/ontomde-core/demoInstaller.rb +32 -0
- data/lib/ontomde-core/exceptions.rb +28 -0
- data/lib/ontomde-core/fileLoader.rb +163 -0
- data/lib/ontomde-core/fileTypes.rb +133 -0
- data/lib/ontomde-core/helper.rb +538 -0
- data/lib/ontomde-core/loader.rb +70 -0
- data/lib/ontomde-core/log.rb +32 -0
- data/lib/ontomde-core/meta.rb +316 -0
- data/lib/ontomde-core/profil.rb +62 -0
- data/lib/ontomde-core/resource.rb +272 -0
- data/lib/ontomde-core/resourceSet.rb +173 -0
- data/lib/ontomde-core/triplet.rb +161 -0
- data/lib/ontomde-core/version.rb +5 -0
- data/test/protege/demo.sh +2 -0
- data/test/protege/etatCivil.pprj +891 -0
- data/test/protege/etatCivil.rdf +29 -0
- data/test/protege/etatCivil.rdfs +71 -0
- data/test/protege/test_demo.rb +46 -0
- data/test/test_context.rb +88 -0
- data/test/test_ontomde-core.rb +9 -0
- data/test/test_protected.rb +352 -0
- data/test/test_uri.rb +37 -0
- data/test/unit_test_crash.rb +22 -0
- data/test/unit_test_protected_sample +27 -0
- data/test/unit_test_protected_wrongEnd +9 -0
- metadata +106 -0
@@ -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
|
+
|