KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tctest > performance > servlets > LongRunningTestServlet


1 /*
2  * All content copyright (c) 2003-2006 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

4 package com.tctest.performance.servlets;
5
6 import java.io.IOException JavaDoc;
7 import java.io.PrintWriter JavaDoc;
8 import java.util.LinkedList JavaDoc;
9 import java.util.List JavaDoc;
10 import java.util.Random JavaDoc;
11
12 import javax.servlet.http.HttpServlet JavaDoc;
13 import javax.servlet.http.HttpServletRequest JavaDoc;
14 import javax.servlet.http.HttpServletResponse JavaDoc;
15 import javax.servlet.http.HttpSession JavaDoc;
16
17 public class LongRunningTestServlet extends HttpServlet JavaDoc {
18
19   protected void doGet(HttpServletRequest JavaDoc req, HttpServletResponse JavaDoc res) {
20     try {
21       doGet0(req, res);
22     } catch (Throwable JavaDoc t) {
23       t.printStackTrace();
24       throw new RuntimeException JavaDoc(t.getMessage());
25     }
26   }
27
28   private void doGet0(HttpServletRequest JavaDoc req, HttpServletResponse JavaDoc res) throws IOException JavaDoc {
29     Random JavaDoc random = new Random JavaDoc();
30
31     String JavaDoc action = req.getParameter("action");
32
33     if ("create".equals(action)) {
34       doCreate(req, res, random);
35     } else if ("mutate".equals(action)) {
36       doMutate(req, res, random);
37     } else if ("add".equals(action)) {
38       doAdd(req, res, random);
39     } else if ("remove".equals(action)) {
40       doRemove(req, res, random);
41     } else if ("invalidate".equals(action)) {
42       doInvalidate(req, res, random);
43     } else {
44       throw new AssertionError JavaDoc("unknown action: " + action);
45     }
46
47     createGarbageAndConsumeCPU(random);
48
49     res.setStatus(HttpServletResponse.SC_OK);
50     PrintWriter JavaDoc writer = res.getWriter();
51     writer.println("OK");
52   }
53
54   private void createGarbageAndConsumeCPU(Random JavaDoc random) {
55     List JavaDoc list = new LinkedList JavaDoc();
56
57     for (int i = 0; i < 512; i++) {
58       list.add(String.valueOf(System.currentTimeMillis()));
59     }
60
61     int hc = Math.abs(list.hashCode());
62     hc = hc == Integer.MIN_VALUE ? 0 : hc;
63
64     double d = 0;
65     while ((hc % 10000) != 0) {
66       d += hc;
67       d = Math.sqrt(d);
68       hc--;
69     }
70
71     if (d == random.nextDouble()) {
72       System.err.println("Really?");
73     }
74
75   }
76
77   private void doRemove(HttpServletRequest JavaDoc req, HttpServletResponse JavaDoc res, Random JavaDoc random) {
78     HttpSession JavaDoc session = getSession(req, false);
79
80     String JavaDoc[] attrs = session.getValueNames();
81     if (attrs.length == 0) { return; }
82
83     String JavaDoc attr = attrs[random.nextInt(attrs.length)];
84     session.removeAttribute(attr);
85   }
86
87   private void doInvalidate(HttpServletRequest JavaDoc req, HttpServletResponse JavaDoc res, Random JavaDoc random) {
88     HttpSession JavaDoc session = getSession(req, false);
89     session.invalidate();
90   }
91
92   private void doAdd(HttpServletRequest JavaDoc req, HttpServletResponse JavaDoc res, Random JavaDoc random) {
93     HttpSession JavaDoc session = getSession(req, false);
94     session.setAttribute("add" + System.currentTimeMillis(), makeGraph(random));
95   }
96
97   private void doMutate(HttpServletRequest JavaDoc req, HttpServletResponse JavaDoc res, Random JavaDoc random) {
98     HttpSession JavaDoc session = getSession(req, false);
99
100     String JavaDoc[] attrs = session.getValueNames();
101     if (attrs.length == 0) { return; }
102
103     String JavaDoc attr = attrs[random.nextInt(attrs.length)];
104     DataObject obj = (DataObject) session.getAttribute(attr);
105     obj.mutate(random);
106
107     // Do this for containers that require it (could be skipped for DSO, but it shouldn't matter)
108
session.setAttribute(attr, obj);
109   }
110
111   private void doCreate(HttpServletRequest JavaDoc req, HttpServletResponse JavaDoc res, Random JavaDoc random) {
112     HttpSession JavaDoc session = getSession(req, true);
113
114     Integer JavaDoc idle = Integer.valueOf(req.getParameter("idle"));
115     session.setMaxInactiveInterval(idle.intValue());
116
117     int numAttrs = random.nextInt(5);
118     for (int i = 0; i < numAttrs; i++) {
119       session.setAttribute("create" + i, makeGraph(random));
120     }
121   }
122
123   static DataObject makeGraph(Random JavaDoc random) {
124     return makeGraph(random, random.nextInt(100) + 1);
125   }
126
127   static HttpSession JavaDoc getSession(HttpServletRequest JavaDoc req, boolean expectedNewValue) {
128     HttpSession JavaDoc session = req.getSession(true);
129     boolean isNew = session.isNew();
130     if (expectedNewValue != isNew) { throw new AssertionError JavaDoc("session.isNew() has incorrect value: " + isNew
131                                                               + " for requested ID " + req.getRequestedSessionId()); }
132     return session;
133   }
134
135   static DataObject makeGraph(Random JavaDoc random, int maxNodes) {
136     int num = random.nextInt(maxNodes) + 1;
137     DataObject root = new DataObject();
138     for (int i = 0; i < num; i++) {
139       root.expand(random);
140     }
141     return root;
142   }
143
144   private static class DataObject {
145     private int f1;
146     private int f2;
147     private int f3;
148     private int f4;
149
150     private DataObject ref1;
151     private DataObject ref2;
152
153     private void mutateLocal() {
154       f1++;
155       f2++;
156       f3++;
157       f4++;
158     }
159
160     void mutate(Random JavaDoc random) {
161       mutateLocal();
162
163       if (random.nextBoolean()) {
164         if (ref1 != null) {
165           ref1.mutate(random);
166         }
167       } else {
168         if (ref2 != null) {
169           ref2.mutate(random);
170         }
171       }
172     }
173
174     void expand(Random JavaDoc random) {
175       if (ref1 == null && ref2 == null) {
176         ref1 = new DataObject();
177         return;
178       }
179
180       if (ref1 == null) {
181         if (random.nextBoolean()) {
182           ref2.expand(random);
183         } else {
184           ref1 = new DataObject();
185         }
186         return;
187       }
188
189       if (ref2 == null) {
190         if (random.nextBoolean()) {
191           ref1.expand(random);
192         } else {
193           ref2 = new DataObject();
194         }
195         return;
196       }
197
198       if (random.nextBoolean()) {
199         ref1.expand(random);
200       } else {
201         ref2.expand(random);
202       }
203     }
204   }
205
206 }
207
Popular Tags