Using XML in BBj

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