KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tc > simulator > crasher > Crasher


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.tc.simulator.crasher;
5
6 import org.apache.commons.io.FileUtils;
7
8 import com.tc.exception.TCRuntimeException;
9
10 import java.io.File JavaDoc;
11 import java.io.IOException JavaDoc;
12 import java.text.DateFormat JavaDoc;
13 import java.text.SimpleDateFormat JavaDoc;
14 import java.util.ArrayList JavaDoc;
15 import java.util.Arrays JavaDoc;
16 import java.util.Iterator JavaDoc;
17 import java.util.LinkedList JavaDoc;
18 import java.util.List JavaDoc;
19 import java.util.Random JavaDoc;
20
21 public class Crasher implements Runnable JavaDoc {
22
23   private static final DateFormat JavaDoc dateFormat = new SimpleDateFormat JavaDoc("M/d/y:H:m:s,S (Z)");
24   
25   private final Arguments args;
26
27   public Crasher(Arguments args) {
28     this.args = args;
29   }
30
31   public void run() {
32     System.out.println("instance count: " + args.getInstanceCount());
33     System.out.println("classname: " + args.getClassname());
34     System.out.println("crash freq: " + args.getCrashFrequency());
35     System.out.println("args: " + args.getMainClassArgs());
36     System.out.println("server args: " + args.getServerArgs());
37
38     File JavaDoc outputDirectory = new File JavaDoc(args.getOutputDirectoryname());
39     if (!outputDirectory.exists()) {
40       System.out.println("output directory doesn't exist. attempting to create: " + outputDirectory);
41       try {
42         FileUtils.forceMkdir(outputDirectory);
43       } catch (IOException JavaDoc e) {
44         throw new TCRuntimeException(e);
45       }
46     } else {
47       System.out.println("output directory: " + outputDirectory);
48     }
49
50     System.out.println("output prefix: " + args.getOutputPrefix());
51
52     ProcessContainer[] processes = new ProcessContainer[args.getInstanceCount()];
53     for (int i = 0; i < processes.length; i++) {
54       try {
55         processes[i] = new ProcessContainer(new ProcessContainerConfig(i + "", dateFormat, args.getServerArgs(), args.getClassname(),
56                                                                        args.getMainClassArgs(), outputDirectory, args
57                                                                            .getOutputPrefix()));
58       } catch (IOException JavaDoc e) {
59         throw new TCRuntimeException(e);
60       }
61     }
62
63     try {
64       doStuff(processes);
65     } catch (Exception JavaDoc e) {
66       throw new TCRuntimeException(e);
67     }
68   }
69
70   private void doStuff(ProcessContainer[] processes) throws IOException JavaDoc, InterruptedException JavaDoc {
71     Random JavaDoc random = new Random JavaDoc();
72     while (true) {
73       for (int i = 0; i < processes.length; i++) {
74         ProcessContainer process = processes[i];
75         if (process.isStopped()) {
76           System.out.println("Starting process " + i + "...");
77           process.start();
78         } else if (random.nextInt(100) <= (args.crashFrequency * 100)) {
79           System.out.println("Stopping process " + i + "...");
80           process.stop();
81           System.out.println("Starting process " + i + "...");
82           process.start();
83         }
84       }
85       Thread.sleep(10 * 1000);
86     }
87
88   }
89
90   public static class Arguments {
91     private static final String JavaDoc CLASSNAME_ARG = "--crasher:classname";
92     private static final String JavaDoc INSTANCE_COUNT_ARG = "--crasher:instance-count";
93     private static final String JavaDoc CRASH_FREQUENCY_ARG = "--crasher:crash-frequency";
94     private static final String JavaDoc SERVER_ARGS_PREFIX = "--crasher:server-arg";
95     private static final String JavaDoc OUTPUT_DIRECTORYNAME_ARG = "--crasher:output-directory";
96     private static final String JavaDoc OUTPUT_PREFIX_ARG = "--crasher:output-prefix";
97
98     private final List JavaDoc args;
99     private List JavaDoc serverArgs;
100     private int instanceCount;
101     private String JavaDoc classname;
102     private double crashFrequency;
103     private String JavaDoc outputDirectoryname;
104     private String JavaDoc outputPrefix;
105
106     public Arguments(String JavaDoc[] args) {
107       this.args = new LinkedList JavaDoc(Arrays.asList(args));
108     }
109
110     public List JavaDoc getServerArgs() {
111       return new ArrayList JavaDoc(this.serverArgs);
112     }
113
114     public List JavaDoc getMainClassArgs() {
115       return new ArrayList JavaDoc(args);
116     }
117
118     public double getCrashFrequency() {
119       return this.crashFrequency;
120     }
121
122     public int getInstanceCount() {
123       return this.instanceCount;
124     }
125
126     public String JavaDoc getClassname() {
127       return this.classname;
128     }
129
130     public String JavaDoc getOutputDirectoryname() {
131       return this.outputDirectoryname;
132     }
133
134     public String JavaDoc getOutputPrefix() {
135       return this.outputPrefix;
136     }
137
138     public synchronized boolean parse() {
139       try {
140         this.instanceCount = parseInstanceCount();
141         this.classname = parseClassname();
142         this.crashFrequency = parseCrashFrequency();
143         this.serverArgs = parseServerArgs();
144         this.outputDirectoryname = parseOutputDirectoryname();
145         this.outputPrefix = parseOutputPrefix();
146         addClasspath();
147
148       } catch (Exception JavaDoc e) {
149         e.printStackTrace();
150         return false;
151       }
152       return true;
153     }
154
155     private void addClasspath() {
156       this.serverArgs.add("-classpath");
157       this.serverArgs.add(System.getProperty("java.class.path"));
158     }
159
160     private String JavaDoc parseOutputPrefix() {
161       String JavaDoc rv = getArgumentValueAndPruneArgsArray(OUTPUT_PREFIX_ARG);
162       if (rv == null) { throw new RuntimeException JavaDoc("No such argument: " + OUTPUT_PREFIX_ARG); }
163       return rv;
164     }
165
166     private String JavaDoc parseOutputDirectoryname() {
167       String JavaDoc rv = getArgumentValueAndPruneArgsArray(OUTPUT_DIRECTORYNAME_ARG);
168       if (rv == null) { throw new RuntimeException JavaDoc("No such argument: " + OUTPUT_DIRECTORYNAME_ARG); }
169       return rv;
170     }
171
172     private List JavaDoc parseServerArgs() {
173       return getArgumentValuesAndPruneArgsArray(new ArrayList JavaDoc(), SERVER_ARGS_PREFIX);
174     }
175
176     private int parseInstanceCount() throws Exception JavaDoc {
177       return Integer.parseInt(getArgumentValueAndPruneArgsArray(INSTANCE_COUNT_ARG));
178     }
179
180     private String JavaDoc parseClassname() throws Exception JavaDoc {
181       String JavaDoc rv = getArgumentValueAndPruneArgsArray(CLASSNAME_ARG);
182       if (rv == null) { throw new RuntimeException JavaDoc("No such argument: " + CLASSNAME_ARG); }
183       return rv;
184     }
185
186     private double parseCrashFrequency() throws Exception JavaDoc {
187       return Double.parseDouble(getArgumentValueAndPruneArgsArray(CRASH_FREQUENCY_ARG));
188     }
189
190     private String JavaDoc getArgumentValueAndPruneArgsArray(String JavaDoc argumentPattern) {
191       List JavaDoc values = getArgumentValuesAndPruneArgsArray(new ArrayList JavaDoc(), argumentPattern);
192       return (String JavaDoc) ((values.size() > 0) ? values.get(0) : null);
193     }
194
195     private List JavaDoc getArgumentValuesAndPruneArgsArray(List JavaDoc list, String JavaDoc argumentPattern) {
196       List JavaDoc tmp = getArgumentsAndPruneArgsArray(new ArrayList JavaDoc(), argumentPattern);
197       for (Iterator JavaDoc i = tmp.iterator(); i.hasNext();) {
198         String JavaDoc arg = (String JavaDoc) i.next();
199         list.add(arg.substring(arg.indexOf('=') + 1, arg.length()));
200       }
201       return list;
202     }
203
204     private List JavaDoc getArgumentsAndPruneArgsArray(List JavaDoc list, String JavaDoc argumentPattern) {
205       for (Iterator JavaDoc i = args.iterator(); i.hasNext();) {
206         String JavaDoc arg = (String JavaDoc) i.next();
207         if (arg.startsWith(argumentPattern)) {
208           i.remove();
209           list.add(arg);
210         }
211       }
212       return list;
213     }
214
215     public StringBuffer JavaDoc usage(StringBuffer JavaDoc buf) {
216       buf.append("Crasher -- starts, crashes, and restarts Container instances.\n");
217       buf.append("Usage:\n");
218       buf.append("\tjava " + Crasher.class.getName() + " " + INSTANCE_COUNT_ARG + "=<instance count> "
219                  + CRASH_FREQUENCY_ARG + "=<crash frequency [0-1]> " + "[[" + SERVER_ARGS_PREFIX
220                  + "=<server arg>],...] " + OUTPUT_DIRECTORYNAME_ARG + "=<output directory> " + OUTPUT_PREFIX_ARG
221                  + "=<output prefix> " + CLASSNAME_ARG + "=<main class> <main class args>\n\n");
222       return buf;
223     }
224
225   }
226
227   public static void main(String JavaDoc[] args) throws Exception JavaDoc {
228     Arguments arguments = new Arguments(args);
229     if (!arguments.parse()) {
230       System.out.println(arguments.usage(new StringBuffer JavaDoc()));
231       return;
232     }
233     new Crasher(arguments).run();
234   }
235
236 }
Popular Tags