xmlutils 0.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.
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
+