xmlutils 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +22 -0
  5. data/README.md +77 -0
  6. data/bin/xmltogdl +88 -0
  7. data/docs/README.txt +20 -0
  8. data/lib/xmlutils/contextlistener.rb +432 -0
  9. data/lib/xmlutils/contextparser.rb +111 -0
  10. data/lib/xmlutils/dumplistener.rb +57 -0
  11. data/lib/xmlutils/gdlcontext.rb +305 -0
  12. data/lib/xmlutils/gdlcontextobjs.rb +286 -0
  13. data/lib/xmlutils/gdldoc.rb +547 -0
  14. data/lib/xmlutils/gdldocbuilder.rb +181 -0
  15. data/lib/xmlutils/gdllistener.rb +265 -0
  16. data/lib/xmlutils/gdltemplate.rb +488 -0
  17. data/lib/xmlutils/lineparser.rb +193 -0
  18. data/lib/xmlutils/listener.rb +459 -0
  19. data/lib/xmlutils/rulelistener.rb +414 -0
  20. data/lib/xmlutils/ruleparser.rb +112 -0
  21. data/lib/xmlutils/varlistener.rb +86 -0
  22. data/lib/xmlutils/version.rb +5 -0
  23. data/lib/xmlutils/xmlrulevisitor.rb +704 -0
  24. data/lib/xmlutils/xmltogdlcontroller.rb +93 -0
  25. data/lib/xmlutils/xmltogdltask.rb +23 -0
  26. data/lib/xmlutils/xmlvisitor.rb +690 -0
  27. data/lib/xmlutils.rb +40 -0
  28. data/rakefile.rb +34 -0
  29. data/unittests/2830.xml +1 -0
  30. data/unittests/chunks.rb +31 -0
  31. data/unittests/curDirTest.rb +2 -0
  32. data/unittests/data/2830-GENERATED.gdl +309 -0
  33. data/unittests/data/2830-GENERATED.xml +1 -0
  34. data/unittests/data/AUGuideline.xml +12 -0
  35. data/unittests/data/AUGuideline.xml.gdl +19190 -0
  36. data/unittests/data/BAKUP.DCTEST1.xml +1 -0
  37. data/unittests/data/DCTEST.xml +1 -0
  38. data/unittests/data/DCTEST1.xml +1 -0
  39. data/unittests/data/DCTEST1.xml.gdl +14890 -0
  40. data/unittests/data/DCTEST1.xml.rename.csv +180 -0
  41. data/unittests/data/DCTEST1wLookups.xml +174 -0
  42. data/unittests/data/DCTEST1wLookups.xml.gdl +127 -0
  43. data/unittests/data/GENERATED.gdl.xml +1 -0
  44. data/unittests/data/Message.xml +1 -0
  45. data/unittests/data/Message.xml.gdl +142 -0
  46. data/unittests/data/Pricing2ndGuideline.xml +1 -0
  47. data/unittests/data/Pricing2ndGuideline.xml.gdl +52670 -0
  48. data/unittests/data/Z-TEMP-Jeff.xml +1 -0
  49. data/unittests/data/Z-TEMP-Jeff.xml.gdl +288 -0
  50. data/unittests/tc_convert_xml_to_gdl.rb +23 -0
  51. data/unittests/ts_allTests.rb +2 -0
  52. data/xmlutils.gemspec +25 -0
  53. metadata +139 -0
