Mega Code Archive

 
Categories / Java / Design Pattern
 

State Pattern in Java

//[C] 2002 Sun Microsystems, Inc.--- import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.AbstractTableModel; public class RunStatePattern {   public static void main(String[] arguments) {     System.out.println("Example for the State pattern");     System.out.println();     if (!(new File("appointments.ser").exists())) {       DataCreator.serialize("appointments.ser");     }     System.out.println("Creating CalendarEditor");     CalendarEditor appointmentBook = new CalendarEditor();     System.out.println("");     System.out.println("Created. Appointments:");     System.out.println(appointmentBook.getAppointments());     System.out.println("Created. Creating GUI:");     StateGui application = new StateGui(appointmentBook);     application.createGui();     System.out.println("");   } } interface State {   public void save();   public void edit(); } 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() {   }   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 FileLoader {   public static Object loadData(File inputFile) {     Object returnValue = null;     try {       if (inputFile.exists()) {         if (inputFile.isFile()) {           ObjectInputStream readIn = new ObjectInputStream(               new FileInputStream(inputFile));           returnValue = readIn.readObject();           readIn.close();         } else {           System.err.println(inputFile + " is a directory.");         }       } else {         System.err.println("File " + inputFile + " does not exist.");       }     } catch (ClassNotFoundException exc) {       exc.printStackTrace();     } catch (IOException exc) {       exc.printStackTrace();     }     return returnValue;   }   public static void storeData(File outputFile, Serializable data) {     try {       ObjectOutputStream writeOut = new ObjectOutputStream(           new FileOutputStream(outputFile));       writeOut.writeObject(data);       writeOut.close();     } catch (IOException exc) {       exc.printStackTrace();     }   } } class DataCreator {   private static final String DEFAULT_FILE = "data.ser";   private static Calendar dateCreator = Calendar.getInstance();   public static void main(String[] args) {     String fileName;     if (args.length == 1) {       fileName = args[0];     } else {       fileName = DEFAULT_FILE;     }     serialize(fileName);   }   public static void serialize(String fileName) {     try {       serializeToFile(createData(), fileName);     } catch (IOException exc) {       exc.printStackTrace();     }   }   private static Serializable createData() {     ArrayList appointments = new ArrayList();     ArrayList contacts = new ArrayList();     contacts.add(new ContactImpl("Test", "Subject", "Volunteer",         "United Patterns Consortium"));     Location location1 = new LocationImpl("Punxsutawney, PA");     appointments.add(new Appointment("Slowpokes anonymous", contacts,         location1, createDate(2001, 1, 1, 12, 01), createDate(2001, 1,             1, 12, 02)));     appointments.add(new Appointment("Java focus group", contacts,         location1, createDate(2001, 1, 1, 12, 30), createDate(2001, 1,             1, 14, 30)));     appointments         .add(new Appointment("Something else", contacts, location1,             createDate(2001, 1, 1, 12, 01), createDate(2001, 1, 1,                 12, 02)));     appointments.add(new Appointment("Yet another thingie", contacts,         location1, createDate(2001, 1, 1, 12, 01), createDate(2001, 1,             1, 12, 02)));     return appointments;   }   private static void serializeToFile(Serializable content, String fileName)       throws IOException {     ObjectOutputStream serOut = new ObjectOutputStream(         new FileOutputStream(fileName));     serOut.writeObject(content);     serOut.close();   }   public static Date createDate(int year, int month, int day, int hour,       int minute) {     dateCreator.set(year, month, day, hour, minute);     return dateCreator.getTime();   } } class Appointment implements Serializable {   private String reason;   private ArrayList contacts;   private Location location;   private Date startDate;   private Date endDate;   public Appointment(String reason, ArrayList contacts, Location location,       Date startDate, Date endDate) {     this.reason = reason;     this.contacts = contacts;     this.location = location;     this.startDate = startDate;     this.endDate = endDate;   }   public String getReason() {     return reason;   }   public ArrayList getContacts() {     return contacts;   }   public Location getLocation() {     return location;   }   public Date getStartDate() {     return startDate;   }   public Date getEndDate() {     return endDate;   }   public void setReason(String reason) {     this.reason = reason;   }   public void setContacts(ArrayList contacts) {     this.contacts = contacts;   }   public void setLocation(Location location) {     this.location = location;   }   public void setStartDate(Date startDate) {     this.startDate = startDate;   }   public void setEndDate(Date endDate) {     this.endDate = endDate;   }   public String toString() {     return "Appointment:" + "\n    Reason: " + reason + "\n    Location: "         + location + "\n    Start: " + startDate + "\n    End: "         + endDate + "\n";   } } class CalendarEditor {   private State currentState;   private File appointmentFile;   private ArrayList appointments = new ArrayList();   private static final String DEFAULT_APPOINTMENT_FILE = "appointments.ser";   public CalendarEditor() {     this(DEFAULT_APPOINTMENT_FILE);   }   public CalendarEditor(String appointmentFileName) {     appointmentFile = new File(appointmentFileName);     try {       appointments = (ArrayList) FileLoader.loadData(appointmentFile);     } catch (ClassCastException exc) {       System.err           .println("Unable to load information. The file does not contain a list of appointments.");     }     currentState = new CleanState();   }   public void save() {     currentState.save();   }   public void edit() {     currentState.edit();   }   private class DirtyState implements State {     private State nextState;     public DirtyState(State nextState) {       this.nextState = nextState;     }     public void save() {       FileLoader.storeData(appointmentFile, appointments);       currentState = nextState;     }     public void edit() {     }   }   private class CleanState implements State {     private State nextState = new DirtyState(this);     public void save() {     }     public void edit() {       currentState = nextState;     }   }   public ArrayList getAppointments() {     return appointments;   }   public void addAppointment(Appointment appointment) {     if (!appointments.contains(appointment)) {       appointments.add(appointment);     }   }   public void removeAppointment(Appointment appointment) {     appointments.remove(appointment);   } } class StateGui implements ActionListener {   private JFrame mainFrame;   private JPanel controlPanel, editPanel;   private CalendarEditor editor;   private JButton save, exit;   public StateGui(CalendarEditor edit) {     editor = edit;   }   public void createGui() {     mainFrame = new JFrame("State Pattern Example");     Container content = mainFrame.getContentPane();     content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));     editPanel = new JPanel();     editPanel.setLayout(new BorderLayout());     JTable appointmentTable = new JTable(new StateTableModel(         (Appointment[]) editor.getAppointments().toArray(             new Appointment[1])));     editPanel.add(new JScrollPane(appointmentTable));     content.add(editPanel);     controlPanel = new JPanel();     save = new JButton("Save Appointments");     exit = new JButton("Exit");     controlPanel.add(save);     controlPanel.add(exit);     content.add(controlPanel);     save.addActionListener(this);     exit.addActionListener(this);     mainFrame.addWindowListener(new WindowCloseManager());     mainFrame.pack();     mainFrame.setVisible(true);   }   public void actionPerformed(ActionEvent evt) {     Object originator = evt.getSource();     if (originator == save) {       saveAppointments();     } else if (originator == exit) {       exitApplication();     }   }   private class WindowCloseManager extends WindowAdapter {     public void windowClosing(WindowEvent evt) {       exitApplication();     }   }   private void saveAppointments() {     editor.save();   }   private void exitApplication() {     System.exit(0);   }   private class StateTableModel extends AbstractTableModel {     private final String[] columnNames = { "Appointment", "Contacts",         "Location", "Start Date", "End Date" };     private Appointment[] data;     public StateTableModel(Appointment[] appointments) {       data = appointments;     }     public String getColumnName(int column) {       return columnNames[column];     }     public int getRowCount() {       return data.length;     }     public int getColumnCount() {       return columnNames.length;     }     public Object getValueAt(int row, int column) {       Object value = null;       switch (column) {       case 0:         value = data[row].getReason();         break;       case 1:         value = data[row].getContacts();         break;       case 2:         value = data[row].getLocation();         break;       case 3:         value = data[row].getStartDate();         break;       case 4:         value = data[row].getEndDate();         break;       }       return value;     }     public boolean isCellEditable(int row, int column) {       return ((column == 0) || (column == 2)) ? true : false;     }     public void setValueAt(Object value, int row, int column) {       switch (column) {       case 0:         data[row].setReason((String) value);         editor.edit();         break;       case 1:         break;       case 2:         data[row].setLocation(new LocationImpl((String) value));         editor.edit();         break;       case 3:         break;       case 4:         break;       }     }   } }