Listing 1: TransferServlet "doGet" Method
public void doGet(HttpServletRequest req
, HttpServletResponse res) throws IOException
{ // -- get the current http session --
HttpSession session=req.getSession(true);

String user=(String)
session.getAttribute("user");

if (user==null)
{ /* -- write error message -- */ }
else
{
// -- display the transfer form
res.setContentType("text/html");
PrintWriter out = res.getWriter();

displayForm(out,user,null);
}
}

Listing 2: TransferServlet "doPost" Method
public void doPost(HttpServletRequest req
, HttpServletResponse res) throws IOException
{
// -- get the current http session --
HttpSession session=req.getSession(true);
String user=(String) session.getAttribute("user");

if (user==null)
{ /* -- write error message -- */ }
else
{
// -- handle the transfer form submission --

res.setContentType("text/html");
PrintWriter out = res.getWriter();

String toEngineer=
req.getParameter("toEngineer");

if (toEngineer==null)
{
displayForm(out,user
,"You must specify an engineer");
}
else
{
out.println("");

out.println("TransferServlet<br> ");

try
{
Context initial = new InitialContext();

TaskManagerHome taskManagerHome =
(TaskManagerHome) PortableRemoteObject
.narrow(initial.lookup("TaskManager")
,TaskManagerHome.class);

TaskManager taskManager=
taskManagerHome.create();

taskManager.transferTasks(user,toEngineer);

out.println("Transfer to "+toEngineer
+" succeeded. ");
}
catch (TransferException ex1)
{
out.println("Transfer to "+toEngineer
+" failed with an application error. ");
}
catch (Exception ex2)
{
out.println("Transfer to "+toEngineer
+" failed with a system error. ");
}

out.println("");
out.println("");
}
}
}

Listing 3: TaskManager Implementation
public class TaskManagerEJB
implements SessionBean
{
public void ejbCreate() throws CreateException
{}

public void transferTasks(String fromEngineer
, String toEngineer) throws TransferException
{
try
{
InitialContext ic = new InitialContext();

DataSource ds = (DataSource)
ic.lookup("java:comp/env/jdbc/LOTONtech");

Connection con = ds.getConnection();
Statement st=con.createStatement();

st.executeQuery(
"UPDATE usertasks SET username='"+toEngineer
+"' WHERE username='"+fromEngineer+"'");

}
catch (Exception e) { /* handle the error */ }
}

public TaskManagerEJB() {}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
public void setSessionContext(SessionContext sc) {}
}

Listing 4: Engineer Entity Bean
public interface Engineer extends javax.ejb.EJBObject
{
public int getTaskCount() throws java.rmi.RemoteException;
public String[] getTasks() throws java.rmi.RemoteException;
public void deleteTasks() throws java.rmi.RemoteException;
public void assignTask(String task, boolean sometimesFail)
throws java.rmi.RemoteException;
public String getKey() throws java.rmi.RemoteException;
}

Listing 5: transferTasks Method with Entity Beans
public void transferTasks
(String fromEngineerID, String toEngineerID)
throws java.rmi.RemoteException
{
try
{
EngineerHome engineerHome= (IEngineerHome)
ctx.lookup( "EngineerHome" );

Engineer fromEngineer=engineerHome
.findByPrimaryKey(fromEngineerID);

Engineer toEngineer=engineerHome
.findByPrimaryKey(toEngineerID);

String[] tasks=fromEngineer
.getTasks();

fromEngineer.deleteTasks();

for (int i=0; i<tasks.length; i++)
{
// Sometimes fail this, to roll back the transaction
toEngineer.assignTask(tasks[i], true);
}
}
catch (Exception e)
{
System.out.println("TaskManager Exception: "+e);
}
}