Using XML in BBj
0 comments
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
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
Indroduction
0 comments
BBj is probably the greatest opportunity for Business Basic programmers I've ever seen. For years we have programmed away in our little niche, successful because accounting systems can be programmed in Business Basic quicker than in any other language, but, not being buzz-word compliant, unable to break out of our niche.
BBj allows us to use the power of Java, and SQL databases, to reach a world that otherwise would not consider our products.
Lots of cool things here. All of my new files on in mysql. My program DATABASE.PUB.BBJ is set up to figure out whether my file is in bbj or mysql, and act accordingly. I'm also using optimistic field locking, where I compare the field changed to what's on disk before issuing a stop.
I no longer use BBj print objects in my new reports. By seperating the data from the presentation, XML and XSL are much more flexible for reports and forms. I can't emphasize enough how important it is to move your printing to XML. Not only is report development much, much faster, but it is much more flexible. Customising a report for a customer involves changing just a small XSL file. Throwing a report into Excel or a PDF becomes a no-brainer. Or you can throw it into a webservice and let websites and external customers format the XML however they want.
Even more importantly, you can use the XML you generate for one report in other reports. Let's say you have a complex sales analysis report, involving very complex business logic. This very recently happened to me. The report itself took weeks, as it involved calculating business days and complex percentages. Later we decided to put this information into a sales brochure
Since I had done the original report in XML, this was no problem for me. I merely set up a program that called the report program, took that XML and extracted the numbers I needed. These numbers I then put into another XML document which I then transformed using an XSL file using Microsoft's SpreadsheetML syntax. In a few days I had a sales brochure. Not only was this quick, but this ensures that the customer is going to be getting the same figures whether from the report or from the brochure.
Here's the steps for speeding up report development. First, use SQL or something like my Query_BBJ routine in DATABASE.PUB.BBJ so you're not always writing custom file read procedures. Second, make extensive use of java collections using routines such as the one described here in Using "TreeMaps like Print Sort Files". Thirdly, throw the collections into an XML object, and then transform it with an XSL file to obtain the desired output.
BBj allows us to use the power of Java, and SQL databases, to reach a world that otherwise would not consider our products.
Lots of cool things here. All of my new files on in mysql. My program DATABASE.PUB.BBJ is set up to figure out whether my file is in bbj or mysql, and act accordingly. I'm also using optimistic field locking, where I compare the field changed to what's on disk before issuing a stop.
I no longer use BBj print objects in my new reports. By seperating the data from the presentation, XML and XSL are much more flexible for reports and forms. I can't emphasize enough how important it is to move your printing to XML. Not only is report development much, much faster, but it is much more flexible. Customising a report for a customer involves changing just a small XSL file. Throwing a report into Excel or a PDF becomes a no-brainer. Or you can throw it into a webservice and let websites and external customers format the XML however they want.
Even more importantly, you can use the XML you generate for one report in other reports. Let's say you have a complex sales analysis report, involving very complex business logic. This very recently happened to me. The report itself took weeks, as it involved calculating business days and complex percentages. Later we decided to put this information into a sales brochure
Since I had done the original report in XML, this was no problem for me. I merely set up a program that called the report program, took that XML and extracted the numbers I needed. These numbers I then put into another XML document which I then transformed using an XSL file using Microsoft's SpreadsheetML syntax. In a few days I had a sales brochure. Not only was this quick, but this ensures that the customer is going to be getting the same figures whether from the report or from the brochure.
Here's the steps for speeding up report development. First, use SQL or something like my Query_BBJ routine in DATABASE.PUB.BBJ so you're not always writing custom file read procedures. Second, make extensive use of java collections using routines such as the one described here in Using "TreeMaps like Print Sort Files". Thirdly, throw the collections into an XML object, and then transform it with an XSL file to obtain the desired output.
Subscribe to:
Posts (Atom)