001    /** 
002     * 
003     * Copyright 2004 Protique Ltd
004     * 
005     * Licensed under the Apache License, Version 2.0 (the "License"); 
006     * you may not use this file except in compliance with the License. 
007     * You may obtain a copy of the License at 
008     * 
009     * http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS, 
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
014     * See the License for the specific language governing permissions and 
015     * limitations under the License. 
016     * 
017     **/
018    package org.activemq.web;
019    
020    import javax.jms.Destination;
021    import javax.jms.JMSException;
022    import javax.jms.Message;
023    import javax.jms.Session;
024    import javax.servlet.ServletException;
025    import javax.servlet.http.HttpServletRequest;
026    import javax.servlet.http.HttpServletResponse;
027    import java.io.IOException;
028    import java.io.PrintWriter;
029    import java.util.Hashtable;
030    import java.util.Map;
031    
032    /**
033     * A servlet which will publish dummy market data prices
034     * 
035     * @version $Revision: 1.1.1.1 $
036     */
037    public class PortfolioPublishServlet extends MessageServletSupport {
038    
039        private static final int maxDeltaPercent = 1;
040        private static final Map lastPrices = new Hashtable();
041        private boolean ricoStyle = true;
042    
043        
044        public void init() throws ServletException {
045            super.init();
046            
047            ricoStyle = asBoolean(getServletConfig().getInitParameter("rico"), true);
048        }
049    
050        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
051            PrintWriter out = response.getWriter();
052            long sleep = 0;
053            String sleepText = request.getParameter("sleep");
054            if (sleepText != null && sleepText.length() > 0) {
055                sleep = Long.parseLong(sleepText);
056            }
057            String[] stocks = request.getParameterValues("stocks");
058            if (stocks == null || stocks.length == 0) {
059                out.println("<html><body>No <b>stocks</b> query parameter specified. Cannot publish market data</body></html>");
060            }
061            else {
062                int count = getNumberOfMessages(request);
063                try {
064                    WebClient client = getWebClient(request);
065                    for (int i = 0; i < count; i++) {
066                        if (i > 0 && sleep > 0) {
067                            try {
068                                Thread.sleep(sleep);
069                            }
070                            catch (InterruptedException e) {
071                                // ignore
072                            }
073                        }
074                        sendMessage(client, stocks);
075                    }
076                    out.print("<html><head><meta http-equiv='refresh' content='");
077                    String refreshRate = request.getParameter("refresh");
078                    if (refreshRate == null || refreshRate.length() == 0) {
079                        refreshRate = "1";
080                    }
081                    out.print(refreshRate);
082                    out.println("'/></head>");
083                    out.println("<body>Published <b>" + count + "</b> price messages");
084                    out.println("</body></html>");
085    
086                }
087                catch (JMSException e) {
088                    out.println("<html><body>Failed sending price messages due to <b>" + e + "</b></body></html>");
089                    log("Failed to send message: " + e, e);
090                }
091            }
092        }
093    
094        protected void sendMessage(WebClient client, String[] stocks) throws JMSException {
095            Session session = client.getSession();
096    
097            int idx = 0;
098            while (true) {
099                idx = (int) Math.round(stocks.length * Math.random());
100                if (idx < stocks.length) {
101                    break;
102                }
103            }
104            String stock = stocks[idx];
105            Destination destination = session.createTopic("STOCKS." + stock);
106            String stockText = createStockText(stock);
107            log("Sending: " + stockText + " on destination: " + destination);
108            Message message = session.createTextMessage(stockText);
109            client.send(destination, message);
110        }
111    
112        protected String createStockText(String stock) {
113            Double value = (Double) lastPrices.get(stock);
114            if (value == null) {
115                value = new Double(Math.random() * 100);
116            }
117    
118            // lets mutate the value by some percentage
119            double oldPrice = value.doubleValue();
120            value = new Double(mutatePrice(oldPrice));
121            lastPrices.put(stock, value);
122            double price = value.doubleValue();
123    
124            double offer = price * 1.001;
125    
126            String movement = (price > oldPrice) ? "up" : "down";
127            return "<price stock='" + stock + "' bid='" + price + "' offer='" + offer + "' movement='" + movement + "'/>";
128        }
129    
130        protected double mutatePrice(double price) {
131            double percentChange = (2 * Math.random() * maxDeltaPercent) - maxDeltaPercent;
132    
133            return price * (100 + percentChange) / 100;
134        }
135    
136        protected int getNumberOfMessages(HttpServletRequest request) {
137            String name = request.getParameter("count");
138            if (name != null) {
139                return Integer.parseInt(name);
140            }
141            return 1;
142        }
143    }