thads       2004/04/08 11:40:08

  Modified:    src/core/org/apache/jmeter/threads JMeterThread.java
               src/core/org/apache/jmeter/engine StandardJMeterEngine.java
  Added:       src/components/org/apache/jmeter/sampler/gui
                        TestActionGui.java
               src/components/org/apache/jmeter/sampler TestAction.java
  Removed:     src/core/org/apache/jmeter/threads JMeterContext.java
               src/core/org/apache/jmeter/resources messages.properties
  Log:
  TestAction is a new test component (implemented as a sampler...for now)

  that gives the ability to pause or stop the current running thread

  or pause/stop the entire test.
  
  Revision  Changes    Path
  1.49      +13 -2     
jakarta-jmeter/src/core/org/apache/jmeter/threads/JMeterThread.java
  
  Index: JMeterThread.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/threads/JMeterThread.java,v
  retrieving revision 1.48
  retrieving revision 1.49
  diff -u -r1.48 -r1.49
  --- JMeterThread.java 27 Feb 2004 00:17:06 -0000      1.48
  +++ JMeterThread.java 8 Apr 2004 18:40:08 -0000       1.49
  @@ -216,6 +216,7 @@
               threadContext = JMeterContextService.getContext();
               threadContext.setVariables(threadVars);
               threadContext.setThreadNum(getThreadNum());
  +            threadContext.setThread(this);
               testTree.traverse(compiler);
               running = true;
               //listeners = controller.getListeners();
  @@ -354,12 +355,21 @@
                //engine.stopTest();
                if (engine != null ) engine.askThreadsToStop();
        }
  +
        private void stopThread()
        {
                running = false;
                log.info("Stop Thread detected by thread " + threadName);
        }
   
  +     public void pauseThread(int milis)
  +     {
  +             try
  +             {
  +                     Thread.sleep(milis);
  +             }
  +             catch (InterruptedException e) {}
  +     }
   
       private void checkAssertions(List assertions, SampleResult result)
       {
  @@ -493,6 +503,7 @@
               notifyTestListeners();
           }
       }
  +    
       /**
        * Save the engine instance for access to the stop methods
        * 
  
  
  
  1.1                  
jakarta-jmeter/src/components/org/apache/jmeter/sampler/gui/TestActionGui.java
  
  Index: TestActionGui.java
  ===================================================================
  /*
   * Copyright 2003-2004 The Apache Software Foundation.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *   http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   * 
  */
  
  package org.apache.jmeter.sampler.gui;
  
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.awt.event.FocusEvent;
  import java.awt.event.FocusListener;
  
  import javax.swing.ButtonGroup;
  import javax.swing.DefaultComboBoxModel;
  import javax.swing.JComboBox;
  import javax.swing.JLabel;
  import javax.swing.JRadioButton;
  import javax.swing.JTextField;
  import javax.swing.event.ChangeEvent;
  import javax.swing.event.ChangeListener;
  
  import org.apache.jmeter.gui.util.HorizontalPanel;
  import org.apache.jmeter.sampler.TestAction;
  import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
  import org.apache.jmeter.testelement.TestElement;
  import org.apache.jmeter.util.JMeterUtils;
  import org.apache.jorphan.gui.layout.VerticalLayout;
  
  /**
   * @version $Revision: 1.1 $
   */
  public class TestActionGui extends AbstractSamplerGui
  {
        //Gui components
        private JComboBox targetBox;
  //    private ButtonGroup actionButtons;
        private JRadioButton pauseButton;
        private JRadioButton stopButton;
        private JTextField durationField;
        
        //State variables
        private int target;
        private int action;
        private int duration;
  
        //String in the panel
        private static final String title = 
JMeterUtils.getResString("test_action_title");
        private static final String targetLabel = 
JMeterUtils.getResString("test_action_target");
        private static final String threadTarget = 
JMeterUtils.getResString("test_action_target_thread");
        private static final String testTarget = 
JMeterUtils.getResString("test_action_target_test");
        private static final String actionLabel = 
JMeterUtils.getResString("test_action_action");
        private static final String pauseAction = 
JMeterUtils.getResString("test_action_pause");
        private static final String stopAction = 
JMeterUtils.getResString("test_action_stop");
        private static final String durationLabel = 
JMeterUtils.getResString("test_action_duration");
        
      public TestActionGui()
      {
          super();
          target = TestAction.THREAD;
          action = TestAction.PAUSE;
          init();
      }
  
      /**
       * @see org.apache.jmeter.gui.JMeterGUIComponent#getStaticLabel()
       */
      public String getStaticLabel()
      {
          return title;
      }
      
      public void configure(TestElement element)
      {
          super.configure(element);
          TestAction ta = (TestAction)element;
          
          target=ta.getTarget();
          if (target == TestAction.THREAD)
                targetBox.setSelectedItem(threadTarget);
          else 
                        targetBox.setSelectedItem(testTarget);
  
                action = ta.getAction();                
                if (action == TestAction.PAUSE)
                        pauseButton.setSelected(true);
                else
                        stopButton.setSelected(true);
                
                duration=ta.getDuration();
                durationField.setText(Integer.toString(duration));
      }
  
      /**
       * @see org.apache.jmeter.gui.JMeterGUIComponent#createTestElement()
       */
      public TestElement createTestElement()
      {
          TestAction ta = new TestAction();
          modifyTestElement(ta);
          return ta;
      }
  
      /**
       * Modifies a given TestElement to mirror the data in the gui components.
       * @see org.apache.jmeter.gui.JMeterGUIComponent#modifyTestElement(TestElement)
       */
      public void modifyTestElement(TestElement element)
      {
          super.configureTestElement(element);
                TestAction ta = (TestAction)element;
                ta.setAction(action);
                ta.setTarget(target);
                ta.setDuration(duration);
      }
      
      private void init()
      {
                setLayout(
                        new VerticalLayout(5, VerticalLayout.LEFT, 
VerticalLayout.TOP));
                setBorder(makeBorder());
                add(makeTitlePanel());
                
                //Target
                HorizontalPanel targetPanel = new HorizontalPanel();
                targetPanel.add(new JLabel(targetLabel));
                DefaultComboBoxModel targetModel = new DefaultComboBoxModel();
                targetModel.addElement(threadTarget);
                targetModel.addElement(testTarget);
                targetBox = new JComboBox(targetModel);
                targetBox.addActionListener(new ActionListener()
                {
                        public void actionPerformed(ActionEvent e)
                        {
                                if (((String)targetBox.getSelectedItem())
                                        .equals(threadTarget))
                                {
                                        target = TestAction.THREAD;
                                }
                                else
                                {
                                        target = TestAction.TEST;
                                }
                        }
                });
                targetPanel.add(targetBox);
                add(targetPanel);
                
                //Action
                HorizontalPanel actionPanel = new HorizontalPanel();
                ButtonGroup actionButtons = new ButtonGroup();
                pauseButton = new JRadioButton(pauseAction,true);
                pauseButton.addChangeListener(new ChangeListener()
                {
                        public void stateChanged(ChangeEvent e)
                        {
                                if(pauseButton.isSelected())
                                {
                                        action = TestAction.PAUSE;
                                        durationField.setEnabled(true);
                                }
                                        
                        }
                });
                stopButton = new JRadioButton(stopAction,false);
                stopButton.addChangeListener(new ChangeListener()
                {
                        public void stateChanged(ChangeEvent e)
                        {
                                if(stopButton.isSelected())
                                {
                                        action = TestAction.STOP;
                                        durationField.setEnabled(false);
                                }
                        }
                });
                actionButtons.add(pauseButton);
                actionButtons.add(stopButton);
                actionPanel.add(new JLabel(actionLabel));
                actionPanel.add(pauseButton);
                actionPanel.add(stopButton);
                add(actionPanel);
  
                //Duration
                HorizontalPanel durationPanel = new HorizontalPanel();
                durationField = new JTextField(5);
                durationField.setText(Integer.toString(duration));
                durationField.addFocusListener(new FocusListener()
                {
                        public void focusLost(FocusEvent e)
                        {
                                try 
                                { 
                                        duration = 
Integer.parseInt(durationField.getText());
                                }
                                catch (NumberFormatException nfe)
                                {
                                        duration = 0;
                                        //alert
  //                                    durationField.grabFocus();
                                }
                        }
                        
                        public void focusGained(FocusEvent e) {}
                });
                durationPanel.add(new JLabel("Duration"));
                durationPanel.add(durationField);
                add(durationPanel);
      }
      
  
  }
  
  
  
  1.1                  
