You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2013/11/24 23:21:59 UTC
svn commit: r1545089 - in /jmeter/trunk: bin/
src/core/org/apache/jmeter/resources/
src/protocol/jms/org/apache/jmeter/protocol/jms/
src/protocol/jms/org/apache/jmeter/protocol/jms/client/
src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/ sr...
Author: pmouawad
Date: Sun Nov 24 22:21:58 2013
New Revision: 1545089
URL: http://svn.apache.org/r1545089
Log:
Bug 55589 - JMS Publisher/Point to Point : Add ability to set typed values in JMS header properties.
Bugzilla Id: 55589
Added:
jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPropertiesPanel.java (with props)
jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSProperties.java (with props)
jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSProperty.java (with props)
Modified:
jmeter/trunk/bin/saveservice.properties
jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/Utils.java
jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/Publisher.java
jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPublisherGui.java
jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSSamplerGui.java
jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSSampler.java
jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/PublisherSampler.java
jmeter/trunk/xdocs/changes.xml
Modified: jmeter/trunk/bin/saveservice.properties
URL: http://svn.apache.org/viewvc/jmeter/trunk/bin/saveservice.properties?rev=1545089&r1=1545088&r2=1545089&view=diff
==============================================================================
--- jmeter/trunk/bin/saveservice.properties (original)
+++ jmeter/trunk/bin/saveservice.properties Sun Nov 24 22:21:58 2013
@@ -167,6 +167,8 @@ JDBCPreProcessor=org.apache.jmeter.proto
JDBCSampler=org.apache.jmeter.protocol.jdbc.sampler.JDBCSampler
# Renamed to JMSSamplerGui; keep original entry for backwards compatibility
JMSConfigGui=org.apache.jmeter.protocol.jms.control.gui.JMSConfigGui
+JMSProperties=org.apache.jmeter.protocol.jms.sampler.JMSProperties
+JMSProperty=org.apache.jmeter.protocol.jms.sampler.JMSProperty
JMSPublisherGui=org.apache.jmeter.protocol.jms.control.gui.JMSPublisherGui
JMSSampler=org.apache.jmeter.protocol.jms.sampler.JMSSampler
JMSSamplerGui=org.apache.jmeter.protocol.jms.control.gui.JMSSamplerGui
Modified: jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties?rev=1545089&r1=1545088&r2=1545089&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/resources/messages.properties Sun Nov 24 22:21:58 2013
@@ -451,6 +451,11 @@ jms_message_type=Message Type
jms_msg_content=Content
jms_object_message=Object Message
jms_point_to_point=JMS Point-to-Point
+jms_properties=JMS Properties
+jms_properties_title=JMS Properties
+jms_properties_name=Name
+jms_properties_type=Class of value
+jms_properties_value=Value
jms_props=JMS Properties
jms_provider_url=Provider URL
jms_publisher=JMS Publisher
Modified: jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties?rev=1545089&r1=1545088&r2=1545089&view=diff
==============================================================================
--- jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties (original)
+++ jmeter/trunk/src/core/org/apache/jmeter/resources/messages_fr.properties Sun Nov 24 22:21:58 2013
@@ -445,6 +445,11 @@ jms_message_type=Type de message \:
jms_msg_content=Contenu
jms_object_message=Message Object
jms_point_to_point=Requ\u00EAte JMS Point-\u00E0-point
+jms_properties=Propri\u00E9t\u00E9s JMS
+jms_properties_title=Propri\u00E9t\u00E9s JMS
+jms_properties_type=Classe de la Valeur
+jms_properties_name=Nom
+jms_properties_value=Valeur
jms_props=Propri\u00E9t\u00E9s JMS
jms_provider_url=URL du fournisseur
jms_publisher=Requ\u00EAte JMS Publication
Modified: jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/Utils.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/Utils.java?rev=1545089&r1=1545088&r2=1545089&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/Utils.java (original)
+++ jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/Utils.java Sun Nov 24 22:21:58 2013
@@ -31,6 +31,8 @@ import javax.jms.Session;
import javax.naming.Context;
import javax.naming.NamingException;
+import org.apache.jmeter.config.Arguments;
+import org.apache.jmeter.protocol.jms.sampler.JMSProperties;
import org.apache.jorphan.logging.LoggingManager;
import org.apache.log.Logger;
@@ -171,23 +173,39 @@ public final class Utils {
* @param map Map<String, String>
* @throws JMSException
*/
- public static void addJMSProperties(Message msg, Map<String, String> map) throws JMSException {
+ public static void addJMSProperties(Message msg, Map<String, Object> map) throws JMSException {
if(map == null) {
return;
}
- for (Map.Entry<String, String> me : map.entrySet()) {
+ for (Map.Entry<String, Object> me : map.entrySet()) {
String name = me.getKey();
- String value = me.getValue();
+ Object value = me.getValue();
if (log.isDebugEnabled()) {
log.debug("Adding property [" + name + "=" + value + "]");
}
// WebsphereMQ does not allow corr. id. to be set using setStringProperty()
if("JMSCorrelationID".equalsIgnoreCase(name)) { // $NON-NLS-1$
- msg.setJMSCorrelationID(value);
+ msg.setJMSCorrelationID((String)value);
} else {
- msg.setStringProperty(name, value);
+ msg.setObjectProperty(name, value);
}
}
}
+
+
+ /**
+ * Converts {@link Arguments} to {@link JmsProperties} defaulting to String type
+ * Used to convert version <= 2.10 test plans
+ * @param args {@link Arguments}
+ * @return jmsProperties {@link JmsProperties}
+ */
+ public static final JMSProperties convertArgumentsToJmsProperties(Arguments args) {
+ JMSProperties jmsProperties = new JMSProperties();
+ Map<String,String> map = args.getArgumentsAsMap();
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ jmsProperties.addJmsProperty(entry.getKey(), entry.getValue());
+ }
+ return jmsProperties;
+ }
}
Modified: jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/Publisher.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/Publisher.java?rev=1545089&r1=1545088&r2=1545089&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/Publisher.java (original)
+++ jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/client/Publisher.java Sun Nov 24 22:21:58 2013
@@ -157,7 +157,7 @@ public class Publisher implements Closea
return publish(text, destinationName, null);
}
- public Message publish(String text, String destinationName, Map<String, String> properties)
+ public Message publish(String text, String destinationName, Map<String, Object> properties)
throws JMSException, NamingException {
TextMessage msg = session.createTextMessage(text);
return setPropertiesAndSend(destinationName, properties, msg);
@@ -173,13 +173,13 @@ public class Publisher implements Closea
return publish(contents, destinationName, null);
}
- public Message publish(Serializable contents, String destinationName, Map<String, String> properties)
+ public Message publish(Serializable contents, String destinationName, Map<String, Object> properties)
throws JMSException, NamingException {
ObjectMessage msg = session.createObjectMessage(contents);
return setPropertiesAndSend(destinationName, properties, msg);
}
- public Message publish(byte[] bytes, String destinationName, Map<String, String> properties)
+ public Message publish(byte[] bytes, String destinationName, Map<String, Object> properties)
throws JMSException, NamingException {
BytesMessage msg = session.createBytesMessage();
msg.writeBytes(bytes);
@@ -196,7 +196,7 @@ public class Publisher implements Closea
return publish(map, destinationName, null);
}
- public MapMessage publish(Map<String, Object> map, String destinationName, Map<String, String> properties)
+ public MapMessage publish(Map<String, Object> map, String destinationName, Map<String, Object> properties)
throws JMSException, NamingException {
MapMessage msg = session.createMapMessage();
for (Entry<String, Object> me : map.entrySet()) {
@@ -214,7 +214,7 @@ public class Publisher implements Closea
* @throws NamingException
*/
private Message setPropertiesAndSend(String destinationName,
- Map<String, String> properties, Message msg)
+ Map<String, Object> properties, Message msg)
throws JMSException, NamingException {
Utils.addJMSProperties(msg, properties);
if (staticDest || destinationName == null) {
Added: jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPropertiesPanel.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPropertiesPanel.java?rev=1545089&view=auto
==============================================================================
--- jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPropertiesPanel.java (added)
+++ jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPropertiesPanel.java Sun Nov 24 22:21:58 2013
@@ -0,0 +1,354 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.protocol.jms.control.gui;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BorderFactory;
+import javax.swing.DefaultCellEditor;
+import javax.swing.JButton;
+import javax.swing.JComboBox;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.ListSelectionModel;
+import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableColumn;
+
+import org.apache.jmeter.gui.util.HeaderAsPropertyRenderer;
+import org.apache.jmeter.protocol.jms.sampler.JMSProperties;
+import org.apache.jmeter.protocol.jms.sampler.JMSProperty;
+import org.apache.jmeter.testelement.TestElement;
+import org.apache.jmeter.util.JMeterUtils;
+import org.apache.jorphan.gui.GuiUtils;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.log.Logger;
+
+/**
+ * Handles input for Jms Properties
+ * @since 2.10.1
+ */
+public class JMSPropertiesPanel extends JPanel implements ActionListener {
+
+ private static final long serialVersionUID = -2893899384410289131L;
+
+ private static final Logger log = LoggingManager.getLoggerForClass();
+
+ private static final String ADD_COMMAND = "Add"; //$NON-NLS-1$
+
+ private static final String DELETE_COMMAND = "Delete"; //$NON-NLS-1$
+
+ private static final int COL_NAME = 0;
+ private static final int COL_VALUE = 1;
+ private static final int COL_TYPE = 2;
+
+ private InnerTableModel tableModel;
+
+ private JTable jmsPropertiesTable;
+
+ private JButton addButton;
+
+ private JButton deleteButton;
+
+
+ /**
+ * Default Constructor.
+ */
+ public JMSPropertiesPanel() {
+ tableModel = new InnerTableModel();
+ init();
+ }
+
+ public TestElement createTestElement() {
+ JMSProperties jmsProperties = tableModel.jmsProperties;
+ return (TestElement) jmsProperties.clone();
+ }
+
+ /**
+ * Modifies a given TestElement to mirror the data in the gui components.
+ *
+ * @see org.apache.jmeter.gui.JMeterGUIComponent#modifyTestElement(TestElement)
+ */
+ public void modifyTestElement(TestElement el) {
+ GuiUtils.stopTableEditing(jmsPropertiesTable);
+ JMSProperties jmsProperties = (JMSProperties) el;
+ jmsProperties.clear();
+ jmsProperties.addTestElement((TestElement) tableModel.jmsProperties.clone());
+ }
+
+ /**
+ * Clear GUI
+ */
+ public void clearGui() {
+ tableModel.clearData();
+ deleteButton.setEnabled(false);
+ }
+
+ /**
+ * Configures GUI from el
+ * @param el {@link TestElement}
+ */
+ public void configure(TestElement el) {
+ tableModel.jmsProperties.clear();
+ tableModel.jmsProperties.addTestElement((JMSProperties) el.clone());
+ if (tableModel.getRowCount() != 0) {
+ deleteButton.setEnabled(true);
+ }
+ }
+
+ /**
+ * Shows the main properties panel for this object.
+ */
+ private void init() {// called from ctor, so must not be overridable
+ setLayout(new BorderLayout());
+ setBorder(BorderFactory.createEmptyBorder(10, 10, 5, 10));
+ add(createPropertiesPanel(), BorderLayout.CENTER);
+ }
+
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ String action = e.getActionCommand();
+
+ if (action.equals(DELETE_COMMAND)) {
+ if (tableModel.getRowCount() > 0) {
+ // If a table cell is being edited, we must cancel the editing
+ // before deleting the row.
+ if (jmsPropertiesTable.isEditing()) {
+ TableCellEditor cellEditor = jmsPropertiesTable.getCellEditor(jmsPropertiesTable.getEditingRow(), jmsPropertiesTable
+ .getEditingColumn());
+ cellEditor.cancelCellEditing();
+ }
+
+ int rowSelected = jmsPropertiesTable.getSelectedRow();
+
+ if (rowSelected != -1) {
+ tableModel.removeRow(rowSelected);
+ tableModel.fireTableDataChanged();
+
+ // Disable the DELETE and SAVE buttons if no rows remaining
+ // after delete.
+ if (tableModel.getRowCount() == 0) {
+ deleteButton.setEnabled(false);
+ }
+
+ // Table still contains one or more rows, so highlight
+ // (select) the appropriate one.
+ else {
+ int rowToSelect = rowSelected;
+
+ if (rowSelected >= tableModel.getRowCount()) {
+ rowToSelect = rowSelected - 1;
+ }
+
+ jmsPropertiesTable.setRowSelectionInterval(rowToSelect, rowToSelect);
+ }
+ }
+ }
+ } else if (action.equals(ADD_COMMAND)) {
+ // If a table cell is being edited, we should accept the current
+ // value and stop the editing before adding a new row.
+ GuiUtils.stopTableEditing(jmsPropertiesTable);
+
+ tableModel.addNewRow();
+ tableModel.fireTableDataChanged();
+
+ // Enable the DELETE and SAVE buttons if they are currently
+ // disabled.
+ if (!deleteButton.isEnabled()) {
+ deleteButton.setEnabled(true);
+ }
+
+ // Highlight (select) the appropriate row.
+ int rowToSelect = tableModel.getRowCount() - 1;
+ jmsPropertiesTable.setRowSelectionInterval(rowToSelect, rowToSelect);
+ }
+ }
+
+ public JPanel createPropertiesPanel() {
+ // create the JTable that holds JMSProperty per row
+ jmsPropertiesTable = new JTable(tableModel);
+ jmsPropertiesTable.getTableHeader().setDefaultRenderer(new HeaderAsPropertyRenderer());
+ jmsPropertiesTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ jmsPropertiesTable.setPreferredScrollableViewportSize(new Dimension(100, 70));
+
+
+ TableColumn mechanismColumn = jmsPropertiesTable.getColumnModel().getColumn(COL_TYPE);
+ mechanismColumn.setCellEditor(new TypeCellEditor());
+
+ JPanel panel = new JPanel(new BorderLayout(0, 5));
+ panel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
+ JMeterUtils.getResString("jms_props"))); //$NON-NLS-1$
+ panel.add(new JScrollPane(jmsPropertiesTable));
+ panel.add(createButtonPanel(), BorderLayout.SOUTH);
+ return panel;
+ }
+
+ private JButton createButton(String resName, char mnemonic, String command, boolean enabled) {
+ JButton button = new JButton(JMeterUtils.getResString(resName));
+ button.setMnemonic(mnemonic);
+ button.setActionCommand(command);
+ button.setEnabled(enabled);
+ button.addActionListener(this);
+ return button;
+ }
+
+ private JPanel createButtonPanel() {
+ boolean tableEmpty = (tableModel.getRowCount() == 0);
+
+ addButton = createButton("add", 'A', ADD_COMMAND, true); //$NON-NLS-1$
+ deleteButton = createButton("delete", 'D', DELETE_COMMAND, !tableEmpty); //$NON-NLS-1$
+
+ // Button Panel
+ JPanel buttonPanel = new JPanel();
+ buttonPanel.add(addButton);
+ buttonPanel.add(deleteButton);
+ return buttonPanel;
+ }
+
+ private static class InnerTableModel extends AbstractTableModel {
+ private static final long serialVersionUID = 4638155137475747946L;
+ final JMSProperties jmsProperties;
+
+ public InnerTableModel() {
+ jmsProperties = new JMSProperties();
+ }
+
+ public void addNewRow() {
+ jmsProperties.addJmsProperty(new JMSProperty("","",String.class.getName()));
+ }
+
+ public void clearData() {
+ jmsProperties.clear();
+ fireTableDataChanged();
+ }
+
+ public void removeRow(int row) {
+ jmsProperties.removeJmsProperty(row);
+ }
+
+ @Override
+ public boolean isCellEditable(int row, int column) {
+ // all table cells are editable
+ return true;
+ }
+
+ @Override
+ public Class<?> getColumnClass(int column) {
+ return getValueAt(0, column).getClass();
+ }
+
+ /**
+ * Required by table model interface.
+ */
+ @Override
+ public int getRowCount() {
+ return jmsProperties.getJmsPropertyCount();
+ }
+
+ /**
+ * Required by table model interface.
+ */
+ @Override
+ public int getColumnCount() {
+ return 3;
+ }
+
+ /**
+ * Required by table model interface.
+ */
+ @Override
+ public String getColumnName(int column) {
+ switch(column) {
+ case COL_NAME:
+ return "name";
+ case COL_VALUE:
+ return "value";
+ case COL_TYPE:
+ return "jms_properties_type";
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * Required by table model interface.
+ */
+ @Override
+ public Object getValueAt(int row, int column) {
+ JMSProperty property = jmsProperties.getJmsProperty(row);
+
+ switch (column){
+ case COL_NAME:
+ return property.getName();
+ case COL_VALUE:
+ return property.getValue();
+ case COL_TYPE:
+ return property.getType();
+ default:
+ return null;
+ }
+ }
+
+ @Override
+ public void setValueAt(Object value, int row, int column) {
+ JMSProperty property = jmsProperties.getJmsProperty(row);
+ if(log.isDebugEnabled()) {
+ log.debug("Setting jms property value: " + value);
+ }
+ switch (column){
+ case COL_NAME:
+ property.setName((String)value);
+ break;
+ case COL_VALUE:
+ property.setValue((String) value);
+ break;
+ case COL_TYPE:
+ property.setType((String) value);
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ private static class TypeCellEditor extends DefaultCellEditor {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ public TypeCellEditor() {
+ super(new JComboBox(new Object[]{
+ Boolean.class.getName(),
+ Byte.class.getName(),
+ Short.class.getName(),
+ Integer.class.getName(),
+ Long.class.getName(),
+ Float.class.getName(),
+ Double.class.getName(),
+ String.class.getName()
+ }));
+ }
+ }
+}
Propchange: jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPropertiesPanel.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPublisherGui.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPublisherGui.java?rev=1545089&r1=1545088&r2=1545089&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPublisherGui.java (original)
+++ jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSPublisherGui.java Sun Nov 24 22:21:58 2013
@@ -28,13 +28,12 @@ import javax.swing.JPanel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
-import org.apache.jmeter.config.Arguments;
-import org.apache.jmeter.config.gui.ArgumentsPanel;
import org.apache.jmeter.gui.util.FilePanel;
import org.apache.jmeter.gui.util.JLabeledRadioI18N;
import org.apache.jmeter.gui.util.JSyntaxTextArea;
import org.apache.jmeter.gui.util.JTextScrollPane;
import org.apache.jmeter.gui.util.VerticalPanel;
+import org.apache.jmeter.protocol.jms.sampler.JMSProperties;
import org.apache.jmeter.protocol.jms.sampler.PublisherSampler;
import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
import org.apache.jmeter.testelement.TestElement;
@@ -118,7 +117,7 @@ public class JMSPublisherGui extends Abs
private final JLabeledRadioI18N destSetup =
new JLabeledRadioI18N("jms_dest_setup", DEST_SETUP_ITEMS, DEST_SETUP_STATIC); // $NON-NLS-1$
- private ArgumentsPanel jmsPropertiesPanel;
+ private JMSPropertiesPanel jmsPropertiesPanel;
public JMSPublisherGui() {
init();
@@ -177,7 +176,7 @@ public class JMSPublisherGui extends Abs
sampler.setUseAuth(useAuth.isSelected());
sampler.setUseNonPersistentDelivery(useNonPersistentDelivery.isSelected());
- Arguments args = (Arguments) jmsPropertiesPanel.createTestElement();
+ JMSProperties args = (JMSProperties) jmsPropertiesPanel.createTestElement();
sampler.setJMSProperties(args);
}
@@ -201,7 +200,7 @@ public class JMSPublisherGui extends Abs
mainPanel.add(createAuthPane());
mainPanel.add(iterations);
- jmsPropertiesPanel = new ArgumentsPanel(JMeterUtils.getResString("jms_props")); //$NON-NLS-1$
+ jmsPropertiesPanel = new JMSPropertiesPanel(); //$NON-NLS-1$
mainPanel.add(jmsPropertiesPanel);
configChoice.setLayout(new BoxLayout(configChoice, BoxLayout.X_AXIS));
@@ -245,7 +244,7 @@ public class JMSPublisherGui extends Abs
jmsPwd.setEnabled(false);
destSetup.setText(DEST_SETUP_STATIC);
useNonPersistentDelivery.setSelected(false);
- jmsPropertiesPanel.clear();
+ jmsPropertiesPanel.clearGui();
}
/**
Modified: jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSSamplerGui.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSSamplerGui.java?rev=1545089&r1=1545088&r2=1545089&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSSamplerGui.java (original)
+++ jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/control/gui/JMSSamplerGui.java Sun Nov 24 22:21:58 2013
@@ -33,6 +33,7 @@ import org.apache.jmeter.config.gui.Argu
import org.apache.jmeter.gui.util.HorizontalPanel;
import org.apache.jmeter.gui.util.JSyntaxTextArea;
import org.apache.jmeter.gui.util.JTextScrollPane;
+import org.apache.jmeter.protocol.jms.sampler.JMSProperties;
import org.apache.jmeter.protocol.jms.sampler.JMSSampler;
import org.apache.jmeter.samplers.gui.AbstractSamplerGui;
import org.apache.jmeter.testelement.TestElement;
@@ -72,7 +73,7 @@ public class JMSSamplerGui extends Abstr
private JLabeledChoice oneWay = new JLabeledChoice(JMeterUtils.getResString("jms_communication_style"), labels); //$NON-NLS-1$
- private ArgumentsPanel jmsPropertiesPanel;
+ private JMSPropertiesPanel jmsPropertiesPanel;
private ArgumentsPanel jndiPropertiesPanel;
@@ -101,7 +102,7 @@ public class JMSSamplerGui extends Abstr
messageContent.setInitialText(""); // $NON-NLS-1$
initialContextFactory.setText(""); // $NON-NLS-1$
providerUrl.setText(""); // $NON-NLS-1$
- jmsPropertiesPanel.clear();
+ jmsPropertiesPanel.clearGui();
jndiPropertiesPanel.clear();
}
@@ -133,7 +134,7 @@ public class JMSSamplerGui extends Abstr
Arguments jndiArgs = (Arguments) jndiPropertiesPanel.createTestElement();
element.setJNDIProperties(jndiArgs);
- Arguments args = (Arguments) jmsPropertiesPanel.createTestElement();
+ JMSProperties args = (JMSProperties) jmsPropertiesPanel.createTestElement();
element.setJMSProperties(args);
}
@@ -250,7 +251,7 @@ public class JMSSamplerGui extends Abstr
messageContent.setPreferredSize(pref);
messagePanel.add(messageContentPanel, BorderLayout.CENTER);
- jmsPropertiesPanel = new ArgumentsPanel(JMeterUtils.getResString("jms_props")); //$NON-NLS-1$
+ jmsPropertiesPanel = new JMSPropertiesPanel(); //$NON-NLS-1$
messagePanel.add(jmsPropertiesPanel, BorderLayout.SOUTH);
Box mainPanel = Box.createVerticalBox();
Added: jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSProperties.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSProperties.java?rev=1545089&view=auto
==============================================================================
--- jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSProperties.java (added)
+++ jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSProperties.java Sun Nov 24 22:21:58 2013
@@ -0,0 +1,248 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.protocol.jms.sampler;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.jmeter.testelement.AbstractTestElement;
+import org.apache.jmeter.testelement.property.CollectionProperty;
+import org.apache.jmeter.testelement.property.PropertyIterator;
+import org.apache.jmeter.testelement.property.TestElementProperty;
+
+/**
+ * A set of JMSProperty objects.
+ * @since 2.10.1
+ */
+public class JMSProperties extends AbstractTestElement implements Serializable {
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = -2896138201054314563L;
+ /** The name of the property used to store the JmsProperties. */
+ public static final String JMS_PROPERTIES = "JMSProperties.properties"; //$NON-NLS-1$
+
+ /**
+ * Create a new JmsPropertys object with no JmsProperties
+ */
+ public JMSProperties() {
+ setProperty(new CollectionProperty(JMS_PROPERTIES, new ArrayList<JMSProperty>()));
+ }
+
+ /**
+ * Get the JmsPropertiess.
+ *
+ * @return the JmsProperties
+ */
+ public CollectionProperty getProperties() {
+ return (CollectionProperty) getProperty(JMS_PROPERTIES);
+ }
+
+ /**
+ * Clear the JmsProperties.
+ */
+ @Override
+ public void clear() {
+ super.clear();
+ setProperty(new CollectionProperty(JMS_PROPERTIES, new ArrayList<JMSProperty>()));
+ }
+
+ /**
+ * Set the list of JmsProperties. Any existing JmsProperties will be lost.
+ *
+ * @param jmsProperties
+ * the new JmsProperties
+ */
+ public void setProperties(List<JMSProperty> jmsProperties) {
+ setProperty(new CollectionProperty(JMS_PROPERTIES, jmsProperties));
+ }
+
+ /**
+ * Get the JmsProperties as a Map. Each JMSProperty name is used as the key, and
+ * its value as the value.
+ *
+ * @return a new Map with String keys and values containing the JmsProperties
+ */
+ public Map<String, Object> getJmsPropertysAsMap() {
+ PropertyIterator iter = getProperties().iterator();
+ Map<String, Object> argMap = new LinkedHashMap<String, Object>();
+ while (iter.hasNext()) {
+ JMSProperty arg = (JMSProperty) iter.next().getObjectValue();
+ // Because CollectionProperty.mergeIn will not prevent adding two
+ // properties of the same name, we need to select the first value so
+ // that this element's values prevail over defaults provided by
+ // configuration
+ // elements:
+ if (!argMap.containsKey(arg.getName())) {
+ argMap.put(arg.getName(), arg.getValueAsObject());
+ }
+ }
+ return argMap;
+ }
+
+ /**
+ * Add a new JMSProperty with the given name and value.
+ *
+ * @param name
+ * the name of the JMSProperty
+ * @param value
+ * the value of the JMSProperty
+ */
+ public void addJmsProperty(String name, String value) {
+ addJmsProperty(new JMSProperty(name, value));
+ }
+
+ /**
+ * Add a new argument.
+ *
+ * @param arg
+ * the new argument
+ */
+ public void addJmsProperty(JMSProperty arg) {
+ TestElementProperty newArg = new TestElementProperty(arg.getName(), arg);
+ if (isRunningVersion()) {
+ this.setTemporary(newArg);
+ }
+ getProperties().addItem(newArg);
+ }
+
+ /**
+ * Add a new argument with the given name, value, and metadata.
+ *
+ * @param name
+ * the name of the argument
+ * @param value
+ * the value of the argument
+ * @param metadata
+ * the metadata for the argument
+ */
+ public void addJmsProperty(String name, String value, String type) {
+ addJmsProperty(new JMSProperty(name, value, type));
+ }
+
+ /**
+ * Get a PropertyIterator of the JmsProperties.
+ *
+ * @return an iteration of the JmsProperties
+ */
+ public PropertyIterator iterator() {
+ return getProperties().iterator();
+ }
+
+ /**
+ * Create a string representation of the JmsProperties.
+ *
+ * @return the string representation of the JmsProperties
+ */
+ @Override
+ public String toString() {
+ StringBuilder str = new StringBuilder();
+ PropertyIterator iter = getProperties().iterator();
+ while (iter.hasNext()) {
+ JMSProperty arg = (JMSProperty) iter.next().getObjectValue();
+ str.append(arg.toString());
+ if (iter.hasNext()) {
+ str.append(","); //$NON-NLS-1$
+ }
+ }
+ return str.toString();
+ }
+
+ /**
+ * Remove the specified argument from the list.
+ *
+ * @param row
+ * the index of the argument to remove
+ */
+ public void removeJmsProperty(int row) {
+ if (row < getProperties().size()) {
+ getProperties().remove(row);
+ }
+ }
+
+ /**
+ * Remove the specified argument from the list.
+ *
+ * @param arg
+ * the argument to remove
+ */
+ public void removeJmsProperty(JMSProperty arg) {
+ PropertyIterator iter = getProperties().iterator();
+ while (iter.hasNext()) {
+ JMSProperty item = (JMSProperty) iter.next().getObjectValue();
+ if (arg.equals(item)) {
+ iter.remove();
+ }
+ }
+ }
+
+ /**
+ * Remove the argument with the specified name.
+ *
+ * @param argName
+ * the name of the argument to remove
+ */
+ public void removeJmsProperty(String argName) {
+ PropertyIterator iter = getProperties().iterator();
+ while (iter.hasNext()) {
+ JMSProperty arg = (JMSProperty) iter.next().getObjectValue();
+ if (arg.getName().equals(argName)) {
+ iter.remove();
+ }
+ }
+ }
+
+ /**
+ * Remove all JmsProperties from the list.
+ */
+ public void removeAllJmsPropertys() {
+ getProperties().clear();
+ }
+
+ /**
+ * Get the number of JmsProperties in the list.
+ *
+ * @return the number of JmsProperties
+ */
+ public int getJmsPropertyCount() {
+ return getProperties().size();
+ }
+
+ /**
+ * Get a single JMSProperty.
+ *
+ * @param row
+ * the index of the JMSProperty to return.
+ * @return the JMSProperty at the specified index, or null if no JMSProperty
+ * exists at that index.
+ */
+ public JMSProperty getJmsProperty(int row) {
+ JMSProperty argument = null;
+
+ if (row < getProperties().size()) {
+ argument = (JMSProperty) getProperties().get(row).getObjectValue();
+ }
+
+ return argument;
+ }
+}
Propchange: jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSProperties.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added: jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSProperty.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSProperty.java?rev=1545089&view=auto
==============================================================================
--- jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSProperty.java (added)
+++ jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSProperty.java Sun Nov 24 22:21:58 2013
@@ -0,0 +1,171 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.protocol.jms.sampler;
+
+import java.io.Serializable;
+
+import org.apache.jmeter.testelement.AbstractTestElement;
+import org.apache.jmeter.testelement.property.StringProperty;
+
+/**
+ * JMS Property with type
+ * @since 2.10.1
+ */
+public class JMSProperty extends AbstractTestElement implements Serializable {
+
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 6371090992800805753L;
+
+ /** Name used to store the JmsProperty's name. */
+ public static final String PROP_NAME = "JMSProperty.name"; // $NON-NLS-1$
+
+ /** Name used to store the JmsProperty's value. */
+ public static final String PROP_VALUE = "JMSProperty.value"; // $NON-NLS-1$
+
+ /** Name used to store the JmsProperty's description. */
+ public static final String PROP_TYPE = "JMSProperty.type"; // $NON-NLS-1$
+
+ private static final String DFLT_TYPE = String.class.getName();
+
+ /**
+ * Create a new JmsProperty without a name, value, or metadata.
+ */
+ public JMSProperty() {
+ }
+
+ /**
+ * Create a new JmsProperty with the specified name and value, and String type.
+ *
+ * @param name
+ * the prop name
+ * @param value
+ * the prop value
+ */
+ public JMSProperty(String name, String value) {
+ this(name, value, DFLT_TYPE);
+ }
+
+ /**
+ * Create a new JmsProperty with the specified name and value, and String type.
+ *
+ * @param name
+ * the prop name
+ * @param value
+ * the prop value
+ * @param type
+ * the type type
+ */
+ public JMSProperty(String name, String value, String type) {
+ setProperty(new StringProperty(PROP_NAME, name));
+ setProperty(new StringProperty(PROP_VALUE, value));
+ setProperty(new StringProperty(PROP_TYPE, type));
+ }
+
+ /**
+ * Set the name of the JmsProperty.
+ *
+ * @param newName
+ * the new name
+ */
+ @Override
+ public void setName(String newName) {
+ setProperty(new StringProperty(PROP_NAME, newName));
+ }
+
+ /**
+ * Get the name of the JmsProperty.
+ *
+ * @return the attribute's name
+ */
+ @Override
+ public String getName() {
+ return getPropertyAsString(PROP_NAME);
+ }
+
+ /**
+ * Sets the value of the JmsProperty.
+ *
+ * @param newValue
+ * the new value
+ */
+ public void setValue(String newValue) {
+ setProperty(new StringProperty(PROP_VALUE, newValue));
+ }
+
+ /**
+ * Gets the value of the JmsProperty object.
+ *
+ * @return the attribute's value
+ */
+ public String getValue() {
+ return getPropertyAsString(PROP_VALUE);
+ }
+
+ /**
+ * Sets the Meta Data attribute of the JmsProperty.
+ *
+ * @param newMetaData
+ * the new metadata
+ */
+ public void setType(String type) {
+ setProperty(new StringProperty(PROP_TYPE, type));
+ }
+
+ /**
+ * Gets the Meta Data attribute of the JmsProperty.
+ *
+ * @return the MetaData value
+ */
+ public String getType() {
+ return getPropertyAsString(PROP_TYPE);
+ }
+
+ @Override
+ public String toString() {
+ return getName() + "," + getValue()+","+getType();
+ }
+
+ public Object getValueAsObject() {
+ String type = getType();
+ String value = getValue();
+
+ if(type.equals(Boolean.class.getName())) {
+ return Boolean.valueOf(value);
+ } else if(type.equals(Byte.class.getName())) {
+ return Byte.valueOf(value);
+ } else if(type.equals(Short.class.getName())) {
+ return Short.valueOf(value);
+ } else if(type.equals(Integer.class.getName())) {
+ return Integer.valueOf(value);
+ } else if(type.equals(Long.class.getName())) {
+ return Long.valueOf(value);
+ } else if(type.equals(Float.class.getName())) {
+ return Float.valueOf(value);
+ } else if(type.equals(Double.class.getName())) {
+ return Double.valueOf(value);
+ } else if(type.equals(String.class.getName())) {
+ return value;
+ } else {
+ return null;
+ }
+ }
+}
Propchange: jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSProperty.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSSampler.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSSampler.java?rev=1545089&r1=1545088&r2=1545089&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSSampler.java (original)
+++ jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/JMSSampler.java Sun Nov 24 22:21:58 2013
@@ -185,16 +185,33 @@ public class JMSSampler extends Abstract
}
private void addJMSProperties(TextMessage msg) throws JMSException {
- Map<String, String> map = getArguments(JMSSampler.JMS_PROPERTIES).getArgumentsAsMap();
- Utils.addJMSProperties(msg, map);
+ Utils.addJMSProperties(msg, getJMSProperties().getJmsPropertysAsMap());
}
- public Arguments getJMSProperties() {
- return getArguments(JMSSampler.JMS_PROPERTIES);
+ /**
+ * @return {@link JMSProperties} JMS Properties
+ */
+ public JMSProperties getJMSProperties() {
+ Object o = getProperty(JMS_PROPERTIES).getObjectValue();
+ JMSProperties jmsProperties = null;
+ // Backward compatibility with versions <= 2.10
+ if(o instanceof Arguments) {
+ jmsProperties = Utils.convertArgumentsToJmsProperties((Arguments)o);
+ } else {
+ jmsProperties = (JMSProperties) o;
+ }
+ if(jmsProperties == null) {
+ jmsProperties = new JMSProperties();
+ setJMSProperties(jmsProperties);
+ }
+ return jmsProperties;
}
-
- public void setJMSProperties(Arguments args) {
- setProperty(new TestElementProperty(JMSSampler.JMS_PROPERTIES, args));
+
+ /**
+ * @param jmsProperties JMS Properties
+ */
+ public void setJMSProperties(JMSProperties jmsProperties) {
+ setProperty(new TestElementProperty(JMS_PROPERTIES, jmsProperties));
}
public Arguments getJNDIProperties() {
Modified: jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/PublisherSampler.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/PublisherSampler.java?rev=1545089&r1=1545088&r2=1545089&view=diff
==============================================================================
--- jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/PublisherSampler.java (original)
+++ jmeter/trunk/src/protocol/jms/org/apache/jmeter/protocol/jms/sampler/PublisherSampler.java Sun Nov 24 22:21:58 2013
@@ -165,24 +165,26 @@ public class PublisherSampler extends Ba
int loop = getIterationCount();
result.sampleStart();
String type = getMessageChoice();
+
try {
+ Map<String, Object> msgProperties = getJMSProperties().getJmsPropertysAsMap();
for (int idx = 0; idx < loop; idx++) {
if (JMSPublisherGui.TEXT_MSG_RSC.equals(type)){
String tmsg = getMessageContent();
- Message msg = publisher.publish(tmsg, getDestination(), getJMSProperties().getArgumentsAsMap());
+ Message msg = publisher.publish(tmsg, getDestination(), msgProperties);
buffer.append(tmsg);
Utils.messageProperties(propBuffer, msg);
} else if (JMSPublisherGui.MAP_MSG_RSC.equals(type)){
Map<String, Object> m = getMapContent();
- Message msg = publisher.publish(m, getDestination(), getJMSProperties().getArgumentsAsMap());
+ Message msg = publisher.publish(m, getDestination(), msgProperties);
Utils.messageProperties(propBuffer, msg);
} else if (JMSPublisherGui.OBJECT_MSG_RSC.equals(type)){
Serializable omsg = getObjectContent();
- Message msg = publisher.publish(omsg, getDestination(), getJMSProperties().getArgumentsAsMap());
+ Message msg = publisher.publish(omsg, getDestination(), msgProperties);
Utils.messageProperties(propBuffer, msg);
} else if (JMSPublisherGui.BYTES_MSG_RSC.equals(type)){
byte[] bmsg = getBytesContent();
- Message msg = publisher.publish(bmsg, getDestination(), getJMSProperties().getArgumentsAsMap());
+ Message msg = publisher.publish(bmsg, getDestination(), msgProperties);
Utils.messageProperties(propBuffer, msg);
} else {
throw new JMSException(type+ " is not recognised");
@@ -202,7 +204,6 @@ public class PublisherSampler extends Ba
return result;
}
-
private Map<String, Object> getMapContent() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {
Map<String,Object> m = new HashMap<String,Object>();
String text = getMessageContent();
@@ -502,31 +503,30 @@ public class PublisherSampler extends Ba
public boolean getUseNonPersistentDelivery() {
return getPropertyAsBoolean(NON_PERSISTENT_DELIVERY, false);
}
-
- public void setArguments(Arguments args) {
- setProperty(new TestElementProperty(JMS_PROPERTIES, args));
- }
-
- public Arguments getArguments(String name) {
- return (Arguments) getProperty(name).getObjectValue();
- }
/**
- * @return Arguments JMS Properties
+ * @return {@link JMSProperties} JMS Properties
*/
- public Arguments getJMSProperties() {
- Arguments arguments = getArguments(JMS_PROPERTIES);
- if(arguments == null) {
- arguments = new Arguments();
- setArguments(arguments);
+ public JMSProperties getJMSProperties() {
+ Object o = getProperty(JMS_PROPERTIES).getObjectValue();
+ JMSProperties jmsProperties = null;
+ // Backward compatibility with versions <= 2.10
+ if(o instanceof Arguments) {
+ jmsProperties = Utils.convertArgumentsToJmsProperties((Arguments)o);
+ } else {
+ jmsProperties = (JMSProperties) o;
+ }
+ if(jmsProperties == null) {
+ jmsProperties = new JMSProperties();
+ setJMSProperties(jmsProperties);
}
- return arguments;
+ return jmsProperties;
}
-
+
/**
- * @param args Arguments JMS Properties
+ * @param jmsProperties JMS Properties
*/
- public void setJMSProperties(Arguments args) {
- setProperty(new TestElementProperty(JMS_PROPERTIES, args));
+ public void setJMSProperties(JMSProperties jmsProperties) {
+ setProperty(new TestElementProperty(JMS_PROPERTIES, jmsProperties));
}
}
Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1545089&r1=1545088&r2=1545089&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml (original)
+++ jmeter/trunk/xdocs/changes.xml Sun Nov 24 22:21:58 2013
@@ -175,6 +175,7 @@ A workaround is to use a Java 7 update 4
<h3>Other samplers</h3>
<ul>
+<li><bugzilla>55589</bugzilla> - JMS Publisher/Point to Point : Add ability to set typed values in JMS header properties.</li>
</ul>
<h3>Controllers</h3>