KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > jmeter > module > integration > JMeterIntegrationEngine


1 /*
2  * The contents of this file are subject to the terms of the Common Development
3  * and Distribution License (the License). You may not use this file except in
4  * compliance with the License.
5  *
6  * You can obtain a copy of the License at http://www.netbeans.org/cddl.html
7  * or http://www.netbeans.org/cddl.txt.
8  *
9  * When distributing Covered Code, include this CDDL Header Notice in each file
10  * and include the License file at http://www.netbeans.org/cddl.txt.
11  * If applicable, add the following below the CDDL Header, with the fields
12  * enclosed by brackets [] replaced by your own identifying information:
13  * "Portions Copyrighted [year] [name of copyright owner]"
14  *
15  * The Original Software is NetBeans. The Initial Developer of the Original
16  * Software is Sun Microsystems, Inc. Portions Copyright 1997-2006 Sun
17  * Microsystems, Inc. All Rights Reserved.
18  */

19
20 package org.apache.jmeter.module.integration;
21
22 import java.awt.Component JavaDoc;
23 import java.awt.Image JavaDoc;
24 import java.io.BufferedInputStream JavaDoc;
25 import java.io.File JavaDoc;
26 import java.io.FileInputStream JavaDoc;
27 import java.io.FilenameFilter JavaDoc;
28 import java.io.IOException JavaDoc;
29 import java.io.InputStream JavaDoc;
30 import java.net.URL JavaDoc;
31 import java.util.ArrayList JavaDoc;
32 import java.util.Collection JavaDoc;
33 import java.util.Collections JavaDoc;
34 import java.util.Iterator JavaDoc;
35 import java.util.LinkedList JavaDoc;
36 import java.util.List JavaDoc;
37 import java.util.Locale JavaDoc;
38 import java.util.Map JavaDoc;
39 import java.util.WeakHashMap JavaDoc;
40 import java.util.concurrent.Semaphore JavaDoc;
41 import javax.swing.JPopupMenu JavaDoc;
42
43 import org.apache.jmeter.engine.JMeterEngine;
44 import org.apache.jmeter.engine.StandardJMeterEngine;
45 import org.apache.jmeter.engine.TreeCloner;
46 import org.apache.jmeter.engine.event.LoopIterationEvent;
47 import org.apache.jmeter.module.JMXTypeDataNode;
48 import org.apache.jmeter.module.exceptions.InitializationException;
49 import org.apache.jmeter.module.loadgenerator.spi.impl.ProcessDescriptor;
50 import org.apache.jmeter.reporters.ResultCollector;
51 import org.apache.jmeter.save.SaveService;
52 import org.apache.jmeter.testelement.TestElement;
53 import org.apache.jmeter.testelement.TestListener;
54 import org.apache.jmeter.testelement.TestPlan;
55 import org.apache.jmeter.util.JMeterUtils;
56 import org.apache.jmeter.visualizers.Visualizer;
57 import org.apache.jorphan.collections.HashTree;
58 import org.apache.jorphan.collections.HashTreeTraverser;
59 import org.openide.filesystems.FileAttributeEvent;
60 import org.openide.filesystems.FileChangeListener;
61 import org.openide.filesystems.FileEvent;
62 import org.openide.filesystems.FileObject;
63 import org.openide.filesystems.FileRenameEvent;
64 import org.openide.filesystems.FileUtil;
65 import org.openide.modules.InstalledFileLocator;
66 import org.openide.util.Utilities;
67
68 /**
69  *
70  * @author Jaroslav Bachorik
71  */

