Package de.willuhn.jameica.hbci.server

Source Code of de.willuhn.jameica.hbci.server.DBPropertyUtil$HBCITypedProperties

/**********************************************************************
*
* Copyright (c) by Olaf Willuhn
* All rights reserved
*
**********************************************************************/

package de.willuhn.jameica.hbci.server;

import java.rmi.RemoteException;
import java.sql.ResultSet;
import java.sql.SQLException;

import de.willuhn.datasource.rmi.DBIterator;
import de.willuhn.datasource.rmi.DBService;
import de.willuhn.datasource.rmi.ResultSetExtractor;
import de.willuhn.jameica.hbci.Settings;
import de.willuhn.jameica.hbci.rmi.DBProperty;
import de.willuhn.jameica.hbci.rmi.Konto;
import de.willuhn.logging.Logger;
import de.willuhn.util.ApplicationException;
import de.willuhn.util.TypedProperties;

/**
* Hilfsklasse zum Laden und Speichern der Properties.
*/
public class DBPropertyUtil
{
  /**
   * Query-Parameter fuer die BPD fuer "Ueberweisung absenden".
   */
  public final static String BPD_QUERY_UEB = "Params%.UebPar%.ParUeb.%";

  /**
   * Query-Parameter fuer die BPD fuer "Dauerauftrag aendern".
   */
  public final static String BPD_QUERY_DAUER_EDIT = "Params%.DauerEditPar%.ParDauerEdit.%";

  /**
   * Query-Parameter fuer die BPD fuer "SEPA-Dauerauftrag aendern".
   */
  public final static String BPD_QUERY_SEPADAUER_EDIT = "Params%.DauerSEPAEditPar%.ParDauerSEPAEdit.%";

  /**
   * Liefert die BPD fuer das Konto und den angegebenen Suchfilter.
   * @param konto das Konto.
   * @param query Suchfilter.
   * @return Liste der Properties.
   * Die Schluesselnamen sind um alle Prefixe gekuerzt, enthalten also nur noch den
   * eigentlichen Parameternamen wie etwas "maxusage".
   * Die Funktion liefert nie NULL sondern hoechstens leere Properties.
   * @throws RemoteException
   */
  public static TypedProperties getBPD(Konto konto, String query) throws RemoteException
  {
    final TypedProperties props = new HBCITypedProperties();

    // Konto angegeben?
    if (konto == null || query == null || query.length() == 0)
      return props;
   
    // Kundennummer korrekt?
    String kd = konto.getKundennummer();
    if (kd == null || kd.length() == 0 || !kd.trim().matches("[0-9a-zA-Z]{1,30}"))
      return props;

    // Wir haengen noch unseren Prefix vorn dran. Der wurde vom Callback hinzugefuegt
    query = "bpd." + kd.trim() + "." + query;

    // Wir sortieren aufsteigend, da es pro BPD-Set (z.Bsp. in "%UebPar%") mehrere
    // gibt (jeweils pro Segment-Version). HBCI4Java nimmt bei Geschaeftsvorfaellen
    // immer die hoechste verfuegbare Segment-Version. Also machen wir das hier auch
    Settings.getDBService().execute("select name,content from property where name like ? order by name",new String[]{query},new ResultSetExtractor()
    {
      public Object extract(ResultSet rs) throws RemoteException, SQLException
      {
        while (rs.next())
        {
          String name  = rs.getString(1);
          String value = rs.getString(2);

          if (name == null || value == null) continue;
         
          // Wir trimmen noch den Prefix aus dem Namen raus
          name = name.substring(name.lastIndexOf('.')+1);
          props.put(name,value);
        }
        return null;
      }
    });
   
    return props;
  }
 
  /**
   * Speichert ein Property.
   * @param name Name des Property.
   * @param value Wert des Property.
   * @throws RemoteException
   */
  public static void set(String name, String value) throws RemoteException
  {
    DBProperty prop = find(name);
    if (prop == null)
    {
      Logger.warn("parameter name " + name + " invalid");
      return;
    }

    try
    {
      // Kein Wert angegeben
      if (value == null)
      {
        // Wenn er in der DB existiert, loeschen wir ihn gleich ganz
        if (!prop.isNewObject())
          prop.delete();
       
        // auf jeden Fall nichts zu speichern
        return;
      }

      // Ansonsten abspeichern
      prop.setValue(value);
      prop.store();
    }
    catch (ApplicationException ae)
    {
      throw new RemoteException(ae.getMessage(),ae);
    }
  }
 
  /**
   * Liefert den Wert des Parameters.
   * @param name Name des Parameters.
   * @param defaultValue Default-Wert, wenn der Parameter nicht existiert oder keinen Wert hat.
   * @return Wert des Parameters.
   * @throws RemoteException
   */
  public static String get(String name, String defaultValue) throws RemoteException
  {
    DBProperty prop = find(name);
    if (prop == null)
      return defaultValue;
    String value = prop.getValue();
    return value != null ? value : defaultValue;
  }
 
  /**
   * Loescht alle Parameter, deren Namen mit dem angegebenen Prefix beginnt.
   * @param prefix der prefix.
   * @throws RemoteException
   */
  public static void deleteAll(String prefix) throws RemoteException
  {
    if (prefix == null || prefix.length() == 0)
      throw new RemoteException("no parameter prefix given");

    if (prefix.indexOf("%") != -1 || prefix.indexOf("_") != -1)
      throw new RemoteException("no wildcards allowed in parameter prefix");
   
    DBIterator i = Settings.getDBService().createList(DBProperty.class);
    i.addFilter("name like ?",prefix + "%");
    try
    {
      while (i.hasNext())
      {
        DBProperty p = (DBProperty) i.next();
        p.delete();
      }
    }
    catch (ApplicationException ae)
    {
      throw new RemoteException(ae.getMessage(),ae);
    }
  }

  /**
   * Liefert den Parameter mit dem genannten Namen.
   * Wenn er nicht existiert, wird er automatisch angelegt.
   * @param name Name des Parameters. Darf nicht <code>null</code> sein.
   * @return der Parameter oder <code>null</code>, wenn kein Name angegeben wurde.
   * @throws RemoteException
   */
  private static DBProperty find(String name) throws RemoteException
  {
    if (name == null)
      return null;
   
    // Mal schauen, ob wir das Property schon haben
    DBService service = Settings.getDBService();
    DBIterator i = service.createList(DBProperty.class);
    i.addFilter("name = ?",name);
    if (i.hasNext())
      return (DBProperty) i.next();

    // Ne, dann neu anlegen
    DBProperty prop = (DBProperty) service.createObject(DBProperty.class,null);
    prop.setName(name);
    return prop;
  }
 
  /**
   * Ueberschrieben, weil boolsche Werte in den BPD mit "J","N" statt "true","false"
   * gespeichert sind.
   */
  public static class HBCITypedProperties extends TypedProperties
  {
    /**
     * @see de.willuhn.util.TypedProperties#getBoolean(java.lang.String, boolean)
     */
    public boolean getBoolean(String name, boolean defaultValue)
    {
      String s = super.getProperty(name,defaultValue ? "J" : "N");
      return "J".equalsIgnoreCase(s);
    }
  }
}
TOP

Related Classes of de.willuhn.jameica.hbci.server.DBPropertyUtil$HBCITypedProperties

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.