package hermes.browser.dialog.replay;
import hermes.Domain;
import hermes.Hermes;
import hermes.browser.HermesBrowser;
import hermes.browser.tasks.ReplayMessagesFromStoreTask;
import hermes.browser.tasks.ThreadPool;
import hermes.config.DestinationConfig;
import hermes.store.MessageStore;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import javax.naming.Binding;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
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 ReplayMessagesDialog extends JDialog {
private static final Logger log = Logger.getLogger(ReplayMessagesDialog.class);
private final JPanel contentPanel = new JPanel();
private JComboBox destinationComboBox;
private JComboBox hermesComboBox;
private MessageStore store;
private JButton tglbtnNewToggleButton;
private boolean isQueue = true;
private String[] getDestinations(Domain domain, String hermesId) {
Context ctx = HermesBrowser.getBrowser().getLoader().getContext();
ArrayList<String> destinations = new ArrayList<String>();
try {
Hermes hermes = (Hermes) ctx.lookup(hermesId);
for (Iterator<DestinationConfig> iter = hermes.getDestinations(); iter.hasNext();) {
final DestinationConfig destinationConfig = iter.next();
if (destinationConfig.getDomain() == domain.getId()) {
if (destinationConfig.getDomain() == Domain.TOPIC.getId()) {
if (destinations.contains(destinationConfig.getName())) {
continue;
}
}
destinations.add(destinationConfig.getName());
}
}
} catch (Exception ex) {
HermesBrowser.getBrowser().showErrorDialog(ex);
}
return destinations.toArray(new String[destinations.size()]);
}
private Collection<String> getHermesIds() {
Context ctx = HermesBrowser.getBrowser().getLoader().getContext();
ArrayList<String> hermesIds = new ArrayList<String>();
try {
for (NamingEnumeration iter = ctx.listBindings(""); iter.hasMoreElements();) {
final Binding binding = (Binding) iter.next();
if (binding.getObject() instanceof Hermes) {
final Hermes hermes = (Hermes) binding.getObject();
hermesIds.add(binding.getName());
}
}
} catch (NamingException ex) {
HermesBrowser.getBrowser().showErrorDialog(ex);
}
return hermesIds;
}
/**
* Create the dialog.
*
* @param lastDestination
* @param lastHermesId
*/
public ReplayMessagesDialog(MessageStore store, String lastHermesId, String lastDestination) {
this.store = store;
setTitle("Replay From " + store.getId());
setBounds(100, 100, 450, 181);
getContentPane().setLayout(new BorderLayout());
contentPanel.setBorder(new TitledBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null), "Select target", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)));
getContentPane().add(contentPanel, BorderLayout.CENTER);
contentPanel.setLayout(new FormLayout(new ColumnSpec[] { FormFactory.DEFAULT_COLSPEC, ColumnSpec.decode("default:grow"), ColumnSpec.decode("60dlu"), },
new RowSpec[] { FormFactory.DEFAULT_ROWSPEC, FormFactory.DEFAULT_ROWSPEC, FormFactory.RELATED_GAP_ROWSPEC, FormFactory.DEFAULT_ROWSPEC,
FormFactory.DEFAULT_ROWSPEC, }));
{
JLabel lblSession = new JLabel("Session:");
lblSession.setHorizontalAlignment(SwingConstants.RIGHT);
contentPanel.add(lblSession, "1, 2, right, default");
}
{
Collection<String> hermesIds = getHermesIds();
hermesComboBox = new JComboBox(hermesIds.toArray(new String[hermesIds.size()]));
if (!hermesIds.contains(lastHermesId)) {
lastHermesId = hermesIds.iterator().next();
}
hermesComboBox.setSelectedItem(lastHermesId);
contentPanel.add(hermesComboBox, "2, 2, 2, 1, fill, default");
hermesComboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String hermesId = (String) hermesComboBox.getSelectedItem();
destinationComboBox.setModel(new DefaultComboBoxModel(getDestinations(tglbtnNewToggleButton.isSelected() ? Domain.TOPIC : Domain.QUEUE,
hermesId)));
}
});
}
{
JLabel lblDestination = new JLabel("Destination:");
contentPanel.add(lblDestination, "1, 4, right, default");
}
{
destinationComboBox = new JComboBox(new DefaultComboBoxModel(getDestinations(Domain.QUEUE, lastHermesId)));
if (lastDestination != null) {
destinationComboBox.setSelectedItem(lastDestination);
}
contentPanel.add(destinationComboBox, "2, 4, fill, default");
}
{
tglbtnNewToggleButton = new JButton("Queues");
tglbtnNewToggleButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (isQueue) {
destinationComboBox.setModel(new DefaultComboBoxModel(getDestinations(Domain.TOPIC, getHermesId())));
tglbtnNewToggleButton.setText("Topics");
isQueue = false;
} else {
destinationComboBox.setModel(new DefaultComboBoxModel(getDestinations(Domain.QUEUE, getHermesId())));
tglbtnNewToggleButton.setText("Queues");
isQueue = true;
}
}
});
contentPanel.add(tglbtnNewToggleButton, "3, 4");
}
{
JPanel buttonPane = new JPanel();
FlowLayout fl_buttonPane = new FlowLayout(FlowLayout.RIGHT);
buttonPane.setLayout(fl_buttonPane);
getContentPane().add(buttonPane, BorderLayout.SOUTH);
{
JButton okButton = new JButton("OK");
okButton.setActionCommand("OK");
buttonPane.add(okButton);
getRootPane().setDefaultButton(okButton);
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
replay();
dispose();
}
});
}
{
final JButton cancelButton = new JButton("Cancel");
cancelButton.setActionCommand("Cancel");
buttonPane.add(cancelButton);
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
dispose();
}
});
}
}
}
public String getHermesId() {
return hermesComboBox.getSelectedItem().toString();
}
public Hermes getSelectedHermes() {
try {
return (Hermes) HermesBrowser.getBrowser().getLoader().getContext().lookup(getHermesId());
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
return null;
}
protected void replay() {
Hermes hermes = getSelectedHermes();
DestinationConfig dConfig = getSelectedDestination();
if (hermes != null && dConfig != null) {
ThreadPool.get().invokeLater(new ReplayMessagesFromStoreTask(store, hermes, dConfig));
}
}
public DestinationConfig getSelectedDestination() {
DestinationConfig dConfig = new DestinationConfig();
dConfig.setDomain(isQueue ? Domain.QUEUE.getId() : Domain.TOPIC.getId());
dConfig.setName((String) destinationComboBox.getSelectedItem());
return dConfig;
}
public String getDestination() {
return (String) destinationComboBox.getSelectedItem();
}
}