/* $Id: TransactionsToXML.java,v 1.1 2011/05/04 22:37:44 willuhn Exp $
This file is part of HBCI4Java
Copyright (C) 2001-2008 Stefan Palme
HBCI4Java is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
HBCI4Java is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.kapott.hbci.tools;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.kapott.hbci.GV_Result.GVRKUms;
import org.kapott.hbci.GV_Result.GVRKUms.UmsLine;
import org.kapott.hbci.manager.HBCIUtils;
import org.kapott.hbci.structures.Konto;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
// TODO: API-Dok.
public class TransactionsToXML
{
public void createTransactionElements(Document doc, Element troot, List<GVRKUms.UmsLine> transactions)
{
for (Iterator<GVRKUms.UmsLine> i=transactions.iterator(); i.hasNext(); ) {
GVRKUms.UmsLine transaction= i.next();
Element transElem=doc.createElement("transaction");
troot.appendChild(transElem);
Element vdate=doc.createElement("value_date");
vdate.appendChild(doc.createTextNode(HBCIUtils.date2StringISO(transaction.valuta)));
transElem.appendChild(vdate);
Element bdate=doc.createElement("booking_date");
bdate.appendChild(doc.createTextNode(HBCIUtils.date2StringISO(transaction.bdate)));
transElem.appendChild(bdate);
Element amount=doc.createElement("amount");
amount.setAttribute("curr", transaction.value.getCurr());
amount.appendChild(doc.createTextNode(HBCIUtils.bigDecimal2String(transaction.value.getBigDecimalValue())));
transElem.appendChild(amount);
Element saldo=doc.createElement("saldo");
saldo.setAttribute("curr", transaction.saldo.value.getCurr());
saldo.appendChild(doc.createTextNode(HBCIUtils.bigDecimal2String(transaction.saldo.value.getBigDecimalValue())));
transElem.appendChild(saldo);
if (!transaction.gvcode.equals("999")) {
// structured_details
Element structured=doc.createElement("structured_details");
transElem.appendChild(structured);
// participant
Element participant=doc.createElement("participant");
structured.appendChild(participant);
Konto acc=transaction.other;
Element name=doc.createElement("name");
name.appendChild(doc.createTextNode(nullAsEmpty(acc!=null?acc.name:"")));
participant.appendChild(name);
Element name2=doc.createElement("name2");
name2.appendChild(doc.createTextNode(nullAsEmpty(acc!=null?acc.name2:"")));
participant.appendChild(name2);
Element country=doc.createElement("country");
country.appendChild(doc.createTextNode(nullAsEmpty(acc!=null?acc.country:"")));
participant.appendChild(country);
Element blz=doc.createElement("blz");
blz.appendChild(doc.createTextNode(nullAsEmpty(acc!=null?acc.blz:"")));
participant.appendChild(blz);
Element number=doc.createElement("number");
number.appendChild(doc.createTextNode(nullAsEmpty(acc!=null?acc.number:"")));
participant.appendChild(number);
// description
Element descr=doc.createElement("description");
structured.appendChild(descr);
for (Iterator<String> j=transaction.usage.iterator(); j.hasNext(); ) {
Element line=doc.createElement("line");
String usage= j.next();
line.appendChild(doc.createTextNode(nullAsEmpty(usage)));
descr.appendChild(line);
}
} else {
// unstructured_details
Element unstructured=doc.createElement("unstructured_details");
transElem.appendChild(unstructured);
unstructured.appendChild(doc.createTextNode(nullAsEmpty(transaction.additional)));
}
// booking_type
Element btype=doc.createElement("booking_type");
transElem.appendChild(btype);
Element code=doc.createElement("code");
code.appendChild(doc.createTextNode(nullAsEmpty(transaction.gvcode)));
btype.appendChild(code);
Element txt=doc.createElement("text");
String st="";
if (!transaction.gvcode.equals("999")) {
st=nullAsEmpty(transaction.text);
}
txt.appendChild(doc.createTextNode(st));
btype.appendChild(txt);
}
}
public Document createXMLDocument(List<UmsLine> transactions, String rawMT940)
{
// Empfangene Transaktionen als XML-Datei aufbereiten
DocumentBuilderFactory fac=DocumentBuilderFactory.newInstance();
fac.setIgnoringComments(true);
fac.setValidating(false);
// create document
DocumentBuilder builder;
try {
builder=fac.newDocumentBuilder();
} catch (ParserConfigurationException e) {
throw new RuntimeException(e);
}
Document doc=builder.newDocument();
Element root=doc.createElement("account_transactions");
doc.appendChild(root);
// <transactions>
if (transactions!=null) {
Element transElement=doc.createElement("transactions");
root.appendChild(transElement);
createTransactionElements(doc, transElement, transactions);
}
// <raw>
if (rawMT940!=null) {
Element rawElem=doc.createElement("raw");
root.appendChild(rawElem);
try {
String mt940_encoded=HBCIUtils.encodeBase64(rawMT940.getBytes("ISO-8859-1"));
rawElem.appendChild(doc.createCDATASection(mt940_encoded));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
return doc;
}
public void writeXMLString(Document doc, OutputStream out)
{
if (doc==null) {
throw new NullPointerException("document must not be null");
}
if (out==null) {
throw new NullPointerException("output stream must not be null");
}
try {
TransformerFactory transFac=TransformerFactory.newInstance();
Transformer trans=transFac.newTransformer();
trans.setOutputProperty(OutputKeys.METHOD,"xml");
trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,"no");
trans.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
trans.setOutputProperty(OutputKeys.INDENT,"yes");
Source source=new DOMSource(doc);
Result target=new StreamResult(out);
trans.transform(source, target);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private String nullAsEmpty(String st)
{
String ret=st;
if (ret==null) {
ret="";
}
return ret;
}
}