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

4

Middleware Platforms

Simple 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.

Dieses Praktikum stellt den Einstieg in Enterprise JavaBeans dar. Hierbei sollen einfache Konzepte wie Entity- und Session-Beans, Naming geübt werden. Als J2EE-Applikationsserver soll der JBoss in der Version 4.0 (www.jboss.com) zum Einsatz kommen.

Teil 1 - Simple Entity Bean

Gegeben sei folgendes Datenmodell in der Unified Modeling Language (www.uml.org). Dieses soll mit Hilfe von Entity-Beans realisiert werden.

Hinweise

  • Das CustomerEJB soll über ein Remote-Interface verfügen.
  • Das ContactEJB ist lediglich mit einem Lokal-Interface ausgestattet
  • Verwenden Sie Data Object (CustomerDO, ContactDO) für den Datenaustausch
  • Verwenden Sie Container-Managed Persistence
  • Implementieren Sie die Beziehung zwischen Customer und Contact mit Hilfe von CMP 2.x (Achtung Kompositionssemantik!)
  • Als Datenbanksystem ist die im JBoss integrierte Hypersonic SQL zu verwenden und das OR-Mapping vorzunehmen (jbosscmp-jdbc.xml)
  • JNDI (jboss.xml)

Teil 2 – Simple Session Bean

Der Zugriff auf Entity-Beans sollte nicht direkt erfolgen, stattdessen wird der Zugriff mit Hilfe von Session-Beans realisiert (Session-Facade). Implementieren Sie den CustomerAgent als Session-Bean.

Hinweise

  • Das CustomerAgentEJB ist als stateless Session-Bean zu realisieren.

Teil 3 – Test-Client (JUnit)

Für Test und Bewertung kommt die Unit-Test-Bibliothek jUnit (www.junit.org) zum Einsatz. Die geforderte Funktionalität wird anhand von 10 Unit-Tests überprüft, von denen Ihnen vorab die folgenden 5 zur Verfügung stehen:

package test.de.hu.informatik.sar;

import java.util.Date;
import java.util.List;

import javax.naming.*;
import de.hu.informatik.sar.*;
import junit.framework.*;
import junit.textui.TestRunner;

public class SimpleTest extends TestCase {

	private CustomerHomeRemote customerHome;
	private CustomerAgentHomeRemote agentHome;
	
	public SimpleTest(String name) {
		super(name);
	}

	protected void setUp() throws NamingException {
		// Setting up..
		Context jndiContext = getInitialContext();
		Object obj = jndiContext.lookup("CustomerHomeRemote");
		customerHome = (CustomerHomeRemote) javax.rmi.PortableRemoteObject
				.narrow(obj, CustomerHomeRemote.class);
		obj = jndiContext.lookup("CustomerAgentHomeRemote");
		agentHome = (CustomerAgentHomeRemote) javax.rmi.PortableRemoteObject
				.narrow(obj, CustomerAgentHomeRemote.class);
	}

	protected void tearDown() {
		//cleanup
	}
	
	public static Context getInitialContext()
			throws javax.naming.NamingException {
		return new InitialContext();
	}

	public static void main(String[] args) {
		TestRunner.runAndWait(new TestSuite(SimpleTest.class));
	}

	public void test1() throws Exception {
		
		String firstName = "foo";
		String lastName = "bar";
		String phoneNum = "0190666";
		String eMail = "foo@bar";
		
		ContactDO contact = new ContactDO(phoneNum, eMail);
		CustomerDO custDO = new CustomerDO(lastName, firstName, new Date(), true, contact);
		
		CustomerAgentRemote agent = agentHome.create();

		Long primaryKey = new Long(1);
		agent.createCustomer(primaryKey, custDO);
		
		// fetch customer via session bean
		List custList = agent.listCustomers();
		
		assertTrue(custList.size() == 1);
		
		CustomerDO tmp_cust = (CustomerDO)custList.get(0);
		assertTrue(tmp_cust.getFirstName().equals(firstName));
		assertTrue(tmp_cust.getLastName().equals(lastName));

		// remove customer to clean up
		boolean flag = agent.removeCustomer(primaryKey);
		
		assertTrue(flag);
	}	
	
	public void test2() throws Exception {
		
		String firstName = "foo";
		String lastName = "bar";
		String phoneNum = "0190666";
		String eMail = "foo@bar";
		
		// create a customer
		Long primaryKey = new Long(1);
		CustomerRemote customer = customerHome.create(primaryKey);

		CustomerDO custDO = new CustomerDO(lastName, firstName, new Date(), true);
		customer.setCustomer(custDO);
		
		// creating ContactDO data object..
		ContactDO contact = new ContactDO(phoneNum, eMail);

		// set address in customer bean
		// setting Contact in Customer 1...
		customer.setContact(contact);

		// acquiring contact data object from customer 1...
		contact = customer.getContact();

		// customer 1 contact data
		assertTrue(contact.getPhoneNumber().equals(phoneNum));
		assertTrue(contact.getEmail().equals(eMail));
		
		// remove customer to clean up
		customer.remove();		
	}
	
	public void test3() throws Exception {
		
		String firstName = "gab";
		String lastName = "knight";
		
		// create a customer
		Long primaryKey = new Long(1);
		CustomerRemote customer = customerHome.create(primaryKey);

		CustomerDO custDO = new CustomerDO(lastName, firstName, new Date(), true);
		customer.setCustomer(custDO);
		
		CustomerAgentRemote agent = agentHome.create();
		
		// fetch customer via session bean
		List custList = agent.listCustomers();
		
		assertTrue(custList.size() == 1);
		
		CustomerDO tmp_cust = (CustomerDO)custList.get(0);
		assertTrue(tmp_cust.getFirstName().equals(firstName));
		assertTrue(tmp_cust.getLastName().equals(lastName));
		
		// remove customer to clean up
		customer.remove();		

		custList = agent.listCustomers();
		assertTrue(custList.size() == 0);
	}
	
	public void test4() throws Exception {
		
		String firstName = "gab";
		String lastName = "knight";
		String phoneNum = "0190555";
		String eMail = "gab@knight";
		
		// create a customer
		Long primaryKey = new Long(1);
		CustomerRemote customer = customerHome.create(primaryKey);

		ContactDO contDO = new ContactDO(phoneNum, eMail);
		
		CustomerDO custDO = new CustomerDO(lastName, firstName, new Date(), true, contDO);
		customer.setCustomer(custDO);
		
		CustomerAgentRemote agent = agentHome.create();
		
		// fetch customer via session bean
		List contactList = agent.listContacts();
		
		assertTrue(contactList.size() == 1);
		
		// remove customer to clean up
		customer.remove();		

		contactList = agent.listContacts();
		assertTrue(contactList.size() == 0);
	}
	
	public void test5() throws Exception {
		try {
			Context jndiContext = getInitialContext();
			Object obj = jndiContext.lookup("ContactHomeLocal");
			ContactHomeLocal contactHome = (ContactHomeLocal) javax.rmi.PortableRemoteObject
				.narrow(obj, ContactHomeLocal.class);
			fail("Contact bean has no remote interface");
		} catch (Exception e) {}
	}
}

Abgabe 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.

Hinweise

  • Als Build-Tool kommt Ant zum Einsatz.
  • Erweiteren Sie den mitgelieferten Unittest um eigene Tests

Ressourcen


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