*/ public RecordTimeWorkflow createString username throws RemoteException, CreateException; } RecordTimeWorkflowBean.java RecordTimeWorkflowBean.java is the implementation class for the
Trang 1{ /** Answers a reference to the newly created Activity bean */
public RecordTimeWorkflow create(String username) throws RemoteException,
CreateException; }
RecordTimeWorkflowBean.java
RecordTimeWorkflowBean.java is the implementation class for the RecordTimeWork-flow session bean Most of this code should be somewhere between familiar and monotonous, by this point However, there is one new wrinkle, as the ejbCreate method finds a User entity bean based on the username parameter This bean reference
is kept for the duration of the stateful session The RecordTimeWorkflow session bean wraps the data for a timecard into a custom TimecardDTO object
package com.wiley.compBooks.EJwithUML.TimeCardWorkflow;
import com.wiley.compBooks.EJwithUML.Dtos.*;
import com.wiley.compBooks.EJwithUML.TimeCardDomain.*;
import com.wiley.compBooks.EJwithUML.Base.ApplicationExceptions.*; import com.wiley.compBooks.EJwithUML.Base.DateUtil;
import com.wiley.compBooks.EJwithUML.Base.EjbUtil.*;
import java.util.*;
import java.rmi.*;
import javax.ejb.*;
import javax.naming.*;
/**
* The RecordTimeWorkflow allows client objects to record their time
* RecordTimeWorkflowBean is the actual session bean implementation
*/
public class RecordTimeWorkflowBean extends BasicSessionBean {
private UserLocal user;
public void ejbCreate(String username) throws CreateException {
try { System.out.println(“creating RecordTimeWorkflowBean with user -” Æ + username);
Context initialContext = getInitialContext();
UserLocalHome userHome = (UserLocalHome)initialContext.lookup(
EjbReferenceNames Æ USER_HOME);
Collection users = userHome.findByUserName(username);
Trang 2if (userIterator.hasNext()) {
this.user = (UserLocal) userIterator.next();
} System.out.println(“done creating RecordTimeWorkflowBean with user -” +
username);
} catch (NamingException e) {
throw new CreateException(“User Bean Not Found”);
} catch (FinderException e) {
throw new CreateException(“User(“ + username + “) Not Found”);
} }
public void ejbPostCreate(String username) {
}
/** Answers the current timecard If first time, creates one */
public TimecardDTO getCurrentTimecard() throws DataCreateException, FatalApplicationException, RemoteException
{ try { System.out.println(“in getCurrentTimecard().”);
TimecardLocal timecard = user.getCurrentTimecard();
if (timecard == null) {
// creates for the first time timecard = createTimecard(timecard);
} TimecardDTO tcDTO = new TimecardDTO(new Date(timecard.getStartDate()),
new Date(timecard.getEndDate())); Collection timeEntries = timecard.getTimeEntries();
Iterator timeEntryIterator = timeEntries.iterator();
System.out.println(“total entries#” + timeEntries.size());
while(timeEntryIterator.hasNext()) {
TimeEntryLocal timeEntry = (TimeEntryLocal) Æ timeEntryIterator.next();
ChargeCodeLocal chargeCode = (ChargeCodeLocal) Æ timeEntry.getChargeCode();
TimeEntryDTO timeEntryDTO = new TimeEntryDTO(
((TimeEntryPK)timeEntry.getPrimaryKey()).id, chargeCode.getProject().getClient().getName(),
Trang 3timeEntry.getHours(), timeEntry.getDate());
tcDTO.addEntry(timeEntryDTO);
} System.out.println(tcDTO);
return tcDTO;
} catch(InvalidDataException e) {
throw new DataCreateException(Origin.TIMECARD_WORKFLOW, e,
“failed to retrieve current Æ timecard.”);
} }
/** Marks the current timecard as closed and creates a new one */ public void submitTimecard() throws DataCreateException,
FatalApplicationException, RemoteException {
System.out.println(“in submitTimecard().”);
TimecardLocal currentTimecard = user.getCurrentTimecard();
createTimecard(currentTimecard);
}
/** Adds/Updates/modifies the entries of the current timecard */ public void updateTimecard(TimecardDTO tcDTO) throws Æ DataUpdateException,
FatalApplicationException {
try { System.out.println(“in getUpdateTimecard().”);
Context initialContext = getInitialContext();
(TimeEntryLocalHome)initialContext.lookup(
EjbReferenceNames Æ TIME_ENTRY_HOME);
ChargeCodeLocalHome cchome = (ChargeCodeLocalHome) Æ initialContext.lookup(
EjbReferenceNames Æ CHARGECODE_HOME);
Iterator teIterator = tcDTO.getEntries();
System.out.println(“total entries#” + tcDTO.getTotalEntries()); while(teIterator.hasNext())
{ TimeEntryDTO entryDTO = (TimeEntryDTO)teIterator.next();
TimeEntryLocal tentry = null;
ChargeCodeLocal ccode = null;
Collection ccodes = cchome.findByName(entryDTO Æ
Trang 4entryDTO Æ getChargeCodeName());
if (ccodes.size() == 1) {
// we have single hit ccode = (ChargeCodeLocal) ccodes.iterator().next();
} else { //we have multiple hits; we need to narrow it down to 1 Iterator ccIterator = ccodes.iterator();
while(ccIterator.hasNext()) {
ChargeCodeLocal nextCcode = (ChargeCodeLocal) Æ ccIterator.next();
if (nextCcode.getProject().getClient().getName().equals(
entryDTO.getClientName())) {
ccode = nextCcode;
break;
} }
if (ccode == null) {
System.out.println(“could not find the charge code Æ cannot update/create - “
+ entryDTO);
continue;
} }
if (entryDTO.isUpdated()) {
try { tentry = (TimeEntryLocal) tehome.findByPrimaryKey(new
(entryDTO.getId()));
/* makes sure that the entry belongs to the right timecard*/
if (!tentry.getTimecard().getPrimaryKey().equals(
user.getCurrentTimecard().getPrimaryKey())) {
throw new DataUpdateException(Origin.TIMECARD_WORKFLOW,
entryDTO.toString());
} System.out.println(“updating entry-” + entryDTO);
tentry.setDate(entryDTO.getDate());
tentry.setHours(entryDTO.getHours());
tentry.setChargeCode(ccode);
Trang 5catch(FinderException exception) {
throw new DataUpdateException(Origin.TIMECARD_WORKFLOW,
“Marked as an update, but no entry found-” + Æ entryDTO.toString());
} } else if (entryDTO.isNew()) {
// new entry- we need to add it; new entry has partial key; we // need to add the timecard id to it see TimeEntryDTO for // more details
String newId =((TimecardPK)user.getCurrentTimecard Æ ().getPrimaryKey()).id
+ “-” + entryDTO.getId();
System.out.println(“adding a new entry-” + entryDTO);
System.out.println(“actual id=” + newId);
tehome.create(newId,entryDTO.getDate(), entryDTO.getHours(),
ccode, user.getCurrentTimecard());
} } System.out.println(“total entries#” +
getTimeEntries().size());
System.out.println(“done getUpdateTimecard().”);
} catch(NamingException exception) {
// invalid charge code throw new FatalApplicationException(Origin.TIMECARD_WORKFLOW, Æ exception,
“ChargeCode/TimeEntry Bean Not Æ Found”);
} catch(FinderException exception) {
// invalid charge code throw new DataNotFoundException(Origin.TIMECARD_WORKFLOW, exception,
“invalid charge code, failed to update Æ timecard.” );
} catch (CreateException e) {
throw new DataUpdateException(Origin.TIMECARD_WORKFLOW, e,
“Failed to update timecard.”); }
}
Trang 6* Answers a ClientDTO with client related information- projects and
* charge codes
*/
public ClientDTO getClient(String clientName) throws Æ DataNotFoundException,
Æ FatalApplicationException
{ try { System.out.println(“in getClient().”);
Context initialContext = getInitialContext();
ClientLocalHome chome = (ClientLocalHome)initialContext.lookup(
Æ EjbReferenceNames.CLIENT_HOME);
Collection clients = chome.findByName(clientName);
Iterator clientIterator = clients.iterator();
ClientLocal client = null;
if (clientIterator.hasNext()) {
//should be unique; so we only get to look for one
client = (ClientLocal) clientIterator.next();
} ClientDTO cDTO = new ClientDTO(client.getName());
extractClientInfo(client, cDTO);
System.out.println(“done getClient().”);
return cDTO;
} catch (NamingException exception) {
// invalid charge code throw new FatalApplicationException(Origin.TIMECARD_WORKFLOW, Æ exception,
“Client Bean Not Found”);
} catch (FinderException exception) {
throw new DataNotFoundException(Origin.TIMECARD_WORKFLOW, Æ exception,
“client(“ + clientName + “) not found.” );
} }
/**
* Answers a Collection of ClientDTOs with client related
information-* projects and charge codes
*/
public Collection getAllClients() throws DataNotFoundException,
FatalApplicationException, Æ
Trang 7{ try { System.out.println(“in getAllClients().”);
Context initialContext = getInitialContext();
ClientLocalHome chome = (ClientLocalHome)initialContext.lookup(
Æ EjbReferenceNames.CLIENT_HOME);
Collection clients = chome.findAll();
Iterator clientIterator = clients.iterator();
Collection clientDtos = new ArrayList();
ClientLocal client = null;
while(clientIterator.hasNext()) {
client = (ClientLocal) clientIterator.next();
ClientDTO cDTO = new ClientDTO(client.getName());
extractClientInfo(client, cDTO);
clientDtos.add(cDTO);
} System.out.println(“done getAllClients().”);
return clientDtos;
} catch (NamingException exception) {
// invalid charge code throw new FatalApplicationException(Origin.TIMECARD_WORKFLOW, Æ exception,
“Client Bean Not Found”);
} catch (FinderException exception) {
throw new DataNotFoundException(Origin.TIMECARD_WORKFLOW, Æ exception,
“no client found.” );
} }
private void extractClientInfo(ClientLocal client, ClientDTO cDTO) {
System.out.println(“in extractClientInfo().”);
Collection projects = client.getProjects();
Iterator projectIterator = projects.iterator();
while(projectIterator.hasNext()) {
ProjectLocal project = (ProjectLocal) projectIterator.next(); ProjectDTO pDTO = new ProjectDTO(project.getName());
Collection chargeCodes = project.getChargeCodes();
Iterator ccIterator = chargeCodes.iterator();
while(ccIterator.hasNext())
Trang 8ChargeCodeLocal chargeCode = (ChargeCodeLocal) Æ ccIterator.next();
pDTO.addChargeCode(chargeCode.getName());
} cDTO.addProject(pDTO);
System.out.println(“done extractClientInfo().”);
} }
private TimecardLocal createTimecard(TimecardLocal currentTimecard) throws DataCreateException, FatalApplicationException, Æ RemoteException
{ try { System.out.println(“creating a new Timecard.”);
/*
* closes the current timecard by creating a new one
* timecard id = userid + “-”+ year+ “-”+ “week”;
* Timecard starts on Monday and ends on Sunday Duration of each Æ timecard
* is 7 days
*/
Date startDate = null;
if (currentTimecard == null) {
// first timecard startDate = DateUtil.getCurrentWeekMonday(new Date());
} else { startDate = DateUtil.getNextWeekMonday(new Æ Date(currentTimecard.getStartDate()));
} String id = ((UserPK)user.getPrimaryKey()).id + “-” +
DateUtil.getCurrentYear(startDate) + “-” + DateUtil.getCurrentWeek(startDate);
Date endDate = DateUtil.getCurrentWeekSunday(startDate);
DateUtil.toDateString(startDate) +
“ endDate=” + DateUtil.toDateString(endDate));
Context initialContext = getInitialContext();
TimecardLocalHome tchome = (TimecardLocalHome) Æ initialContext.lookup(
EjbReferenceNames Æ TIMECARD_HOME);
TimecardLocal nextTimecard = tchome.create(id, startDate, Æ endDate, true,
user);
Trang 9//one to be current.
if(user.getCurrentTimecard()!= null) {
user.getCurrentTimecard().setIsCurrent(false);
} user.setCurrentTimecard(nextTimecard);
System.out.println(“done creating a new Timecard.”);
return nextTimecard;
} catch (NamingException e) {
throw new FatalApplicationException(Origin.TIMECARD_WORKFLOW, e,
“Timecard Bean Not Found”); }
catch (CreateException e) {
throw new DataCreateException(Origin.TIMECARD_WORKFLOW, e,
“Failed to create timecard.”); }
} }
Trang 10SelectChargeCodeServlet.java
The SelectChargeCodeServlet uses the RecordTimeWorkflow to get a collection of charge codes that are valid for the system It uses TablePrimitive, TextPrimitive, and LinkPrimitive to build a list of charge codes with an associated “Add” link for each charge code When the user clicks on an “Add” link, RecordTimeServlet uses the request parameters to identify the correct charge code to add to the timecard.
package com.wiley.compBooks.EJwithUML.TimecardUI;
import javax.servlet.http.*;
import javax.servlet.*;
import javax.naming.*;
import javax.ejb.*;
import java.rmi.*;
import javax.rmi.PortableRemoteObject;
import java.io.*;
import java.util.*;
import java.text.*;
import com.wiley.compBooks.EJwithUML.Base.HtmlPrimitives.Core.*;
SelectChargeCodeServletjava