Here's the program I use to handle most XML requests. I'll try to expand on this later.
Rem XML.PUB.BBJ 10/19/2005
Escape; rem no ::label
EscapeIllegalChars:
Enter V!,text$
text$=java.lang.String.valueOf(text$).replaceAll("<","<")
text$=java.lang.String.valueOf(text$).replaceAll(">",">")
text$=java.lang.String.valueOf(text$).replaceAll("'"," '")
text$=java.lang.String.valueOf(text$).replaceAll(Chr(34),""")
Exit
Init:
Enter V!
V!=new java.util.HashMap()
V!.put("NAME",pgm(-2))
XML$=""
XML$=STBL("ASPConfig.xml",err=*next)
If XML$<>""
ctapi!=new com.ctaa.API()
XML$=java.lang.String.valueOf(XML$).replaceAll(CHR(10),"")
Call PGM(-2)+"::DecodeXML",XML$,document!
V!.put("BBjTmpDir",ctapi!.getNodeValue(document!.getDocumentElement(),"BBjTmpDir"))
V!.put("Excel",ctapi!.getNodeValue(document!.getDocumentElement(),"Excel"))
V!.put("Browser",ctapi!.getNodeValue(document!.getDocumentElement(),"Browser"))
V!.put("WindowsTmpDir",ctapi!.getNodeValue(document!.getDocumentElement(),"WindowsTmpDir"))
V!.put("StyleSheets",ctapi!.getNodeValue(document!.getDocumentElement(),"StyleSheets"))
V!.put("StyleSheetsDirectory",ctapi!.getNodeValue(document!.getDocumentElement(),"StyleSheetsDirectory"))
Else
If info(0,0)="Linux" then
V!.put("BBjTmpDir","/home/groups/tmp/")
V!.put("Excel",CHR(34)+"D:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE"+CHR(34))
V!.put("Browser",CHR(34)+"C:\Program Files\Internet Explorer\iexplore.exe"+chr(34))
Else
V!.put("BBjTmpDir","c:\tmp\")
V!.put("Excel",CHR(34)+"C:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE"+CHR(34))
V!.put("Browser",CHR(34)+"C:\Program Files\Internet Explorer\iexplore.exe"+chr(34))
V!.put("WindowsTmpDir",V!.get("BBjTmpDir"))
V!.put("StyleSheets","c:\asp\asp5\XSL\")
V!.put("StyleSheetsDirectory","c:\asp\asp5\XSL\")
Fi
Fi
Exit
CreateDocument:
Enter V!,document!,stylesheet$
If V!=null()
Call PGM(-2)+"::Init",V!
Fi
dbf!=javax.xml.parsers.DocumentBuilderFactory.newInstance()
builder!=dbf!.newDocumentBuilder()
document! = builder!.newDocument()
If stylesheet$<>"" then
document!.appendChild(document!.createProcessingInstruction("xml-stylesheet","type="+chr(34)+"text/xsl"+chr(34)+" href="+chr(34)+V!.get("StyleSheets")+stylesheet$+".xsl"+Chr(34)))
Fi
Exit
CreateXMLFile:
Enter hmXML!,FileName$,ch
If FileName$<>"" then
Erase STBL("TMPDIR")+FileName$,err=*next
STRING STBL("TMPDIR")+FileName$,err=*next
ch=unt; Open(ch)STBL("TMPDIR")+FileName$
Fi
Exit
AddElementNode:
Enter V!,document!,ParentNode!,Element$,ChildNode!
Element$=java.lang.String.valueOf(Element$).replaceAll("&","&")
Call V!.get("NAME")+"::EscapeIllegalChars",V!,Element$
Element$=cvs(Element$,3)
E$=java.lang.String.valueOf(Element$).replaceAll(" ","_")
If E$(1,1)<"A" then
E$="_"+E$
Fi
ChildNode! = document!.createElement(E$)
rem Probably not used anywhere: ChildNode!.setAttribute("Display",Element$)
ParentNode!.appendChild(ChildNode!)
Exit
AddTextElement:
Enter V!,document!,ChildNode!,FieldName$,Value$
REM Value$=java.lang.String.valueOf(Value$).replaceAll("&",CHR(177))
REM Call V!.get("NAME")+"::EscapeIllegalChars",V!,Value$
TextElement!=document!.createElement(FieldName$)
ChildNode!.appendChild(TextElement!)
TextElement!.appendChild(document!.createTextNode(new java.lang.String(Value$).trim()))
V!.put("TextElement",TextElement!)
rem CVS(Value$,3)))
Exit
ClassToString:
Enter hmXML!,document!,XML$
Call PGM(-2)+"::Transform",hmXML!,document!,stringWriter!
XML$=stringWriter!.getBuffer().toString()
Exit
Rem Transform is used normally to convert the XML class to string
Transform:
Enter hmXML!,document!,stringWriter!
source! = new javax.xml.transform.dom.DOMSource(document!)
stringwriter! = new java.io.StringWriter()
result! = new javax.xml.transform.stream.StreamResult(stringwriter!)
factory! = javax.xml.transform.TransformerFactory.newInstance()
transformer! = factory!.newTransformer()
transformer!.transform(source!,result!)
rem ? stringWriter!.getBuffer().toString()
Exit
If 1=2 and hmXML!.get("hmParameters")<>null() then
Rem I'm disabling this because this does not do an xsl transform
rem So it shouldn't be needed now, only my oldest reports did the transform in
Rem Excel. If this needs to be reenabled hmParameters must be saved in PrintReport below.
hmParameters!=hmXML!.get("hmParameters")
itParameters!=hmParameters!.entrySet().iterator()
While itParameters!.hasNext()
map!=itParameters!.next()
transformer!.setParameter(map!.getKey(),map!.getValue())
Wend
hmXML!.remove("hmParameters"); rem trash hmParameters, prepare for next job
Fi
TransformXSL:
Enter V!,hmXMLRep!,StyleSheet$,document!,stringWriter!
source! = new javax.xml.transform.dom.DOMSource(document!)
stringwriter! = new java.io.StringWriter()
result! = new javax.xml.transform.stream.StreamResult(stringwriter!)
factory! = javax.xml.transform.TransformerFactory.newInstance()
rem xslt!=new java.io.File(V!.get("StyleSheets")+StyleSheet$) Wouldn't work in ShowXMLReport
xslt!=new java.io.File(V!.get("StyleSheetsDirectory")+StyleSheet$)
ss!=new javax.xml.transform.stream.StreamSource(xslt!)
transformer! = factory!.newTransformer(ss!); rem if this fails try to open xslt!.getPath() before saving XML and seeing how it translates in the IDE
If hmXMLRep!.get("hmParameters")<>null() then
hmParameters!=hmXMLRep!.get("hmParameters")
itParameters!=hmParameters!.entrySet().iterator()
While itParameters!.hasNext()
map!=itParameters!.next()
transformer!.setParameter(map!.getKey(),map!.getValue())
Wend
Fi
transformer!.transform(source!,result!)
rem ? stringWriter!.getBuffer().toString()
Exit
DecodeXML:
Enter XML$,document!
Call PGM(-2)+"::ConvertXMLtoDocument",XML$,d!
document!=d!.getChildNodes()
Exit
ConvertXMLtoDocument:
Enter XML$,document!
sr!=new java.io.StringReader(XML$)
is!=new org.xml.sax.InputSource(sr!)
dbf!=javax.xml.parsers.DocumentBuilderFactory.newInstance()
rem dbf!.setIgnoringElementContentWhitespace(1)
builder!=dbf!.newDocumentBuilder()
document!=builder!.parse(is!)
Exit
DecodeXMLElementNode:
Rem Get the nodelist this way
Rem Call "XML.PUB.BBJ::DecodeXMLElementNode",document!.getElementsByTagName("Item"),bvXML!
Enter nodelist!,bvXML!
bvXML!=BBjAPI().makeVector()
i=0
While nodelist!.getLength()>i
i!=nodelist!.item(i)
i=i+1
Rem Load HashMap
hmRecord!=new java.util.HashMap()
For y=0 to i!.getLength()-1
If i!.item(y).getChildNodes().getLength()=0 then
Value$=""
Else
If i!.item(y).getChildNodes().getLength()=1 then
Value$=i!.item(y).getChildNodes().item(0).getNodeValue()
Else
Escape; rem More than 1 item in childnodes
Fi
Fi
hmRecord!.put(i!.item(y).getTagName(),Value$)
Next y
bvXML!.add(hmRecord!)
Wend
exit
PDF:
Enter hmXML!,hmXMLRep!,document!,stringWriter!
xslt!=new java.io.File(hmXML!.get("StyleSheetsDirectory")+hmXMLRep!.get("StyleSheet"))
rem xml!=new java.io.File("/tmp/SalvageBids.xml")
If hmXMLRep!.get("TempFile")=null()
TempDir!=new java.io.File(STBL("TMPDIR"))
pdf!=java.io.File.createTempFile("XMLReport",".pdf",TempDir!)
Else
Rem use this in calling program if you don't like "XMLReport" name or need a different path
TempFile$=hmXMLRep!.get("TempFile")
If pos("/"=TempFile$)
pdf!=new java.io.File(TempFile$)
Else
pdf!=new java.io.File(stbl("TMPDIR")+TempFile$)
Fi
Fi
d!=new org.apache.fop.apps.Driver()
logger!=new org.apache.avalon.framework.logger.ConsoleLogger()
d!.setLogger(logger!)
org.apache.fop.messaging.MessageHandler.setScreenLogger(logger!)
d!.setRenderer(d!.RENDER_PDF)
out!=new java.io.FileOutputStream(pdf!)
d!.setOutputStream(out!)
factory!=javax.xml.transform.TransformerFactory.newInstance()
ss!=new javax.xml.transform.stream.StreamSource(xslt!)
transformer!=factory!.newTransformer(ss!); rem Check xslt!.getPath() 1st, Mismatched tags, unknown syntax
If hmXML!.get("hmParameters")<>null() then
hmParameters!=hmXML!.get("hmParameters")
itParameters!=hmParameters!.entrySet().iterator()
While itParameters!.hasNext()
map!=itParameters!.next()
transformer!.setParameter(map!.getKey(),map!.getValue())
Wend
hmXML!.remove("hmParameters"); rem trash hmParameters, prepare for next job
Fi
sr!=new java.io.StringReader(stringWriter!.getBuffer().toString())
is!=new javax.xml.transform.stream.StreamSource(sr!)
rem is!=new javax.xml.transform.stream.StreamSource(xml!)
res!=new javax.xml.transform.sax.SAXResult(d!.getContentHandler())
rem transformer!.transform(stringWriter!.getBuffer().toString(),res!)
transformer!.transform(is!,res!)
out!.close()
If hmXMLRep!.get("OpenWith")<>null() then
If hmXMLRep!.get("OpenWith")="Browser" then
CM$=hmXML!.get("Browser")+" "+STBL("CLIENT_TEMP_DIRECTORY")+pdf!.getName()
rs!=BBJAPI().getThinClient().clientExec(cm$)
Fi
Fi
Exit
ShowMSOfficeML:
Enter hmXML!,hmXMLRep!,StyleSheet$,document!,stringWriter!
Call PGM(-2)+"::TransformXSL",hmXML!,hmXMLRep!,StyleSheet$,document!,stringWriter!
TempDir!=new java.io.File(STBL("TMPDIR"))
TempFile!=java.io.File.createTempFile("XMLReport",".xml",TempDir!)
rem escape; rem ? TempFile!.getPath()
fw! = new java.io.FileWriter(TempFile!)
bwr! = new java.io.BufferedWriter(fw!)
bwr!.write(stringWriter!.getBuffer().toString())
bwr!.close()
fw!.close()
If hmXMLRep!.get("OpenWith")="Excel" then
CM$=hmXML!.get("Excel")+" "+STBL("CLIENT_TEMP_DIRECTORY")+TempFile!.getName()
rs!=BBJAPI().getThinClient().clientExec(cm$)
Fi
Exit
ShowXMLReport:
Enter hmXML!,hmXMLRep!,StyleSheet$,document!,stringWriter!
Rem html - Browser or Excel
Call PGM(-2)+"::TransformXSL",hmXML!,hmXMLRep!,StyleSheet$,document!,stringWriter!
TempDir!=new java.io.File(STBL("TMPDIR"))
If hmXMLRep!.get("OpenWith")="Excel" then
ext$=".xls"
Fi
If hmXMLRep!.get("OpenWith")="Browser" then
ext$=".html"
Fi
If hmXMLRep!.get("TempFile")=null()
TempFile!=java.io.File.createTempFile("XMLReport",ext$,TempDir!)
Else
TempFile$=hmXMLRep!.get("TempFile")+ext$
If pos("/"=TempFile$)
TempFile!=new java.io.File(TempFile$)
Else
TempFile!=new java.io.File(stbl("TMPDIR")+TempFile$)
Fi
Fi
fw! = new java.io.FileWriter(TempFile!)
bwr! = new java.io.BufferedWriter(fw!)
bwr!.write(stringWriter!.getBuffer().toString())
bwr!.close()
fw!.close()
If hmXMLRep!.get("OpenWith")="Excel" then
CM$=hmXML!.get("Excel")+" "+stbl("CLIENT_TEMP_DIRECTORY")+TempFile!.getName()
rs!=BBJAPI().getThinClient().clientExec(cm$)
Fi
If hmXMLRep!.get("OpenWith")="Browser" then
CM$=hmXML!.get("Browser")+" "+STBL("CLIENT_TEMP_DIRECTORY")+TempFile!.getName()
rs!=BBJAPI().getThinClient().clientExec(cm$)
Fi
hmXMLRep!.put("TempFile",TempFile!.getName())
exit
PrintReport:
rem Using printerjob
Enter hmXML!,StyleSheet$,document!,stringWriter!,printerJob!
Call hmXML!.get("NAME")+"::Transform",hmXML!,document!,stringWriter!
ch=unt
open(ch)hmXML!.get("StyleSheetsDirectory")+StyleSheet$
read record(ch,siz=100000)XSL$
close(ch)
somexslstring!=XSL$
baXSLContent!=somexslstring!.getBytes("utf-8")
xslis!=new java.io.ByteArrayInputStream(baXSLContent!)
disXSL!=new org.xml.sax.InputSource(xslis!)
xmlis!=new java.io.ByteArrayInputStream(stringWriter!.getBuffer().toString().getBytes())
disXML!=new org.xml.sax.InputSource(xmlis!)
input!=new org.apache.fop.apps.XSLTInputHandler(disXML!,disXSL!)
If hmXML!.get("hmParameters")<>null() then
hmParameters!=hmXML!.get("hmParameters")
itParameters!=hmParameters!.entrySet().iterator()
While itParameters!.hasNext()
map!=itParameters!.next()
input!.setParameter(map!.getKey(),map!.getValue())
Wend
hmXML!.remove("hmParameters"); rem trash hmParameters, prepare for next job
Fi
driver!=new org.apache.fop.apps.Driver()
renderer!=new com.ctaa.PrintRenderer(printerJob!)
printerJob!.setCopies(1)
driver!.setRenderer(renderer!)
input!.run(driver!)
printerJob!.print(); rem If there's a null exception here there's no data.
Exit
0 comments:
Post a Comment