/*
* Copyright (C) 2011 Red Hat, Inc. and/or its affiliates.
*
* 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 org.jboss.errai.tools.monitoring;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
public class ServerLogPanel extends JFrame implements Attachable {
private ServerLogModel serverLogModel;
private ActivityProcessor.Handle handle;
public ServerLogPanel(MainMonitorGUI mainMonitorGUI) {
serverLogModel = new ServerLogModel();
JTable activityTable = new JTable(serverLogModel);
activityTable.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
activityTable.setDefaultRenderer(LogMessage.class, new DefaultTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
Object msg = ((LogMessage) value).getMessage();
if (msg != null) {
String txt = String.valueOf(msg);
setText(txt);
setToolTipText(txt);
}
else {
setText("--");
}
return this;
}
});
getContentPane().add(new JScrollPane(activityTable));
Point point = mainMonitorGUI.getLocation();
setLocation(point.x + 20, point.y + 20);
setSize(500, 300);
addWindowListener(new WindowListener() {
public void windowOpened(WindowEvent e) {
}
public void windowClosing(WindowEvent e) {
}
public void windowClosed(WindowEvent e) {
handle.dispose();
}
public void windowIconified(WindowEvent e) {
}
public void windowDeiconified(WindowEvent e) {
}
public void windowActivated(WindowEvent e) {
}
public void windowDeactivated(WindowEvent e) {
}
});
setTitle("Monitoring Bus");
setVisible(true);
}
public class ServerLogEntry {
private long time;
private EventType eventType;
private SubEventType subEventType;
private String subject;
private LogMessage message;
public ServerLogEntry(long time, EventType eventType, SubEventType subEventType, String subject, LogMessage message) {
this.time = time;
this.eventType = eventType;
this.subEventType = subEventType;
this.subject = subject;
this.message = message;
}
}
/**
* A simple wrapper for Swing's formatting purposes.
*/
public class LogMessage {
private Object message;
public LogMessage(Object message) {
this.message = message;
}
public Object getMessage() {
return (message==null) ? "" : String.valueOf(message);
}
}
public class ServerLogModel extends AbstractTableModel {
private ArrayList<ServerLogEntry> entries = new ArrayList<ServerLogEntry>();
private final String[] COLS
= {"Time", "Event Type", "Sub-Event Type", "Details", "Message"};
private final Class[] TYPES
= {String.class, Enum.class, Enum.class, String.class, LogMessage.class};
private DateFormat formatter = new SimpleDateFormat("hh:mm:ss.SSS");
@Override
public String getColumnName(int column) {
return COLS[column];
}
public int getRowCount() {
return entries.size();
}
public int getColumnCount() {
return COLS.length;
}
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0:
return formatter.format(new Date(entries.get(rowIndex).time));
case 1:
return entries.get(rowIndex).eventType;
case 2:
return entries.get(rowIndex).subEventType;
case 3:
return entries.get(rowIndex).subject;
case 4:
return entries.get(rowIndex).message;
}
return null;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return TYPES[columnIndex];
}
public void addMessage(long time, EventType eventType, SubEventType subEventType, String subject, Object message) {
entries.add(new ServerLogEntry(time, eventType, subEventType, subject, new LogMessage(message)));
fireTableRowsInserted(entries.size() - 1, entries.size() - 1);
}
}
public class MessageDetailsModel extends AbstractTableModel {
public int getRowCount() {
return 0;
}
public int getColumnCount() {
return 0;
}
public Object getValueAt(int rowIndex, int columnIndex) {
return null;
}
}
public void attach(ActivityProcessor proc) {
handle = proc.registerEvent(EventType.BUS_EVENT, new MessageMonitor() {
public void monitorEvent(MessageEvent event) {
String details = null;
switch (event.getSubType()) {
case REMOTE_UNSUBSCRIBE:
case REMOTE_SUBSCRIBE:
case SERVER_SUBSCRIBE:
case SERVER_UNSUBSCRIBE:
details = event.getSubject();
break;
case REMOTE_ATTACHED:
details = event.getFromBus();
break;
}
addMessage(event.getTime(), EventType.BUS_EVENT, event.getSubType(), details, event.getContents());
}
});
proc.notifyEvent(System.currentTimeMillis(), EventType.REPLAY_BUS_EVENTS, SubEventType.NONE, null, null, null, null, null, false);
}
public void addMessage(long time, EventType eventType, SubEventType subEventType, String subject, Object message) {
serverLogModel.addMessage(time, eventType, subEventType, subject, message);
}
}