Hi *Problem Statement:* In my daily work i used BeanShell elements extensively and i find them to be very powerful giving the edge to jmeter over the other test frameworks. However, writing Java or Python code in JTextArea is really painful and error prone (and it can hurt the eyes too).
*Proposal:* I would like to propose to Jmeter Dev Community to include rsyntaxtextarea-2.0.7.jar library that can do syntax highlighting, code folding, undo typing, and redo typing. The library is published under BSD license and more details can be found here: http://fifesoft.com/rsyntaxtextarea/ The jar file needs to be compiled from source (It is very easy to do. Took me only 5 minutes to compile and add it to jmeter project in eclipse) *Implementation change Proposal:* The following is the list of files that i changed to make Syntax Highlighting work: M src/protocol/java/org/apache/jmeter/protocol/java/control/gui/BeanShellSamplerGui.java M src/components/org/apache/jmeter/assertions/gui/BeanShellAssertionGui.java ? src/core/org/apache/jmeter/testbeans/gui/textarea.properties M src/core/org/apache/jmeter/testbeans/gui/TextAreaEditor.java M src/core/org/apache/jmeter/testbeans/gui/WrapperEditor.java M src/core/org/apache/jmeter/testbeans/gui/GenericTestBeanCustomizer.java I also had to add the following in build.properties rsyntaxtextarea.version = 2.0.7 rsyntaxtextarea.jar = rsyntaxtextarea-${rsyntaxtextarea.version}.jar rsyntaxtextarea.md5 = a4bdaabc88ff5464002a43c654bbf856 the following in .classpath <classpathentry kind="lib" path="lib/rsyntaxtextarea-2.0.7.jar"/> And the following in build.xml <include name="${lib.dir}/${rsyntaxtextarea.jar}"/> </patternset> ... <pathelement location="${lib.dir}/${xstream.jar}"/> <pathelement location="${lib.dir}/${rsyntaxtextarea.jar}"/> ... *Implementation Details** TextAreaEditor.java and textarea.properties*: Instead of JTextArea, textUI uses RSyntaxTextArea. In order to have numbers for lines i also changes the scroller to RTextScrollPane. To support different languages from BSF and JSR elements new private field languageProperties is added. This field keeps mapping between different languages and syntaxes available in SyntaxConstants interface. Mappings are defined in textarea.properties file Also the TextAreaEditor implements PropertyChangeListener so that propertyChange events can be captured. In summary: public class TextAreaEditor extends PropertyEditorSupport implements FocusListener, PropertyChangeListener { private RSyntaxTextArea textUI; private RTextScrollPane scroller; private Properties languageProperties; ... private final void init() {// called from ctor, so must not be overridable textUI = new RSyntaxTextArea(20,20); textUI.discardAllEdits(); textUI.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); textUI.setCodeFoldingEnabled(true); textUI.setAntiAliasingEnabled(true); textUI.addFocusListener(this); textUI.setWrapStyleWord(true); textUI.setLineWrap(true); scroller = new RTextScrollPane(textUI); scroller.setFoldIndicatorEnabled(true); languageProperties = JMeterUtils.loadProperties("org/apache/jmeter/testbeans/gui/textarea.properties"); } ... @Override public void propertyChange(PropertyChangeEvent evt){ Object source = evt.getSource(); if (source instanceof ComboStringEditor && source !=null){ ComboStringEditor cse = (ComboStringEditor)source; String lang = cse.getAsText().toLowerCase(); if (languageProperties.containsKey(lang)){ textUI.setSyntaxEditingStyle(languageProperties.getProperty(lang)); } else{ textUI.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_NONE); } } } *Implementation Details BeanShellAssertionGui.java and ** BeanShellSamplerGui.java* This is not a java bean element so direct change was applied: private RSyntaxTextArea scriptField;// script area ... private JPanel createScriptPanel() { scriptField = new RSyntaxTextArea(20,20); scriptField.setSyntaxEditingStyle(SyntaxConstants.SYNTAX_STYLE_JAVA); scriptField.setCodeFoldingEnabled(true); scriptField.setAntiAliasingEnabled(true); scriptField.setLineWrap(true); scriptField.setWrapStyleWord(true); ... JPanel panel = new JPanel(new BorderLayout()); panel.add(label, BorderLayout.NORTH); panel.add(new RTextScrollPane(scriptField), BorderLayout.CENTER); *Implementation Details **GenericTestBeanCustomizer.java* Changes made here were necessary to enable Syntax Highlighting changes when different language is selected in ComboBox in BSF and JSR elements. GenericTestBeanCustomizer(BeanInfo beanInfo) { super(); ... // Added in the "for" loop for descriptors //Find the index of textAreaEditor if (propertyEditor instanceof TextAreaEditor) { textAreaEditorIndex = i; } //Figure out the index of scriptLanguage ComboBOx if (name.equals("scriptLanguage")){ scriptLanguageIndex=i; } ... // This is after the for loop. In case of BSF and JSR elements i want to add textAreaEditor as // a listener to scriptLanguage ComboBox. String beanName = this.beanInfo.getBeanDescriptor().getName(); if (beanName.startsWith("BSF") || beanName.startsWith("JSR223")){ WrapperEditor we = (WrapperEditor) editors[scriptLanguageIndex]; TextAreaEditor tae = (TextAreaEditor) editors[textAreaEditorIndex]; we.addChangeListener(tae); } ... *Implementation Details **WrapperEditor.java* In the GenericTestBeanCustomizer constructor i used e.addChangeListener(tae) to add listener to comboBox. Consequently, WrapperEditor class had to be modified, thus addChangeListener method is added that will do actual listener adding on the guiEditor public void addChangeListener(PropertyChangeListener listener){ guiEditor.addPropertyChangeListener(listener); } *Conclusion* I found Syntax Highlighting to significantly improve look and feel of Scripting elements in Jmeter. Especially revording was to find that RSyntaxTextArea has integrated undo/redo. It is available by simply right clicking in the TextArea. Nevertheless, all the changes proposed are cosmetic and up to you to decide if it would be worth changing in Jmeter. Best Regards Marko
