/* * 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.model; import hermes.Hermes; import hermes.HermesException; import hermes.HermesRuntimeException; import hermes.browser.HermesBrowser; import hermes.swing.HideableTableColumn; import hermes.swing.RowValueProvider; import hermes.util.JMSUtils; import java.util.Date; import java.util.Vector; import javax.jms.JMSException; import javax.jms.Message; import javax.swing.table.DefaultTableModel; import org.apache.log4j.Logger; import com.codestreet.selector.jms.ValueProvider; import com.codestreet.selector.parser.IValueProvider; /** * @author colincrist@hermesjms.com * @version $Id: MessageHeaderTableModel.java,v 1.2 2004/07/26 19:03:36 * colincrist Exp $ */ public class MessageHeaderTableModel extends DefaultTableModel implements RowValueProvider { /** * */ private static final long serialVersionUID = 5348456596625232189L; private static final Logger log = Logger.getLogger(MessageHeaderTableModel.class); private final Vector<Vector> rows = new Vector<Vector>(); private final Vector<Message> messages = new Vector<Message>(); private final Hermes hermes; private String destinationName; private Vector<HideableTableColumn> userProperties = new Vector<HideableTableColumn>(); public MessageHeaderTableModel(Hermes hermes, String destinationName) { this.hermes = hermes; this.destinationName = destinationName; addColumn("#"); addColumn("JMSMessageId"); addColumn("JMSDestination"); addColumn("JMSTimestamp"); addColumn("JMSType"); addColumn("JMSReplyTo"); addColumn("JMSCorrelationID"); addColumn("JMSExpiration"); addColumn("JMSPriority"); } public IValueProvider getValueProviderForRow(int row) { return ValueProvider.valueOf(messages.get(row)); } public Message getMessageAt(int row) { return (Message) messages.elementAt(row); } public void setDestinationName(String destinationName) { this.destinationName = destinationName; } public boolean isCellEditable(int row, int column) { return false; } public void clear() { rows.clear(); messages.clear(); fireTableDataChanged(); } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#getColumnCount() */ public int getColumnCount() { return 9 + userProperties.size(); } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#getRowCount() */ public int getRowCount() { if (rows == null) { return 0; } return rows.size(); } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#getValueAt(int, int) */ public Object getValueAt(int y, int x) { if (rows.size() > y) { Vector row = (Vector) rows.elementAt(y); return row.elementAt(x); } else { return null; } } public void removeFirstRow() { rows.remove(0); messages.remove(0); fireTableRowsDeleted(0, 1); } private Vector createRow(int messageIndex, Message message) throws JMSException { final Vector<Object> newRow = new Vector<Object>(); newRow.add(new Long(messageIndex)); newRow.add(message.getJMSMessageID()); // // Some providers, e.g. WebSphereMQ, when dealing with messages put from // a non-JMS sender don't include the destination // on the message so if its not there we'll use the configured name. try { if (message.getJMSDestination() != null) { newRow.add(JMSUtils.getDestinationName(message.getJMSDestination())); } else { newRow.add(destinationName); } } catch (Exception ex) { log.error("cannot get JMSDestination: " + ex.getMessage()); newRow.add("Unknown"); } try { newRow.add(new Date(message.getJMSTimestamp())); } catch (Exception ex) { newRow.add(new Date()); log.error("no JMSTimestamp in message: " + ex.getMessage()); } try { newRow.add(message.getJMSType()); } catch (Exception ex) { log.error("no JMSType in message: " + ex.getMessage()); newRow.add(""); } try { if (message.getJMSReplyTo() != null) { newRow.add(JMSUtils.getDestinationName(message.getJMSReplyTo())); } else { newRow.add(""); } } catch (Exception ex) { log.error("no JMSReplyTo in message: " + ex.getMessage()); newRow.add(""); } try { newRow.add(message.getJMSCorrelationID()); } catch (Exception ex) { log.error("no JMSCorrelationID in message: " + ex.getMessage()); newRow.add(""); } try { newRow.add(new Long(message.getJMSExpiration())); } catch (Exception ex) { log.error("no JMSExpiration in message: " + ex.getMessage()); newRow.add(""); } try { newRow.add(message.getJMSPriority()); } catch (Exception ex) { log.error("no JMSPriority in message: " + ex.getMessage()); newRow.add(""); } return newRow; } public void setFinalMessageIndex(int messageIndex) { try { // log.debug("setFinalMessageIndex, messageIndex=" + messageIndex); if (messageIndex == -1) { if (rows.size() > 0) { rows.clear(); messages.clear(); fireTableDataChanged(); } } else if (messageIndex != rows.size() - 1 && (HermesBrowser.getBrowser().getMaxMessagesInBrowserPane() == -1 || messageIndex < HermesBrowser.getBrowser() .getMaxMessagesInBrowserPane())) { int lastRow = rows.size() - 1; while (rows.size() != messageIndex + 1) { if (rows.size() > 0) { rows.remove(rows.size() - 1); messages.remove(messages.size() - 1); } else { break; } } fireTableDataChanged(); } } catch (HermesException ex) { throw new HermesRuntimeException(ex); } } public void addMessage(int messageIndex, Message message) throws JMSException { if (messageIndex < rows.size()) { Message existingMessage = messages.elementAt(messageIndex); // log.debug("comparing " + existingMessage.getJMSMessageID() + // " and " // + message.getJMSMessageID()); if (existingMessage.getJMSMessageID().equals(message.getJMSMessageID())) { // log.debug("add message (exists) index=" + messageIndex + // " id=" + // message.getJMSMessageID()); // The same message in the same index position, ignore it... return; } else { // log.debug("add message (change) index=" + messageIndex + " // size()= " + rows.size() + " id=" + // message.getJMSMessageID()); rows.setElementAt(createRow(messageIndex, message), messageIndex); messages.setElementAt(message, messageIndex); fireTableRowsUpdated(messageIndex, messageIndex); return; } } else { // log.debug("add message (append) index=" + messageIndex + " id=" + // message.getJMSMessageID()); } rows.add(createRow(messageIndex, message)); messages.add(message); fireTableRowsInserted(messageIndex, messageIndex); } /* * (non-Javadoc) * * @see javax.swing.table.TableModel#getColumnName(int) */ public String getColumnName(int arg0) { switch (arg0) { case 0: return "#"; case 1: return "JMSMessageID"; case 2: return "JMSDestination"; case 3: return "JMSTimestamp"; case 4: return "JMSType"; case 5: return "JMSReplyTo"; case 6: return "JMSCorrelationID"; case 7: return "JMSExpiration"; case 8: return "JMSPriority"; } return super.getColumnName(arg0); } public Class getColumnClass(int column) { switch (column) { case 0: return Long.class; case 1: return String.class; case 2: return String.class; case 3: return String.class; case 4: return String.class; case 5: return String.class; case 6: return String.class; case 7: return Long.class; case 8: return Integer.class; } return super.getColumnClass(column); } public Object getChildValueAt(int row) { return getMessageAt(row); } public void updateMessage(Message message) throws JMSException { for (int i = 0; i < messages.size(); i++) { if (messages.get(i).getJMSMessageID().equals(message.getJMSMessageID())) { messages.set(i, message); fireTableRowsUpdated(i, i); break; } } } }