HUMBOLDT-UNIVERSITÄT ZU BERLIN
COMPUTER SCIENCE DEPARTMENT
Systems Architecture Group

Head: Prof. Dr. Jens-Peter Redlich
Secretary:  Silvia Schoch
Phone: +49(30)2093-41150

 

     

Lab

6

Middleware Platforms

Advanced EJB


Systems Architecture Group

Ablieferungstermin und erreichbare Punktzahl für diese Aufgabe, sowie Voraussetzungen für die Prüfungszulassung entnehmen Sie bitte http://sar.informatik.hu-berlin.de.

Ziel dieses Praktikums ist die Vertiefung Ihrer EJB-Kenntnisse. Auf der einen Seite soll ein komplexes Datenmodell mit Hilfe von Entity-Beans realisiert werden. Des Weiteren wird die Verwendung von Message-Driven-Beans und stateful Session-Bean eingeführt.

Anwendungsfall

In diesem Praktikum soll eine Nutzerverwaltung mit Hilfe von EJB 3.0 realisiert werden. Bestehende Nutzer können sich über die login()-Funktionalität des UserManagers an das System anmelden. Neue Nutzer müssen sich hingegen zunächst einmalig registrieren (register()). Über deregister() kann zudem ein Nutzer wieder aus dem System ausgetragen werden. Des Weiteren stehen eine Reihe von Hilfsfunktionen zur Verfügung (createRole(), ...). Eine Besonderheit weist dieses System auf: schlägt ein login()-Versuch auf Grund eines falschen Passwortes fehl, so ist dieser Fehlversuch zu loggen. Dies soll jedoch asynchron erfolgen. Hierzu ist eine JMS-Nachricht zu erzeugen und an eine Message-Queue zu senden. Nachrichten in der Message-Queue sollen in regelmäßigen Abständen von einem Message-Driven-Bean (LoggerEJB) verarbeitet werden (Erzeugen von Log-Objekten und persistentes Speichern unter Nutzung der EJB-Funktionalität).

Hinweise

  • Verwenden Sie den Applikationsserver JBoss und EJB 3.0.
  • Die Methode "logout" schließt die Sitzung.
  • Der UserManager ist als stateful Session-Bean zu realisieren. Beachten Sie folgende Besonderheit: ein login-Versuch muss scheitern, wenn der Nutzer bereits angemeldet ist. Verwenden Sie den Extended Persistence Context.
  • Das mehrfache registrieren von Nutzern mit gleichem Vor- und Nachnamen muss scheitern. Verwenden Sie container-erzeugte Werte für den Primärschlüssel Id des Nutzers.
  • Beachten Sie die Art und Kardinalität von Beziehungen und das Kaskadieren von Operationen.
  • Das LoggerBean ist ein Message-Driven-Bean. Die Beschreibung der zugehörigen Datenquelle finden Sie standardmäßig in JBOSS_HOME/server/default/deploy/jms/jms-ds.xml.
  • Jeder neu am System registrierte Nutzer bekommt die Rolle "everybody" zugewiesen.
  • Die Hilfsmethode "removeAll" soll alle gespeicherten Objekte des Datenmodells löschen, damit sich Fehler aus einzelnen Unittests nicht fortsetzen.
  • Das Wort "Zoll" im obigen Diagramm bedeutet "in" (Fehler im Visio).

Aufgabe und Bewertung

Begründen Sie die von Ihnen getroffenen Design-Entscheidungen und beschreiben Sie aufgetretene Besonderheiten und Probleme. Benutzen Sie dafür eine HTML-Datei mit dem Namen index.html. Abzugeben sind weiterhin die Quelltexte der Lösung (Java-Sourcen, XML-Files, ect.) und das mitgelieferte Ant-Skript, das die Quellen mit den gängigen Werkzeugen automatisiert übersetzt und im JBoss deployed. Bitte reichen Sie die geforderten Dateien in ein ZIP Archiv gepackt ein.

Für Test und Bewertung kommt wieder die Unit-Test-Bibliothek jUnit (www.junit.org) zum Einsatz. Die geforderte Funktionalität wird anhand von 10 Unit-Tests überprüft, von denen min. 5 (sinnvolle) Tests von Ihnen zu erstellen sind. Mit anderen Worten: sowohl die Qualität Ihrer Applikation, als auch die Ihrer Tests ist maßgeblich für die Bewertung.

package test.de.hu.informatik.sar;

import java.sql.Date;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Vector;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import junit.framework.TestCase;
import junit.framework.TestSuite;
import junit.textui.TestRunner;
import de.hu.informatik.sar.log.Log;
import de.hu.informatik.sar.security.Permission;
import de.hu.informatik.sar.security.Role;
import de.hu.informatik.sar.user.Address;
import de.hu.informatik.sar.user.User;
import de.hu.informatik.sar.user.UserManagerRemote;
import de.hu.informatik.sar.util.ApplicationException;

public class SimpleTest extends TestCase {

  private javax.naming.Context jndiContext;

  private UserManagerRemote userMgr;

  public SimpleTest(String name) {
    super(name);
  }

  protected void setUp() throws NamingException {
    // Setting up..
    jndiContext = getInitialContext();
  }

  protected void tearDown() throws NamingException {
    userMgr = (UserManagerRemote)jndiContext.lookup("UserManagerBean/remote");
    try {
      userMgr.removeAll();
    } catch (Throwable e) {
    }
  }

  public static Context getInitialContext() throws javax.naming.NamingException {
    return new InitialContext();
  }

  public static void main(String[] args) {
    //org.apache.log4j.BasicConfigurator.configure();
    TestRunner.run(new TestSuite(SimpleTest.class));
  }

  public void test1() throws Exception {

    userMgr = (UserManagerRemote)jndiContext.lookup("UserManagerBean/remote");

    Permission perm1 = userMgr.createPermission(1, "Perm1", Boolean.TRUE,
        Boolean.FALSE, Boolean.FALSE);
    Permission perm2 = userMgr.createPermission(2, "Perm2", Boolean.FALSE,
        Boolean.FALSE, Boolean.FALSE);

    Collection<Permission> permissions = new Vector<Permission>();
    permissions.add(perm1);
    permissions.add(perm2);
    userMgr.createRole("myRole", "myDesc", permissions);
    userMgr.removeRole("myRole");
  }

  public void test3() throws Exception {
    userMgr = (UserManagerRemote)jndiContext.lookup("UserManagerBean/remote");
    Address address = new Address("McDrive 1", "FooBar", "MA", 40815);
    Date date = new Date(System.currentTimeMillis());
    User user = new User("John", "Doe", "none", date, true, address, null);
    userMgr.createRole("everybody", "myDesc", null);
    user = userMgr.register(user);

    userMgr.login("John", "Doe", "none");
    userMgr.logout();

    userMgr = (UserManagerRemote)jndiContext.lookup("UserManagerBean/remote");
    try {
      userMgr.login("John", "Doe", "password");

      fail("Was able to log in with wrong password");
    } catch (ApplicationException e) {
      // pass...
    }

    userMgr = (UserManagerRemote)jndiContext.lookup("UserManagerBean/remote");
    userMgr.login("John", "Doe", "none");
    userMgr.logout();

    userMgr = (UserManagerRemote)jndiContext.lookup("UserManagerBean/remote");
    try {
      userMgr.logout();
      fail("Was able to log out without beeing logged in");
    } catch (ApplicationException e) {
    }

    userMgr = (UserManagerRemote)jndiContext.lookup("UserManagerBean/remote");
    userMgr.deregister(user);
    userMgr.removeRole("everybody");
  }

  public void test4() throws Exception {
    userMgr = (UserManagerRemote)jndiContext.lookup("UserManagerBean/remote");
    Address address = new Address("McDrive 1", "FooBar", "MA", 40815);
    Date date = new Date(System.currentTimeMillis());
    User user = new User("John", "Doe", "none", date, true, address, null);
    userMgr.createRole("everybody", "myDesc", null);
    user = userMgr.register(user);

    User user2 = userMgr.getUser(user.getId());
    assertNotNull(user2);
    assertEquals(user.getFirstName(), user2.getFirstName());
    assertEquals(user.getLastName(), user2.getLastName());
    assertEquals(user.getPassWord(), user2.getPassWord());
    assertEquals(user.getId(), user2.getId());

    userMgr.login("John", "Doe", "none");
    userMgr.logout();

    userMgr = (UserManagerRemote)jndiContext.lookup("UserManagerBean/remote");
    userMgr.deregister(user);
    userMgr.removeRole("everybody");
  }

