/* * Copyright 2003,2004 Colin Crist * * Licensed 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 hermes.browser.tasks; import hermes.Domain; import hermes.Hermes; import hermes.browser.HermesBrowser; import hermes.browser.IconCache; import hermes.browser.actions.BrowserAction; import hermes.config.DestinationConfig; import hermes.swing.SwingRunner; import java.util.ArrayList; import java.util.Collection; import javax.jms.JMSException; import javax.swing.JOptionPane; import javax.swing.ProgressMonitor; import javax.swing.SwingUtilities; import org.apache.log4j.Logger; /** * Truncate a queue. * * @author colincrist@hermesjms.com * @version $Id: TruncateQueueAction.java,v 1.2 2004/07/30 17:25:14 colincrist * Exp $ */ public class TruncateQueueTask extends TaskSupport { private static final Logger log = Logger.getLogger(TruncateQueueTask.class); private DestinationConfig dConfig; private Hermes hermes; private Collection<String> messageIds; private boolean showWarning = true; private ProgressMonitor monitor; private BrowserAction action; public TruncateQueueTask(Hermes hermes, DestinationConfig dConfig, BrowserAction action, boolean showWarning) { super(IconCache.getIcon("hermes.messages.delete")); this.dConfig = dConfig; this.hermes = hermes; this.showWarning = showWarning; this.action = action; } public TruncateQueueTask(Hermes hermes, DestinationConfig dConfig, Collection messageIds, BrowserAction action, boolean showWarning) { super(IconCache.getIcon("hermes.messages.delete")); this.dConfig = dConfig; this.hermes = hermes; this.messageIds = messageIds; this.action = action; this.showWarning = showWarning; } public String getTitle() { return (messageIds == null ? "Truncate" : "Delete") + " from " + dConfig.getName(); } public void invoke() throws Exception { if (messageIds == null) { doTruncate(); } else { doDelete(); } hermes.close(); } private void doTruncate() throws Exception { synchronized (this) { SwingUtilities.invokeLater(new Runnable() { public void run() { String message = null; if (dConfig.getDomain() == Domain.QUEUE.getId()) { message = "Are you sure you wish to truncate " + dConfig.getName() + " ?\nAll messages will be deleted from this queue."; } else { if (dConfig.isDurable()) { message = "Are you sure you wish to truncate all messages pending for the durable subscription " + dConfig.getClientID() + " on " + dConfig.getName() + "?"; } } if (JOptionPane.showConfirmDialog(HermesBrowser.getBrowser(), message, "Warning", JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) { stop(); notifyStatus("Truncate cancelled"); } synchronized (TruncateQueueTask.this) { TruncateQueueTask.this.notify(); } } }); try { this.wait(); } catch (InterruptedException ex) { // Nah... } } if (isRunning()) { int size = hermes.truncate(dConfig); if (size == 1) { Hermes.ui.getDefaultMessageSink().add( "Message deleted from " + dConfig.getName() + (dConfig.isDurable() ? " durableName=" + dConfig.getClientID() : "")); } else { Hermes.ui.getDefaultMessageSink().add( "Deleted " + size + " messages from " + dConfig.getName() + (dConfig.isDurable() ? " durableName=" + dConfig.getClientID() : "")); } if (action != null) { action.refresh(); } } } private void doDelete() throws Exception { synchronized (this) { if (showWarning) { SwingRunner.invokeLater(new Runnable() { public void run() { if (messageIds.size() > 0) { if (JOptionPane.showConfirmDialog(HermesBrowser.getBrowser(), "Are you sure you wish to delete " + messageIds.size() + ((messageIds.size() > 1) ? " messages" : " message") + " from " + dConfig.getName() + "?", "Warning", JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) { stop(); notifyStatus("Delete from " + dConfig.getName() + " cancelled"); } synchronized (TruncateQueueTask.this) { TruncateQueueTask.this.notify(); } } else { JOptionPane.showMessageDialog(HermesBrowser.getBrowser(), "No messages selected to delete.", "Cannot Delete", JOptionPane.ERROR_MESSAGE); } } }); try { this.wait(); } catch (InterruptedException ex) { // Nah... } } } if (isRunning()) { final StringBuffer message = new StringBuffer(); monitor = new ProgressMonitor(HermesBrowser.getBrowser(), "Deleting " + messageIds.size() + ((messageIds.size() == 1) ? " message" : " messages") + " from " + dConfig.getName(), "Connecting...", 0, messageIds.size()) { }; monitor.setMillisToDecideToPopup(50); monitor.setMillisToPopup(100); try { int batchSize = HermesBrowser.getBrowser().getConfig().getDeleteBatch() ; ArrayList<String> ids = new ArrayList<String>(); for (String messageId : messageIds) { ids.add(messageId); if (ids.size() == batchSize) { hermes.delete(dConfig, ids, monitor); ids.clear(); } } if (ids.size() > 0) { hermes.delete(dConfig, ids, monitor); } hermes.commit(); if (action != null) { action.refresh(); } hermes.close(); Hermes.ui.getDefaultMessageSink().add(message.toString()); } catch (Exception ex) { message.append("During delete from ").append(dConfig.getName()).append(": ").append(ex.getMessage()); log.error(ex.getMessage(), ex); try { hermes.rollback(); } catch (JMSException ex2) { message.append("\nRollback also failed, probably transport failure."); log.error(ex2); } SwingRunner.invokeLater(new Runnable() { public void run() { JOptionPane.showMessageDialog(HermesBrowser.getBrowser(), message.toString(), "Copy Failed.", JOptionPane.OK_OPTION); } }); } finally { monitor.close(); } } } }