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

5

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 und CMR realisiert werden. Des Weiteren wird die Verwendung von Message-Driven-Beans eingeführt.

Anwendungsfall

In diesem Praktikum soll eine Nutzerverwaltung mit Hilfe von EJB 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

  • Die Entitäten des Datenmodells sind mit Hilfe von CMP-Entity-Beans zu realisieren.
  • Die Beziehungen zwischen den Entitäten werden über CMR realisiert.
  • Der UserManager ist als stateful Session-Bean zu realisieren. Beachten Sie folgende Besonderheit: ein login-Versuch muss scheitern, wenn der Nutzer bereits angemeldet ist. Analog ist mit logout zu verfahren.
  • Das LoggerEJB ist ein Message-Driven-Bean
  • Jeder neu am System registrierte Nutzer bekommt die Rolle "everybody" zugewiesen.
  • Klassennamen mit der Endung ...DO sind die zu der Entity gehörenden Data Object Klassen.
  • Ein Klient (und der Unit-Test) soll auf die gespeicherten Daten nur indirekt über den UserManager zugreifen können. Leiten Sie eine Realisierung der entsprechenden Schnittstellen als local und/oder remote ab.

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 (ejb-jar.xml, jboss.xml, jbosscmp-jdbc.xml), 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.rmi.RemoteException;
import java.sql.Date;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Vector;

import javax.ejb.CreateException;
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.security.PermissionDO;
import de.hu.informatik.sar.security.RoleDO;
import de.hu.informatik.sar.user.AddressDO;
import de.hu.informatik.sar.user.UserDO;
import de.hu.informatik.sar.user.UserManagerHomeRemote;
import de.hu.informatik.sar.user.UserManagerRemote;
import de.hu.informatik.sar.util.ApplicationException;

public class SimpleTest extends TestCase {

  private UserManagerHomeRemote userMgrHome;

  private UserManagerRemote userMgr;

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

  protected void setUp() throws NamingException, RemoteException,
      CreateException {
    Context jndiContext = getInitialContext();
    Object obj = jndiContext.lookup("UserManagerHomeRemote");
    userMgrHome = (UserManagerHomeRemote) javax.rmi.PortableRemoteObject
        .narrow(obj, UserManagerHomeRemote.class);
    userMgr = userMgrHome.create();
  }

  protected void tearDown() {
  }

  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 {

    Long perm1 = userMgr.createPermission("Perm1", new Long(2), Boolean.TRUE,
        Boolean.FALSE, Boolean.FALSE);
    Long perm2 = userMgr.createPermission("Perm2", new Long(3), Boolean.FALSE,
        Boolean.FALSE, Boolean.FALSE);

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

  public void test3() throws Exception {
    AddressDO address = new AddressDO("McDrive 1", "FooBar", "MA", 40815);
    Date date = new Date(System.currentTimeMillis());
    UserDO user = new UserDO(1, "John", "Doe", "none", date, true, address,
        null);
    userMgr.createRole("everybody", "myDesc", null);
    Long userId = userMgr.register(user);

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

    try {
      userMgr.login("John", "Doe", "password");

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

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

    try {
      userMgr.logout();
      fail("Was able to log out without beeing logged in");
    } catch (ApplicationException e) {
    }

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

  public void test4() throws Exception {
    AddressDO address = new AddressDO("McDrive 1", "FooBar", "MA", 40815);
    Date date = new Date(System.currentTimeMillis());
    UserDO user = new UserDO(1, "John", "Doe", "none", date, true, address,
        null);
    userMgr.createRole("everybody", "myDesc", null);
    Long userId = userMgr.register(user);

    UserDO user2 = userMgr.getUser(userId);
    assertEquals(user.getFirstName(), user2.getFirstName());
    assertEquals(user.getLastName(), user2.getLastName());
    assertEquals(user.getPassWord(), user2.getPassWord());
    assertEquals(userId.longValue(), user2.getId());

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

    userMgr.deregister(userId);

    userMgr.logout();
    userMgr.removeRole("everybody");
  }


  public void test6() throws Exception {
    AddressDO address = new AddressDO("McDrive 1", "FooBar", "MA", 40815);
    Date date1 = new Date(0);
    UserDO user1 = new UserDO(1, "John", "Doe", "none", date1, true, address,
        null);

    Long roleId1 = userMgr.createRole("everybody", "myDesc", null);
    Long roleId2 = userMgr.createRole("admin", "myDesc", null);

    Long userId1 = userMgr.register(user1);

    assertTrue(userMgr.isUserInRole(userId1, roleId1));
    assertFalse(userMgr.isUserInRole(userId1, roleId2));

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

    userMgr.assignRoleToUser(roleId2, userId1);

    assertTrue(userMgr.isUserInRole(userId1, roleId1));
    assertTrue(userMgr.isUserInRole(userId1, roleId2));

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

    userMgr.removeRoleFromUser(roleId1, userId1);

    assertFalse(userMgr.isUserInRole(userId1, roleId1));
    assertTrue(userMgr.isUserInRole(userId1, roleId2));

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

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

  public void test7() throws Exception {
    AddressDO address = new AddressDO("McDrive 1", "FooBar", "MA", 40815);
    Date date1 = new Date(0);
    UserDO user1 = new UserDO(1, "John", "Doe", "none", date1, true, address,
        null);

    Long permId1 = userMgr.createPermission("read file", new Long(8888),
        Boolean.TRUE, Boolean.FALSE, Boolean.FALSE);
    Long permId2 = userMgr.createPermission("read file", new Long(8888),
        Boolean.TRUE, Boolean.FALSE, Boolean.FALSE);
    Long permId3 = userMgr.createPermission("full access", new Long(8888),
        Boolean.TRUE, Boolean.TRUE, Boolean.TRUE);

    Collection collPermIds = new LinkedList();
    collPermIds.add(permId1);
    Long roleId1 = userMgr.createRole("everybody", "myDesc", collPermIds);

    collPermIds = new LinkedList();
    collPermIds.add(permId2);
    collPermIds.add(permId3);
    Long roleId2 = userMgr.createRole("admin", "myDesc", collPermIds);
    Long userId1 = userMgr.register(user1);

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

    userMgr.assignRoleToUser(roleId2, userId1);

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

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

Ressourcen


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