📄 frmevbrowser.java
字号:
//Title: Event Browser
//Version:
//Author: Adam Cheyer
//Company: SRI International
//Description: Displays and records event traces
/**
* The contents of this file are subject to the OAA Community Research
* 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.ai.sri.com/~oaa/. Software distributed under the License
* is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the License for the specific language governing
* rights and limitations under the License. Portions of the software are
* Copyright (c) SRI International, 1999. All rights reserved.
* "OAA" is a registered trademark, and "Open Agent Architecture" is a
* trademark, of SRI International, a California nonprofit public benefit
* corporation.
*/
package com.sri.oaa2.agt.monitor;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;
import com.sri.oaa2.icl.*;
public class frmEvBrowser extends JFrame {
BorderLayout borderLayout1 = new BorderLayout();
JScrollPane jScrollPane1 = new JScrollPane();
JList lstEvents = new JList();
JToolBar jToolBar1 = new JToolBar();
JButton btnClear = new JButton();
JButton btnFilters = new JButton();
JRadioButton rbHighLevel = new JRadioButton();
JRadioButton rbTcp = new JRadioButton();
JCheckBox chkOneAgent = new JCheckBox();
// Class variables -----------------------------------
int evtAt = -1; // Current event
Vector evtLog = new Vector(); // Contains log of all events
Vector evtLogF = new Vector(); // Contains formatted log of all events
frmMonitor fMonitor = null; // Pointer back to parent
String findStr = "";
int findPos = 0;
IclTerm lastSolutions = null; // format event stores last solutions here
// previous points for event arrows (used to erase previous)
Point prevPt1 = null;
Point prevPt2 = null;
public frmEvBrowser(frmMonitor f) {
try {
fMonitor = f;
jbInit();
}
catch (Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
// Main window
this.setSize(600,300);
this.getContentPane().setLayout(borderLayout1);
// Buttons and options
// Clear all events
this.setTitle("Event Log");
this.addComponentListener(new java.awt.event.ComponentAdapter() {
public void componentResized(ComponentEvent e) {
this_componentResized(e);
}
});
btnClear.setText("Clear Log");
btnClear.setSelected(true);
btnClear.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
btnClear_actionPerformed(e);
}
});
btnFilters.setText("Set Filters");
btnFilters.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
btnFilter_actionPerformed(e);
}
});
// Display high-level version of events
rbHighLevel.setText("High Level");
rbHighLevel.setSelected(true);
rbHighLevel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
rbLevel_actionPerformed(e);
}
});
// Display low-level (TCP) version of events
rbTcp.setText("TCP Level");
rbTcp.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
rbLevel_actionPerformed(e);
}
});
// Display only events for currenly selected agent
chkOneAgent.setText("Only current agent");
chkOneAgent.setEnabled(false);
chkOneAgent.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
chkOneAgent_actionPerformed(e);
}
});
// Scrolling event window
jScrollPane1.setPreferredSize(new Dimension(300,200));
jScrollPane1.getViewport().add(lstEvents, null);
lstEvents.setFont(new Font("Courier", 0, 12));
this.getContentPane().add(jScrollPane1, BorderLayout.CENTER);
lstEvents.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(KeyEvent e) {
lstEvents_keyPressed(e);
}
});
// Toolbar
this.getContentPane().add(jToolBar1, BorderLayout.NORTH);
jToolBar1.add(btnFilters, null);
jToolBar1.addSeparator();
jToolBar1.add(btnClear, null);
jToolBar1.addSeparator();
jToolBar1.add(rbHighLevel, null);
jToolBar1.add(rbTcp, null);
jToolBar1.add(chkOneAgent, null);
// Group the radio buttons.
ButtonGroup group = new ButtonGroup();
group.add(rbHighLevel);
group.add(rbTcp);
}
/**
// Formats an event as "high level", meaning at a level
// that programmers familiar with the OAA library API
// will be used to. "tcp level" doesn't change the event
// at all, just returning the exact bytes that were sent.
*/
public String formatEvent(String ev, boolean highLevel) {
lastSolutions = null;
if (highLevel) {
IclTerm evt = IclTerm.fromString(true, ev);
if (evt == null || !(evt instanceof IclStruct)) {
return ev;
}
String fun = ((IclStruct)evt).getFunctor();
int arity = evt.size();
/////////// oaaSolve()
// ev_solve(GoalId,Goal,Params) --> oaaSolve(Goal, Params)
if ((fun.equals("ev_solve"))) {
return "oaaSolve(" + evt.getTerm(1) + "," + evt.getTerm(2) + ")";
} else
// ev_solved(GoalId,Requestees,Solvers,Goal,P,Sols) --> N solutions found for Goal
if (fun.equals("ev_solved")) {
String goal = "[]";
String params = "[]";
IclTerm solutions = null;
String res = "";
Integer numSolutions;
goal = evt.getTerm(3).toString();
params = evt.getTerm(4).toString();
solutions = evt.getTerm(5);
numSolutions = new Integer(solutions.size());
res = numSolutions.toString() +
" solution(s) found for " + goal + "," + params;
numSolutions = new Integer(1);
// Store solutions for event in global variable
lastSolutions = solutions;
return res;
} else
/////////// oaaAddData(), oaaRemoveData(), oaaReplaceData()
// ev_update_data(GoalId,Mode,Data,Params) --> oaaAddData(Data,Params)
if ((fun.equals("ev_update_data"))) {
if (evt.getTerm(1).toString().equals("add"))
return "oaaAddData(" + evt.getTerm(2) + "," + evt.getTerm(3) + ")";
else
if (evt.getTerm(1).toString().equals("remove"))
return "oaaRemoveData(" + evt.getTerm(2) + "," + evt.getTerm(3) + ")";
else
if (evt.getTerm(1).toString().equals("replace"))
return "oaaReplaceData(" + evt.getTerm(2) + "," + evt.getTerm(3) + ")";
else return ev;
} else
// ev_data_updated(GoalId,Mode,Data,P,Sols) --> Num solvers...
if (fun.equals("ev_data_updated")) {
String mode = evt.getTerm(1).toString();
String data = "[]";
String params = "[]";
IclTerm solutions = null;
String res = "";
Integer numSolutions;
data = evt.getTerm(2).toString();
params = evt.getTerm(3).toString();
solutions = evt.getTerm(5);
numSolutions = new Integer(solutions.size());
if (mode.equals("add"))
res = numSolutions + " solvers(s) found for oaaAddData(" + data + "," + params + ") : " + solutions;
else if (mode.equals("remove"))
res = numSolutions + " solvers(s) found for oaaRemoveData(" + data + "," + params + ") : " + solutions;
else if (mode.equals("replace"))
res = numSolutions + " solvers(s) found for oaaReplaceData(" + data + "," + params + ") : " + solutions;
return res;
} else
/////////// oaaAddTrigger(), oaaRemoveTrigger()
// *oaaReplaceTrigger() doesn't exist in OAA libraries yet for some reason
// ev_update_trigger(GoalId,Mode,Type,Cond,Act,Params) --> oaaAddTrigger(Type,Cond,Act,Params)
if (fun.equals("ev_update_trigger")) {
if (evt.getTerm(1).toString().equals("add"))
return "oaaAddTrigger(" + evt.getTerm(2) + "," + evt.getTerm(3) + "," + evt.getTerm(4) + "," + evt.getTerm(5) + ")";
else
if (evt.getTerm(1).toString().equals("remove"))
return "oaaRemoveTrigger(" + evt.getTerm(2) + "," + evt.getTerm(3) + "," + evt.getTerm(4) + "," + evt.getTerm(5) + ")";
else return ev;
} else
// ev_trigger_updated(GoalId,Mode,T,C,A,P,Sols) --> Num solvers:
if (fun.equals("ev_trigger_updated")) {
String mode = evt.getTerm(1).toString();
String type = "[]";
String cond = "[]";
String act = "[]";
String params = "[]";
IclTerm solutions = null;
String res = "";
Integer numSolutions;
type = evt.getTerm(2).toString();
cond = evt.getTerm(3).toString();
act = evt.getTerm(4).toString();
params = evt.getTerm(5).toString();
solutions = evt.getTerm(7);
numSolutions = new Integer(solutions.size());
if (mode.equals("add"))
res = numSolutions + " solvers(s) found for oaaAddTrigger(" + type + "," + cond + "," + act + "," + params + ") : " + solutions;
else if (mode.equals("remove"))
res = numSolutions + " solvers(s) found for oaaRemoveTrigger(" + type + "," + cond + "," + act + ","+ params + ") : " + solutions;
return res;
}
else return ev;
}
else return ev;
}
// Returns the sign (+1 or -1) of a number
int sign(double x) {
if (x >= 0)
return 1;
else return -1;
}
// Given a start point, end point, height and width of a component, and a pad
// size, shortens the end point so that it doesn't intersect with the component.
Point adjustEndpoint(Point startPt, Point endPt, int endH, int endW, int pad) {
double dx = startPt.x - endPt.x;
double dy = startPt.y - endPt.y;
Point res;
int newX = 0, newY = 0;
if (Math.abs(dx/dy) < 1) {
newY = endPt.y + sign(dy) * (endH / 2 + pad);
if (dy != 0)
newX = endPt.x + sign(dx) * (endW / 2 + pad) * (int)dx / (int) dy * sign(dx/dy);
else newX = endPt.x + sign(dx) * (endW / 2 + pad);
}
else {
newX = endPt.x + sign(dx) * (endW / 2 + pad);
if (dx != 0)
newY = endPt.y + sign(dy) * (endH / 2 + pad) * (int)dy / (int)dx * sign(dx/dy);
else newY = endPt.y + sign(dy) * (endH / 2 + pad);
}
return new Point(newX, newY);
}
// Given an agent component, draws an arrow from or to the facilitator button
// If agt is null, simply erases the last drawn arrow
void drawMsgArrow(agtInfo agt, boolean receive) {
Graphics g = fMonitor.pnlMonitor.getGraphics();
Point facPt, agtPt, newFacPt, newAgtPt;
int pad = 10;
int h = 0, w = 0;
// If no agent given, simply erase last drawn arrow
if (agt == null) {
if (prevPt1 != null) {
g.setColor(Color.lightGray);
g.drawLine(prevPt1.x, prevPt1.y, prevPt2.x, prevPt2.y);
g.fillRect(prevPt2.x-pad/2, prevPt2.y-pad/2, pad, pad);
}
}
else {
facPt = fMonitor.btnFacilitator.getLocation();
agtPt = agt.getLocation();
// the points start out in the center points of the facilitator and agent
facPt.x = facPt.x + (fMonitor.btnFacilitator.getWidth() / 2);
facPt.y = facPt.y + (fMonitor.btnFacilitator.getHeight() / 2);
agtPt.x = agtPt.x + (agt.getWidth() / 2);
agtPt.y = agtPt.y + (agt.getHeight() / 2);
// Erase last drawn arrow
if (prevPt1 != null) {
g.setColor(Color.lightGray);
g.drawLine(prevPt1.x, prevPt1.y, prevPt2.x, prevPt2.y);
g.fillRect(prevPt2.x-pad/2, prevPt2.y-pad/2, pad, pad);
}
newAgtPt = adjustEndpoint(facPt, agtPt, agt.getHeight(), agt.getWidth(), pad);
newFacPt = adjustEndpoint(agtPt, facPt, fMonitor.btnFacilitator.getHeight(),
fMonitor.btnFacilitator.getWidth(), pad);
if (receive) {
prevPt1 = newFacPt;
prevPt2 = newAgtPt;
}
else {
prevPt1 = newAgtPt;
prevPt2 = newFacPt;
}
// Draw the arrow
g.setColor(Color.blue);
g.drawLine(prevPt1.x, prevPt1.y, prevPt2.x, prevPt2.y);
g.fillRect(prevPt2.x-pad/2, prevPt2.y-pad/2, pad, pad);
}
}
// Given an event (in log format, ie. m_ev(OP, AGTID, EVENT), add it:
// - to the log record
// - to the event window
// - drawn graphically on the screen
public void addEvent(IclTerm event, boolean addToLog, boolean addToWindow, boolean drawGraphic) {
String op = event.getTerm(0).toString();
String AgtId = event.getTerm(1).getTerm(1).toString();
String ev = event.getTerm(2).toString();
agtInfo agt;
if (!fMonitor.shouldLogEvent(op, AgtId, ev))
return;
agt = fMonitor.findAgentByIdName(AgtId, null);
if (agt != null) {
if (addToLog) {
evtLog.addElement((evtLog.size()+1) + ": " + event.toString());
// We can now browse the events
if (evtLog.size() == 1) {
enableEventFunctions(true);
}
// Record # bytes for profiling information
if (op.compareTo("send") == 0) {
agt.bytesReceived = agt.bytesReceived + ev.length();
if (agt.bytesReceived > fMonitor.maxBytesReceived)
fMonitor.maxBytesReceived = agt.bytesReceived;
fMonitor.totalBytesReceived = fMonitor.totalBytesReceived + agt.bytesReceived;
}
else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -