You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by se...@apache.org on 2007/05/07 17:10:49 UTC

svn commit: r535891 - in /jakarta/jmeter/branches/rel-2-2: src/core/org/apache/jmeter/gui/action/ src/core/org/apache/jmeter/gui/tree/ xdocs/

Author: sebb
Date: Mon May  7 08:10:46 2007
New Revision: 535891

URL: http://svn.apache.org/viewvc?view=rev&rev=535891
Log:
Bug 25441 - TestPlan changes sometimes detected incorrectly (isDirty)

Modified:
    jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/ActionNames.java
    jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/CheckDirty.java
    jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/Load.java
    jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/tree/JMeterTreeModel.java
    jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml

Modified: jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/ActionNames.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/ActionNames.java?view=diff&rev=535891&r1=535890&r2=535891
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/ActionNames.java (original)
+++ jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/ActionNames.java Mon May  7 08:10:46 2007
@@ -71,6 +71,7 @@
     public static final String SAVE_GRAPHICS_ALL= "save_graphics_all"; // $NON-NLS-1$
     public static final String SSL_MANAGER      = "sslManager"; // $NON-NLS-1$
     public static final String SUB_TREE_LOADED  = "sub_tree_loaded"; // $NON-NLS-1$
+    public static final String SUB_TREE_MERGED  = "sub_tree_merged"; // $NON-NLS-1$
     public static final String SUB_TREE_SAVED   = "sub_tree_saved"; // $NON-NLS-1$
     public static final String WHAT_CLASS       = "what_class"; // $NON-NLS-1$
 

Modified: jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/CheckDirty.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/CheckDirty.java?view=diff&rev=535891&r1=535890&r2=535891
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/CheckDirty.java (original)
+++ jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/CheckDirty.java Mon May  7 08:10:46 2007
@@ -34,8 +34,8 @@
 import org.apache.log.Logger;
 
 /**
- * @author mstover
- * @version $Revision$
+ * Check if the TestPlan has been changed since it was last saved
+ *
  */
 public class CheckDirty extends AbstractAction implements HashTreeTraverser, ActionListener {
 	private static final Logger log = LoggingManager.getLoggerForClass();
@@ -52,6 +52,7 @@
 	static {
 		commands.add(ActionNames.CHECK_DIRTY);
 		commands.add(ActionNames.SUB_TREE_SAVED);
+		commands.add(ActionNames.SUB_TREE_MERGED);
 		commands.add(ActionNames.SUB_TREE_LOADED);
 		commands.add(ActionNames.ADD_ALL);
 		commands.add(ActionNames.CHECK_REMOVE);
@@ -91,12 +92,18 @@
 			}
 			removeMode = false;
 		}
-		checkMode = true;
-		dirty = false;
-		HashTree wholeTree = GuiPackage.getInstance().getTreeModel().getTestPlan();
-		wholeTree.traverse(this);
+		// If we are merging in another test plan, we know the test plan is dirty now
+		if(action.equals(ActionNames.SUB_TREE_MERGED)) {
+			dirty = true;
+		}
+		else {
+			dirty = false;
+			checkMode = true;
+			HashTree wholeTree = GuiPackage.getInstance().getTreeModel().getTestPlan();
+			wholeTree.traverse(this);
+			checkMode = false;
+		}
 		GuiPackage.getInstance().setDirty(dirty);
