jsalvata    2003/11/29 07:43:18

  Modified:    src/core/org/apache/jmeter/resources messages.properties
               src/protocol/http/org/apache/jmeter/protocol/http/proxy
                        ProxyControl.java
               src/protocol/http/org/apache/jmeter/protocol/http/proxy/gui
                        ProxyControlGui.java
  Log:
  Add a combo in the HTTP Proxy Server to select a
  controller to store the generated samples. The default
  selection is still to use the recording controller.
  
  Revision  Changes    Path
  1.72      +1 -0      
jakarta-jmeter/src/core/org/apache/jmeter/resources/messages.properties
  
  Index: messages.properties
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/resources/messages.properties,v
  retrieving revision 1.71
  retrieving revision 1.72
  diff -u -r1.71 -r1.72
  --- messages.properties       29 Nov 2003 00:41:30 -0000      1.71
  +++ messages.properties       29 Nov 2003 15:43:18 -0000      1.72
  @@ -280,6 +280,7 @@
   proxy_cl_error=If specifying a proxy server, host and port must be given
   proxy_headers=Capture HTTP Headers
   proxy_separators=Add Separators
  +proxy_target=Target Controller:
   proxy_title=HTTP Proxy Server
   proxy_usekeepalive=Set Keep-Alive
   ramp_up=Ramp-Up Period (in seconds):
  
  
  
  1.34      +108 -75   
jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java
  
  Index: ProxyControl.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/proxy/ProxyControl.java,v
  retrieving revision 1.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- ProxyControl.java 18 Nov 2003 19:02:43 -0000      1.33
  +++ ProxyControl.java 29 Nov 2003 15:43:18 -0000      1.34
  @@ -51,6 +51,10 @@
    * individuals on behalf of the Apache Software Foundation.  For more
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
  + * 
  + * @author  Michael Stover
  + * @author  <a href="mailto:[EMAIL PROTECTED]">Jordi Salvat i Alabart</a>
  + * @version $Id$
    */
   package org.apache.jmeter.protocol.http.proxy;
   
  @@ -84,18 +88,17 @@
   import org.apache.jmeter.testelement.property.PropertyIterator;
   import org.apache.jmeter.threads.ThreadGroup;
   import org.apache.jmeter.util.JMeterUtils;
  +
   import org.apache.jorphan.logging.LoggingManager;
  +
   import org.apache.log.Logger;
  +
   import org.apache.oro.text.MalformedCachePatternException;
   import org.apache.oro.text.PatternCacheLRU;
   import org.apache.oro.text.regex.Pattern;
   import org.apache.oro.text.regex.Perl5Compiler;
   import org.apache.oro.text.regex.Perl5Matcher;
   
  -/**
  - * @author     Michael Stover
  - * @version    $Revision$
  - */
   public class ProxyControl extends ConfigTestElement implements Serializable
   {
       transient private static Logger log = LoggingManager.getLoggerForClass();
  @@ -114,14 +117,20 @@
        public static final String ADD_SEPARATORS = "ProxyControlGui.add_separator";
        public static final String USE_KEEPALIVE  = "ProxyControlGui.use_keepalive";
   
  -
        private long lastTime = 0;//When was the last sample seen?
        private static final long sampleGap = 
            JMeterUtils.getPropDefault("proxy.pause",1000);//Detect if user has 
pressed a new link
        private boolean addAssertions;
        private boolean addSeparators;
        private boolean useKeepAlive;
  -
  +    
  +    /**
  +     * Tree node where the samples should be stored.
  +     * <p>
  +     * This property is not persistent.
  +     */
  +    private JMeterTreeNode target;
  +    
       public ProxyControl()
       {
           matcher = new Perl5Matcher();
  @@ -239,6 +248,23 @@
       {
           getIncludePatterns().clear();
       }
  +    
  +    /**
  +     * @return the target controller node
  +     */
  +    public JMeterTreeNode getTarget()
  +    {
  +        return target;
  +    }
  +    
  +    /**
  +     * Sets the target node where the samples generated by the proxy have
  +     * to be stored.
  +     */
  +    public void setTarget(JMeterTreeNode target)
  +    {
  +        this.target= target;
  +    }
   
       /**
        * Receives the recorded sampler from the proxy server for placing in the
  @@ -340,90 +366,97 @@
           HTTPSampler sampler,
           TestElement[] subConfigs)
       {
  -        //NOTUSED ValueReplacer replacer = GuiPackage.getInstance().getReplacer();
           TestElement urlConfig = null;
           JMeterTreeModel treeModel = GuiPackage.getInstance().getTreeModel();
  -        List nodes = treeModel.getNodesOfType(RecordingController.class);
  -        if (nodes.size() == 0)
  +        if (target == null)
           {
  -            nodes = treeModel.getNodesOfType(ThreadGroup.class);
  +            List nodes = treeModel.getNodesOfType(RecordingController.class);
  +            Iterator iter= nodes.iterator();
  +            while (iter.hasNext()) {
  +                JMeterTreeNode node= (JMeterTreeNode) iter.next();
  +                if (node.isEnabled()) {
  +                    target= node;
  +                    break;
  +                }
  +            }
           }
  -        Iterator iter = nodes.iterator();
  -        while (iter.hasNext())
  +        if (target == null)
           {
  -            JMeterTreeNode node = (JMeterTreeNode) iter.next();
  +            List nodes = treeModel.getNodesOfType(ThreadGroup.class);
  +            Iterator iter = nodes.iterator();
  +            while (iter.hasNext()) {
  +                JMeterTreeNode node= (JMeterTreeNode) iter.next();
  +                if (node.isEnabled()) {
  +                    target= node;
  +                    break;
  +                }
  +            }
  +        }
   
  -            if (!node.isEnabled())
  +        Enumeration enum = target.children();
  +        String guiClassName = null;
  +        while (enum.hasMoreElements())
  +        {
  +            JMeterTreeNode subNode =
  +                (JMeterTreeNode) enum.nextElement();
  +            TestElement sample =
  +                (TestElement) subNode.createTestElement();
  +            guiClassName =
  +                sample.getPropertyAsString(TestElement.GUI_CLASS);
  +            if (guiClassName.equals(UrlConfigGui.class.getName())
  +                || guiClassName.equals(HttpDefaultsGui.class.getName()))
               {
  -                continue;
  +                urlConfig = sample;
  +                break;
               }
  -            else
  +        }
  +
  +        if (areMatched(sampler, urlConfig))
  +        {
  +            removeValuesFromSampler(sampler, urlConfig);
  +            replaceValues(sampler,subConfigs);
  +            sampler.setUseKeepAlive(useKeepAlive);
  +            sampler.setProperty(
  +                TestElement.GUI_CLASS,
  +                "org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui");
  +            try
               {
  -                Enumeration enum = node.children();
  -                String guiClassName = null;
  -                while (enum.hasMoreElements())
  -                {
  -                    JMeterTreeNode subNode =
  -                        (JMeterTreeNode) enum.nextElement();
  -                    TestElement sample =
  -                        (TestElement) subNode.createTestElement();
  -                    guiClassName =
  -                        sample.getPropertyAsString(TestElement.GUI_CLASS);
  -                    if (guiClassName.equals(UrlConfigGui.class.getName())
  -                        || guiClassName.equals(HttpDefaultsGui.class.getName()))
  -                    {
  -                        urlConfig = sample;
  -                        break;
  -                    }
  +                boolean firstInBatch=false;
  +                if (lastTime == 0){
  +                    lastTime = System.currentTimeMillis();
  +                    firstInBatch=true;
                   }
  -                if (areMatched(sampler, urlConfig))
  -                {
  -                    removeValuesFromSampler(sampler, urlConfig);
  -                    replaceValues(sampler,subConfigs);
  -                    sampler.setUseKeepAlive(useKeepAlive);
  -                    sampler.setProperty(
  -                        TestElement.GUI_CLASS,
  -                        
"org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui");
  -                    try
  -                    {
  -                                             boolean firstInBatch=false;
  -                                             if (lastTime == 0){
  -                                                     lastTime = 
System.currentTimeMillis();
  -                                                     firstInBatch=true;
  -                                             }
  -                                             long now = System.currentTimeMillis();
  -                                             if (now - lastTime > sampleGap){
  -                                                     addDivider(treeModel,node);
  -                             firstInBatch=true;//Remember to save the new node
  -                                             }
  -                                             lastTime = System.currentTimeMillis();
  +                long now = System.currentTimeMillis();
  +                if (now - lastTime > sampleGap){
  +                    addDivider(treeModel,target);
  +                    firstInBatch=true;//Remember to save the new node
  +                }
  +                lastTime = System.currentTimeMillis();
   
  -                        JMeterTreeNode newNode =
  -                            treeModel.addComponent(sampler, node);
  +                JMeterTreeNode newNode =
  +                    treeModel.addComponent(sampler, target);
                               
  -                        if(firstInBatch){
  -                             addAssertion(treeModel,newNode);
  -                                                     firstInBatch=false;
  -                        }
  -
  -                        for (int i = 0;
  -                            subConfigs != null && i < subConfigs.length;
  -                            i++)
  -                        {
  -                            if (subConfigs[i] instanceof HeaderManager)
  -                            {
  -                                subConfigs[i].setProperty(
  -                                    TestElement.GUI_CLASS,
  -                                    
"org.apache.jmeter.protocol.http.gui.HeaderPanel");
  -                                treeModel.addComponent(subConfigs[i], newNode);
  -                            }
  -                        }
  -                    }
  -                    catch (IllegalUserActionException e)
  +                if(firstInBatch){
  +                    addAssertion(treeModel,newNode);
  +                    firstInBatch=false;
  +                }
  +
  +                for (int i = 0;
  +                    subConfigs != null && i < subConfigs.length;
  +                    i++)
  +                {
  +                    if (subConfigs[i] instanceof HeaderManager)
                       {
  -                        JMeterUtils.reportErrorToUser(e.getMessage());
  +                        subConfigs[i].setProperty(
  +                            TestElement.GUI_CLASS,
  +                            "org.apache.jmeter.protocol.http.gui.HeaderPanel");
  +                        treeModel.addComponent(subConfigs[i], newNode);
                       }
                   }
  +            }
  +            catch (IllegalUserActionException e)
  +            {
  +                JMeterUtils.reportErrorToUser(e.getMessage());
               }
           }
       }
  
  
  
  1.27      +200 -16   
jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/proxy/gui/ProxyControlGui.java
  
  Index: ProxyControlGui.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src/protocol/http/org/apache/jmeter/protocol/http/proxy/gui/ProxyControlGui.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- ProxyControlGui.java      16 Nov 2003 02:31:49 -0000      1.26
  +++ ProxyControlGui.java      29 Nov 2003 15:43:18 -0000      1.27
  @@ -51,6 +51,11 @@
    * individuals on behalf of the Apache Software Foundation.  For more
    * information on the Apache Software Foundation, please see
    * <http://www.apache.org/>.
  + *
  + * @author  Michael Stover
  + * @author   Thad Smith (controller combo code, taken from ModuleController)
  + * @author   <a href="mailto:[EMAIL PROTECTED]">Jordi Salvat i Alabart</a>
  + * @version $Id$
    */
   package org.apache.jmeter.protocol.http.proxy.gui;
   
  @@ -69,8 +74,10 @@
   
   import javax.swing.BorderFactory;
   import javax.swing.Box;
  +import javax.swing.DefaultComboBoxModel;
   import javax.swing.JButton;
   import javax.swing.JCheckBox;
  +import javax.swing.JComboBox;
   import javax.swing.JLabel;
   import javax.swing.JOptionPane;
   import javax.swing.JPanel;
  @@ -79,30 +86,27 @@
   import javax.swing.JTable;
   import javax.swing.JTextField;
   
  +import org.apache.jmeter.control.Controller;
   import org.apache.jmeter.engine.util.ValueReplacer;
   import org.apache.jmeter.functions.InvalidVariableException;
   import org.apache.jmeter.gui.AbstractJMeterGuiComponent;
   import org.apache.jmeter.gui.GuiPackage;
   import org.apache.jmeter.gui.JMeterGUIComponent;
   import org.apache.jmeter.gui.UnsharedComponent;
  +import org.apache.jmeter.gui.action.ActionRouter;
   import org.apache.jmeter.gui.tree.JMeterTreeNode;
   import org.apache.jmeter.gui.util.HorizontalPanel;
   import org.apache.jmeter.gui.util.MenuFactory;
   import org.apache.jmeter.gui.util.PowerTableModel;
   import org.apache.jmeter.protocol.http.proxy.ProxyControl;
   import org.apache.jmeter.testelement.TestElement;
  +import org.apache.jmeter.testelement.TestPlan;
  +import org.apache.jmeter.testelement.WorkBench;
   import org.apache.jmeter.testelement.property.PropertyIterator;
   import org.apache.jmeter.util.JMeterUtils;
   import org.apache.jorphan.logging.LoggingManager;
   import org.apache.log.Logger;
   
  -/****************************************
  - * Title: Jakarta-JMeter
  - *
  - [EMAIL PROTECTED]    Michael Stover
  - [EMAIL PROTECTED] $Revision$ Last updated: $Date$
  - ***************************************/
  -
   public class ProxyControlGui
       extends AbstractJMeterGuiComponent
       implements
  @@ -139,13 +143,20 @@
         */
        private JCheckBox useKeepAlive;
   
  +    /**
  +     * List of available target controllers
  +     */
  +    private JComboBox targetNodes;
  +    private DefaultComboBoxModel targetNodesModel;
  +    
       private ProxyControl model;
   
       private JTable excludeTable;
       private PowerTableModel excludeModel;
       private JTable includeTable;
       private PowerTableModel includeModel;
  -
  +    private static final String CHANGE_TARGET = "change_target";
  +        
       private JButton stop, start, restart;
       private static final String STOP = "stop";
       private static final String START = "start";
  @@ -205,6 +216,15 @@
                        model.setSeparators(addSeparators.isSelected());
                        model.setAssertions(addAssertions.isSelected());
                        model.setUseKeepAlive(useKeepAlive.isSelected());
  +            TreeNodeWrapper nw= (TreeNodeWrapper)targetNodes.getSelectedItem();
  +            if (nw == null)
  +            {
  +                model.setTarget(null);
  +            }
  +            else
  +            {
  +                model.setTarget(nw.getTreeNode());
  +            }
           }
       }
   
  @@ -251,6 +271,9 @@
                
