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,53 @@
1
+ # Overrides standard ruby method_missing interceptor.
2
+ # NOTE:
3
+ # This is a workaround for standard method_missing
4
+ # generates very high CPU usage
5
+ # when a significant model is loaded in memory.
6
+ #:include: ../shared/license.rdoc
7
+
8
+
9
+ def method_missing(methId,args=nil)
10
+ msg=respond_to?(:rdf_uri) ? "#{rdf_uri}" : "nil"
11
+ log.error { "method #{methId} not available for object of class #{self.class.name}, (uri=#{msg})(to_s=#{self})" }
12
+
13
+ if msg=="ukb_null"
14
+ log.error { <<-END
15
+ ********** INVALID MODEL DETECTED **********
16
+ ********** INVALID MODEL DETECTED **********
17
+ **** An invalid source model was used (an ukb_null was found).
18
+ **** Probable cause is that you are using a RSM modeler, and
19
+ **** one of your model contains an invalid reference somewhere.
20
+ ****
21
+ **** Because RSM does not tell you where this error is located,
22
+ **** you have to use your .nt export file :
23
+ ****
24
+ **** 1) open .nt export file with a text editor.
25
+ **** 2) locate <http://kb#null> string.
26
+ **** 3) locate left member refering to this null element.
27
+ **** 4) This element is the key of RSM invalid element.
28
+ **** 5) Locate this element in RSM and fix it (or delete it).
29
+ **** 6) Re-export your model and check for null uris.
30
+ ****
31
+ ********** INVALID MODEL DETECTED **********
32
+ END
33
+ }
34
+ end
35
+
36
+ log.debug {
37
+ msg=""
38
+ self.methods.sort{|a,b| a<=>b}.each {|m|
39
+ msg="#{msg}, #{m}"
40
+ }
41
+ "Available methods are: #{msg}"
42
+ }
43
+
44
+ #self.included_modules.each { |m|
45
+ # #puts "include #{m}"
46
+ # }
47
+ puts "end of custom method_missing"
48
+ #TODO: l'appel au stock method_missing genere des temps de traitements infinis. (cpu a 100%, conso memoire enorme)
49
+ #super
50
+ puts "exiting"
51
+ throw NoMethodError.new("method missing '#{methId}' for object '#{self.class.name}'",methId,args)
52
+ #exit
53
+ end
@@ -0,0 +1,20 @@
1
+ class Delayed2
2
+ def initialize(&b)
3
+ @b=b
4
+ end
5
+ def to_s
6
+ return @b.call
7
+ end
8
+ end
9
+
10
+ #Example usage:
11
+ #i=45
12
+ #c=mtk_delay { i + 5 }
13
+ #i=35
14
+ #puts c.to_s
15
+ def mtk_delay (&block)
16
+ return Delayed2.new(&block)
17
+ end
18
+
19
+
20
+
@@ -0,0 +1,32 @@
1
+ module DemoInstaller
2
+ def proceed(target,source,banner)
3
+ options = { }
4
+ options[:target]="#{target}"
5
+ OptionParser.new do |opts|
6
+ opts.banner =banner +<<END
7
+
8
+ Command syntax:
9
+ ----------
10
+ END
11
+ opts.on("-t","--target DIRECTORY","","target directory where demo project will be installed","default: --target #{options[:target]}" ) do |v|
12
+ options[:target] = v
13
+ end
14
+
15
+
16
+ # No argument, shows at tail. This will print an options summary.
17
+ # Try it and see!
18
+ opts.on_tail("-h", "--help", "Show this message") do
19
+ puts opts
20
+ exit
21
+ end
22
+ end.parse!
23
+
24
+ if File.exist?(options[:target])
25
+ puts "WARNING: File already exists (#{options[:target]})"
26
+ puts "WARNING: Copy aborted"
27
+ else
28
+ cp_r("#{source}", options[:target] )
29
+ puts "INFO: Project created in #{options[:target]}"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,28 @@
1
+ # Core exceptions class
2
+ #:include: ../shared/license.rdoc
3
+
4
+ # Generic use exception.
5
+ class Warning < RuntimeError
6
+ def initialize()
7
+ end
8
+ end
9
+
10
+ # Exception raised when an URI is not found in current model.
11
+ class WarningURIundefined < RuntimeError
12
+ attr_reader :uri
13
+ def initialize(uri)
14
+ @uri=uri
15
+ end
16
+ end
17
+
18
+ # Exception raised when a ressources claims to be of a type not defined in currently loaded metamodels.
19
+ class WarningRubyTypeUndefined < RuntimeError
20
+ attr_reader :uri,:res
21
+ def initialize(uri,res)
22
+ @res=res
23
+ @uri=uri
24
+ end
25
+ end
26
+
27
+ class WarningUnknownFileType < RuntimeError
28
+ end
@@ -0,0 +1,163 @@
1
+ #:include: ../shared/license.rdoc
2
+
3
+ class NTriple ; end
4
+
5
+ class NTripleFile < NTriple
6
+ attr_reader :line
7
+ def line=(_line)
8
+ @line=_line
9
+ @about_uri=@predicat_uri=@value_uri=@value_litteral=nil
10
+ @split=@line.split(" ",3)
11
+ end
12
+
13
+ def about_uri
14
+ @about_uri=urialias(@split[0]) if !@about_uri
15
+ return @about_uri
16
+ end
17
+ def predicat_uri
18
+ @predicat_uri=urialias(@split[1]) if !@predicat_uri
19
+ return @predicat_uri
20
+ end
21
+ def value_uri
22
+ @value_uri=urialias(@split[2]) if ! @value_uri
23
+ return @value_uri
24
+ end
25
+ def value_litteral
26
+ @value_litteral=@split[2][1,@split[2].length-5] if !@value_literral
27
+ return @value_litteral
28
+ end
29
+
30
+ def valueIsReference?
31
+ case @split[2][0]
32
+ when 60 then return true
33
+ when 34 then return false
34
+ else raise Warning.new,"Bad ntriple detected"
35
+ end
36
+ end
37
+
38
+ COMMENT_SIGNATURE="#"[0]
39
+ def isComment?
40
+ return @line[0]==COMMENT_SIGNATURE
41
+ end
42
+
43
+
44
+ def isOntoMDXHeader?
45
+ return @line.to_s=="#!ontomdx\n"
46
+ end
47
+ end
48
+
49
+ module Mrdf_Model
50
+ def loadMetaModelFromFile(fileName,ignoreHeader=false)
51
+ @updateCount=@updateCount+1
52
+ raise Exception.new("nil fileName passed to loadMetaModelFromFile") if fileName.nil?
53
+ m=fileName+".rb"
54
+ #log.debug "m=#{m}"
55
+ if( File.exists?(m) && File.mtime(m) > File.mtime(fileName) )
56
+ log.debug "Using cache in #{m}"
57
+ require(m)
58
+ loadModelFromFile(fileName,ignoreHeader)
59
+ else
60
+ log.debug "Generating cache in #{m}"
61
+ loadModelFromFile(fileName,ignoreHeader)
62
+ self.generateClassesFromMetamodel(m)
63
+ end
64
+ end
65
+
66
+ def loadModelFromFile (srcFileName,ignoreHeader=false)
67
+ fileName=translateToNt(srcFileName)
68
+ @updateCount=@updateCount+1
69
+ #Crdf_Resource.new(self,"xx").initUpdate
70
+ [false,true].each { |modeData|
71
+ begin
72
+ File.open(fileName,"r") { |aFile|
73
+ parseModelStream(aFile,modeData,ignoreHeader)
74
+ }
75
+ rescue Exception => e
76
+ raise Exception.new(e.message+"ERROR *** current file is: \"#{fileName}\"\nERROR ***\n")
77
+ end
78
+ }
79
+ end
80
+
81
+ def parseModelStream(stream,modeData,ignoreHeader=false)
82
+ aFile=stream
83
+ i=0
84
+ nt=NTripleFile.new()
85
+ aFile.each_line {
86
+ |nt.line|
87
+ begin
88
+ i=i+1
89
+
90
+ if(!ignoreHeader)
91
+ ignoreHeader=true
92
+ next if nt.isOntoMDXHeader?
93
+ p="\nERROR *** "
94
+ raise Exception.new("#{p}#{p}ontomdx was given a model file without#{p}a valid ontomdx plugin file header.#{p}If you have used a model file created by a modeler plugin,#{p}upgrade your plugin.#{p}Il you have used a plain RDF or RDFS file,#{p}specify ignoreHeader=true when loading model with loadModel.#{p}\n")
95
+ end
96
+
97
+ next if nt.isComment?
98
+ parse(nt,modeData)
99
+ rescue WarningRubyTypeUndefined => z
100
+ log.error "WARNING ["+(modeData ? "data":"res")+" :nt.line "+i.to_s+", "+z.to_s+", Will create a default type. Possible discrepancies if defined later on. In case of problem, Consider bootstraping]:"+nt.line
101
+ #log.debug "z.res=#{z.res}"
102
+ z.res.createRubyClassMinimal(self)
103
+ i=i-1
104
+ retry
105
+
106
+ rescue WarningURIundefined => z
107
+ log.error "WARNING ["+(modeData ? "data":"res")+" :line "+i.to_s+", "+z.to_s+",Will create a default entry]:"+nt.line
108
+ #log.debug "z.uri=#{z.uri}"
109
+ Crdf_Resource.new(self,z.uri)
110
+ #parse(nt.line,modeData)
111
+ i=i-1
112
+ retry
113
+ rescue Warning => w
114
+ log.error "WARNING ["+(modeData ? "data":"res")+" :line "+i.to_s+", "+w.to_s+"]:"+nt.line
115
+
116
+ end
117
+ }
118
+ end
119
+
120
+ # moved to ontomde-redland-win
121
+ # WIN_PATH_RAPPER=File.expand_path("#{File.dirname(__FILE__)}/../../dist/redland-1.0.3-Win32/rapper.exe").tr('/','\\\\')
122
+
123
+ PLATFORM_IS_UNIX=!(RUBY_PLATFORM.index("inux").nil?)
124
+ def rapperRun(param)
125
+ if PLATFORM_IS_UNIX
126
+ cmd="rapper "+param
127
+ else
128
+ cmd='"'+WIN_PATH_RAPPER+'"'+param
129
+ end
130
+ return if system(cmd)
131
+ raise Exception.new("\n***\n***Error running command\n***\n***#{cmd}\n***\n")
132
+
133
+ end
134
+ def translateToNt(srcFileName)
135
+ return srcFileName if ! (srcFileName=~/.rdfs*$/ )
136
+
137
+ fileName="#{srcFileName}.cache.deleteMe.nt"
138
+ if( File.exists?(fileName) && File.mtime(fileName) > File.mtime(srcFileName) )
139
+ log.debug "INFO:Using cache in #{fileName}"
140
+ else
141
+ raise "Blanc dans nom de fichier non supportes sous windows" if fileName.include?(" ")
142
+ if PLATFORM_IS_UNIX
143
+ param=' -q -o ntriples -i rdfxml '+srcFileName+' > '+fileName
144
+ else
145
+ param=' -q -o ntriples -i rdfxml '+srcFileName.tr('/','\\\\')+' > '+fileName.tr('/','\\\\')+''
146
+ end
147
+ rapperRun(param)
148
+ end
149
+ return fileName
150
+ end
151
+
152
+ def translateToXML(srcFileName,fileName)
153
+ raise "Blanc dans nom de fichier non supportes sous windows" if fileName.include?(" ") || srcFileName.include?(" ")
154
+ if PLATFORM_IS_UNIX
155
+ param=' -q -i ntriples -o rdfxml '+srcFileName+' > '+fileName+''
156
+ else
157
+ param=' -q -i ntriples -o rdfxml '+srcFileName.tr('/','\\\\')+' > '+fileName.tr('/','\\\\')+''
158
+ end
159
+ rapperRun(param)
160
+ return fileName
161
+ end
162
+
163
+ end
@@ -0,0 +1,133 @@
1
+ # File types supported for round trip.
2
+ # Other File types may be added easily.
3
+
4
+ class FileType
5
+ include Singleton
6
+ attr_reader :re_begin, :re_end
7
+ @@types=Hash.new
8
+ def initialize(type)
9
+ #puts "type=#{type}"
10
+ @@types[type]=self
11
+ end
12
+ def writeComment(str,writer)
13
+ raise Warning.new(), "Internal error. Undefined method"
14
+ end
15
+ def beginMarker(str,id)
16
+ raise Warning.new(), "Internal error. Undefined method"
17
+ end
18
+ def endMarker(str,id)
19
+ raise Warning.new(), "Internal error. Undefined method"
20
+ end
21
+ def FileType.getFileType(fileName)
22
+ ext=File.extname(fileName)
23
+ type=@@types[ext]
24
+ return type if ! type.nil?
25
+ msg="Unknown File Type \"#{ext}\" for \"#{fileName}\""
26
+ log.debug(msg)
27
+ raise WarningUnknownFileType.new(),msg
28
+ end
29
+ # escape text to be included in markers
30
+ def escape(txt)
31
+ return txt
32
+ end
33
+ #unescape text to be read from markers
34
+ def unescape(txt)
35
+ return txt
36
+ end
37
+ end
38
+
39
+ class FileTypeJava < FileType
40
+ include Singleton
41
+ def initialize(ext=".java")
42
+ super(ext)
43
+ @re_begin=Regexp.new(/^[ \t]*\/\*[ _]*XMDA[ _]BEGIN[ _]+reverse="(.*)"[ _]uri="(.*)"[ _]*\*\//)
44
+ @re_end=Regexp.new(/^[ \t]*\/\*[ _]*XMDA[ _]END[ _]+uri="(.*)"[ _]*\*\//)
45
+ end
46
+ def writeComment(str,writer)
47
+ writer.write("/* #{str} */")
48
+ end
49
+ def thinLineComment
50
+ #return context[:thinLineComment,true] ? ('_'*60) : ''
51
+ #return "_____________________________________________________________________________________________________________________________________________"
52
+ return ""
53
+ end
54
+ def beginMarker(uri,reverse)
55
+ return %{\n/*XMDA_BEGIN_reverse="#{reverse ? 'yes':'no'}"_#{thinLineComment}uri="#{uri}"_*/\n}
56
+ end
57
+ def endMarker(uri)
58
+ return %{\n/*XMDA_END_#{thinLineComment}uri="#{uri}"_*/\n}
59
+ end
60
+ end
61
+ FileTypeJava.instance # register
62
+
63
+ class FileTypeXML < FileType
64
+ # a character that can not exist in a URI
65
+ URI_ESCAPE_CHAR_ONE='�'
66
+ def initialize(ext=".xml")
67
+ super(ext)
68
+ @re_begin=/^[ \t]*<\!-- *XMDA BEGIN +reverse="([^"]*)" uri="([^"]*)" *-->/
69
+ @re_end=/^[ \t]*<\!-- *XMDA END +uri="([^"]*)" *-->/
70
+ end
71
+ def writeComment(str,writer)
72
+ writer.write("<!-- #{str} -->")
73
+ end
74
+ def beginMarker(uri,reverse)
75
+ return %{\n<!-- XMDA BEGIN reverse="#{reverse ? 'yes':'no'}" uri="#{escape(uri)}" -->\n}
76
+ end
77
+ def endMarker(uri)
78
+ return %{\n<!-- XMDA END uri="#{escape(uri)}" -->\n}
79
+ end
80
+ def escape(txt)
81
+ return txt.tr('-',URI_ESCAPE_CHAR_ONE)
82
+ end
83
+ def unescape(txt)
84
+ return txt.tr(URI_ESCAPE_CHAR_ONE,'-')
85
+ end
86
+ end
87
+ FileTypeXML.instance # register
88
+
89
+
90
+ class FileTypeJavaProperties < FileType
91
+ def initialize(ext=".properties")
92
+ super(ext)
93
+ @re_begin=/^[ \t]*#[_ ]*XMDA_BEGIN_reverse="([^"]*)"_uri="([^"]*)"[ _]*$/
94
+ @re_end=/^[ \t]*#[ _]*XMDA_END_uri="([^"]*)"[ _]*$/
95
+ end
96
+ def writeComment(str,writer)
97
+ writer.write("# #{str} ")
98
+ end
99
+ def beginMarker(uri,reverse)
100
+ return %{\n#_XMDA_BEGIN_reverse="#{reverse ? 'yes':'no'}"_uri="#{uri}"\n}
101
+ end
102
+ def endMarker(uri)
103
+ return %{\n#_XMDA_END_uri="#{uri}"\n}
104
+ end
105
+ end
106
+ FileTypeJavaProperties.instance # register
107
+
108
+
109
+
110
+
111
+ class FileTypeJSP < FileType
112
+ include Singleton
113
+ def initialize(ext=".jsp")
114
+ super(ext)
115
+ @re_begin=Regexp.new(/^[ \t]*<%--*[ _]*XMDA[ _]BEGIN[ _]*reverse="(.*)"[ _]uri="(.*)"[ _]*--%>/)
116
+ @re_end=Regexp.new(/^[ \t]*<%--[ _]*XMDA[ _]END[ _]*uri="(.*)"[ _]*--%>/)
117
+ end
118
+ def writeComment(str,writer)
119
+ writer.write("<%-- #{str} --%>")
120
+ end
121
+ def thinLineComment
122
+ #return context[:thinLineComment,true] ? ('_'*60) : ''
123
+ #return "_____________________________________________________________________________________________________________________________________________"
124
+ return ""
125
+ end
126
+ def beginMarker(uri,reverse)
127
+ return %{\n<%--_XMDA_BEGIN_reverse="#{reverse ? 'yes':'no'}"_#{thinLineComment}uri="#{uri}"_--%>\n}
128
+ end
129
+ def endMarker(uri)
130
+ return %{\n<%--_XMDA_END_#{thinLineComment}uri="#{uri}"_--%>\n}
131
+ end
132
+ end
133
+ FileTypeJSP.instance # register
@@ -0,0 +1,538 @@
1
+ #:include: ../shared/license.rdoc
2
+
3
+ require 'fileutils'
4
+ #require 'ontomde-core/exceptions.rb'
5
+ #require 'ontomde-core/fileTypes.rb'
6
+
7
+ class WarningReverseBadOrMissingEnd < Warning
8
+ end
9
+
10
+ #Internal use.
11
+ class LoadModelLazyWriter
12
+
13
+ #Internal use.
14
+ def initialize (fn,ft)
15
+ @fileName=fn
16
+ @fileType=ft
17
+ @model=nil
18
+ @usedResources=nil
19
+ end
20
+ def fileType
21
+ if @fileType.nil?
22
+ @fileType=FileType.getFileType(@fileName)
23
+ end
24
+ return @fileType
25
+ end
26
+
27
+ #Internal use.
28
+ def protectedMode?
29
+ return !@model.nil?
30
+ end
31
+
32
+ def [](key)
33
+ if @model.nil?
34
+ @model=Crdf_Model.new
35
+ @model.mtk_retrieveProtected(@fileName,fileType)
36
+ end
37
+ if @usedResources.nil?
38
+ @usedResources=Array.new
39
+ end
40
+ ret=@model[key]
41
+ @usedResources << key unless ret.nil?
42
+ return ret
43
+ end
44
+
45
+ def unusedData
46
+ return nil if @model.nil?
47
+ ret=nil
48
+ @model.each { |k,c|
49
+ next if @usedResources.include?(k)
50
+ # c is either a String or a bootstrap element.
51
+ next if c.kind_of?(Mrdf_Resource) && c.ext_isBootstrap?
52
+ ret=Array.new if ret.nil?
53
+ ret << k
54
+ }
55
+ return ret
56
+ end
57
+
58
+ end
59
+ module Mmtk_helper
60
+
61
+ end
62
+
63
+ module Mrdf_Resource
64
+ include Mmtk_helper
65
+ end
66
+
67
+ class Crdf_Model
68
+ include Mmtk_helper
69
+ end
70
+ class Crdf_Resource
71
+ include Mmtk_helper
72
+ end
73
+
74
+ module Mrdf_Model
75
+ include Mmtk_helper
76
+ end
77
+ module Mmtk_helper
78
+ # Internal use.
79
+ #
80
+ # Used primarily by mtk server
81
+ def mtk_stringWriteSession()
82
+ fileName=context.get(:mtk_filename)
83
+ fileName='string-file' if fileName.nil?
84
+ file=StringOutputStream.new
85
+
86
+ ret=nil
87
+ mtk_context(:mtk_out=>file,:mtk_fileName=>fileName) {
88
+ @@mtk_out=context[:mtk_out] # perf
89
+ yield
90
+ ret=@@mtk_out.to_s
91
+ }
92
+ @@mtk_out=context.get(:mtk_out) # perf
93
+ return ret
94
+ end
95
+
96
+ #mtk_writeSession temporary file suffix.
97
+ TEMP_FILE_SUFFIX=".xmda_toolkit_temporary"
98
+
99
+ @@max_file_logged=30
100
+
101
+ #le fichier fileName a ete genere pour la resource res
102
+ attr_reader :fileGenerated
103
+ #@fileGenerated=Array.new
104
+ def notifyFileGenerated(fileName,res)
105
+ #@fileGenerated << [ fileName , res ]
106
+ end
107
+
108
+ #Opens a file for writing.
109
+ #Note:
110
+ # Existing file is deleted
111
+ # Directory are automatically created
112
+ # Write is atomic. In case of failure existing file is not affected.
113
+ # The name of the current file is available in context: context[:mtk_fileName]
114
+ #
115
+ # if context[:dryRun] is true, file writes will be skipped.
116
+ # Note that reverse (file read) **will** be performed however.
117
+ #Example:
118
+ #mtk_writeSession('file1.java') {
119
+ # write('this goes into file1.java')
120
+ # mtk_writeSession('file2.java') {
121
+ # write('this goes into file2.java')
122
+ # puts context[:mtk_fileName]
123
+ # }
124
+ # write('this goes into file1.java')
125
+ # }
126
+ MTK_WRITE_SESSION_FILE_NAMES=Set.new
127
+ def mtk_writeSession(fileName,fileType=nil)
128
+ # Open or create session
129
+ mtk_writeSessionNameClashErrorDetection(fileName.to_s)
130
+
131
+ protectedReverse=LoadModelLazyWriter.new(fileName,fileType)
132
+ FileUtils.mkdir_p(File.dirname(fileName))
133
+ notifyFileGenerated(File.expand_path(fileName),self)
134
+
135
+ doNotOverwrite=mtk_autoNewFileCreationCheck(fileName)
136
+ if context[:dryRun,false]
137
+ file=NullFileWriter.instance
138
+ log.debug { "Simulating Write to #{fileName} (because context[:dryRun]==true)" }
139
+ mtk_context(:mtk_out=>file,:mtk_fileName=>fileName,:protectedReverse=>protectedReverse) {
140
+ @@mtk_out=context[:mtk_out] # perf
141
+ yield
142
+ }
143
+ @@mtk_out=context.get(:mtk_out) # perf
144
+ return
145
+ end
146
+ File.open(fileName+TEMP_FILE_SUFFIX,File::CREAT|File::TRUNC|File::RDWR, 0644) {
147
+ |file|
148
+ mtk_context(:mtk_out=>file,:mtk_fileName=>fileName,:protectedReverse=>protectedReverse) {
149
+ log.debug { "Writing #{fileName}" }
150
+ @@mtk_out=context[:mtk_out] # perf
151
+ yield
152
+ }
153
+ @@mtk_out=context.get(:mtk_out) # perf
154
+ }
155
+ #Le fichier temporaire a bien �t� g�n�r�.
156
+ unusedData=protectedReverse.unusedData
157
+ if(!unusedData.nil?)
158
+ log.info { "warning: saved code appended to #{fileName}.mtk_save" }
159
+ msg=""
160
+ File.open(fileName+".mtk_save",File::CREAT|File::APPEND|File::RDWR, 0644) { |file|
161
+ unusedData.each {|k|
162
+ msg=msg+%{\n ** uri="#{k}"}
163
+ file.write <<END
164
+ //***********************
165
+ //XMDA BEGIN SAVED DATA : uri="#{k}"
166
+ //***********************
167
+ #{protectedReverse[k]}
168
+ //***********************
169
+ //END SAVED DATA
170
+ //***********************
171
+
172
+ END
173
+
174
+ }
175
+ }
176
+ if !context[:allowAutomaticCodeDeletion,false]
177
+ doNotOverwrite=true
178
+ log.error { %{
179
+ ***************************************************************
180
+ Code generation has been *halted* to prevent code loss in
181
+ #{fileName}
182
+
183
+ Code to be deleted is stored in
184
+ #{fileName}.mtk_save
185
+
186
+ You must take the appropriate actions before re-running generator.
187
+ * fix your model for unwanted deletion.
188
+ * manually delete unused code for #{msg}
189
+ * rename
190
+ #{fileName+TEMP_FILE_SUFFIX}
191
+ to
192
+ #{fileName}
193
+ #
194
+ ***************************************************************
195
+ }}
196
+ #exit(1)
197
+ end
198
+
199
+ end
200
+
201
+ puts "Writing: #{fileName}" if context[:logFileWrite,false]
202
+ retryCount=0
203
+ while true
204
+ begin
205
+ # On some windows machine,
206
+ # file is sometimes locked by some management
207
+ # daemon (probably some corporate audit daemon)
208
+ # This cause code generation to fail.
209
+ # This loop gives the daemon a chance to
210
+ # unlock the file.
211
+ # We just wait a few seconds and try again.
212
+ #raise IOException.new(),"KO" if retryCount<2
213
+ File.rename(fileName+TEMP_FILE_SUFFIX,fileName)
214
+ puts "Retry succeeded." if retryCount>0
215
+ break # exit while
216
+ rescue => e
217
+ retryCount=retryCount+1
218
+ #log.warn "#{e}"
219
+ raise e if retryCount > 3
220
+ puts "Rename failed. Retrying (#{retryCount})"
221
+ sleep(2) #
222
+ end
223
+ end
224
+ return nil
225
+ end
226
+
227
+ #checks if fileName already exists
228
+ def mtk_autoNewFileCreationCheck(fileName)
229
+ doNotOverwrite=!context[:autoNewFileCreation,true] && !File.exists?(fileName)
230
+ if doNotOverwrite
231
+ # xmda is not allowed to create new file
232
+ log.error { %{
233
+ ********* NEW FILE DETECTED **********
234
+ ** A new file needs to be added to your project:
235
+ ** "#{fileName}"
236
+ **
237
+ ** Generator has been halted to let
238
+ ** you take proper actions such as:
239
+ **
240
+ ** * Refactor your code if this new file is a renamed file
241
+ ** * Create a blank file and Add this file to version control
242
+ **
243
+ ** Model Element being processed is:
244
+ ** #{mtk_object_message}
245
+ **
246
+ ** Model element being processed is related to:
247
+ ** #{mtk_related_message}
248
+ ********* NEW FILE DETECTED **********
249
+ }}
250
+ #exit(1)
251
+ end
252
+ return doNotOverwrite
253
+ end
254
+
255
+ #detects if fileName has already been used.
256
+ #Logs an error if a clash is detected.
257
+ def mtk_writeSessionNameClashErrorDetection(fileName)
258
+ if(MTK_WRITE_SESSION_FILE_NAMES.include?(fileName.to_s))
259
+ log.error{ %{********* NAME CLASH DETECTED ********** #{fileName}
260
+ ********* NAME CLASH DETECTED **********
261
+ ** This software has detected that a generated file
262
+ ** is being overwritten in the same code generation session.
263
+ ** This most likely is caused by a name clash in the source model.
264
+ **
265
+ ** Filename being overwritten is
266
+ ** "#{fileName}"
267
+ ** Model Element being processed is:
268
+ ** #{mtk_object_message}
269
+ **
270
+ ** Model element being processed is related to:
271
+ ** #{mtk_related_message}
272
+ ********* NAME CLASH DETECTED **********
273
+ }}
274
+ else
275
+ MTK_WRITE_SESSION_FILE_NAMES<< fileName.to_s
276
+ end
277
+ end
278
+
279
+ #writes before string,
280
+ #yield block and then writes after.
281
+ #
282
+ #EXAMPLE.
283
+ # encloseWrite("<title>","</title>") { write "Today news" }
284
+ def encloseWrite(beforeStr,afterStr,&middleBlock)
285
+ write(beforeStr.to_s)
286
+ yield
287
+ write(afterStr.to_s)
288
+ end
289
+
290
+ # Write string to the current file opened by mtk_writeSession.
291
+ def write(str)
292
+ if !@@mtk_out.nil?
293
+ @@mtk_out.write(str)
294
+ return
295
+ end
296
+ raise Warning.new(), <<END
297
+ There is no file currently opened.
298
+ Please use mtk_writeSession prior to using any write method.
299
+ Example:
300
+ # mtk_writeSession('file1.java') {
301
+ # write("Package .... ;")
302
+ # }
303
+ # }
304
+ END
305
+ end
306
+
307
+ # Internal use.
308
+ #
309
+ # Transforms a uri to a uri qualified by the current file name
310
+ def mtk_qualifyBlockURI(_uri)
311
+ return "#{_uri}__#{context[:mtk_fileName]}"
312
+ end
313
+
314
+ #def mtk_fileType
315
+ # fileType=nil
316
+ # puts "fileType1=#{fileType}"
317
+ # fileType=context.get(:mtk_fileType)
318
+ # puts "fileType2=#{fileType}"
319
+ # fileType=FileType.get(fileName) if fileType.nil?
320
+ # puts "fileType3=#{fileType}"
321
+ #
322
+ # #fileType=FileTypeJava.instance
323
+ # return fileType
324
+ #end
325
+
326
+ #
327
+ # Internal use.
328
+ #
329
+ # Reverse the file currently being written by mtk_writeSession.
330
+ # This method is automaticaly called
331
+ def mtk_retrieveProtected(fileName,fileType)
332
+ return false unless File.exists?(fileName)
333
+
334
+ mtk_context(:mtk_fileName=>fileName) {
335
+ File.open(fileName,'r') { |aFile|
336
+ i=0
337
+ reading=false
338
+ block_uri=nil
339
+ buffer=''
340
+ reverseMode=nil
341
+
342
+ aFile.each_line { |line|
343
+ i=i+1
344
+ if !reading
345
+ #return if !line.include?("PROTECTED REGION XMDA BEGIN") # optimisation ?
346
+ m=fileType.re_begin.match(line)
347
+ log.debug {"beg match_ok=#{!m.nil?} line=#{line}"}
348
+ next if m.nil?
349
+ #raise Warning.new,"Error Reading Protected region header\n#{fileName}:line #{i}: #{line}" if m.nil?
350
+ reading=true
351
+ buffer=''
352
+ linesep=''
353
+ block_uri=fileType.unescape(m[2].to_s)
354
+ log.debug { "ma: #{m[0]} block_uri=#{block_uri}" }
355
+ raise Warning.new,'Error Reading Protected region header nil uri' if block_uri.nil?
356
+ case m[1]
357
+ when 'yes' then reverseMode=true
358
+ when 'no' then reverseMode=false
359
+ else raise Warning.new,%{Bad reverseMode value in file #{fileName}. reverse="yes" or reverse="no" expected (got "#{m[1]}" line ##{i}).}
360
+ end
361
+ raise Warning.new,'Error Reading Protected region header nil uri' if reverseMode.nil?
362
+ log.debug { "!!!!!! block_ri=--#{block_uri}--" }
363
+ else
364
+ #log.debug "#{reading} line=#{line}"
365
+ m=fileType.re_end.match(line)
366
+ #log.debug "end match_ok=#{!m.nil?} line=#{line}"
367
+ if m.nil?
368
+ buffer=buffer.nil? ? line : "#{buffer}#{line}"
369
+ next
370
+ end
371
+ block_uri_end=fileType.unescape(m[1].to_s)
372
+ if block_uri_end!=block_uri
373
+ raise WarningReverseBadOrMissingEnd.new, <<ENDERRORMSG
374
+ Bad non matching END tag in #{fileName}
375
+ expected uri="#{block_uri}"
376
+ and got uri="#{block_uri_end}"
377
+ line ##{i})
378
+ ENDERRORMSG
379
+ end
380
+ reading=false
381
+ #log.debug "block_uri=#{block_uri} protected ->xxxxxxx\n#{buffer}xxxxxxxxxx"
382
+ qualified_block_uri=mtk_qualifyBlockURI(block_uri)
383
+ if reverseMode
384
+ self[qualified_block_uri]=buffer[0,buffer.size-1]
385
+ else
386
+ #log.debug "Reverse ignored #{context[:mtk_fileName]}!"
387
+ end
388
+ end
389
+
390
+ }
391
+ }}
392
+ return true # un fichier a ete retro
393
+ end
394
+ end
395
+
396
+ #module Mrdf_Resource
397
+ #end
398
+ module Mmtk_helper #_Resource
399
+ REVERSE=true
400
+ NOREVERSE=false
401
+
402
+ # mtk_protected is used when generated code can be modified by user and preserved by subsequent generation.
403
+ # The code generated in the block passed as parameter will be generated encolosed between identifiable tags.
404
+ #
405
+ # NOTE:
406
+ # The block is identified by the current rdf resource URI.
407
+ # If more than one block is to be generated in one file, zoneId must be used.
408
+ #
409
+ #
410
+ #
411
+ #
412
+ #Example 1: default
413
+ # mtk_writeSession('file1.java') {
414
+ # write("Package .... ;")
415
+ # a.mtk_protected() {
416
+ # write("default code to be redefined by user");
417
+ # }
418
+ # b.mtk_protected() {
419
+ # write("default code to be redefined by user");
420
+ # }
421
+ # }
422
+ #Example 2: initial mode is reverse
423
+ # mtk_writeSession('file1.java') {
424
+ # write("Package .... ;")
425
+ # mtk_protected(REVERSE) {
426
+ # write("default code to be redefined by user");
427
+ # }
428
+ # }
429
+ #Example 3: initial mode is noreverse
430
+ # mtk_writeSession('file1.java') {
431
+ # write("Package .... ;")
432
+ # mtk_protected(NOREVERSE) {
433
+ # write("default code to be redefined by user");
434
+ # }
435
+ # }
436
+ #Example 4: multiple-protected zone for a single object
437
+ # mtk_writeSession('file1.java') {
438
+ # write("Package .... ;")
439
+ # a.mtk_protected(REVERSE,"a") {
440
+ # write("default code to be redefined by user");
441
+ # }
442
+ # a.mtk_protected(REVERSE,"b") {
443
+ # write("default code to be redefined by user");
444
+ # }
445
+ # }
446
+ def mtk_protected(initialReverseMode=false,zoneId='0',&block)
447
+ #mbu=mtk_block_uri
448
+ mbu="#{rdf_uri}__#{zoneId}"
449
+ qualified_uri=rdf_model.mtk_qualifyBlockURI(mbu)
450
+
451
+ fileType=context[:protectedReverse].fileType
452
+ str=context[:protectedReverse][qualified_uri]
453
+
454
+ reverse= (!str.nil?) || initialReverseMode
455
+
456
+ write(fileType.beginMarker(mbu,reverse))
457
+
458
+ if str.nil?
459
+ #log.debug "!!yield block_uri=#{mbu}"
460
+ yield
461
+ else
462
+ write(str)
463
+ end
464
+ write(fileType.endMarker(mbu))
465
+ end
466
+
467
+ #Stream to String Session
468
+ def mtk_stss(&block)
469
+ #@rdf_model.mtk_stringWriteSession(&block)
470
+ mtk_stringWriteSession(&block)
471
+ end
472
+
473
+ #internal method.
474
+ #
475
+ #Returns file descriptor currently used by mtk_writeSession.
476
+ def mtk_out
477
+ return context[:mtk_out]
478
+ end
479
+
480
+ end
481
+
482
+ #Internal use.
483
+ #
484
+ #Used by mtk_stringWriteSession.
485
+ class StringOutputStream
486
+ def initialize
487
+ @str=nil
488
+ end
489
+
490
+ # Internal use.
491
+ #
492
+ # Simulates file open
493
+ def open ; end
494
+
495
+ # Internal use.
496
+ #
497
+ # Simulates file open
498
+ def close ; end
499
+
500
+ # Internal use.
501
+ #
502
+ # Appends str to internal steam buffer
503
+ def write (str)
504
+ #log.debug "Ajout #{str.to_s} !!"
505
+ if @str
506
+ @str="#{@str}#{str.to_s}"
507
+ else
508
+ @str=str.to_s
509
+ end
510
+ end
511
+
512
+ # Internal use.
513
+ # returns the internal stream buffer
514
+ def to_s
515
+ return @str
516
+ end
517
+ end
518
+
519
+
520
+
521
+ module Mcore_Product
522
+ end
523
+
524
+ class Ccore_Product < Crdfs_Class
525
+ include Mcore_Product
526
+ def generate
527
+ end
528
+
529
+ end
530
+
531
+ # a file writer that writes nowhere
532
+ class NullFileWriter
533
+ include Singleton
534
+ def write(str)
535
+ # does nothing !
536
+ end
537
+ end
538
+