-		checkMode = false;
 	}
 
 	/**
@@ -107,12 +114,15 @@
 		log.debug("Node is class:" + node.getClass());
 		JMeterTreeNode treeNode = (JMeterTreeNode) node;
 		if (checkMode) {
-			if (previousGuiItems.containsKey(treeNode)) {
-				if (!previousGuiItems.get(treeNode).equals(treeNode.getTestElement())) {
+			// Only check if we have not found any differences so far
+			if(!dirty) {
+				if (previousGuiItems.containsKey(treeNode)) {
+					if (!previousGuiItems.get(treeNode).equals(treeNode.getTestElement())) {
+						dirty = true;
+					}
+				} else {
 					dirty = true;
 				}
-			} else {
-				dirty = true;
 			}
 		} else if (removeMode) {
 			previousGuiItems.remove(treeNode);

Modified: jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/Load.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/Load.java?view=diff&rev=535891&r1=535890&r2=535891
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/Load.java (original)
+++ jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/action/Load.java Mon May  7 08:10:46 2007
@@ -35,6 +35,7 @@
 import org.apache.jmeter.gui.util.FileDialoger;
 import org.apache.jmeter.save.SaveService;
 import org.apache.jmeter.services.FileServer;
+import org.apache.jmeter.testelement.TestElement;
 import org.apache.jmeter.testelement.TestPlan;
 import org.apache.jmeter.util.JMeterUtils;
 import org.apache.jorphan.collections.HashTree;
@@ -45,13 +46,13 @@
 import com.thoughtworks.xstream.converters.ConversionException;
 
 /**
- * @author Michael Stover
- * @version $Revision$
+ * Load a new file, replacing whatever was present.
+ *
  */
 public class Load implements Command {
 	private static final Logger log = LoggingManager.getLoggerForClass();
 
-	private static final boolean expandTree = JMeterUtils.getPropDefault("onload.expandtree", true);
+	private static final boolean expandTree = JMeterUtils.getPropDefault("onload.expandtree", true); //$NON-NLS-1$
 	
 	private static Set commands = new HashSet();
 	static {
@@ -68,31 +69,34 @@
 	}
 
 	public void doAction(ActionEvent e) {
-		boolean merging = e.getActionCommand().equals(ActionNames.MERGE);
-
-		if (!merging) {
-			ActionRouter.getInstance().doActionNow(new ActionEvent(e.getSource(), e.getID(), "close"));
-		}
-
-		JFileChooser chooser = FileDialoger.promptToOpenFile(new String[] { ".jmx" });
+		JFileChooser chooser = FileDialoger.promptToOpenFile(new String[] { ".jmx" }); //$NON-NLS-1$
 		if (chooser == null) {
 			return;
 		}
-		boolean isTestPlan = false;
 		InputStream reader = null;
-		File f = null;
 		try {
-			f = chooser.getSelectedFile();
+            File f = chooser.getSelectedFile();
 			if (f != null) {
+                boolean isTestPlan = false;
+                boolean merging = e.getActionCommand().equals(ActionNames.MERGE);
+
 				if (merging) {
 					log.info("Merging file: " + f);
 				} else {
 					log.info("Loading file: " + f);
+                    // Close the test plan currently open
+					ActionRouter.getInstance().doActionNow(new ActionEvent(e.getSource(), e.getID(), ActionNames.CLOSE));
+
 					FileServer.getFileServer().setBasedir(f.getAbsolutePath());
 				}
 				reader = new FileInputStream(f);
 				HashTree tree = SaveService.loadTree(reader);
-				isTestPlan = insertLoadedTree(e.getID(), tree);
+				isTestPlan = insertLoadedTree(e.getID(), tree, merging);
+                
+                // don't change name if merging
+                if (!merging && isTestPlan) {
+                    GuiPackage.getInstance().setTestPlanFile(f.getAbsolutePath());
+                }
 			}
 		} catch (NoClassDefFoundError ex) // Allow for missing optional jars
 		{
@@ -117,28 +121,39 @@
 			GuiPackage.getInstance().updateCurrentGui();
 			GuiPackage.getInstance().getMainFrame().repaint();
 		}
-		// don't change name if merging
-		if (!merging && isTestPlan && f != null) {
-			GuiPackage.getInstance().setTestPlanFile(f.getAbsolutePath());
-		}
 	}
 
 	/**
 	 * Returns a boolean indicating whether the loaded tree was a full test plan
 	 */
-	public boolean insertLoadedTree(int id, HashTree tree) throws Exception, IllegalUserActionException {
+	public boolean insertLoadedTree(int id, HashTree tree, boolean merging) throws Exception, IllegalUserActionException {
 		// convertTree(tree);
 		if (tree == null) {
 			throw new Exception("Error in TestPlan - see log file");
 		}
 		boolean isTestPlan = tree.getArray()[0] instanceof TestPlan;
+
+		// If we are loading a new test plan, initialize the tree with the testplan node we are loading
+		if(isTestPlan && !merging) {
+			GuiPackage.getInstance().getTreeModel().clearTestPlan((TestElement)tree.getArray()[0]);
+		}
+
 		HashTree newTree = GuiPackage.getInstance().addSubTree(tree);
 		GuiPackage.getInstance().updateCurrentGui();
 		GuiPackage.getInstance().getMainFrame().getTree().setSelectionPath(
 				new TreePath(((JMeterTreeNode) newTree.getArray()[0]).getPath()));
 		tree = GuiPackage.getInstance().getCurrentSubTree();
-		ActionRouter.getInstance().actionPerformed(
-				new ActionEvent(tree.get(tree.getArray()[tree.size() - 1]), id, ActionNames.SUB_TREE_LOADED));
+		// Send different event wether we are merging a test plan into another test plan,
+		// or loading a testplan from scratch
+		ActionEvent actionEvent = null;
+		if(!merging) {
+			actionEvent = new ActionEvent(tree.get(tree.getArray()[tree.size() - 1]), id, ActionNames.SUB_TREE_LOADED);
+		}
+		else {
+			actionEvent = new ActionEvent(tree.get(tree.getArray()[tree.size() - 1]), id, ActionNames.SUB_TREE_MERGED);
+		}
+
+		ActionRouter.getInstance().actionPerformed(actionEvent);
 	    if (expandTree) {
 			JTree jTree = GuiPackage.getInstance().getMainFrame().getTree();
 			   for(int i = 0; i < jTree.getRowCount(); i++) {
@@ -147,5 +162,9 @@
 	    }
 
 		return isTestPlan;
+	}
+    
+	public boolean insertLoadedTree(int id, HashTree tree) throws Exception, IllegalUserActionException {
+		return insertLoadedTree(id, tree, false);
 	}
 }

Modified: jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/tree/JMeterTreeModel.java
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/tree/JMeterTreeModel.java?view=diff&rev=535891&r1=535890&r2=535891
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/tree/JMeterTreeModel.java (original)
+++ jakarta/jmeter/branches/rel-2-2/src/core/org/apache/jmeter/gui/tree/JMeterTreeModel.java Mon May  7 08:10:46 2007
@@ -49,7 +49,8 @@
 
 	public JMeterTreeModel() {
 		super(new JMeterTreeNode(new WorkBenchGui().createTestElement(), null));
-		initTree();
+		TestElement tp = new TestPlanGui().createTestElement();
+		initTree(tp);
 	}
 
 	/**
@@ -174,19 +175,46 @@
 		return getCurrentSubTree((JMeterTreeNode) ((JMeterTreeNode) this.getRoot()).getChildAt(0));
 	}
 
+    /**
+     * Clear the test plan, and use default node for test plan and workbench
+     */
 	public void clearTestPlan() {
-		super.removeNodeFromParent((JMeterTreeNode) getChild(getRoot(), 0));
-		initTree();
-	}
-
-	private void initTree() {
 		TestElement tp = new TestPlanGui().createTestElement();
-		TestElement wb = new WorkBenchGui().createTestElement();
-		this.insertNodeInto(new JMeterTreeNode(tp, this), (JMeterTreeNode) getRoot(), 0);
-		try {
-			super.removeNodeFromParent((JMeterTreeNode) getChild(getRoot(), 1));
-		} catch (RuntimeException e) {
-		}
-		this.insertNodeInto(new JMeterTreeNode(wb, this), (JMeterTreeNode) getRoot(), 1);
+		clearTestPlan(tp);
+	}
+    
+    /**
+     * Clear the test plan, and use specified node for test plan and default node for workbench
+     * 
+     * @param testPlan the node to use as the testplan top node
+     */
+    public void clearTestPlan(TestElement testPlan) {
+        // Remove the workbench and testplan nodes
+        int children = getChildCount(getRoot());
+        while (children > 0) {
+            JMeterTreeNode child = (JMeterTreeNode)getChild(getRoot(), 0);
+            super.removeNodeFromParent(child);
+            children = getChildCount(getRoot());
+        }
+        // Init the tree
+        initTree(testPlan);
+    }
+    
+    /**
+     * Initialize the model with nodes for testplan and workbench. Use the specified
+     * node for testplan, and default node for workbench.
+     * 
+     * @param tp the element to use as testplan
+     */
+	private void initTree(TestElement tp) {
+        // Insert the test plan node
+        insertNodeInto(new JMeterTreeNode(tp, this), (JMeterTreeNode) getRoot(), 0);
+        // Insert the workbench node
+        TestElement wb = new WorkBenchGui().createTestElement();
+		insertNodeInto(new JMeterTreeNode(wb, this), (JMeterTreeNode) getRoot(), 1);
+        // Let others know that the tree content has changed.
+        // This should not be necessary, but without it, nodes are not shown when the user
+        // uses the Close menu item
+        nodeStructureChanged((JMeterTreeNode)getRoot());
 	}
 }

Modified: jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml?view=diff&rev=535891&r1=535890&r2=535891
==============================================================================
--- jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml (original)
+++ jakarta/jmeter/branches/rel-2-2/xdocs/changes.xml Mon May  7 08:10:46 2007
@@ -225,6 +225,7 @@
 <li>Bug 41078 - merge results in name change of test plan</li>
 <li>Bug 40077 - Creating new Elements copies values from Existing elements</li>
 <li>Bug 42325 - Implement the "clear" method for the LogicControllers</li>
+<li>Bug 25441 - TestPlan changes sometimes detected incorrectly (isDirty)</li>
 </ul>
 
 <h3>Version 2.2</h3>



---------------------------------------------------------------------
To unsubscribe, e-mail: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org