You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jmeter.apache.org by Marko Vlahovic <vl...@gmail.com> on 2013/07/05 17:40:38 UTC
Adding RSyntaxTextArea for BeanShell, BSF, and JSR223 elements
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
Re: Adding RSyntaxTextArea for BeanShell, BSF, and JSR223 elements
Posted by Marko Vlahovic <vl...@gmail.com>.
Thank you. I will do that
On Friday, July 5, 2013, Philippe Mouawad wrote:
> Hello,
> It is really a good idea, why not open a bugzilla and attach a patch for
> this ?
>
> Thanks
> Regards
>
>
> On Fri, Jul 5, 2013 at 5:40 PM, Marko Vlahovic <vlahovic74@gmail.com<javascript:;>>
> wrote:
>
> > 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
> >
>
>
>
> --
> Cordialement.
> Philippe Mouawad.
>
Re: Adding RSyntaxTextArea for BeanShell, BSF, and JSR223 elements
Posted by Philippe Mouawad <ph...@gmail.com>.
Hello,
It is really a good idea, why not open a bugzilla and attach a patch for
this ?
Thanks
Regards
On Fri, Jul 5, 2013 at 5:40 PM, Marko Vlahovic <vl...@gmail.com> wrote:
> 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
>
--
Cordialement.
Philippe Mouawad.