@@ -0,0 +1,488 @@
1
+ #
2
+ # File: gdlTemplate.rb
3
+ #
4
+ # This class is used to create the final GDL document
5
+ #
6
+ #
7
+
8
+ require 'xmlutils/gdlcontext'
9
+ require 'xmlutils/gdlcontextobjs'
10
+
11
+
12
+ #################################################
13
+ #
14
+ # class GdlTemplate
15
+ #
16
+ #################################################
17
+ class GdlTemplate
18
+
19
+ attr_accessor :maxWidth
20
+
21
+ def initialize()
22
+ @maxWidth = 75
23
+ end
24
+
25
+
26
+
27
+
28
+ #-------------------------------------------------------------------------------------------------------------#
29
+ # fileHeader - generate file header
30
+ #
31
+ # fname - file name to place on header
32
+ # curDate - a date string
33
+ #
34
+ # returns - File header text
35
+ #
36
+ #------------------------------------------------------------------------------------------------------------#
37
+ def fileHeader(fname, curDate, misc="")
38
+ fname = File.basename(fname, ".gdl")
39
+ header = <<EOF
40
+ /* **************************************************************************
41
+ * File: #{fname}.gdl
42
+ *
43
+ * Guideline source generated #{curDate}
44
+ * #{misc}
45
+ *
46
+ * *************************************************************************/
47
+
48
+
49
+ EOF
50
+
51
+ return header
52
+ end # fileHeader
53
+
54
+
55
+
56
+ #-------------------------------------------------------------------------------------------------------------#
57
+ # sectionComment - generate definition header
58
+ #
59
+ # headerType - Header type (ex: DSM)
60
+ #
61
+ # returns - definition header text
62
+ #
63
+ #------------------------------------------------------------------------------------------------------------#
64
+ def sectionComment(sectionName)
65
+ txt = sectionName.strip
66
+ bar = ""
67
+ # 6: 5 misc chars (// ) plus 1
68
+ width = (@maxWidth - 6 - txt.length) / 2
69
+ width.times do
70
+ bar += "+"
71
+ end
72
+
73
+ header = <<EOF
74
+
75
+
76
+
77
+
78
+ // #{bar} #{txt} #{bar}
79
+
80
+ EOF
81
+
82
+ header
83
+
84
+ end # def sectionComment
85
+
86
+
87
+
88
+
89
+ #-------------------------------------------------------------------------------------------------------------#
90
+ # multiLineComment - generate a multi line comment block
91
+ #
92
+ # comment - comment text
93
+ #
94
+ # returns - multi line comment block
95
+ #
96
+ #------------------------------------------------------------------------------------------------------------#
97
+ def multiLineComment(comment, header = "")
98
+ bar = ""
99
+ hdrBar = ""
100
+
101
+ # 3: 3 misc chars (/* )
102
+ width = (@maxWidth - 3)
103
+
104
+ width.times do
105
+ bar += "*"
106
+ end
107
+
108
+ if (header.length > 0) # Generate a formatted header if it exists.
109
+ hdrWidth = (@maxWidth - 6 - header.length) / 2
110
+
111
+ hdrWidth.times do
112
+ hdrBar += " "
113
+ end # times
114
+ end # if header
115
+
116
+ output = <<EOF
117
+
118
+
119
+
120
+
121
+ /* #{bar}
122
+ #{hdrBar}-- #{header} --#{hdrBar}
123
+
124
+ #{comment}
125
+
126
+ #{bar} */
127
+
128
+
129
+
130
+
131
+ EOF
132
+
133
+ output
134
+
135
+ end # def multiLineComment
136
+
137
+
138
+
139
+
140
+ #-------------------------------------------------------------------------------------------------------------#
141
+ # ppm - generate a PPM definition
142
+ #
143
+ # var - XML element to generate output for
144
+ #
145
+ # @returns GDL output for PPM definition
146
+ #
147
+ #------------------------------------------------------------------------------------------------------------#
148
+ def ppm(dataType, ppmType, varName, varAlias)
149
+ dt = dataType.ljust(12)
150
+ pt = ppmType.ljust(12)
151
+ vn = varName.ljust(48)
152
+ va = varAlias
153
+ out = <<EOF
154
+ ppm #{dt}#{pt}#{vn}"#{va}";
155
+ EOF
156
+
157
+ out # Return generated output
158
+ end # ppm
159
+
160
+
161
+ #-------------------------------------------------------------------------------------------------------------#
162
+ # dsm - generate a GDL version of a DSM definition based on DSM XML element
163
+ #
164
+ # var - XML element to generate output for
165
+ #
166
+ # @returns GDL output for DSM definition
167
+ #
168
+ #------------------------------------------------------------------------------------------------------------#
169
+ def dsm(dataType, varName, varAlias)
170
+ dsn = "decision".ljust(16)
171
+ dpm = "dpm".ljust(4)
172
+ dt = dataType.ljust(12)
173
+ vn = varName.ljust(48)
174
+
175
+ out = <<EOF
176
+ #{dsn}#{dpm}#{dt}#{vn}"#{varAlias}";
177
+ EOF
178
+
179
+ out # Return generated output
180
+ end # dsm
181
+
182
+
183
+ #-------------------------------------------------------------------------------------------------------------#
184
+ # dpm - generate a GDL version of a DPM definition based on DPM XML element
185
+ #
186
+ # var - XML element to generate output for
187
+ #
188
+ # @returns GDL output for DPM definition
189
+ #
190
+ #------------------------------------------------------------------------------------------------------------#
191
+ def dpm(dataType, varName, varAlias)
192
+ lead = " ".ljust(16)
193
+ dpm = "dpm".ljust(4)
194
+ dt = dataType.ljust(12)
195
+ vn = varName.ljust(48)
196
+
197
+ out = <<EOF
198
+ #{lead}#{dpm}#{dt}#{vn}"#{varAlias}";
199
+ EOF
200
+
201
+ out # Return generated output
202
+ end # dpm
203
+
204
+
205
+
206
+
207
+ #-------------------------------------------------------------------------------------------------------------#
208
+ # rule - output a rule
209
+ #
210
+ # ofile - output file handle
211
+ #
212
+ #------------------------------------------------------------------------------------------------------------#
213
+ def rule(rule)
214
+
215
+ # Rule output is generated in GdlDoc.visitRule()
216
+ return rule.src
217
+
218
+ end # def rule
219
+
220
+
221
+
222
+
223
+ #-------------------------------------------------------------------------------------------------------------#
224
+ # ruleset - output collected variables to file
225
+ #
226
+ # ofile - output file handle
227
+ #
228
+ #------------------------------------------------------------------------------------------------------------#
229
+ def ruleset(ruleset, ctx)
230
+ rulelist = rulelist(ruleset, ctx)
231
+
232
+ cmtSuffix = ""
233
+ ruleParams = "#{ruleset.execType}" # Build the ruleset parameter list.
234
+
235
+ if (ruleset.type == "PL")
236
+ ruleParams += ", PL"
237
+ cmtSuffix += "(PowerLookup)"
238
+ end # if ruleset.type
239
+
240
+ aliasStmt = "" # Don't create an alias statement if it is not needed.
241
+
242
+ if (ruleset.name != ruleset.alias)
243
+ aliasStmt = <<EOF
244
+ alias(ruleset, #{ruleset.name}, "#{ruleset.alias}");
245
+ EOF
246
+ end # if ruleset.name...
247
+
248
+
249
+ out = <<EOF
250
+ #{aliasStmt}
251
+ /* ==========================================================================
252
+ * #{ruleset.name} #{cmtSuffix}
253
+ *
254
+ *
255
+ */
256
+ ruleset #{ruleset.name}(#{ruleParams})
257
+ #{rulelist}
258
+ end // ruleset #{ruleset.name}(#{ruleParams})
259
+
260
+
261
+
262
+
263
+ EOF
264
+
265
+ return out
266
+
267
+ end # def ruleset
268
+
269
+
270
+
271
+
272
+ #-------------------------------------------------------------------------------------------------------------#
273
+ # rulelist - output ruleset's rule ref list
274
+ #
275
+ # returns ruleset rule list source
276
+ #
277
+ #------------------------------------------------------------------------------------------------------------#
278
+ def rulelist(ruleset, ctx)
279
+
280
+ outlist = ""
281
+
282
+ ruleset.rules.each do |ralias|
283
+ rname = ctx.rules[ralias].name
284
+ outlist += reference("rule", rname)
285
+
286
+ end # rules.each
287
+
288
+ return outlist
289
+
290
+ end # def rulelist
291
+
292
+
293
+
294
+
295
+ #-------------------------------------------------------------------------------------------------------------#
296
+ # reference - output rule/set reference
297
+ #
298
+ # returns rule/set reference source
299
+ #
300
+ #------------------------------------------------------------------------------------------------------------#
301
+ def reference(refType, refName)
302
+
303
+ refout = <<EOF
304
+ #{refType} #{refName}();
305
+ EOF
306
+
307
+ return refout
308
+
309
+ end # def reference
310
+
311
+
312
+
313
+
314
+ #-------------------------------------------------------------------------------------------------------------#
315
+ # cleanMsgText - msg text to clean. Converts double quotes to single quotes.
316
+ #
317
+ # returns cleaned text
318
+ #
319
+ #------------------------------------------------------------------------------------------------------------#
320
+ def cleanMsgText(txt)
321
+ clean = txt.gsub(/["]/,"'")
322
+
323
+ clean
324
+ end # cleanMsgText
325
+
326
+
327
+
328
+
329
+ #-------------------------------------------------------------------------------------------------------------#
330
+ # msg - output a message
331
+ #
332
+ # returns message source
333
+ #
334
+ #------------------------------------------------------------------------------------------------------------#
335
+ def msg(msgObj)
336
+
337
+ raise "Bad argument" if (nil == msgObj)
338
+
339
+ isCondition = false
340
+ isException = false
341
+
342
+ msgTxt = cleanMsgText(msgObj.msg)
343
+ msgTag = "message"
344
+ msgType = ""
345
+ # Determine message type
346
+ case msgObj.type
347
+ when 'Condition'
348
+ isCondition = true
349
+ msgTag = "condition"
350
+
351
+ when 'Exceptions'
352
+ msgType += "exception"
353
+ isException = true
354
+
355
+ when 'Observation'
356
+ msgType += "observation"
357
+
358
+ when 'Findings'
359
+ msgType += "findings"
360
+
361
+ when 'Credit'
362
+ msgType += "credit"
363
+
364
+ end # case msgObj.type
365
+
366
+
367
+ if (isCondition) # Handle condition messages
368
+
369
+ case msgObj.category # Handle condition message category type
370
+ when '1'
371
+ msgType += "asset"
372
+
373
+ when '2'
374
+ msgType += "credit"
375
+
376
+ when '3'
377
+ msgType += "income"
378
+
379
+ when '4'
380
+ msgType += "property"
381
+
382
+ when '5'
383
+ msgType += "purchase"
384
+
385
+ when '6'
386
+ msgType += "title"
387
+
388
+ else
389
+ msgType += " asset"
390
+
391
+ end # case category
392
+
393
+
394
+
395
+ case msgObj.priorTo # Handle condition message priorTo type
396
+ when '1'
397
+ msgType += ", docs"
398
+
399
+ when '2'
400
+ msgType += ", funding"
401
+
402
+ when '3'
403
+ msgType += ", approval"
404
+
405
+ else
406
+ msgType += ", docs"
407
+
408
+ end # case priorTo
409
+
410
+ end # if isCondition
411
+
412
+
413
+
414
+
415
+ msgout = <<EOF
416
+ #{msgTag}(#{msgType}, "#{msgTxt}");
417
+ EOF
418
+
419
+ return msgout
420
+
421
+ end # def msg
422
+
423
+
424
+
425
+
426
+ #-------------------------------------------------------------------------------------------------------------#
427
+ # guideline - output collected variables to file
428
+ #
429
+ # ofile - output file handle
430
+ #
431
+ #------------------------------------------------------------------------------------------------------------#
432
+ def guideline(ctx)
433
+ gdlout = ""
434
+ reflist = ""
435
+ return gdlout if( ctx.guideline.nil? )
436
+
437
+ if( ! ctx.guideline.items.nil? )
438
+ ctx.guideline.items.each do |item|
439
+ rname = "UNKNOWN"
440
+ if (item[0] == 'rule')
441
+ rname = ctx.rules[item[1]].name
442
+ elsif (item[0] == 'ruleset')
443
+ rname = ctx.rulesets[item[1]].name
444
+ end # if item
445
+
446
+ reflist += reference(item[0], rname)
447
+
448
+ end # items.each
449
+ end
450
+
451
+ gdlout = <<EOF
452
+ /* ==========================================================================
453
+ * #{ctx.guideline.name}
454
+ *
455
+ * ID: #{ctx.guideline.id}
456
+ * Version: #{ctx.guideline.version}
457
+ * Start Date: #{ctx.guideline.startDate}
458
+ *
459
+ */
460
+ guideline("#{ctx.guideline.name}")
461
+
462
+ #{reflist}
463
+
464
+ end // guideline #{ctx.guideline.name}
465
+ EOF
466
+
467
+ return gdlout
468
+
469
+ end # def guideline
470
+
471
+
472
+
473
+ #-------------------------------------------------------------------------------------------------------------#
474
+ # lookup - output lookup reference
475
+ #
476
+ # returns lookup reference source
477
+ #
478
+ #------------------------------------------------------------------------------------------------------------#
479
+ def lookup(lkupName, xParamName, yParamName)
480
+
481
+
482
+ refout = 'lookup("' + "#{lkupName}" + '", ' + "#{xParamName}, #{yParamName})"
483
+
484
+ return refout
485
+
486
+ end # def lookup
487
+ end # class GdlTemplate
488
+
@@ -0,0 +1,193 @@
1
+ #
2
+ # File: lineParser.rb
3
+ #
4
+ # This class is used to import GDL variable definitions.
5
+ #
6
+ #
7
+
8
+ require 'xmlutils/gdlcontextobjs'
9
+
10
+ class LineParser
11
+
12
+ attr_accessor :ppms
13
+ attr_accessor :dpms
14
+ attr_accessor :dsms
15
+
16
+
17
+ def initialize()
18
+ @ppms = Hash.new
19
+ @dpms = Hash.new
20
+ @dsms = Hash.new
21
+
22
+ end # initialize
23
+
24
+
25
+ def dumpResults()
26
+ puts "PPMs parsed: #{ppms.size}"
27
+ puts "DPMs parsed: #{dpms.size}"
28
+ puts "DSMs parsed: #{dsms.size}"
29
+
30
+ puts "--== PPMs ==--".center(79)
31
+ puts
32
+ @ppms.each do |key, val|
33
+ puts "[#{key}] #{val.name}"
34
+ # puts "[ #{key} ] #{val.inspect}"
35
+ #puts "\t\t#{val.inspect}"
36
+ end # do
37
+ puts
38
+ puts
39
+
40
+ puts "--== DPMs ==--".center(79)
41
+ puts
42
+ @dpms.each do |key, val|
43
+ puts "[#{key}] #{val.name}"
44
+ end # do
45
+ puts
46
+ puts
47
+
48
+ puts "--== DSMs ==--".center(79)
49
+ puts
50
+ @dsms.each do |key, val|
51
+ puts "[#{key}] #{val.name}"
52
+ end # do
53
+ puts
54
+ puts
55
+
56
+ end # dumpResults
57
+
58
+
59
+ def getAlias(line)
60
+ outAry = line.scan(/"([^";]*)"/)
61
+ #puts "Get Alias scan result: #{outAry}"
62
+ outp = outAry[0].to_s
63
+ outp.strip!
64
+ #puts "Get Alias final result: #{outp}"
65
+ return outp
66
+ end # getAlias
67
+
68
+
69
+ def parse(filename)
70
+ fh = File.new(filename)
71
+
72
+ fh.readlines.each { |line|
73
+ parseLine(line.chomp!)
74
+ }
75
+
76
+ end # parse
77
+
78
+
79
+ def parseLine(line)
80
+ line.gsub!(/;/, '') # Remove semi-colon terminators
81
+ parts = line.split
82
+ return unless (parts.length > 0)
83
+
84
+ case parts[0]
85
+ when 'ppm'
86
+ parsePpm(line)
87
+
88
+ when 'dpm'
89
+ parseDpm(line)
90
+
91
+ when 'decision'
92
+ parseDsm(line)
93
+
94
+ else
95
+ puts "Skipping line: #{line}" if $DEBUG
96
+ end # case
97
+ end
98
+
99
+ def parsePpm(line)
100
+ varAlias = getAlias(line)
101
+ parts = line.split
102
+
103
+ parts.each {|part| part.strip!}
104
+
105
+ if (parts.length < 5)
106
+ puts "*** Invalid PPM line. Less than 5 items. ***"
107
+ return
108
+ end # if parts
109
+
110
+ attributes = Hash.new
111
+ attributes["DataType"] = parts[1]
112
+ attributes["Type"] = parts[2]
113
+ varName = parts[3]
114
+
115
+ raise "Missing PPM var name: #{attributes}" unless (varName.length > 0)
116
+
117
+ if (nil == varAlias || varAlias.length < 1)
118
+ varAlias = varName
119
+ end
120
+
121
+ attributes["Name"] = varAlias
122
+
123
+ @ppms[varAlias] = Ppm.new(varName, attributes)
124
+
125
+ end
126
+
127
+ def parseDpm(line)
128
+ puts "parse DPM: #{line}" if $DEBUG
129
+ varAlias = getAlias(line)
130
+ parts = line.split
131
+
132
+ parts.each {|part| part.strip!}
133
+
134
+ if (parts.length < 3)
135
+ puts "*** Invalid DPM line. Less than 3 items. ***"
136
+ return
137
+ end # if parts
138
+
139
+ attributes = Hash.new
140
+ attributes["Type"] = "DPM"
141
+ attributes["ProductType"] = parts[1]
142
+ attributes["DataType"] = parts[1]
143
+ varName = parts[2]
144
+
145
+ if (nil == varAlias || varAlias.length < 1)
146
+ varAlias = varName
147
+ end
148
+
149
+ attributes["Name"] = varAlias
150
+
151
+ raise "Missing DPM var name: #{attributes}" unless (varName.length > 0)
152
+
153
+
154
+ #attributes["Type"] = parts[2]
155
+
156
+ @dpms[varAlias] = Dpm.new(varName, attributes)
157
+
158
+ end
159
+
160
+ def parseDsm(line)
161
+ puts "parse DSM: #{line}" if $DEBUG
162
+ varAlias = getAlias(line)
163
+ parts = line.split
164
+
165
+ parts.each {|part| part.strip!}
166
+
167
+ if (parts.length < 4)
168
+ puts "*** Invalid DSM line. Less than 4 items. ***"
169
+ return
170
+ end # if parts
171
+
172
+ attributes = Hash.new
173
+ attributes["Type"] = "DSM"
174
+ attributes["ProductType"] = parts[2]
175
+ attributes["DataType"] = parts[2]
176
+ varName = parts[3]
177
+
178
+ if (nil == varAlias || varAlias.length < 1)
179
+ varAlias = varName
180
+ end
181
+
182
+ attributes["Name"] = varAlias
183
+
184
+
185
+ raise "Missing DSM var name: #{attributes}" unless (varName.length > 0)
186
+
187
+ #attributes["Type"] = parts[2]
188
+
189
+ @dsms[varAlias] = Dpm.new(varName, attributes)
190
+
191
+ end
192
+ end # class LineParser
193
+