jakarta-jmeter/src/components/org/apache/jmeter/sampler/TestAction.java
  
  Index: TestAction.java
  ===================================================================
  /*
   * Copyright 2001-2004 The Apache Software Foundation.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *   http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   * 
  */
  package org.apache.jmeter.sampler;
  
  import org.apache.jmeter.samplers.AbstractSampler;
  import org.apache.jmeter.samplers.Entry;
  import org.apache.jmeter.samplers.SampleResult;
  import org.apache.jmeter.testelement.property.IntegerProperty;
  import org.apache.jmeter.threads.JMeterContext;
  import org.apache.jmeter.threads.JMeterContextService;
  import org.apache.jmeter.threads.JMeterThread;
  
  /**
   * @author Administrator
   *
   * To change the template for this generated type comment go to
   * Window>Preferences>Java>Code Generation>Code and Comments
   */
  public class TestAction
        extends AbstractSampler 
  {
        //Actions
        public final static int STOP = 0;
        public final static int PAUSE = 1;
  
        //Action target
        public final static int THREAD = 0;
  //    public final static int THREAD_GROUP = 1;
        public final static int TEST = 2;
        
        //Identifiers
        private final static String TARGET = "ActionProcessor.target";
        private final static String ACTION = "ActionProcessor.action";
        private final static String DURATION = "ActionProcessor.duration";
  
        public TestAction()
        {
                super();
                setTarget(THREAD);
                setAction(PAUSE);
                setDuration(0);
        }
  
        /* (non-Javadoc)
         * @see 
org.apache.jmeter.samplers.Sampler#sample(org.apache.jmeter.samplers.Entry)
         */
        public SampleResult sample(Entry e) 
        {
  //            SampleResult res = new SampleResult();
                JMeterContext context = JMeterContextService.getContext();
  //            StringBuffer response = new StringBuffer();
  //                            
  //            res.setSampleLabel(getTitle());
  //            res.setSuccessful(true);
  //            res.setResponseMessage("OK");
  //            res.sampleStart();
  
                int target = getTarget();
                int action = getAction();
                if (target==THREAD)
                {
                        JMeterThread thread = context.getThread();
                        if (action==PAUSE)
                        {
  //                            res.setSamplerData("Pause Thread 
"+thread.getThreadNum());
                                thread.pauseThread(getDuration());
  //                            response.append("Thread ");
  //                            response.append(thread.getThreadNum());
  //                            response.append(" paused for ");
  //                            response.append(getDuration());
  //                            response.append(" miliseconds");
                        }
                        else if (action==STOP)
                        {
  //                            res.setSamplerData("Stop 
Thread"+thread.getThreadNum());
                                context.getThread().stop();
  //                            response.append("Thread ");
  //                            response.append(thread.getThreadNum());
  //                            response.append(" stopped");
                        }
                }
  //Not yet implemented
  //            else if (target==THREAD_GROUP)
  //            {
  //                    if (action==PAUSE)
  //                    {
  //                    }
  //                    else if (action==STOP)
  //                    {
  //                    }
  //            }
                else if(target==TEST)
                {
                        if (action==PAUSE)
                        {
                                context.getEngine().pauseTest(getDuration());
                        }
                        else if (action==STOP)
                        {
                                context.getEngine().askThreadsToStop();
                        }
                }
  
  //            res.setResponseData(response.toString().getBytes());
  //            res.sampleEnd();
  //            return res;
                return null;
        }
        
        public void setTarget(int target)
        {
                setProperty(new IntegerProperty(TARGET,target));
        }
  
        public int getTarget()
        {
                return getPropertyAsInt(TARGET);
        }
        
        public void setAction(int action)
        {
                setProperty(new IntegerProperty(ACTION,action));
        }
        
        public int getAction()
        {
                return getPropertyAsInt(ACTION);
        }
        
        public void setDuration(int duration)
        {
                setProperty(new IntegerProperty(DURATION,duration));
        }
        
        public int getDuration()
        {
                return getPropertyAsInt(DURATION);
        }
        
        private String getTitle()
        {
                return this.getName();
        }
  }
  
  
  
  1.44      +20 -2     
jakarta-jmeter/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java
  
  Index: StandardJMeterEngine.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jmeter/src/core/org/apache/jmeter/engine/StandardJMeterEngine.java,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- StandardJMeterEngine.java 18 Feb 2004 23:23:58 -0000      1.43
  +++ StandardJMeterEngine.java 8 Apr 2004 18:40:08 -0000       1.44
  @@ -373,6 +373,24 @@
               thread.setScheduled(true);
           }
       }
  +    
  +    public synchronized void pauseTest(int milis)
  +    {
  +             Iterator iter = new HashSet(allThreads.keySet()).iterator();
  +             while (iter.hasNext())
  +             {
  +                     Thread t = (Thread) allThreads.get(iter.next());
  +                     if (t != null && t.isAlive())
  +                     {
  +                             try
  +                             {
  +                                     t.sleep(milis);
  +                             }
  +                             catch (InterruptedException e)
  +                             {}
  +                     }
  +             }       
  +    }
   
       private void verifyThreadsStopped()
       {
  
  
  

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

Reply via email to