package hermes.browser.dialog.message;
import hermes.Domain;
import hermes.browser.components.EditedMessageHandler;
import hermes.util.JMSUtils;
import hermes.util.TextUtils;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;
import javax.jms.BytesMessage;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
import javax.naming.NamingException;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import org.apache.commons.lang.time.FastDateFormat;
import org.apache.log4j.Logger;
import com.jgoodies.forms.factories.FormFactory;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.RowSpec;
public class JMSHeaderPropertyPanel extends JPanel {
private static final Logger log = Logger.getLogger(JMSHeaderPropertyPanel.class);
private JTextField messageIdField;
private JTextField replyToField;
private JTextField correlationIDField;
private JTextField destinationField;
private JTextField typeField;
private JTextField timestampField;
private Message message;
private JSpinner expirationSpinner;
private JSpinner priroritySpinner;
private JComboBox messageTypeCombo;
private JButton tglbtnQueue;
private Domain replyToDomain = Domain.QUEUE;
public JComboBox getMessageTypeComboBox() {
return messageTypeCombo;
}
private void syncFromMessage() throws JMSException {
Calendar cal = Calendar.getInstance();
FastDateFormat fmt = FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss.SSSZ");
if (message.getJMSReplyTo() != null) {
replyToDomain = Domain.getDomain(message.getJMSReplyTo());
} else {
replyToDomain = Domain.QUEUE;
}
tglbtnQueue.setText(replyToDomain.toString());
messageIdField.setText(message.getJMSMessageID());
replyToField.setText(JMSUtils.getDestinationName(message.getJMSReplyTo()));
destinationField.setText(JMSUtils.getDestinationName(message.getJMSDestination()));
correlationIDField.setText(message.getJMSCorrelationID());
typeField.setText(message.getJMSType());
timestampField.setText(fmt.format(new Date(message.getJMSTimestamp())));
expirationSpinner.setValue(message.getJMSExpiration());
priroritySpinner.setValue(message.getJMSPriority());
if (message instanceof TextMessage) {
messageTypeCombo.setSelectedItem(MessageType.TextMessage);
} else if (message instanceof BytesMessage) {
messageTypeCombo.setSelectedItem(MessageType.BytesMessage);
} else if (message instanceof ObjectMessage) {
messageTypeCombo.setSelectedItem(MessageType.ObjectMessage);
} else if (message instanceof MapMessage) {
messageTypeCombo.setSelectedItem(MessageType.MapMessage);
} else if (message instanceof StreamMessage) {
messageTypeCombo.setSelectedItem(MessageType.StreamMessage);
}
}
public Message createMessage(EditedMessageHandler handler) throws JMSException, NamingException {
try {
MessageType messageType = (MessageType) messageTypeCombo.getSelectedItem();
Message newMessage = null;
switch (messageType) {
case TextMessage:
newMessage = handler.createTextMessage();
break;
case MapMessage:
newMessage = handler.createMapMessage();
break;
case Message:
newMessage = handler.createMessage();
break;
case BytesMessage:
newMessage = handler.createBytesMessage();
break;
case ObjectMessage:
newMessage = handler.createObjectMessage() ;
break ;
default:
throw new JMSException("Unsupported message type " + messageType);
}
if (!TextUtils.isEmpty(replyToField.getText())) {
newMessage.setJMSReplyTo(tglbtnQueue.getText().equals(Domain.QUEUE.toString()) ? handler.createQueue(replyToField.getText()) : handler.createTopic(replyToField.getText()));
}
if (!TextUtils.isEmpty(typeField.getText())) {
newMessage.setJMSType(typeField.getText());
}
if (this.message != null) {
newMessage.setJMSMessageID(this.message.getJMSMessageID());
newMessage.setJMSDestination(this.message.getJMSDestination());
}
if (!TextUtils.isEmpty(correlationIDField.getText())) {
newMessage.setJMSCorrelationID(correlationIDField.getText());
}
newMessage.setJMSPriority(((SpinnerNumberModel) priroritySpinner.getModel()).getNumber().intValue());
newMessage.setJMSExpiration(((SpinnerNumberModel) expirationSpinner.getModel()).getNumber().longValue());
return newMessage;
} finally {
handler.close();
}
}
/**
* Create the panel.
*/
public JMSHeaderPropertyPanel() {
setLayout(new FormLayout(new ColumnSpec[] { FormFactory.RELATED_GAP_COLSPEC, FormFactory.DEFAULT_COLSPEC, FormFactory.RELATED_GAP_COLSPEC, ColumnSpec.decode("max(75dlu;pref)"),
FormFactory.RELATED_GAP_COLSPEC, ColumnSpec.decode("max(75dlu;default)"), FormFactory.RELATED_GAP_COLSPEC, ColumnSpec.decode("75dlu"), FormFactory.RELATED_GAP_COLSPEC, },
new RowSpec[] { FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC,
FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
FormFactory.RELATED_GAP_ROWSPEC, FormFactory.MIN_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC,
FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, RowSpec.decode("min(50dlu;default)"), }));
JLabel jmsMessageIDLabel = new JLabel("JMS MessageID:");
jmsMessageIDLabel.setHorizontalAlignment(SwingConstants.RIGHT);
add(jmsMessageIDLabel, "2, 4");
messageIdField = new JTextField();
messageIdField.setEditable(false);
add(messageIdField, "4, 4, 5, 1, fill, default");
messageIdField.setColumns(10);
JLabel jmsDestinationLabel = new JLabel("JMS Destination:");
jmsDestinationLabel.setHorizontalAlignment(SwingConstants.RIGHT);
add(jmsDestinationLabel, "2, 6, right, default");
destinationField = new JTextField();
destinationField.setEditable(false);
add(destinationField, "4, 6, 5, 1, fill, default");
destinationField.setColumns(10);
JLabel jmsTimestampLabel = new JLabel("JMS Timestamp:");
jmsTimestampLabel.setHorizontalAlignment(SwingConstants.RIGHT);
add(jmsTimestampLabel, "2, 8, right, default");
timestampField = new JTextField();
timestampField.setEditable(false);
add(timestampField, "4, 8, 5, 1, fill, default");
timestampField.setColumns(10);
JLabel jmsReplyToLabel = new JLabel("JMS ReplyTo:");
jmsReplyToLabel.setHorizontalAlignment(SwingConstants.RIGHT);
add(jmsReplyToLabel, "2, 10, right, default");
replyToField = new JTextField();
add(replyToField, "4, 10, 3, 1, fill, default");
replyToField.setColumns(10);
tglbtnQueue = new JButton(replyToDomain.toString());
add(tglbtnQueue, "8, 10");
tglbtnQueue.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (replyToDomain.equals(Domain.QUEUE)) {
replyToDomain = Domain.TOPIC;
} else {
replyToDomain = Domain.QUEUE;
}
tglbtnQueue.setText(replyToDomain.toString());
}
});
JLabel jmsTypeLabel = new JLabel("JMS Type:");
add(jmsTypeLabel, "2, 14, right, default");
typeField = new JTextField();
add(typeField, "4, 14, 5, 1, fill, default");
typeField.setColumns(10);
// JPanel cpanel = new JPanel();
// cpanel.setLayout(new FlowLayout(FlowLayout.LEADING, 0, 5));
JLabel jmsCorrelationIDLabel = new JLabel("JMS CorrelationID:");
jmsCorrelationIDLabel.setHorizontalAlignment(SwingConstants.RIGHT);
add(jmsCorrelationIDLabel, "2, 16, right, default");
correlationIDField = new JTextField();
add(correlationIDField, "4, 16, 3, 1, fill, default");
correlationIDField.setColumns(30);
JButton generateCorrelationIdButton = new JButton("Generate");
add(generateCorrelationIdButton, "8, 16");
generateCorrelationIdButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
correlationIDField.setText(UUID.randomUUID().toString());
}
});
// JLabel jmsDeliveryModeLabel = new JLabel("JMS DeliveryMode:");
// add(jmsDeliveryModeLabel, "2, 18, right, default");
//
// deliveryModeCombo = new JComboBox();
// deliveryModeCombo.setModel(new
// DefaultComboBoxModel(DeliveryMode.values()));
// deliveryModeCombo.setEditable(false);
// add(deliveryModeCombo, "4, 18, fill, default");
JLabel jmsPriorityLabel = new JLabel("JMS Priority:");
add(jmsPriorityLabel, "2, 18, right, default");
priroritySpinner = new JSpinner();
priroritySpinner.setModel(new SpinnerNumberModel(new Integer(4), new Integer(0), new Integer(9), new Integer(1)));
add(priroritySpinner, "4, 18");
JLabel jmsExpirationLabel = new JLabel("JMS Expiration:");
add(jmsExpirationLabel, "6, 18, right, default");
expirationSpinner = new JSpinner();
expirationSpinner.setModel(new SpinnerNumberModel(new Long(0), new Long(0), null, new Long(1)));
add(expirationSpinner, "8, 18");
JLabel messageTypeLabel = new JLabel("Message Type:");
add(messageTypeLabel, "2, 20, right, default");
messageTypeCombo = new JComboBox();
messageTypeCombo.setModel(new DefaultComboBoxModel(MessageType.values()));
add(messageTypeCombo, "4, 20, 5, 1, fill, default");
}
public Message getMessage() {
return message;
}
public void setMessage(Message message) throws JMSException {
this.message = message;
syncFromMessage();
}
public void setMessage(Message message, String destinationName, Domain domain) throws JMSException {
this.message = message;
if (message != null) {
syncFromMessage();
}
if (destinationName != null) {
this.destinationField.setText(destinationName);
}
}
}