  public void test6() throws Exception {
    userMgr = (UserManagerRemote)jndiContext.lookup("UserManagerBean/remote");
    Address address = new Address("McDrive 1", "FooBar", "MA", 40815);
    Date date1 = new Date(0);
    User user1 = new User("John", "Doe", "none", date1, true, address, null);

    Role role1 = userMgr.createRole("everybody", "myDesc", null);
    Role role2 = userMgr.createRole("admin", "myDesc", null);

    user1 = userMgr.register(user1);

    assertTrue(userMgr.isUserInRole(user1, role1));
    assertFalse(userMgr.isUserInRole(user1, role2));

    Collection<Role> coll = userMgr.getRoles(user1);
    Iterator iter = coll.iterator();
    while (iter != null && iter.hasNext()) {
      Role role = (Role) iter.next();
      assertTrue("everybody".equals(role.getName()));
    }

    userMgr.assignRoleToUser(role2, user1);

    assertTrue(userMgr.isUserInRole(user1, role1));
    assertTrue(userMgr.isUserInRole(user1, role2));

    coll = userMgr.getRoles(user1);
    iter = coll.iterator();
    while (iter != null && iter.hasNext()) {
      Role role = (Role) iter.next();
      assertTrue("everybody".equals(role.getName())
          || "admin".equals(role.getName()));
    }

    userMgr.removeRoleFromUser(role1, user1);

    assertFalse(userMgr.isUserInRole(user1, role1));
    assertTrue(userMgr.isUserInRole(user1, role2));

    coll = userMgr.getRoles(user1);
    iter = coll.iterator();
    while (iter != null && iter.hasNext()) {
      Role role = (Role) iter.next();
      assertTrue("admin".equals(role.getName()));
    }

    userMgr.deregister(user1);
    userMgr.removeRole("everybody");
  }

  public void test7() throws Exception {
    userMgr = (UserManagerRemote)jndiContext.lookup("UserManagerBean/remote");
    Address address = new Address("McDrive 1", "FooBar", "MA", 40815);
    Date date1 = new Date(0);
    User user1 = new User("John", "Doe", "none", date1, true, address, null);

    Permission permId1 = userMgr.createPermission(3, "read file", 
        Boolean.TRUE, Boolean.FALSE, Boolean.FALSE);
    Permission permId2 = userMgr.createPermission(4, "read file", 
        Boolean.TRUE, Boolean.FALSE, Boolean.FALSE);
    Permission permId3 = userMgr.createPermission(5, "full access", 
        Boolean.TRUE, Boolean.TRUE, Boolean.TRUE);

    Collection<Permission> collPermIds = new LinkedList<Permission>();
    collPermIds.add(permId1);
    Role roleId1 = userMgr.createRole("everybody", "myDesc", collPermIds);

    collPermIds = new LinkedList<Permission>();
    collPermIds.add(permId2);
    collPermIds.add(permId3);
    Role roleId2 = userMgr.createRole("admin", "myDesc", collPermIds);
    user1 = userMgr.register(user1);

    Collection<Permission> coll = userMgr.getPermissions(user1);
    assertEquals(1, coll.size());
    Iterator iter = coll.iterator();
    while (iter != null && iter.hasNext()) {
      Permission perm = (Permission) iter.next();
      assertEquals("read file", perm.getName());
    }

    userMgr.assignRoleToUser(roleId2, user1);

    coll = userMgr.getPermissions(user1);
    assertEquals(3, coll.size());
    iter = coll.iterator();
    while (iter != null && iter.hasNext()) {
      Permission perm = (Permission) iter.next();
      assertTrue("read file".equals(perm.getName())
          || "full access".equals(perm.getName()));
    }

    userMgr.deregister(user1);
    userMgr.removeRole("everybody"); 
  }
}

Ressourcen


Legal disclaimer. .  © 2024 Humboldt-Universität zu Berlin, Computer Science Department, Systems Architecture Group. Contact: sar@informatik.hu-berlin.de .