72 public class JMeterIntegrationEngine {
73   private static JMeterIntegrationEngine instance;
74   
75   private static Semaphore JavaDoc instanceLock = new Semaphore JavaDoc(1);
76   private Semaphore JavaDoc parserLock = new Semaphore JavaDoc(1);
77   
78   private Map JavaDoc<String JavaDoc, HashTree> testPlans;
79   
80   private Collection JavaDoc<ProcessDescriptor> processes;
81   
82   private static String JavaDoc jmeterPath;
83   
84   private class TestProcessListener implements TestListener {
85     private ProcessDescriptor descriptor = null;
86     
87     public TestProcessListener(final ProcessDescriptor process) {
88       descriptor = process;
89     }
90     
91     public void testStarted(String JavaDoc string) {
92       descriptor.setRunning(true);
93     }
94     
95     public void testEnded(String JavaDoc string) {
96       descriptor.setRunning(false);
97     }
98     
99     public void testIterationStart(LoopIterationEvent loopIterationEvent) {
100     }
101     
102     public void testStarted() {
103       descriptor.setRunning(true);
104     }
105     
106     public void testEnded() {
107       descriptor.setRunning(false);
108     }
109     
110   }
111   
112   private static String JavaDoc jmeterCP = System.getProperty("java.class.path");
113   
114   /** Creates a new instance of JMeterIntegrationEngine */
115   private JMeterIntegrationEngine() {
116     testPlans = new WeakHashMap JavaDoc<String JavaDoc, HashTree>();
117     processes = Collections.synchronizedCollection(new ArrayList JavaDoc<ProcessDescriptor>());
118   }
119   
120   /**
121    * Singleton getter
122    */

123   public static JMeterIntegrationEngine getDefault() throws InitializationException {
124     if (instance == null) {
125       try {
126         instanceLock.acquire();
127         if (instance == null) {
128           instance = new JMeterIntegrationEngine();
129           instance.initJMeter();
130         }
131       } catch (InterruptedException JavaDoc ex) {
132         ex.printStackTrace();
133         throw new InitializationException();
134       } catch (Exception JavaDoc e) {
135         e.printStackTrace();
136       } finally {
137         instanceLock.release();
138       }
139     }
140     
141     String JavaDoc classpath = System.getProperty("java.class.path");
142     if (classpath.indexOf("ApacheJMeter_core") == -1) {
143       System.setProperty("java.class.path", classpath + File.pathSeparator + jmeterCP);
144     }
145     return instance;
146   }
147   
148   public List JavaDoc<TestElement> getChildren(final TestElement parent, final String JavaDoc testPlan) {
149     List JavaDoc<TestElement> children = new ArrayList JavaDoc<TestElement>();
150     
151     for(Object JavaDoc elementObj : getPlanTree(testPlan, false).list(parent)) {
152       children.add((TestElement)elementObj);
153     }
154     
155     return children;
156   }
157   
158   public List JavaDoc<TestElement> getChildren(final List JavaDoc<TestElement> elementPath, final String JavaDoc testPlan) {
159     List JavaDoc<TestElement> children = new ArrayList JavaDoc<TestElement>();
160     
161     for(Object JavaDoc elementObj : getPlanTree(testPlan, false).list(elementPath)) {
162       children.add((TestElement)elementObj);
163     }
164     
165     return children;
166   }
167   
168   public TestElement getRoot(final String JavaDoc testPlan) {
169     HashTree planTree = getPlanTree(testPlan, false);
170     
171     return (TestElement)planTree.getArray()[0];
172   }
173   
174   public ProcessDescriptor runTestPlan(final String JavaDoc testPlan) {
175     HashTree planTree = getPlanTree(testPlan, true);
176     TestElement root = getRoot(testPlan);
177     
178     JMeterEngine engine = new StandardJMeterEngine();
179     
180     planTree.traverse(new HashTreeTraverser() {
181       public void addNode(Object JavaDoc object, HashTree hashTree) {
182         if (object instanceof TestElement) {
183           if (object instanceof ResultCollector) {
184             ResultCollector collector = (ResultCollector)object;
185             collector.setListener((Visualizer)getElementCustomizer(collector));
186           }
187         }
188       }
189       public void processPath() {
190       }
191       public void subtractNode() {
192       }
193     });
194     
195     TreeCloner cloner = new TreeCloner(false);
196     planTree.traverse(cloner);
197     
198     ProcessDescriptor process = new ProcessDescriptor(engine, testPlan, root.getPropertyAsString(TestElement.NAME), true);
199     HashTree runtimeTree = cloner.getClonedTree();
200     
201     runtimeTree.add(new TestProcessListener(process));
202     
203     engine.configure(runtimeTree);
204     try {
205       engine.runTest();
206       processes.add(process);
207     } catch (Exception JavaDoc e) {
208       e.printStackTrace();
209       process = null;
210     }
211     
212     return process;
213   }
214   
215   public ProcessDescriptor prepareTest(final String JavaDoc testPlan) {
216     HashTree planTree = getPlanTree(testPlan, true);
217     TestElement root = getRoot(testPlan);
218     
219     JMeterEngine engine = new StandardJMeterEngine();
220     
221     planTree.traverse(new HashTreeTraverser() {
222       public void addNode(Object JavaDoc object, HashTree hashTree) {
223         if (object instanceof TestElement) {
224           if (object instanceof ResultCollector) {
225             ResultCollector collector = (ResultCollector)object;
226             collector.setListener((Visualizer)getElementCustomizer(collector));
227           }
228         }
229       }
230       public void processPath() {
231       }
232       public void subtractNode() {
233       }
234     });
235     
236     TreeCloner cloner = new TreeCloner(false);
237     planTree.traverse(cloner);
238     
239     ProcessDescriptor process = new ProcessDescriptor(engine, testPlan, root.getPropertyAsString(TestElement.NAME), true);
240     HashTree runtimeTree = cloner.getClonedTree();
241     
242     TestPlan plan = (TestPlan)runtimeTree.getArray()[0];
243     Map JavaDoc userVariables = plan.getUserDefinedVariables();
244     
245     if (userVariables.containsKey("nb.enabled")) {
246       process.setNbReady(true);
247       process.setThreadsCount(Integer.parseInt((String JavaDoc)userVariables.get("nb.users")));
248       process.setRampup(Integer.parseInt((String JavaDoc)userVariables.get("nb.rampup")));
249       process.setInterleave(Integer.parseInt((String JavaDoc)userVariables.get("nb.interleave")));
250     }
251     
252     runtimeTree.add(runtimeTree.getArray()[0], new TestProcessListener(process));
253     engine.configure(runtimeTree);
254     
255     return process;
256   }
257   
258   public void runTestPlan(final ProcessDescriptor descriptor) {
259     try {
260       descriptor.getEngine().runTest();
261     } catch (Exception JavaDoc e) {
262       e.printStackTrace();
263     }
264   }
265   
266   public void stopTestPlan(final ProcessDescriptor descriptor) {
267     descriptor.getEngine().stopTest();
268   }
269   
270   public Collection JavaDoc<ProcessDescriptor> getProcesses() {
271     Collection JavaDoc<ProcessDescriptor> result = new ArrayList JavaDoc<ProcessDescriptor>();
272     result.addAll(processes);
273     
274     return result;
275   }
276   
277   public Component JavaDoc getElementCustomizer(final TestElement element) {
278     return JMeterGUISupport.getDefault().getGui(element);
279   }
280   
281   public Image JavaDoc getElementIcon(final TestElement element) {
282     return JMeterGUISupport.getDefault().getIcon(element);
283   }
284   
285   public JPopupMenu JavaDoc getElementMenu(final TestElement element) {
286     return JMeterGUISupport.getDefault().getPopup(element);
287   }
288   
289   public void add(final List JavaDoc<TestElement> parentPath, final TestElement child, final String JavaDoc testPlan) {
290     HashTree planTree = getPlanTree(testPlan, false);
291     HashTree newTree = planTree.getTree(parentPath);
292     
293     if (planTree != null) {
294       planTree.getTree(parentPath).add(child);
295     }
296   }
297   
298   public HashTree getPlanTree(final String JavaDoc testPlan, final boolean forceReload) {
299     HashTree planTree = forceReload ? null : testPlans.get(testPlan);
300     
301     if (planTree == null) {
302       try {
303         parserLock.acquire();
304         if (planTree == null) {
305           planTree = parseJMeterTree(testPlan);
306           testPlans.put(testPlan, planTree);
307         }
308       } catch (InterruptedException JavaDoc e) {
309         e.printStackTrace();
310       } finally {
311         parserLock.release();
312       }
313     }
314     
315     return planTree;
316   }
317   
318   public Process JavaDoc externalEdit(final String JavaDoc scriptPath) throws IOException JavaDoc {
319     // final String cmdProcessor = (Utilities.isWindows() ? "call" : "sh");
320
final String JavaDoc jmeterRoot = jmeterPath + File.separator + "bin";
321     final String JavaDoc jmeterExecutable = jmeterRoot + File.separator + "jmeter" + (Utilities.isWindows() ? ".bat" : "");
322     
323     String JavaDoc[] params = null;
324     System.out.println("Userdir = " + jmeterRoot);
325     System.out.println("Scirptpath = " + decoratePath(scriptPath));
326     
327     if (Utilities.isWindows()) {
328       params = new String JavaDoc[]{
329         jmeterExecutable,
330         "-t",
331         decoratePath(scriptPath)
332       };
333     } else {
334       params = new String JavaDoc[]{
335         "sh",
336         jmeterExecutable,
337         "-t",
338         decoratePath(scriptPath)
339       };
340     }
341     return Runtime.getRuntime().exec(params,null,new File JavaDoc(jmeterRoot));
342   }
343   
344   public void cleanup() {
345     Iterator JavaDoc<ProcessDescriptor> iter = processes.iterator();
346     while(iter.hasNext()) {
347       ProcessDescriptor desc = iter.next();
348       if (!desc.isRunning()) {
349         iter.remove();
350       }
351     }
352   }
353   
354   public static String JavaDoc getLogPath() {
355     return JMeterUtils.getJMeterHome() + File.separator + "summariser.log"; //NOI18N
356
}
357   
358   public static void clearLog() {
359     // try {
360
// File file = new File(getLogPath());
361
// if (file.exists()) {
362
// file.delete();
363
// }
364
// if (file.createNewFile()) {
365
// LoggingManager.setTarget(new FileWriter(file));
366
// }
367
// } catch (IOException e) {
368
// // IGNORE
369
// }
370
}
371   
372   /**
373    * Initializes JMeter subsystem - sets all properties required by JMeter and calls static methods to initialize JMeter internals
374    */

375   private static void initJMeter() throws InitializationException {
376     // try to locate the module jar
377
URL JavaDoc rsrc = JMXTypeDataNode.class.getResource("/org/apache/jmeter/JMeter.class"); // NOI18N
378

379     File JavaDoc userDir = InstalledFileLocator.getDefault().locate("modules/jmeter/bin/jmeter.properties", "org.apache.jmeter.module", false); // NOI18N
380
try {
381       jmeterPath = userDir.getCanonicalPath();
382       System.out.println("Calculated JMeter path = " + jmeterPath);
383       jmeterPath = jmeterPath.substring(0, jmeterPath.lastIndexOf("modules" + File.separator + "jmeter") + ("modules" + File.separator + "jmeter").length()); // NOI18N
384
System.out.println("Modified JMeter path = " + jmeterPath);
385       // change user.dir property - it's required by JMeter
386
// System.setProperty("user.dir", jmeterPath + File.separator + "bin"); // NOI18N
387
// set JMeter home
388
JMeterUtils.setJMeterHome(jmeterPath);
389       // add plugins to classpath
390
final String JavaDoc extPath = jmeterPath + File.separator + "lib" + File.separator + "ext";
391       File JavaDoc dir = new File JavaDoc(extPath);
392       String JavaDoc[] jars = dir.list(new FilenameFilter JavaDoc() {
393         public boolean accept(File JavaDoc f, String JavaDoc name) {
394           if (name.endsWith(".jar")) {
395             return true;
396           }
397           return false;
398         }
399       });
400       String JavaDoc classPath = System.getProperty("java.class.path");
401       String JavaDoc separator = System.getProperty("path.separator");
402       
403       StringBuffer JavaDoc newClassPath = new StringBuffer JavaDoc();
404       for(String JavaDoc jar : jars) {
405         newClassPath.append(separator).append(extPath).append(File.separator).append(jar);
406       }
407       jmeterCP = newClassPath.toString();
408       
409       // call getProperties - this call also initializes the properties (pretty nasty hack)
410
JMeterUtils.getProperties(userDir.getCanonicalPath());
411       //
412
// // initialize the rest of JMeter - JMeter initializes some static fields within the constructor -> it's hell
413
JMeterUtils.setLocale(Locale.getDefault());
414       // LoggingManager.setTarget(new FileWriter(getLogPath()));
415
} catch (IOException JavaDoc e) {
416       throw new InitializationException(e);
417     }
418   }
419   
420   private HashTree parseJMeterTree(final String JavaDoc planPath) {
421     FileObject planFile = FileUtil.toFileObject(new File JavaDoc(planPath));
422     return parseJMeterTree(planFile);
423   }
424   
425   private HashTree parseJMeterTree(final FileObject file) {
426     InputStream JavaDoc planInputStream = null;
427     HashTree rootTree = null;
428     try {
429       planInputStream = new BufferedInputStream JavaDoc(new FileInputStream JavaDoc(FileUtil.toFile(file)));
430       rootTree = SaveService.loadTree(planInputStream);
431       
432       // Remove the disabled items
433
convertSubTree(rootTree);
434       
435     } catch (Exception JavaDoc e) {
436       e.printStackTrace();
437     }
438     
439     return rootTree;
440   }
441   
442   // no clue about the purpose; JMeter requires it
443
private void convertSubTree(HashTree tree) {
444     Iterator JavaDoc iter = new LinkedList JavaDoc(tree.list()).iterator();
445     while (iter.hasNext()) {
446       TestElement item = (TestElement) iter.next();
447       if (!item.isEnabled() || item instanceof ResultCollector) {
448         tree.remove(item);
449       } else {
450         if (item instanceof TestPlan) {
451           TestPlan tp = (TestPlan) item;
452           tp.setFunctionalMode(tp.isFunctionalMode());
453           tp.setSerialized(tp.isSerialized());
454         }
455         convertSubTree(tree.getTree(item));
456       }
457     }
458   }
459   
460   private String JavaDoc decoratePath(final String JavaDoc path) {
461     if (Utilities.isWindows() && path.indexOf(' ') > -1) {
462       return "\"" + path + "\"";
463     }
464     return path;
465   }
466 }
467
Popular Tags