/* $Id: XMLTools.java,v 1.2 2005/06/10 18:03:03 kleiner Exp $
This file is part of HBCI4Java
Copyright (C) 2001-2005 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.demo.hbci.server.backend;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
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.structures.Konto;
import org.kapott.hbci.structures.Value;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class XMLTools
{
private DocumentBuilder docBuilder;
private Transformer trans;
public XMLTools()
{
try {
// document builder fr xml dokumente initialisieren
DocumentBuilderFactory fac=DocumentBuilderFactory.newInstance();
fac.setIgnoringComments(true);
fac.setValidating(false);
docBuilder=fac.newDocumentBuilder();
// transformer zum abspeichern von xml dokumenten initialisieren
TransformerFactory tfac=TransformerFactory.newInstance();
trans=tfac.newTransformer();
trans.setOutputProperty("indent","yes");
trans.setOutputProperty("{http://xml.apache.org/xalan}indent-amount","2");
} catch (Exception e) {
throw new RuntimeException(e.getMessage(),e);
}
}
// evtl. nicht vorhandene Datendatei anlegen
public Document getFileContent(File file,String basename)
{
try {
Document doc;
if (!file.exists()) {
doc=docBuilder.newDocument();
doc.appendChild(doc.createElement(basename));
trans.transform(new DOMSource(doc),new StreamResult(file));
} else {
doc=docBuilder.parse(file);
}
return doc;
} catch (Exception e) {
throw new RuntimeException(e.getMessage(),e);
}
}
private Element getChildElement(Element parent,String name)
{
return (Element)parent.getElementsByTagName(name).item(0);
}
private String getElementValue(Element element)
{
Node node=element.getFirstChild();
return node!=null?node.getNodeValue():null;
}
// Ein XML-Element mit Inhalt erzeugen
// <name>value</name>
public Element createElement(Document doc,String name,String value)
{
Element e=doc.createElement(name);
if (value!=null)
e.appendChild(doc.createTextNode(value));
return e;
}
public String readElement(Element elem,String name,String def)
{
String ret=def;
Element child=getChildElement(elem,name);
if (child!=null) {
String st=getElementValue(child);
if (st!=null && st.length()!=0)
ret=st;
}
return ret;
}
// ein Zeitstempelelement erzeugen
public Element createDateTimeElement(Document doc,String name,Date date)
{
return createElement(doc,name,(date!=null)?(new SimpleDateFormat("yyyyMMddHHmmss").format(date)):null);
}
public Date readDateTimeElement(Element elem,String name,Date def)
{
try {
Date ret=def;
String st=readElement(elem,name,null);
if (st!=null)
ret=new SimpleDateFormat("yyyyMMddHHmmss").parse(st);
return ret;
} catch (Exception e) {
throw new RuntimeException(e.getMessage(),e);
}
}
// ein Zeitstempelelement erzeugen
// <timestamp>zeit</timestamp>
public Element createTimestampElement(Document doc)
{
return createDateTimeElement(doc,"timestamp",new Date());
}
// ein konto-element erzeugen
// <name>
// <country>acc.country</country> usw.
public Element createAccountElement(Document doc,String name,Konto acc)
{
Element ret=doc.createElement(name);
if (acc!=null) {
if (acc.country!=null)
ret.appendChild(createElement(doc,"country",acc.country));
if (acc.blz!=null)
ret.appendChild(createElement(doc,"blz",acc.blz));
if (acc.number!=null)
ret.appendChild(createElement(doc,"number",acc.number));
if (acc.name!=null)
ret.appendChild(createElement(doc,"name",acc.name));
if (acc.name2!=null)
ret.appendChild(createElement(doc,"name2",acc.name2));
}
return ret;
}
public Konto readAccountElement(Element elem,String name,Konto def)
{
Konto ret=def;
Element accelem=getChildElement(elem,name);
if (accelem!=null) {
Konto acc=new Konto();
acc.country=readElement(accelem,"country","DE");
acc.blz=readElement(accelem,"blz","");
acc.number=readElement(accelem,"number","");
acc.name=readElement(accelem,"name","");
acc.name2=readElement(accelem,"name2",null);
if (acc.number!=null && acc.blz!=null)
ret=acc;
}
return ret;
}
// ein value-element erzeugen
// <name>
// <value>btg.value</value> usw.
public Element createValueElement(Document doc,String name,Value btg)
{
Element ret=doc.createElement(name);
if (btg!=null) {
ret.appendChild(createElement(doc,"value",Long.toString(Math.round(btg.value*10000))));
ret.appendChild(createElement(doc,"curr",btg.curr));
}
return ret;
}
public Value readValueElement(Element elem,String name,Value def)
{
Value ret=def;
Element elem_value=getChildElement(elem,name);
if (elem_value!=null) {
Value val=new Value();
val.value=Double.parseDouble(readElement(elem_value,"value","0"))/10000.0;
val.curr=readElement(elem_value,"curr",null);
if (val.curr!=null)
ret=val;
}
return ret;
}
// ein string[]-element erzeugen
// <name>
// <value>data[0]</value> usw.
public Element createStringArrayElement(Document doc,String name,String[] data)
{
Element ret=doc.createElement(name);
if (data!=null) {
for (int i=0;i<data.length;i++) {
String st=data[i];
ret.appendChild(createElement(doc,"value",st));
}
}
return ret;
}
public String[] readStringArrayElement(Element elem,String name,String[] def)
{
String[] ret=def;
Element child=getChildElement(elem,name);
if (child!=null) {
ArrayList lines=new ArrayList();
NodeList values=child.getElementsByTagName("value");
int len=values.getLength();
for (int i=0;i<len;i++) {
lines.add(getElementValue((Element)values.item(i)));
}
if (len!=0)
ret=(String[])lines.toArray(new String[0]);
}
return ret;
}
public Element createUmsLineElement(Document doc,String name,GVRKUms.UmsLine line,String id)
{
Element ret=doc.createElement(name);
if (line!=null) {
ret.appendChild(createElement(doc,"id",id));
ret.appendChild(createDateTimeElement(doc,"bdate",line.bdate));
ret.appendChild(createDateTimeElement(doc,"valuta",line.valuta));
ret.appendChild(createAccountElement(doc,"other",line.other));
Value btg=new Value(line.value.value,line.value.curr);
if (line.cd.equals("D"))
btg.value=-btg.value;
ret.appendChild(createValueElement(doc,"value",btg));
ret.appendChild(createValueElement(doc,"charge",line.charge_value));
ret.appendChild(createValueElement(doc,"orig",line.orig_value));
btg=new Value(line.saldo.value.value,line.saldo.value.curr);
if (line.saldo.cd.equals("D"))
btg.value=-btg.value;
ret.appendChild(createValueElement(doc,"saldo",btg));
ret.appendChild(createStringArrayElement(doc,"usage",line.usage));
ret.appendChild(createElement(doc,"primanota",line.primanota));
ret.appendChild(createElement(doc,"gvcode",line.gvcode));
ret.appendChild(createElement(doc,"addkey",line.addkey));
ret.appendChild(createElement(doc,"instref",line.instref));
ret.appendChild(createElement(doc,"customerref",line.customerref));
ret.appendChild(createElement(doc,"additional",line.additional));
}
return ret;
}
public void transform(Document doc,File file)
{
try {
trans.transform(new DOMSource(doc),new StreamResult(file));
} catch (Exception e) {
throw new RuntimeException(e.getMessage(),e);
}
}
public String key2Text(String gvcode)
{
int code=Integer.parseInt(gvcode);
String ret;
// *** mehr gvcodes->text implementieren
switch (code) {
case 1:
ret="Inhaberscheck"; break;
case 2:
ret="Orderscheck"; break;
case 4:
ret="Lastschrift (Abbuchung)"; break;
case 5:
ret="Lastschrift (Einzug)"; break;
case 8:
ret="Dauerauftrag"; break;
case 17:
ret="BZ-berweisung"; break;
case 20:
ret="berweisung"; break;
case 51:
ret="berweisungsgutschrift"; break;
case 52:
ret="Dauerauftragsgutschrift"; break;
case 53:
ret="Lohn/Gehalt/Rentengutschrift"; break;
case 67:
ret="BZ-Gutschrift"; break;
case 71:
ret="Lastschrifteinreichung"; break;
default:
ret=gvcode;
}
return ret;
}
public Document newDoc()
{
return docBuilder.newDocument();
}
}