1 /***
2 *
3 * Copyright 2004 Protique Ltd
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 **/
18 package org.codehaus.activemq.web;
19
20 import javax.jms.Destination;
21 import javax.jms.JMSException;
22 import javax.jms.Message;
23 import javax.jms.Session;
24 import javax.servlet.ServletException;
25 import javax.servlet.http.HttpServletRequest;
26 import javax.servlet.http.HttpServletResponse;
27 import java.io.IOException;
28 import java.io.PrintWriter;
29 import java.util.Hashtable;
30 import java.util.Map;
31
32 /***
33 * A servlet which will publish dummy market data prices
34 *
35 * @version $Revision: 1.1 $
36 */
37 public class PortfolioPublishServlet extends MessageServletSupport {
38
39 private static final int maxDeltaPercent = 1;
40 private static final Map lastPrices = new Hashtable();
41
42 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
43 PrintWriter out = response.getWriter();
44 String[] stocks = request.getParameterValues("stocks");
45 if (stocks == null || stocks.length == 0) {
46 out.println("<html><body>No <b>stocks</b> query parameter specified. Cannot publish market data</body></html>");
47 } else {
48 int count = getNumberOfMessages(request);
49 try {
50 WebClient client = getWebClient(request);
51 for (int i = 0; i < count; i++) {
52 sendMessage(client, stocks);
53 }
54 out.println("<html><head><meta http-equiv='refresh' content='1'/></head>");
55 out.println("<body>Published <b>" + count + "</b> price messages");
56 out.println("</body></html>");
57
58 } catch (JMSException e) {
59 out.println("<html><body>Failed sending price messages due to <b>" + e + "</b></body></html>");
60 log("Failed to send message: " + e, e);
61 }
62 }
63 }
64
65 protected void sendMessage(WebClient client, String[] stocks) throws JMSException {
66 Session session = client.getSession();
67
68 int idx = 0;
69 while (true) {
70 idx = (int) Math.round(stocks.length * Math.random());
71 if (idx < stocks.length) {
72 break;
73 }
74 }
75 String stock = stocks[idx];
76 Destination destination = session.createTopic("STOCKS." + stock);
77 String stockText = createStockText(stock);
78 log("Sending: " + stockText);
79 Message message = session.createTextMessage(stockText);
80 client.send(destination, message);
81 }
82
83 protected String createStockText(String stock) {
84 Double value = (Double) lastPrices.get(stock);
85 if (value == null) {
86 value = new Double(Math.random() * 100);
87 }
88
89
90 double oldPrice = value.doubleValue();
91 value = new Double(mutatePrice(oldPrice));
92 lastPrices.put(stock, value);
93 double price = value.doubleValue();
94
95 double offer = price * 1.001;
96 String movement = (price > oldPrice) ? "up" : "down";
97 return "<price stock='" + stock + "' bid='" + price + "' offer='" + offer + "' movement='" + movement + "'/>";
98
99 }
100
101 protected double mutatePrice(double price) {
102 double percentChange = (2 * Math.random() * maxDeltaPercent) - maxDeltaPercent;
103
104 return price * (100 + percentChange) / 100;
105 }
106
107 protected int getNumberOfMessages(HttpServletRequest request) {
108 String name = request.getParameter("count");
109 if (name != null) {
110 return Integer.parseInt(name);
111 }
112 return 1;
113 }
114 }