package fauxExchange; import javax.swing.*; import java.awt.*; import java.awt.event.*; /** * This code is for a demonstration interface only. This code does not take * responsibility as the model code for the rest of the Faux Exchange System. * Please view 30+ other classes for examples of correctly written OO code. * * @author A C Programmer Hooked On Java */ public class FauxApp { JFrame main; OrderRunner orderThread; Exchange exchange; OrderBook current; JLabel currentSecurityLbl; int queueSize = 50; OrderBook[] books; final SizedQueue[] prices = new SizedQueue[5]; // SizedQueue prices = new SizedQueue(queueSize); // public SizedQueue getPriceQueue (){ return prices; }; public FauxApp () { main = new JFrame("The Faux Exchange Server"); main.getContentPane().setLayout(new BorderLayout()); main.getContentPane().add(createComponents(), BorderLayout.CENTER); main.setJMenuBar(createMenu()); main.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if (exchange!=null) exchange.closeLog(); System.exit(0); } }); main.pack(); // main.setSize(300, 300); main.setLocation(250, 250); main.setVisible(true); main.repaint(); } protected JMenuBar createMenu(){ JMenuItem menuItem; JMenuBar menu = new JMenuBar(); JMenu main = new JMenu("Exchange"); main.setMnemonic('e'); menuItem = new JMenuItem("Open Exchange"); menuItem.setMnemonic('o'); menuItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ handleOpenExchange(ae); } }); main.add(menuItem); menuItem = new JMenuItem("Open Electronic Ordering"); menuItem.setMnemonic('e'); menuItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ handleOpenElectronicExchange(ae); } }); main.add(menuItem); menuItem = new JMenuItem("Select Security"); menuItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ handleSelectSecurity(ae); } }); menuItem.setMnemonic('s'); main.add(menuItem); menuItem = new JMenuItem("View Security Prices"); menuItem.setMnemonic('v'); menuItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ handleViewPrices(ae); } }); main.add(menuItem); main.addSeparator(); menuItem = new JMenuItem("Exit Faux Exchange"); menuItem.setMnemonic('x'); menuItem.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ if (exchange != null) exchange.closeLog(); System.exit(0); } }); main.add(menuItem); menu.add(main); return menu; } protected JComponent createComponents (){ JPanel root = new JPanel(); root.setLayout(new BorderLayout()); JPanel north = new JPanel(); currentSecurityLbl = new JLabel("No Security Selected"); north.add(currentSecurityLbl, BorderLayout.CENTER); JPanel center = new JPanel(); center.setLayout(new FlowLayout()); JButton breakBtn = new JButton("Break Trading"); breakBtn.setText("Break Trading"); breakBtn.setMnemonic('b'); breakBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ handleBreakBtn(ae); } }); JButton tradeBtn = new JButton("Open Trading"); tradeBtn.setText("Start Trading"); tradeBtn.setMnemonic('t'); tradeBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ handleOpeningTradingBtn(ae); } }); JButton viewOrderBookBtn = new JButton("View Order Book"); viewOrderBookBtn.setText("View Order Book"); viewOrderBookBtn.setMnemonic('v'); viewOrderBookBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ handleOrderBookBtn(ae); } }); center.add(breakBtn); center.add(tradeBtn); center.add(viewOrderBookBtn); root.add(north, BorderLayout.NORTH); root.add(center, BorderLayout.CENTER); return root; } protected void setCurrentBook(OrderBook book){ current = book; currentSecurityLbl.setText(book.getSecurity().getSymbol()); } protected Exchange createExchange (){ // Create the exchange System.out.println("Creating Exchange..."); Exchange myExchange = new Exchange(); OrderBook ob = null; // Create the Segments in this Exchange System.out.println("Creating Segments..."); Segment [] segs = new Segment[1]; int[] securityIds = new int[5]; double[] openingPrices = new double[5]; segs[0] = new Segment(myExchange, 1); String [] symbols = {"Buzz Word Central", "B2B-XML-ASP", "Qualis ICG", "E-CliffSoftB2B.com", "Torsten, Inc."}; for (int i = 0; i < 5; i++){ // Create a Security System.out.println("Creating Security: " + (i+1)); Security sec = new Security(i + 1, symbols[i], segs[0]); securityIds[i] = i+1; // Create an OrderBook for this Security System.out.println("Creating an OrderBook for this Security..."); ob = new OrderBook(sec); ob.initializePrice(94.00+i, 98.50+(i+2)); openingPrices[i] = ob.getOpeningPrice(); ob.startWorker(); myExchange.registerOrderBook(ob); } // Add these Segments to the Exchange System.out.println("Setting Segments in Exchange..."); myExchange.setSegments(segs); myExchange.openLog(); myExchange.setLogTrades(true); orderThread = new OrderRunner(myExchange, securityIds, openingPrices, 0.1, 10); // orderThread.start(); setCurrentBook(ob); this.books = myExchange.getOrderBooks(); return myExchange; } protected void handleOpenElectronicExchange(ActionEvent ae){ orderThread.start(); WorkerThread[] workers = new WorkerThread[5]; for (int i = 0; i < 5; i++){ workers[i] = new WorkerThread(books[i], i); workers[i].start(); } } protected void handleViewPrices(ActionEvent ae){ int index = 0; for (int i = 0; i < books.length; i++){ if (current == books[i]){ index = i; } } java.util.Iterator iter = prices[index].iterator(); int size = prices[index].size(); int i = 0; int[] range = new int[size]; while (iter.hasNext()){ Integer tmp = (Integer)iter.next(); range[i++] = tmp.intValue(); } xyGraph graph = new xyGraph(range); Grapher g = new Grapher(graph); g.repaint(); } protected void handleBreakBtn(ActionEvent ae){ for (int i = 0; i < books.length; i++){ books[i].obsc.setOrderBookState(OrderBookStateController.BREAK_STATE); } } protected void handleOpeningTradingBtn(ActionEvent ae){ for (int i = 0; i < books.length; i++){ books[i].obsc.setOrderBookState(OrderBookStateController.TRADING_STATE); } } protected void handleOrderBookBtn(ActionEvent ae){ if (current == null) return; OutputBookDlg dlg = new OutputBookDlg(main, current.getSecurity().getSymbol() + " Order Book", current); dlg.show(); dlg.repaint(); } protected void handleSelectSecurity(ActionEvent ae){ if (exchange != null){ final OrderBook[] tmpBooks = exchange.getOrderBooks(); final Security[] securities = new Security[tmpBooks.length]; for (int i = 0; i < tmpBooks.length; i++){ securities[i] = tmpBooks[i].getSecurity(); } final JDialog selectDlg = new JDialog(main, "Select a Security to View"); selectDlg.getContentPane().setLayout(new BorderLayout()); // selectDlg.getContentPane().add(new JLabel("Select a security")); final JList list = new JList(securities); list.setSelectedIndex(0); JScrollPane listPane = new JScrollPane(list); selectDlg.getContentPane().add(listPane, BorderLayout.CENTER); JButton selectBtn = new JButton("Select"); selectBtn.setMnemonic('s'); selectBtn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ Security sec = (Security)list.getSelectedValue(); for (int i = 0; i < tmpBooks.length; i++){ if (tmpBooks[i].getSecurity() == sec){ setCurrentBook(tmpBooks[i]); } } selectDlg.hide(); // selectDlg.destroy(); } }); selectDlg.getContentPane().add(selectBtn, BorderLayout.SOUTH); selectDlg.setModal(true); selectDlg.pack(); selectDlg.setLocation(300, 300); selectDlg.show(); } } protected void handleOpenExchange(ActionEvent ae){ exchange = createExchange(); } protected class WorkerThread extends Thread { OrderBook ob; int index; public WorkerThread (OrderBook ob, int index){ this.ob = ob; this.index = index; this.setDaemon(true); prices[index] = new SizedQueue(50); } public void run(){ while (true){ try { if (ob.obsc.getOrderBookState() instanceof TradingState){ prices[index].enqueue(new Integer((int)this.ob.getLastPrice())); } this.sleep(1000); }catch(Exception e){ } } } } /** TO RUN THIS APPLICATION */ public static void main (String[] args){ FauxApp faux = new FauxApp(); } }