/** * Refactored from AbstractAction.java * * @param tree */ public static void ConvertSubTree(HashTree tree) { LinkedList <Object> copyList = new LinkedList <Object>(tree.list()); foreach (Object obj in copyList) { if (typeof(TestElement).IsAssignableFrom(obj.GetType())) { TestElement item = (TestElement)obj; if (item.isEnabled()) { if (typeof(ReplaceableController).IsAssignableFrom(item.GetType())) { ReplaceableController rc; // TODO this bit of code needs to be tidied up // Unfortunately ModuleController is in components, not core if (item.GetType().Name.Equals("org.apache.jmeter.control.ModuleController")) { // Bug 47165 rc = (ReplaceableController)item; } else { // HACK: force the controller to load its tree rc = (ReplaceableController)item.Clone(); } HashTree subTree = tree.GetTree(item); if (subTree != null) { HashTree replacementTree = rc.getReplacementSubTree(); if (replacementTree != null) { ConvertSubTree(replacementTree); tree.Replace(item, rc); tree.Set(rc, replacementTree); } } else { // null subTree ConvertSubTree(tree.GetTree(item)); } } else { // not Replaceable Controller ConvertSubTree(tree.GetTree(item)); } } else { // Not enabled tree.Remove(item); } } else { // Not a TestElement NetMeterTreeNode item = (NetMeterTreeNode)obj; if (item.isEnabled()) { // Replacement only needs to occur when starting the engine // @see StandardJMeterEngine.run() if (item.getUserObject() is ReplaceableController) { ReplaceableController rc = (ReplaceableController)item.getTestElement(); HashTree subTree = tree.GetTree(item); if (subTree != null) { HashTree replacementTree = rc.getReplacementSubTree(); if (replacementTree != null) { ConvertSubTree(replacementTree); tree.Replace(item, rc); tree.Set(rc, replacementTree); } } } else { // Not a ReplaceableController ConvertSubTree(tree.GetTree(item)); TestElement testElement = item.getTestElement(); tree.Replace(item, testElement); } } else { // Not enabled tree.Remove(item); } } } }
// run test in batch mode private void RunTest(String testFile, String logFile, Boolean remoteStart, String remote_hosts_string) { FileStream reader = null; try { if (!File.Exists(testFile)) { println("Could not open " + testFile); return; } //FileServer.getFileServer().setBaseForScript(f); reader = new FileStream(testFile, FileMode.Open, FileAccess.Read, FileShare.Read); log.Info("Loading file: " + testFile); HashTree tree = IOService.loadTree(reader); // Deliberate use of deprecated ctor NetMeterTreeModel treeModel = new NetMeterTreeModel(new Object());// Create non-GUI version to avoid headless problems NetMeterTreeNode root = (NetMeterTreeNode)treeModel.getRoot(); treeModel.addSubTree(tree, root); // Hack to resolve ModuleControllers in non GUI mode SearchByType <ReplaceableController> replaceableControllers = new SearchByType <ReplaceableController>(); tree.Traverse(replaceableControllers); List <ReplaceableController> replaceableControllersRes = replaceableControllers.GetSearchResults(); foreach (ReplaceableController controller in replaceableControllersRes) { controller.resolveReplacementSubTree(root); } // Remove the disabled items // For GUI runs this is done in Start.java ConvertSubTree(tree); ResultCollector summer = null; String summariserName = "Summariser";//$NON-NLS-1$ log.Info("Creating summariser <" + summariserName + ">"); println("Creating summariser <" + summariserName + ">"); summer = new ResultCollector(summariserName); if (logFile != null) { ResultCollector logger = new ResultCollector(summer); logger.setFilename(logFile); tree.Add(tree.GetArray()[0], logger); } else { // only add Summariser if it can not be shared with the ResultCollector if (summer != null) { tree.Add(tree.GetArray()[0], summer); } } LinkedList <NetMeterEngine> engines = new LinkedList <NetMeterEngine>(); tree.Put(tree.GetArray()[0], new ListenToTest(parent, (remoteStart && remoteStop) ? engines : null)); println("Created the tree successfully using " + testFile); if (!remoteStart) { NetMeterEngine engine = new StandardEngine(); engine.Configure(tree); Int64 now = DateTime.Now.Ticks; println("Starting the test @ " + DateTime.Now.ToString() + " (" + now + ")"); engine.RunTest(); engines.AddLast(engine); } //else //{ // java.util.StringTokenizer st = new java.util.StringTokenizer(remote_hosts_string, ",");//$NON-NLS-1$ // List<String> failingEngines = new ArrayList<String>(st.countTokens()); // while (st.hasMoreElements()) // { // String el = (String) st.nextElement(); // println("Configuring remote engine for " + el); // log.info("Configuring remote engine for " + el); // JMeterEngine eng = doRemoteInit(el.trim(), tree); // if (null != eng) // { // engines.add(eng); // } // else // { // failingEngines.add(el); // println("Failed to configure "+el); // } // } // if (engines.isEmpty()) // { // println("No remote engines were started."); // return; // } // if(failingEngines.size()>0) { // throw new IllegalArgumentException("The following remote engines could not be configured:"+failingEngines); // } // println("Starting remote engines"); // log.Info("Starting remote engines"); // long now = System.currentTimeMillis(); // println("Starting the test @ "+new Date(now)+" ("+now+")"); // foreach (NetMeterEngine engine in engines) // { // engine.runTest(); // } // println("Remote engines have been started"); // log.Info("Remote engines have been started"); //} StartUdpDdaemon(engines); } catch (Exception e) { System.Console.WriteLine("Error in NonGUIDriver " + e.Message); log.Error("Error in NonGUIDriver", e); } finally { reader.Close(); } }