// The architecture of this program is inspired by the // AddressBook.java example in "Java-How to Program-3rd Edition" // by Deitel & Deitel, Prentice Hall 1999 import java.sql.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.table.*; import java.util.*; import java.text.*; public class DukeBakery extends JFrame { private DataPanel screenvar; private JTextArea msgout; private Connection dbconn; public DukeBakery() { super( "DUKE'S BAKERY" ); // Set up GUI environment Container p = getContentPane(); screenvar = new DataPanel(); msgout = new JTextArea( 8, 40 ); p.setLayout( new FlowLayout() ); p.add( new JScrollPane( screenvar ) ); p.add( new JScrollPane(msgout) ); // Set up database connection try { String url = "jdbc:odbc:BakeryBook"; Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); dbconn = DriverManager.getConnection( url ); msgout.append( "Connection successful\n" ); } catch ( ClassNotFoundException cnfex ) { // process ClassNotFoundExceptions here cnfex.printStackTrace(); msgout.append( "Connection unsuccessful\n" + cnfex.toString() ); } catch ( SQLException sqlex ) { // process SQLExceptions here sqlex.printStackTrace(); msgout.append( "Connection unsuccessful\n" + sqlex.toString() ); } catch ( Exception excp ) { // process remaining Exceptions here excp.printStackTrace(); msgout.append( excp.toString() ); } // Complete GUI ButtonPanel controls = new ButtonPanel( dbconn, screenvar, msgout); p.add( controls ); RadioButtons rb = new RadioButtons( dbconn , screenvar, msgout ); p.add ( rb ); setSize( 500, 475 ); show(); } public static void main( String args[] ) { DukeBakery bake = new DukeBakery(); bake.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent e ) { System.exit( 0 ); } } ); } } class DukeOrder extends JFrame implements ActionListener { private Connection dbconn; private DataPanel screenvar; private JTextArea msgout; private boolean firsttime = true; public DukeOrder( Connection dbc, DataPanel scv, JTextArea msg ) { super( "DUKE'S BAKERY -- ORDER ENTRY" ); dbconn = dbc; screenvar = scv; msgout = msg; } public void actionPerformed( ActionEvent e) { if (firsttime) { Container cnt = getContentPane(); cnt.setLayout( new FlowLayout() ); OrderBox ob = new OrderBox(); cnt.add( ob ); JButton enterOrder = new JButton("Order"); enterOrder.addActionListener( new PlaceOrder( dbconn, screenvar, msgout, ob ) ); cnt.add( enterOrder ); setSize( 400, 200 ); firsttime = false; } show(); } } class PlaceOrder implements ActionListener { private DataPanel screenvar; private JTextArea msgout; private Connection dbconn; private OrderBox obox; public PlaceOrder( Connection dbc, DataPanel scv, JTextArea msg, OrderBox ob ) { dbconn = dbc; screenvar = scv; msgout = msg; obox = ob; } public void actionPerformed( ActionEvent e ) { boolean inputerror = false; int iwheat=0; int icake=0; int inaan=0; int ibagel=0; try { Statement statement = dbconn.createStatement(); try { iwheat = Integer.parseInt(obox.inwheat.getText() ); } catch( NumberFormatException nfe ) { inputerror = true; obox.inwheat.setText("Error--enter integer value"); } try { icake = Integer.parseInt(obox.incake.getText() ); } catch( NumberFormatException nfe ) { inputerror = true; obox.incake.setText("Error--enter integer value"); } try { inaan = Integer.parseInt(obox.innaan.getText() ); } catch( NumberFormatException nfe ) { inputerror = true; obox.innaan.setText("Error--enter integer value"); } try { ibagel = Integer.parseInt(obox.inbagel.getText() ); } catch( NumberFormatException nfe ) { inputerror = true; obox.inbagel.setText("Error -- enter integer value"); } java.util.Date date = new java.util.Date(); SimpleDateFormat fmt = new SimpleDateFormat ("yyyy.MM.dd-HH:mm z"); String dtstr = fmt.format(date); if( !screenvar.id.getText().equals("") ) { if ( !inputerror && (iwheat != 0 || icake != 0 || inaan != 0 || ibagel != 0) ) { String query = "INSERT INTO orders " + "(LinkAddrTbl,OrderDate,wheat,cake,naan,bagel)" + "VALUES ("+ screenvar.id.getText() + "," + "'" + dtstr + "'," + String.valueOf(iwheat) + "," + String.valueOf(icake) + "," + String.valueOf(inaan) + "," + String.valueOf(ibagel) + ")"; msgout.append( "\nSending query: " + dbconn.nativeSQL( query ) + "\n" ); int result = statement.executeUpdate( query ); if ( result == 1 ) msgout.append( "\nOrder Placed\n" ); else { msgout.append( "\nInsertion failed\n" ); screenvar.first.setText( "" ); screenvar.last.setText( "" ); } } else msgout.append( "\nEnter at least one numeric value " + ", then press Order\n" ); } else msgout.append( "\n *** Find data before issuing order ***\n"); statement.close(); } catch ( SQLException sqlex ) { msgout.append( sqlex.toString() ); } // clear out order input boxes after database write if (!inputerror) { obox.inwheat.setText(""); obox.incake.setText(""); obox.innaan.setText(""); obox.inbagel.setText(""); } } } class OrderHist extends JFrame implements ActionListener { private Connection dbconn; private DataPanel screenvar; private JTextArea msgout; private boolean firsttime = true; private Container c; private JScrollPane jspane; private QueryTableModel qtbl; private JTable jtbl; public OrderHist( Connection dbc, DataPanel scv, JTextArea msg ) { super( "DUKE'S BAKERY -- ORDER HISTORY" ); dbconn = dbc; screenvar = scv; msgout = msg; } public void actionPerformed( ActionEvent e) { if ( !screenvar.id.getText().equals("") ) { // Set up GUI environment if ( firsttime ) { c = getContentPane(); c.setLayout( new FlowLayout() ); qtbl = new QueryTableModel( dbconn, screenvar, msgout ); qtbl.query(); jtbl = new JTable( qtbl ); TableColumn tcol = jtbl.getColumnModel().getColumn(0); tcol.setPreferredWidth(125); jspane = new JScrollPane( jtbl ); c.add( jspane ); setSize( 500, 500 ); firsttime = false; } else { qtbl.query(); qtbl.fire(); TableColumn tcol = jtbl.getColumnModel().getColumn(0); tcol.setPreferredWidth(125); } show(); } else msgout.append( "\n ***Find data before generating Order History***\n"); } } class QueryTableModel extends AbstractTableModel { Connection dbconn; DataPanel screenvar; JTextArea msgout; Vector totalrows; String[] colheads = {"Date & Time", "Wheat Loaf", "Carrot Cake", "Naan Bread", "Bagel"}; public QueryTableModel(Connection dbc, DataPanel scv, JTextArea msg ){ dbconn = dbc; screenvar = scv; msgout = msg; totalrows = new Vector(); } public String getColumnName(int i) { return colheads[i]; } public int getColumnCount() { return 5; } public int getRowCount() { return totalrows.size(); } public Object getValueAt(int row, int col) { return ((String[])totalrows.elementAt(row))[col]; } public boolean isCellEditable(int row, int col) { return false; } public void fire() { fireTableChanged(null); } public void query() { try { Statement statement = dbconn.createStatement(); String query = "SELECT * FROM Orders " + "WHERE LinkAddrTbl =" + screenvar.id.getText() + " ORDER BY OrderDate"; msgout.append( "\nSending query: " + dbconn.nativeSQL( query ) + "\n" ); ResultSet rs = statement.executeQuery( query ); totalrows = new Vector(); while ( rs.next() ) { String[] record = new String[5]; for( int i = 0; i < 5; i++ ) { record[i] = rs.getString( i + 3 ); } totalrows.addElement( record ); } msgout.append( "\nQuery successful\n" ); statement.close(); } catch ( SQLException sqlex ) { msgout.append( sqlex.toString() ); } } } class TotalHist extends JFrame implements ActionListener { private Connection dbconn; private DataPanel screenvar; private JScrollPane orderpane; private JTextArea msgout; private JTextField outwheat, outcake, outnaan, outbagel; private boolean firsttime = true; public TotalHist( Connection dbc, DataPanel scv, JTextArea msg ) { super( "DUKE'S BAKERY -- TOTAL ORDERS" ); dbconn = dbc; screenvar = scv; msgout = msg; } public void actionPerformed( ActionEvent e) { // Set up GUI environment if ( firsttime ) { Container c = getContentPane(); c.setLayout(new GridLayout(4,2) ); JLabel pwheat = new JLabel( "Total number of Wheat Loaves ordered:" ); c.add( pwheat ); outwheat = new JTextField( 10 ); c.add( outwheat ); pwheat.setLabelFor( outwheat ); JLabel pcake = new JLabel( "Total number of Carrot Cakes ordered:"); c.add( pcake); outcake = new JTextField( 10 ); c.add( outcake ); pcake.setLabelFor( outcake ); JLabel pnaan = new JLabel( "Total number of Naan Bread ordered:" ); c.add( pnaan ); outnaan = new JTextField( 10 ); c.add( outnaan ); pnaan.setLabelFor( outnaan ); JLabel pbagel = new JLabel( "Total number of Bagels ordered:" ); c.add( pbagel ); outbagel = new JTextField( 10 ); c.add( outbagel ); pbagel.setLabelFor( outbagel ); setSize( 550, 130 ); firsttime = false; } show(); try { Statement statement = dbconn.createStatement(); String query = "SELECT * FROM Orders"; msgout.append( "\nSending query: " + dbconn.nativeSQL( query ) + "\n" ); ResultSet rs = statement.executeQuery( query ); display( rs ); msgout.append( "\nQuery successful\n" ); statement.close(); } catch ( SQLException sqlex ) { sqlex.printStackTrace(); } } // Display results of query public void display( ResultSet rs ) { int accwheat=0; int acccake=0; int accnaan=0; int accbagel=0; try { while ( rs.next() ) { // compute totals date,wheat,carrot,naan,bagel from database accwheat += rs.getInt(4); acccake += rs.getInt(5); accnaan += rs.getInt(6); accbagel += rs.getInt(7); } } catch ( SQLException sqlex ) { msgout.append( sqlex.toString() ); } outwheat.setText(String.valueOf(accwheat)); outcake.setText(String.valueOf(acccake)); outnaan.setText(String.valueOf(accnaan)); outbagel.setText(String.valueOf(accbagel)); } } class OrderBox extends JPanel { JTextField inwheat, incake, innaan, inbagel; public OrderBox() { JPanel j = new JPanel(); j.setLayout(new GridLayout(4,2) ); JLabel pwheat = new JLabel( "Enter number of Wheat Loaves:" ); j.add( pwheat ); inwheat = new JTextField( 10 ); j.add( inwheat ); pwheat.setLabelFor( inwheat ); JLabel pcake = new JLabel( "Enter number of Carrot Cakes:"); j.add( pcake); incake = new JTextField( 10 ); j.add( incake ); pcake.setLabelFor( incake ); JLabel pnaan = new JLabel( "Enter number of Naan Bread:" ); j.add( pnaan ); innaan = new JTextField( 10 ); j.add( innaan ); pnaan.setLabelFor( innaan ); JLabel pbagel = new JLabel( "Enter number of Bagels:" ); j.add( pbagel ); inbagel = new JTextField( 10 ); j.add( inbagel ); pbagel.setLabelFor( inbagel ); setLayout(new FlowLayout() ); add(j); } } class AddRecord implements ActionListener { private DataPanel screenvar; private JTextArea msgout; private Connection dbconn; public AddRecord( Connection dbc, DataPanel scv, JTextArea msg ) { dbconn = dbc; screenvar = scv; msgout = msg; } public void actionPerformed( ActionEvent e ) { try { Statement statement = dbconn.createStatement(); // strip out non-numerics from phone number String numstrg = new String(); for (int i = 0; i < screenvar.home.getText().length(); i++) { if ( screenvar.home.getText().charAt(i)>='0' && screenvar.home.getText().charAt(i)<='9') { numstrg += screenvar.home.getText().substring(i,i+1); } } if ( !screenvar.last.getText().equals( "" ) && !screenvar.first.getText().equals( "" ) && !numstrg.equals("") ) { String query = "INSERT INTO addresses (" + "firstname, lastname, address, city, " + "state, postalcode, country, " + "emailaddress, homephone, faxnumber" + ") VALUES ('" + screenvar.first.getText() + "', '" + screenvar.last.getText() + "', '" + screenvar.address.getText() + "', '" + screenvar.city.getText() + "', '" + screenvar.state.getText() + "', '" + screenvar.zip.getText() + "', '" + screenvar.country.getText() + "', '" + screenvar.email.getText() + "', '" + numstrg + "', '" + screenvar.fax.getText() + "')"; msgout.append( "\nSending query: " + dbconn.nativeSQL( query ) + "\n" ); int result = statement.executeUpdate( query ); if ( result == 1 ){ // read just inserted record to obtain id field // needed to place orders msgout.append( "\nInsertion successful\n" ); try { query = "SELECT * FROM addresses WHERE homephone='" + numstrg + "'"; ResultSet rs = statement.executeQuery( query ); rs.next(); screenvar.id.setText(String.valueOf(rs.getInt(1))); } catch ( SQLException sqlex ) { msgout.append( sqlex.toString() ); } } else { msgout.append( "\nInsertion failed\n" ); screenvar.first.setText( "" ); screenvar.last.setText( "" ); screenvar.address.setText( "" ); screenvar.city.setText( "" ); screenvar.state.setText( "" ); screenvar.zip.setText( "" ); screenvar.country.setText( "" ); screenvar.email.setText( "" ); screenvar.home.setText( "" ); screenvar.fax.setText( "" ); } } else msgout.append( "\nEnter at least first, last, and " + "home phone, then press Add\n" ); statement.close(); } catch ( SQLException sqlex ) { msgout.append( sqlex.toString() ); screenvar.home.setText("Home phone already exists -- reenter"); } } } class FindRecord implements ActionListener { private DataPanel screenvar; private JTextArea msgout; private Connection dbconn; public FindRecord( Connection dbc, DataPanel scv, JTextArea msg ) { dbconn = dbc; screenvar = scv; msgout = msg; } public void actionPerformed( ActionEvent e ) { try { // strip out non-numerics from home phone String numstrg = new String(); for (int i = 0; i < screenvar.home.getText().length(); i++){ if ( screenvar.home.getText().charAt(i)>='0' && screenvar.home.getText().charAt(i)<='9') { numstrg += screenvar.home.getText().substring(i,i+1); } } if ( !numstrg.equals( "" ) ) { Statement statement =dbconn.createStatement(); String query = "SELECT * FROM addresses " + "WHERE homephone = '" + numstrg + "'"; msgout.append( "\nSending query: " + dbconn.nativeSQL( query ) + "\n" ); ResultSet rs = statement.executeQuery( query ); display( rs ); statement.close(); } else screenvar.home.setText( "Enter home phone then press Find" ); } catch ( SQLException sqlex ) { msgout.append( sqlex.toString() + sqlex.getMessage() ); } } // Display results of query public void display( ResultSet rs ) { try { rs.next(); int recordNumber = rs.getInt( 1 ); if ( recordNumber != 0 ) { screenvar.id.setText( String.valueOf(recordNumber) ); screenvar.first.setText( rs.getString( 2 ) ); screenvar.last.setText( rs.getString( 3 ) ); screenvar.address.setText( rs.getString( 4 ) ); screenvar.city.setText( rs.getString( 5 ) ); screenvar.state.setText( rs.getString( 6 ) ); screenvar.zip.setText( rs.getString( 7 ) ); screenvar.country.setText( rs.getString( 8 ) ); screenvar.email.setText( rs.getString( 9 ) ); screenvar.home.setText( rs.getString( 10 ) ); screenvar.fax.setText( rs.getString( 11 ) ); } else msgout.append( "\nNo record found\n" ); } catch ( SQLException sqlex ) { msgout.append( "\n*** Phone Number Not In Database ***\n" ); } } } class UpdateRecord implements ActionListener { private DataPanel screenvar; private JTextArea msgout; private Connection dbconn; public UpdateRecord( Connection dbc, DataPanel scv, JTextArea msg ) { dbconn = dbc; screenvar = scv; msgout = msg; } public void actionPerformed( ActionEvent e ) { try { Statement statement = dbconn.createStatement(); if ( ! screenvar.id.getText().equals( "" ) ) { // strip out non-numerics from home phone String numstrg = new String(); for (int i = 0; i < screenvar.home.getText().length(); i++) { if ( screenvar.home.getText().charAt(i)>='0' && screenvar.home.getText().charAt(i)<='9') { numstrg += screenvar.home.getText().substring(i,i+1); } } String query = "UPDATE addresses SET " + "firstname='" + screenvar.first.getText() + "', lastname='" + screenvar.last.getText() + "', address='" + screenvar.address.getText() + "', city='" + screenvar.city.getText() + "', state='" + screenvar.state.getText() + "', postalcode='" + screenvar.zip.getText() + "', country='" + screenvar.country.getText() + "', emailaddress='" + screenvar.email.getText() + "', homephone='" + numstrg + "', faxnumber='" + screenvar.fax.getText() + "' WHERE id=" + screenvar.id.getText(); msgout.append( "\nSending query: " + dbconn.nativeSQL( query ) + "\n" ); int result = statement.executeUpdate( query ); if ( result == 1 ) msgout.append( "\nUpdate successful\n" ); else { msgout.append( "\nUpdate failed\n" ); screenvar.first.setText( "" ); screenvar.last.setText( "" ); screenvar.address.setText( "" ); screenvar.city.setText( "" ); screenvar.state.setText( "" ); screenvar.zip.setText( "" ); screenvar.country.setText( "" ); screenvar.email.setText( "" ); screenvar.home.setText( "" ); screenvar.fax.setText( "" ); } statement.close(); } else msgout.append( "\nYou may only update an " + "existing record. Use Find to " + "locate the record, then " + "modify the information and " + "press Update.\n" ); } catch ( SQLException sqlex ) { msgout.append( sqlex.toString() ); } } } class DataPanel extends JPanel { JTextField id, first, last, address, home, city, state, zip, country, email, fax; JLabel lfirst, llast, laddress, lhome, lcity, lstate, lzip, lcountry, lemail, lfax; public DataPanel() { // Label panel JPanel labelPanel = new JPanel(); labelPanel.setLayout( new GridLayout( 10, 1 ) ); lfirst = new JLabel( "First Name:", 0 ); labelPanel.add( lfirst); llast = new JLabel( "Last Name:", 0 ); labelPanel.add( llast); lhome = new JLabel( "Phone:", 0 ); labelPanel.add( lhome); laddress = new JLabel( "Address:", 0 ); labelPanel.add( laddress); lcity = new JLabel( "City:", 0 ); labelPanel.add( lcity); lstate = new JLabel( "State:", 0 ); labelPanel.add( lstate); lzip = new JLabel( "Zip Code:", 0 ); labelPanel.add( lzip); lcountry = new JLabel( "Country:", 0 ); labelPanel.add( lcountry); lemail = new JLabel( "Email:", 0 ); labelPanel.add( lemail); lfax = new JLabel( "Fax Number:", 0 ); labelPanel.add( lfax); // TextField panel JPanel screenvarPanel = new JPanel(); screenvarPanel.setLayout( new GridLayout( 10, 1 ) ); id = new JTextField( 20) ; first = new JTextField( 20 ); screenvarPanel.add( first ); last = new JTextField( 20 ); screenvarPanel.add( last ); home = new JTextField("Enter number-click Find", 20); screenvarPanel.add( home ); address = new JTextField( 20 ); screenvarPanel.add( address ); city = new JTextField( 20 ); screenvarPanel.add( city ); state = new JTextField( 20 ); screenvarPanel.add( state ); zip = new JTextField( 20 ); screenvarPanel.add( zip ); country = new JTextField( 20 ); screenvarPanel.add( country ); email = new JTextField( 20 ); screenvarPanel.add( email ); fax = new JTextField( 20 ); screenvarPanel.add( fax ); // Accessibility Section - relate labels and text fields // for use by assistive technologies lfirst.setLabelFor( first ); llast.setLabelFor( last ); lhome.setLabelFor( home ); laddress.setLabelFor( address ); lcity.setLabelFor( city ); lstate.setLabelFor( state ); lzip.setLabelFor( zip ); lcountry.setLabelFor( country ); lemail.setLabelFor( email ); lfax.setLabelFor( fax ); setLayout( new GridLayout( 1, 2 ) ); add( labelPanel ); add( screenvarPanel ); } } class ButtonPanel extends JPanel { public ButtonPanel( Connection dbc, DataPanel scv, JTextArea msg ) { setLayout( new GridLayout( 1, 4 ) ); JButton findName = new JButton( "Find" ); findName.addActionListener( new FindRecord( dbc, scv, msg ) ); add( findName ); JButton addName = new JButton( "Add" ); addName.addActionListener( new AddRecord( dbc, scv, msg ) ); add( addName ); JButton updateName = new JButton( "Update" ); updateName.addActionListener( new UpdateRecord( dbc, scv, msg ) ); add( updateName ); JButton clear = new JButton( "Clear" ); clear.addActionListener( new Clearscreenvar( scv ) ); add( clear ); } } class RadioButtons extends JPanel { public RadioButtons( Connection dbc, DataPanel scv, JTextArea msg ) { JRadioButton place = new JRadioButton( "Place Order", false ); DukeOrder dkord = new DukeOrder( dbc, scv, msg ); place.addActionListener( dkord ); add( place ); OrderHist ohist = new OrderHist( dbc, scv, msg ); JRadioButton review = new JRadioButton( "Order History", false ); review.addActionListener( ohist ); add( review ); TotalHist tothist = new TotalHist( dbc, scv, msg ); JRadioButton stats = new JRadioButton( "Total Orders", false ); stats.addActionListener( tothist ); add( stats ); ButtonGroup radioGrp = new ButtonGroup(); radioGrp.add( place ); radioGrp.add( review ); radioGrp.add( stats ); } } class Clearscreenvar implements ActionListener { private DataPanel screenvar; public Clearscreenvar( DataPanel scv ) { screenvar = scv; } public void actionPerformed( ActionEvent e ) { screenvar.id.setText( "" ); screenvar.first.setText( "" ); screenvar.last.setText( "" ); screenvar.address.setText( "" ); screenvar.city.setText( "" ); screenvar.state.setText( "" ); screenvar.zip.setText( "" ); screenvar.country.setText( "" ); screenvar.email.setText( "" ); screenvar.home.setText( "" ); screenvar.fax.setText( "" ); } }