addSeparators.setSelected(model.getPropertyAsBoolean(ProxyControl.ADD_SEPARATORS));
                
addAssertions.setSelected(model.getPropertyAsBoolean(ProxyControl.ADD_ASSERTIONS));
                
useKeepAlive.setSelected(model.getPropertyAsBoolean(ProxyControl.USE_KEEPALIVE,true));
  +        
  +        reinitializeTargetCombo();
  +
           populateTable(includeModel, model.getIncludePatterns().iterator());
           populateTable(excludeModel, model.getExcludePatterns().iterator());
           repaint();
  @@ -293,6 +316,7 @@
               model.stopProxy();
               stop.setEnabled(false);
               start.setEnabled(true);
  +            restart.setEnabled(false);
           }
           else if (command.equals(START))
           {
  @@ -337,6 +361,20 @@
               includeModel.fireTableDataChanged();
               enableRestart();
           }
  +        else if (command.equals(CHANGE_TARGET))
  +        {
  +            log.debug("Change target "+targetNodes.getSelectedItem());
  +            log.debug("In model "+model);
  +            TreeNodeWrapper nw= (TreeNodeWrapper)targetNodes.getSelectedItem();
  +            if (nw == null)
  +            {
  +                model.setTarget(null); 
  +            }
  +            else
  +            {
  +                model.setTarget(nw.getTreeNode());
  +            }
  +        }
       }
   
       private void startProxy()
  @@ -431,8 +469,14 @@
           add(makeTitlePanel(), BorderLayout.NORTH);
   
           JPanel mainPanel = new JPanel(new BorderLayout());
  -        mainPanel.add(createPortPanel(), BorderLayout.NORTH);
  -
  +        
  +        Box portTargetPanel = Box.createVerticalBox();
  +        portTargetPanel.add(createPortPanel());
  +        portTargetPanel.add(Box.createVerticalStrut(5));
  +        portTargetPanel.add(createTargetPanel());
  +        portTargetPanel.add(Box.createVerticalStrut(5));
  +        mainPanel.add(portTargetPanel, BorderLayout.NORTH);
  +        
           Box includeExcludePanel = Box.createVerticalBox();
           includeExcludePanel.add(createIncludePanel());
           includeExcludePanel.add(createExcludePanel());
  @@ -514,6 +558,45 @@
           return panel;
       }
   
  +    private JPanel createTargetPanel()
  +    {
  +        targetNodesModel= new DefaultComboBoxModel();
  +        targetNodes = new JComboBox(targetNodesModel);
  +        targetNodes.addActionListener(this);
  +        targetNodes.setActionCommand(CHANGE_TARGET);
  +        
  +        JLabel label = new JLabel(JMeterUtils.getResString("proxy_target"));
  +        label.setLabelFor(targetNodes);
  +        
  +        HorizontalPanel panel = new HorizontalPanel();
  +        panel.add(label);
  +        panel.add(targetNodes);
  +
  +        try
  +        {
  +            Class addToTree =
  +                Class.forName("org.apache.jmeter.gui.action.AddToTree");
  +            Class remove = Class.forName("org.apache.jmeter.gui.action.Remove");
  +            ActionListener listener = new ActionListener()
  +            {
  +                public void actionPerformed(ActionEvent e)
  +                {
  +                    reinitializeTargetCombo();
  +                }
  +            };
  +            ActionRouter ar = ActionRouter.getInstance();
  +            ar.addPostActionListener(addToTree, listener);
  +            ar.addPostActionListener(remove, listener);
  +        }
  +        catch (ClassNotFoundException e)
  +        {
  +            // This should never happen -- throw an Error:
  +            throw new Error(e);
  +        }
  +
  +        return panel;        
  +    }
  +
       private JPanel createIncludePanel()
       {
           includeModel = new PowerTableModel(
  @@ -576,17 +659,118 @@
           return buttonPanel;
       }
   
  +    private void reinitializeTargetCombo() {
  +        log.debug("Reinitializing target combo");
  +        targetNodesModel.removeAllElements();
  +        GuiPackage gp = GuiPackage.getInstance();
  +        JMeterTreeNode root;
  +        if (gp != null)
  +        {
  +            root =
  +                (JMeterTreeNode) GuiPackage
  +                    .getInstance()
  +                    .getTreeModel()
  +                    .getRoot();
  +            targetNodesModel.addElement(
  +                new TreeNodeWrapper(null, "Use Recording Controller"));
  +            buildNodesModel(root, "", 0);
  +        }
  +        for (int i = 0; i < targetNodesModel.getSize(); i++)
  +        {
  +            TreeNodeWrapper choice = 
  +                (TreeNodeWrapper) targetNodesModel.getElementAt(i);
  +            if (choice.getTreeNode() == model.getTarget()) // .equals caused NPE
  +            {
  +                log.debug("Selecting item "+choice);
  +                targetNodesModel.setSelectedItem(choice);
  +                break;
  +            }
  +        }
  +        log.debug("Reinitialization complete");
  +    }
  +    
  +    private void buildNodesModel(
  +        JMeterTreeNode node,
  +        String parent_name,
  +        int level)
  +    {
  +        String seperator = " > ";
  +        if (node != null)
  +        {
  +            for (int i = 0; i < node.getChildCount(); i++)
  +            {
  +                StringBuffer name = new StringBuffer();
  +                JMeterTreeNode cur = (JMeterTreeNode) node.getChildAt(i);
  +                TestElement te = cur.createTestElement();
  +                if (te instanceof ThreadGroup)
  +                {
  +                    name.append(parent_name);
  +                    name.append(cur.getName());
  +                    name.append(seperator);
  +                    buildNodesModel(cur, name.toString(), level);
  +                }
  +                else if (te instanceof Controller)
  +                {
  +                    name.append(spaces(level));
  +                    name.append(parent_name);
  +                    name.append(cur.getName());
  +                    TreeNodeWrapper tnw =
  +                        new TreeNodeWrapper(cur, name.toString());
  +                    targetNodesModel.addElement(tnw);
  +                    name = new StringBuffer();
  +                    name.append(cur.getName());
  +                    name.append(seperator);
  +                    buildNodesModel(cur, name.toString(), level + 1);
  +                }
  +                else if (te instanceof TestPlan || te instanceof WorkBench)
  +                {
  +                    name.append(cur.getName());
  +                    name.append(seperator);
  +                    buildNodesModel(cur, name.toString(), 0);
  +                }
  +            }
  +        }
  +    }
  +
  +    private String spaces(int level)
  +    {
  +        int multi = 4;
  +        StringBuffer spaces = new StringBuffer(level * multi);
  +        for (int i = 0; i < level * multi; i++)
  +        {
  +            spaces.append(" ");
  +        }
  +        return spaces.toString();
  +    }
  +    
       public void setNode(JMeterTreeNode node)
       {
           getNamePanel().setNode(node);
       }
  +}
   
  -    /**
  -     * Returns the portField.
  -     * @return JTextField
  -     */
  -    protected JTextField getPortField()
  +class TreeNodeWrapper
  +{
  +    private JMeterTreeNode tn;
  +    private String label;
  +
  +    private TreeNodeWrapper()
  +    {
  +    };
  +
  +    public TreeNodeWrapper(JMeterTreeNode tn, String label)
  +    {
  +        this.tn = tn;
  +        this.label = label;
  +    }
  +
  +    public JMeterTreeNode getTreeNode()
  +    {
  +        return tn;
  +    }
  +
  +    public String toString()
       {
  -        return portField;
  +        return label;
       }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to