//[C] 2002 Sun Microsystems, Inc.---
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
public class RunBuilderPattern {
private static Calendar dateCreator = Calendar.getInstance();
public static void main(String [] arguments){
Appointment appt = null;
System.out.println("Example for the Builder pattern");
System.out.println();
System.out.println("This example demonstrates the use of the Builder");
System.out.println("pattern to create Appointment objects for the PIM.");
System.out.println();
System.out.println("Creating a Scheduler for the example.");
Scheduler pimScheduler = new Scheduler();
System.out.println("Creating an AppointmentBuilder for the example.");
System.out.println();
AppointmentBuilder apptBuilder = new AppointmentBuilder();
try{
System.out.println("Creating a new Appointment with an AppointmentBuilder");
appt = pimScheduler.createAppointment(
apptBuilder, createDate(2066, 9, 22, 12, 30),
null, "Trek convention", new LocationImpl("Fargo, ND"),
createAttendees(4));
System.out.println("Successfully created an Appointment.");
System.out.println("Appointment information:");
System.out.println(appt);
System.out.println();
}
catch (InformationRequiredException exc){
printExceptions(exc);
}
System.out.println("Creating a MeetingBuilder for the example.");
MeetingBuilder mtgBuilder = new MeetingBuilder();
try{
System.out.println("Creating a new Appointment with a MeetingBuilder");
System.out.println("(notice that the same create arguments will produce");
System.out.println(" an exception, since the MeetingBuilder enforces a");
System.out.println(" mandatory end date)");
appt = pimScheduler.createAppointment(
mtgBuilder, createDate(2066, 9, 22, 12, 30),
null, "Trek convention", new LocationImpl("Fargo, ND"),
createAttendees(4));
System.out.println("Successfully created an Appointment.");
System.out.println("Appointment information:");
System.out.println(appt);
System.out.println();
}
catch (InformationRequiredException exc){
printExceptions(exc);
}
System.out.println("Creating a new Appointment with a MeetingBuilder");
System.out.println("(This time, the MeetingBuilder will provide an end date)");
try{
appt = pimScheduler.createAppointment(
mtgBuilder,
createDate(2002, 4, 1, 10, 00),
createDate(2002, 4, 1, 11, 30),
"OOO Meeting",
new LocationImpl("Butte, MT"),
createAttendees(2));
System.out.println("Successfully created an Appointment.");
System.out.println("Appointment information:");
System.out.println(appt);
System.out.println();
}
catch (InformationRequiredException exc){
printExceptions(exc);
}
}
public static Date createDate(int year, int month, int day, int hour, int minute){
dateCreator.set(year, month, day, hour, minute);
return dateCreator.getTime();
}
public static ArrayList createAttendees(int numberToCreate){
ArrayList group = new ArrayList();
for (int i = 0; i < numberToCreate; i++){
group.add(new ContactImpl("John", getLastName(i), "Employee (non-exempt)", "Yoyodyne Corporation"));
}
return group;
}
public static String getLastName(int index){
String name = "";
switch (index % 6){
case 0: name = "Worfin";
break;
case 1: name = "Smallberries";
break;
case 2: name = "Bigbootee";
break;
case 3: name = "Haugland";
break;
case 4: name = "Maassen";
break;
case 5: name = "Sterling";
break;
}
return name;
}
public static void printExceptions(InformationRequiredException exc){
int statusCode = exc.getInformationRequired();
System.out.println("Unable to create Appointment: additional information is required");
if ((statusCode & InformationRequiredException.START_DATE_REQUIRED) > 0){
System.out.println(" A start date is required for this appointment to be complete.");
}
if ((statusCode & InformationRequiredException.END_DATE_REQUIRED) > 0){
System.out.println(" An end date is required for this appointment to be complete.");
}
if ((statusCode & InformationRequiredException.DESCRIPTION_REQUIRED) > 0){
System.out.println(" A description is required for this appointment to be complete.");
}
if ((statusCode & InformationRequiredException.ATTENDEE_REQUIRED) > 0){
System.out.println(" At least one attendee is required for this appointment to be complete.");
}
if ((statusCode & InformationRequiredException.LOCATION_REQUIRED) > 0){
System.out.println(" A location is required for this appointment to be complete.");
}
System.out.println();
}
}
interface Contact extends Serializable{
public static final String SPACE = " ";
public String getFirstName();
public String getLastName();
public String getTitle();
public String getOrganization();
public void setFirstName(String newFirstName);
public void setLastName(String newLastName);
public void setTitle(String newTitle);
public void setOrganization(String newOrganization);
}
class ContactImpl implements Contact{
private String firstName;
private String lastName;
private String title;
private String organization;
public ContactImpl(String newFirstName, String newLastName,
String newTitle, String newOrganization){
firstName = newFirstName;
lastName = newLastName;
title = newTitle;
organization = newOrganization;
}
public String getFirstName(){ return firstName; }
public String getLastName(){ return lastName; }
public String getTitle(){ return title; }
public String getOrganization(){ return organization; }
public void setFirstName(String newFirstName){ firstName = newFirstName; }
public void setLastName(String newLastName){ lastName = newLastName; }
public void setTitle(String newTitle){ title = newTitle; }
public void setOrganization(String newOrganization){ organization = newOrganization; }
public String toString(){
return firstName + SPACE + lastName;
}
}
interface Location extends Serializable{
public String getLocation();
public void setLocation(String newLocation);
}
class LocationImpl implements Location{
private String location;
public LocationImpl(){ }
public LocationImpl(String newLocation){
location = newLocation;
}
public String getLocation(){ return location; }
public void setLocation(String newLocation){ location = newLocation; }
public String toString(){ return location; }
}
class Scheduler{
public Appointment createAppointment(AppointmentBuilder builder,
Date startDate, Date endDate, String description,
Location location, ArrayList attendees) throws InformationRequiredException{
if (builder == null){
builder = new AppointmentBuilder();
}
builder.buildAppointment();
builder.buildDates(startDate, endDate);
builder.buildDescription(description);
builder.buildAttendees(attendees);
builder.buildLocation(location);
return builder.getAppointment();
}
}
class Appointment{
private Date startDate;
private Date endDate;
private String description;
private ArrayList attendees = new ArrayList();
private Location location;
public static final String EOL_STRING =
System.getProperty("line.separator");
public Date getStartDate(){ return startDate; }
public Date getEndDate(){ return endDate; }
public String getDescription(){ return description; }
public ArrayList getAttendees(){ return attendees; }
public Location getLocation(){ return location; }
public void setDescription(String newDescription){ description = newDescription; }
public void setLocation(Location newLocation){ location = newLocation; }
public void setStartDate(Date newStartDate){ startDate = newStartDate; }
public void setEndDate(Date newEndDate){ endDate = newEndDate; }
public void setAttendees(ArrayList newAttendees){
if (newAttendees != null){
attendees = newAttendees;
}
}
public void addAttendee(Contact attendee){
if (!attendees.contains(attendee)){
attendees.add(attendee);
}
}
public void removeAttendee(Contact attendee){
attendees.remove(attendee);
}
public String toString(){
return " Description: " + description + EOL_STRING +
" Start Date: " + startDate + EOL_STRING +
" End Date: " + endDate + EOL_STRING +
" Location: " + location + EOL_STRING +
" Attendees: " + attendees;
}
}
class AppointmentBuilder{
public static final int START_DATE_REQUIRED = 1;
public static final int END_DATE_REQUIRED = 2;
public static final int DESCRIPTION_REQUIRED = 4;
public static final int ATTENDEE_REQUIRED = 8;
public static final int LOCATION_REQUIRED = 16;
protected Appointment appointment;
protected int requiredElements;
public void buildAppointment(){
appointment = new Appointment();
}
public void buildDates(Date startDate, Date endDate){
Date currentDate = new Date();
if ((startDate != null) && (startDate.after(currentDate))){
appointment.setStartDate(startDate);
}
if ((endDate != null) && (endDate.after(startDate))){
appointment.setEndDate(endDate);
}
}
public void buildDescription(String newDescription){
appointment.setDescription(newDescription);
}
public void buildAttendees(ArrayList attendees){
if ((attendees != null) && (!attendees.isEmpty())){
appointment.setAttendees(attendees);
}
}
public void buildLocation(Location newLocation){
if (newLocation != null){
appointment.setLocation(newLocation);
}
}
public Appointment getAppointment() throws InformationRequiredException{
requiredElements = 0;
if (appointment.getStartDate() == null){
requiredElements += START_DATE_REQUIRED;
}
if (appointment.getLocation() == null){
requiredElements += LOCATION_REQUIRED;
}
if (appointment.getAttendees().isEmpty()){
requiredElements += ATTENDEE_REQUIRED;
}
if (requiredElements > 0){
throw new InformationRequiredException(requiredElements);
}
return appointment;
}
public int getRequiredElements(){ return requiredElements; }
}
class InformationRequiredException extends Exception{
private static final String MESSAGE = "Appointment cannot be created because further information is required";
public static final int START_DATE_REQUIRED = 1;
public static final int END_DATE_REQUIRED = 2;
public static final int DESCRIPTION_REQUIRED = 4;
public static final int ATTENDEE_REQUIRED = 8;
public static final int LOCATION_REQUIRED = 16;
private int informationRequired;
public InformationRequiredException(int itemsRequired){
super(MESSAGE);
informationRequired = itemsRequired;
}
public int getInformationRequired(){ return informationRequired; }
}
class MeetingBuilder extends AppointmentBuilder{
public Appointment getAppointment() throws InformationRequiredException{
try{
super.getAppointment();
}
finally{
if (appointment.getEndDate() == null){
requiredElements += END_DATE_REQUIRED;
}
if (requiredElements > 0){
throw new InformationRequiredException(requiredElements);
}
}
return appointment;
}
}