/**********************************************************************
*
* Copyright (c) by Olaf Willuhn
* All rights reserved
*
**********************************************************************/
package de.willuhn.jameica.hbci.io;
import java.io.IOException;
import java.io.InputStream;
import java.rmi.RemoteException;
import java.util.Iterator;
import java.util.Map;
import de.willuhn.datasource.GenericObject;
import de.willuhn.datasource.db.AbstractDBObject;
import de.willuhn.datasource.serialize.ObjectFactory;
import de.willuhn.datasource.serialize.Reader;
import de.willuhn.datasource.serialize.XmlReader;
import de.willuhn.jameica.hbci.HBCI;
import de.willuhn.jameica.hbci.Settings;
import de.willuhn.jameica.hbci.gui.dialogs.KontoAuswahlDialog;
import de.willuhn.jameica.hbci.messaging.ImportMessage;
import de.willuhn.jameica.hbci.rmi.Konto;
import de.willuhn.jameica.hbci.rmi.Umsatz;
import de.willuhn.jameica.system.Application;
import de.willuhn.jameica.system.OperationCanceledException;
import de.willuhn.logging.Logger;
import de.willuhn.util.ApplicationException;
import de.willuhn.util.ProgressMonitor;
/**
* XML-Importer fuer Umsaetze.
* BUGZILLA 1149
*/
public class XMLUmsatzImporter extends XMLImporter
{
/**
* @see de.willuhn.jameica.hbci.io.Importer#doImport(java.lang.Object, de.willuhn.jameica.hbci.io.IOFormat, java.io.InputStream, de.willuhn.util.ProgressMonitor)
*/
public void doImport(Object context, IOFormat format, InputStream is, ProgressMonitor monitor) throws RemoteException, ApplicationException
{
if (is == null)
throw new ApplicationException(i18n.tr("Keine zu importierende Datei ausgew�hlt"));
if (format == null)
throw new ApplicationException(i18n.tr("Kein Datei-Format ausgew�hlt"));
final ClassLoader loader = Application.getPluginLoader().getManifest(HBCI.class).getClassLoader();
Reader reader = null;
try
{
reader = new XmlReader(is, new ObjectFactory() {
public GenericObject create(String type, String id, Map values) throws Exception
{
AbstractDBObject object = (AbstractDBObject) Settings.getDBService().createObject(loader.loadClass(type),null);
Iterator i = values.keySet().iterator();
while (i.hasNext())
{
String name = (String) i.next();
object.setAttribute(name,values.get(name));
}
return object;
}
});
if (monitor != null)
monitor.setStatusText(i18n.tr("Lese Datei ein"));
Konto konto = null;
if (context instanceof Konto)
{
konto = (Konto) context;
}
else
{
try
{
// Wir fragen das Konto grundsaetzlich manuell ab. Siehe BUGZILLA 700
KontoAuswahlDialog d = new KontoAuswahlDialog(KontoAuswahlDialog.POSITION_CENTER);
konto = (Konto) d.open();
}
catch (OperationCanceledException oce)
{
Logger.info("import cancelled");
return;
}
}
int created = 0;
int error = 0;
Umsatz umsatz = null;
while ((umsatz = (Umsatz) reader.read()) != null)
{
if (monitor != null)
{
monitor.log(i18n.tr("Datensatz {0}", "" + (created+1)));
if (created > 0 && created % 10 == 0) // nur geschaetzt
monitor.addPercentComplete(1);
}
try
{
if (konto != null)
umsatz.setKonto(konto);
umsatz.store();
created++;
try
{
Application.getMessagingFactory().sendMessage(new ImportMessage(umsatz));
}
catch (Exception ex)
{
Logger.error("error while sending import message",ex);
}
}
catch (ApplicationException ae)
{
monitor.log(" " + ae.getMessage());
error++;
}
catch (Exception e)
{
Logger.error("unable to import line",e);
monitor.log(" " + i18n.tr("Fehler beim Import des Datensatzes: {0}",e.getMessage()));
error++;
}
}
monitor.setStatusText(i18n.tr("{0} Datens�tze erfolgreich importiert, {1} fehlerhafte �bersprungen", new String[]{""+created,""+error}));
monitor.setPercentComplete(100);
}
catch (OperationCanceledException oce)
{
Logger.warn("operation cancelled");
throw new ApplicationException(i18n.tr("Import abgebrochen"));
}
catch (Exception e)
{
Logger.error("error while reading file",e);
throw new ApplicationException(i18n.tr("Fehler beim Import der XML-Datei"));
}
finally
{
if (reader != null)
{
try
{
reader.close();
}
catch (IOException e)
{
Logger.error("error while closing inputstream",e);
}
}
}
}
/**
* @see de.willuhn.jameica.hbci.io.IO#getIOFormats(java.lang.Class)
*/
public IOFormat[] getIOFormats(Class objectType)
{
if (objectType == null)
return null;
if (!Umsatz.class.isAssignableFrom(objectType))
return null; // Nur fuer Umsaetze anbieten - fuer alle anderen tut es die Basis-Implementierung
IOFormat f = new IOFormat() {
public String getName()
{
return i18n.tr("Hibiscus-Format");
}
/**
* @see de.willuhn.jameica.hbci.io.IOFormat#getFileExtensions()
*/
public String[] getFileExtensions()
{
return new String[] {"*.xml"};
}
};
return new IOFormat[] { f };
}
}