package jade.tools.logging.gui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.InetAddress;
import java.net.URL;
import java.util.Map;
import java.util.HashMap;
import jade.content.onto.basic.Action;
import jade.core.Agent;
import jade.core.AID;
import jade.core.ContainerID;
import jade.gui.AgentTree;
import jade.tools.logging.LogManager;
import jade.tools.logging.JavaLoggingLogManagerImpl;
import jade.domain.FIPAException;
import jade.domain.FIPANames;
import jade.domain.FIPAService;
import jade.domain.JADEAgentManagement.CreateAgent;
import jade.domain.JADEAgentManagement.KillAgent;
import jade.domain.JADEAgentManagement.JADEManagementOntology;
import jade.gui.AclGui;
import jade.lang.acl.ACLMessage;
/**
* LogManager agent main GUI
*
* @author Giovanni Caire - TILAB
*/
public class LogManagerGUI extends JFrame {
private static final String DEFAULT_LOG_MANAGER_CLASS = "jade.tools.logging.JavaLoggingLogManagerImpl";
private Agent myAgent;
private AgentTree agentTree;
private JDesktopPane desktopPane;
private JSplitPane jsp;
private AbstractAction startManagingLogAction, stopManagingLogAction, setDefaultLoggingSystemAction, exitAction;
private Map managedContainers = new HashMap();
private LogManager defaultLogManager;
public LogManagerGUI(Agent a) {
super(a.getName());
myAgent = a;
setIconImage(getToolkit().getImage(getClass().getResource("/jade/gui/images/logger.gif")));
setTitle("JADE Log Manager Agent ("+myAgent.getLocalName()+")");
startManagingLogAction = new StartManagingLogAction(this);
stopManagingLogAction = new StopManagingLogAction(this);
setDefaultLoggingSystemAction = new SetDefaultLoggingSystemAction(this);
exitAction = new ExitAction(this);
//////////////////////////////////////////////
// Main menu and toolbar
//////////////////////////////////////////////
JMenuBar jmb = new JMenuBar();
JMenu menu = null;
menu = new JMenu("Settings");
menu.add(setDefaultLoggingSystemAction);
menu.addSeparator();
menu.add(exitAction);
jmb.add(menu);
menu = new JMenu("Logs");
menu.add(startManagingLogAction);
menu.add(stopManagingLogAction);
jmb.add(menu);
setJMenuBar(jmb);
JToolBar bar = new JToolBar();
URL url = null;
Dimension d = new Dimension(32, 32);
JButton startB = new JButton();
startB.setToolTipText("Start managing log on the selected container");
startB.setAction(startManagingLogAction);
url = getClass().getClassLoader().getResource("jade/tools/logging/gui/images/bullet1.gif");
startB.setIcon(new ImageIcon(url));
startB.setText(null);
startB.setMaximumSize(d);
startB.setMinimumSize(d);
startB.setPreferredSize(d);
JButton stopB = new JButton();
stopB.setToolTipText("Stop managing log on the selected container");
stopB.setAction(stopManagingLogAction);
url = getClass().getClassLoader().getResource("jade/tools/logging/gui/images/bullet2.gif");
stopB.setIcon(new ImageIcon(url));
stopB.setText(null);
stopB.setMaximumSize(d);
stopB.setMinimumSize(d);
stopB.setPreferredSize(d);
JButton setB = new JButton();
setB.setToolTipText("Set the default logging system to be managed");
setB.setAction(setDefaultLoggingSystemAction);
url = getClass().getClassLoader().getResource("jade/gui/images/tick_blue.gif");
setB.setIcon(new ImageIcon(url));
setB.setText(null);
setB.setMaximumSize(d);
setB.setMinimumSize(d);
setB.setPreferredSize(d);
bar.add(setB);
bar.addSeparator();
bar.add(startB);
bar.add(stopB);
getContentPane().add(bar, BorderLayout.NORTH);
//////////////////////////////////////////////
// Agent tree and space for internal frames
//////////////////////////////////////////////
Font f;
f = new Font("SanSerif", Font.PLAIN, 14);
setFont(f);
agentTree = new AgentTree(f);
JPopupMenu popup = new JPopupMenu();
popup.add(startManagingLogAction);
popup.add(stopManagingLogAction);
agentTree.setNewPopupMenu(AgentTree.CONTAINER_TYPE, popup);
agentTree.tree.setSize(new Dimension(300, 600));
desktopPane = new JDesktopPane();
desktopPane.setBackground(Color.lightGray);
jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane(agentTree.tree), new JScrollPane(desktopPane));
jsp.setContinuousLayout(true);
jsp.setDividerLocation(300);
getContentPane().add(jsp, BorderLayout.CENTER);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
exit();
}
});
// Initialize the default LogManager
defaultLogManager = new JavaLoggingLogManagerImpl();
}
/////////////////////////////////////////////
// Methods called by the LogManagerAgent
/////////////////////////////////////////////
public void showCorrect() {
pack();
setSize(800, 600);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
int centerX = (int) screenSize.getWidth()/2;
int centerY = (int) screenSize.getHeight()/2;
setLocation(centerX-getWidth()/2, centerY-getHeight()/2);
setVisible(true);
toFront();
}
public void resetTree() {
Runnable r = new Runnable() {
public void run() {
agentTree.clearLocalPlatform();
}
};
SwingUtilities.invokeLater(r);
}
public void addContainer(final String name, final InetAddress address) {
Runnable r = new Runnable() {
public void run() {
agentTree.addContainerNode(name, address);
}
};
SwingUtilities.invokeLater(r);
}
public void removeContainer(final String name) {
Runnable r = new Runnable() {
public void run() {
agentTree.removeContainerNode(name);
}
};
SwingUtilities.invokeLater(r);
}
public void refreshLocalPlatformName(final String name) {
Runnable r = new Runnable(){
public void run(){
agentTree.refreshLocalPlatformName(name);
}
};
SwingUtilities.invokeLater(r);
}
/////////////////////////////////////////////////////
// Action handling methods
/////////////////////////////////////////////////////
void startManagingLog() {
AgentTree.Node node = agentTree.getSelectedNode();
if (node != null && node instanceof AgentTree.ContainerNode) {
String containerName = node.getName();
System.out.println("Container name = "+containerName);
ContainerLogWindow window = (ContainerLogWindow) managedContainers.get(containerName);
if (window != null) {
System.out.println("Window found");
window.moveToFront();
}
else {
System.out.println("Window NOT found");
AID controller = null;
int state = 0;
try {
if (!containerName.equals(myAgent.here().getName())) {
// Request the AMS to start a Controller on the requested container
controller = createController(containerName);
}
state = 1;
window = new ContainerLogWindow(myAgent, containerName, controller, defaultLogManager, this);
window.pack();
window.setSize(600, 400);
window.setVisible(true);
managedContainers.put(containerName, window);
desktopPane.add(window);
window.moveToFront();
}
catch (FIPAException fe) {
String msg = (state == 0 ? "Cannot create Log Helper agent on container "+containerName : "Cannot retrieve logging information from container "+containerName);
int res = JOptionPane.showConfirmDialog(this, msg+"\nWould you like to see the message?", "WARNING", JOptionPane.YES_NO_OPTION);
if (res == JOptionPane.YES_OPTION) {
AclGui.showMsgInDialog(fe.getACLMessage(), this);
}
}
}
}
}
void stopManagingLog() {
AgentTree.Node node = agentTree.getSelectedNode();
if (node != null && node instanceof AgentTree.ContainerNode) {
String containerName = node.getName();
final ContainerLogWindow window = (ContainerLogWindow) managedContainers.remove(containerName);
if (window != null) {
AID controller = window.getController();
if (controller != null) {
// Kill the controller
killController(controller);
}
// Close the window for the seleced container
EventQueue.invokeLater(new Runnable() {
public void run() {
window.dispose();
}
});
}
}
}
void setDefaultLoggingSystem() {
LogManager lm = initializeLogManager();
if (lm != null) {
defaultLogManager = lm;
}
}
void exit() {
myAgent.doDelete();
}
////////////////////////////////////
// Utility methods
////////////////////////////////////
LogManager initializeLogManager() {
String className = null;
try {
className = JOptionPane.showInputDialog(this, "Insert the fully qualified class name of the LogManager implementation for the desired logging system");
if (className != null) {
return (LogManager) Class.forName(className).newInstance();
}
}
catch (Exception e) {
JOptionPane.showMessageDialog(this, "Cannot create a LogManager of class "+className+" ["+e+"]");
}
return null;
}
private ACLMessage createAMSRequest() {
ACLMessage request = new ACLMessage(ACLMessage.REQUEST);
request.addReceiver(myAgent.getAMS());
request.setProtocol(FIPANames.InteractionProtocol.FIPA_REQUEST);
request.setLanguage(FIPANames.ContentLanguage.FIPA_SL);
request.setOntology(JADEManagementOntology.getInstance().getName());
return request;
}
private AID createController(String containerName) throws FIPAException {
ACLMessage request = createAMSRequest();
CreateAgent ca = new CreateAgent();
String localName = myAgent.getLocalName()+"-helper-on-"+containerName;
ca.setAgentName(localName);
ca.setClassName("jade.tools.logging.LogHelperAgent");
ca.addArguments(myAgent.getAID());
ca.setContainer(new ContainerID(containerName, null));
Action act = new Action();
act.setActor(myAgent.getAMS());
act.setAction(ca);
try {
myAgent.getContentManager().fillContent(request, act);
ACLMessage inform = FIPAService.doFipaRequestClient(myAgent, request, 10000);
if (inform != null) {
return new AID(localName, AID.ISLOCALNAME);
}
else {
throw new FIPAException("Response timeout expired");
}
}
catch (FIPAException fe) {
throw fe;
}
catch (Exception e) {
// Should never happen
e.printStackTrace();
}
return null;
}
private void killController(AID controller) {
ACLMessage request = createAMSRequest();
KillAgent ka = new KillAgent();
ka.setAgent(controller);
Action act = new Action();
act.setActor(myAgent.getAMS());
act.setAction(ka);
try {
myAgent.getContentManager().fillContent(request, act);
FIPAService.doFipaRequestClient(myAgent, request, 10000);
}
catch (Exception e) {
// Should never happen
e.printStackTrace();
}
}
}