Server-Side Trigger für Storages

Dokumente für die Entwicklung von und mit JVx.

Server-Side Trigger für Storages

Postby Development@SIB » Sun Jan 23, 2011 1:06 pm

Mit JVx kann die Business Logik sowohl in der Datenbank als auch in der Middle Tier entwickelt werden. Um die Business Logik vollständig in der Middle Tier zu entwickeln, sind sogenannte Server-Side Triggers eine Grundvoraussetzung. Diese funktionieren ähnlich wie die DataBook Events am Client.

Ein Server-Side Trigger wird z.B aufgerufen wenn am Client ein neuer Datensatz eingefügt/geändert/gelöscht wurde.


Anwendungsbeispiel

Wir verwenden am Client ein RemoteDataBook für die Erstellung von Benutzerkonten. Ein Benutzer wird definiert durch Benutzername, Passwort, Vor- und Nachname. Das Passwort muss jedoch verschlüsselt in der Datenbank abgelegt werden.

Wir definieren die Storage:

Code: Select all
public DBStorage getUsers() throws Exception
{
   DBStorage users = (DBStorage)get("users");
   if (users == null)
   {
      users = new DBStorage();
      users.setDBAccess(getDBAccess());
      users.setWritebackTable("USERS");
      users.open();
      
      users.eventBeforeInsert().addListener(this, "doEncryptPwd");
      users.eventBeforeUpdate().addListener(this, "doEncryptPwd");

      put("users", users);
   }
   return users;
}

und den Trigger für Insert und Update:

Code: Select all
public void doEncryptPwd(StorageEvent pEvent) throws Exception
{
   IBean bn = pEvent.getNew();
   
   String sNew = (String)bn.get("PASSWORD");
   String sOld;
   
   IBean bnOld = pEvent.getOld();
   
   if (bnOld != null)
   {
      sOld = (String)bnOld.get("PASSWORD");
   }
   else
   {
      sOld = null;
   }
   
   if (!CommonUtil.equals(sOld, sNew))
   {
      bn.put("PASSWORD", AbstractSecurityManager.getEncryptedPassword(
                         SessionContext.getCurrentSessionConfig(), sNew));
   }
}

In unserem Beispiel verwendeten wir ein IBean um auf die Properties zuzugreifen. Der Event erlaubt auch die Verwendung von POJOs wie in folgendem Beispiel:

Code: Select all
public void doEncryptPwd(StorageEvent pEvent)
{
    ...
    ...
    User user = pEvent.getNew(User.class);     

    user.setPassword(AbstractSecurityManager.getEncryptedPassword(
                     SessionContext.getCurrentSessionConfig(),
                     user.getPassword()));
}


Hinweis

Es kann jedes beliebige POJO verwendet werden. Der implementierte Mechanismus versucht, die Properties über die Spaltenbezeichnungen aus der Datenbank miteinander abzugleichen. In unserem letzten Beispiel könnte auch ein Adress POJO verwendet werden, sofern darin relevante Properties vorhanden sind. Es werden immer nur die möglichen Properties abgeglichen.
User avatar
Development@SIB
 
Posts: 311
Joined: Mon Sep 28, 2009 1:54 pm

Return to Dokumentation