package net.sf.sahi.ui;
import net.sf.sahi.Proxy;
import net.sf.sahi.config.Configuration;
import net.sf.sahi.test.BrowserLauncher;
import net.sf.sahi.util.BrowserType;
import net.sf.sahi.util.BrowserTypesLoader;
import net.sf.sahi.util.Utils;
import org.apache.log4j.Logger;
import javax.swing.*;
import javax.swing.border.Border;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EtchedBorder;
import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Level;
/**
* Dashboard exposes various Sahi components from a convenient place.
*/
public class Dashboard extends JFrame {
// Useful link: http://download.oracle.com/javase/tutorial/uiswing/layout/box.html#filler
private static Logger logger = Logger.getLogger(Dashboard.class);
private static final long serialVersionUID = 8348788972744726483L;
private Proxy currentInstance;
private JPanel masterPanel;
private int browserTypesHeight;
private JLabel trafficLabel;
private boolean isTrafficEnabled;
public Dashboard() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {
e.printStackTrace();
}
setTitle("Sahi Dashboard");
startProxy();
buildUI();
addOnExit();
final Dimension dashboardSize = new Dimension(200, 225 + 50 + browserTypesHeight);
setSize(dashboardSize);
setPreferredSize(dashboardSize);
refreshTrafficLink();
setVisible(true);
}
private void startProxy() {
final Proxy proxy = new Proxy(Configuration.getPort());
currentInstance = proxy;
proxy.start(true);
}
private void buildUI() {
masterPanel = new JPanel();
masterPanel.setBackground(new Color(255, 255, 255));
masterPanel.add(Box.createRigidArea(new Dimension(120, 5)));
masterPanel.add(getBrowserButtons());
masterPanel.add(Box.createRigidArea(new Dimension(120, 15)));
masterPanel.add(getLogo());
masterPanel.add(Box.createRigidArea(new Dimension(120, 15)));
masterPanel.add(getLinksPanel1());
masterPanel.add(Box.createRigidArea(new Dimension(120, 2)));
masterPanel.add(getLinksPanel2());
masterPanel.add(Box.createRigidArea(new Dimension(120, 2)));
masterPanel.add(getLinksPanel3());
add(masterPanel);
}
private Component getLinksPanel1() {
LinkButton link = new LinkButton("Configure", "http://localhost:9999/_s_/dyn/ConfigureUI");
String scriptsPath = Configuration.getScriptRoots()[0];
if (scriptsPath.endsWith("/") || scriptsPath.endsWith("\\"))
scriptsPath = scriptsPath.substring(0, scriptsPath.length() - 1);
LinkButton link2;
if (System.getProperty("os.name").startsWith("Windows")) {
link2 = new LinkButton("Scripts", "explorer /e,\"" + scriptsPath + "\"");
} else {
link2 = new LinkButton("Scripts", "\"" + scriptsPath + "\"");
}
JPanel buttonPane = new JPanel();
buttonPane.setBackground(new Color(255, 255, 255));
buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
buttonPane.add(link);
buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
buttonPane.add(link2);
return buttonPane;
}
private Component getLinksPanel2() {
LinkButton link3 = new LinkButton("Logs", "http://localhost:9999/logs/");
LinkButton link4 = new LinkButton("DB Logs", "http://localhost:9999//_s_/dyn/pro/DBReports");
JPanel buttonPane = new JPanel();
buttonPane.setBackground(new Color(255, 255, 255));
buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS));
buttonPane.add(link3);
buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
buttonPane.add(link4);
if (System.getProperty("os.name").startsWith("Windows")) {
LinkButton link5 = new LinkButton("Bin", "cmd.exe /K cd " + Configuration.getAbsoluteUserPath("bin"));
buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
buttonPane.add(link5);
}
return buttonPane;
}
private Component getLinksPanel3() {
trafficLabel = new JLabel();
trafficLabel.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
trafficLabel.setHorizontalAlignment(JButton.LEADING);
trafficLabel.addMouseListener(new MouseListener() {
public void mouseReleased(MouseEvent arg0) {
}
public void mousePressed(MouseEvent arg0) {
}
public void mouseExited(MouseEvent arg0) {
}
public void mouseEntered(MouseEvent arg0) {
}
public void mouseClicked(MouseEvent arg0) {
setTrafficLink(!isTrafficEnabled);
setTrafficLog((isTrafficEnabled) ? false : true);
}
});
trafficLabel.addMouseMotionListener(new MouseMotionListener() {
public void mouseMoved(MouseEvent arg0) {
trafficLabel.setCursor(new Cursor(Cursor.HAND_CURSOR));
}
public void mouseDragged(MouseEvent arg0) {
}
});
JPanel buttonPane = new JPanel();
buttonPane.setBackground(new Color(255, 255, 255));
buttonPane.setLayout(new FlowLayout());
buttonPane.add(trafficLabel);
return buttonPane;
}
private void setTrafficLink(boolean isTrafficEnabled) {
this.isTrafficEnabled = isTrafficEnabled;
trafficLabel.setText(((isTrafficEnabled) ? "<html><a href=''><font color='blue'>Enable Traffic Logs</font></a></html>" :
"<html><a href=''><font color='red'>Disable Traffic Logs</font></a></html>"));
}
private void refreshTrafficLink() {
setTrafficLink(!(Configuration.isModifiedTrafficLoggingOn() || Configuration.isUnmodifiedTrafficLoggingOn()));
}
private Component getLogo() {
JLabel picLabel = new JLabel();
picLabel.setIcon(new ImageIcon(getImageBytes("sahi_os_logo2.png"), ""));
return picLabel;
}
private JPanel getBrowserButtons() {
JPanel panel = new JPanel();
final GridLayout layout = new GridLayout(0, 1, 0, 10);
panel.setLayout(layout);
final Border innerBorder = BorderFactory.createEmptyBorder(0, 10, 10, 10);
final Border outerBorder = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
final CompoundBorder compoundBorder = BorderFactory.createCompoundBorder(outerBorder, innerBorder);
final Border titleBorder = BorderFactory.createTitledBorder(compoundBorder, "Launch Browser");
panel.setBorder(titleBorder);
add(panel);
final Map<String, BrowserType> browserTypes = BrowserTypesLoader.getAvailableBrowserTypes(false);
if (browserTypes.size() == 0) {
final JLabel label = new JLabel("<html><b>No usable browsers<br>found in<br>browser_types.xml</b>.<br><br> Click on the<br><u>Configure</u> link below<br>to add/edit browsers.</html>");
label.setSize(120, 100);
panel.add(label);
browserTypesHeight = 100;
} else {
for (Iterator<String> iterator = browserTypes.keySet().iterator(); iterator.hasNext(); ) {
String name = iterator.next();
BrowserType browserType = browserTypes.get(name);
addButton(browserType, panel);
}
browserTypesHeight = browserTypes.size() * 50;
}
panel.setBackground(new Color(255, 255, 255));
return panel;
}
private void setIcon(AbstractButton button, String iconFile) {
if (iconFile == null) return;
button.setIcon(new ImageIcon(getImageBytes(iconFile), ""));
button.setHorizontalAlignment(SwingConstants.LEFT);
}
private byte[] getImageBytes(String iconFile) {
try {
final InputStream resourceAsStream = this.getClass().getResourceAsStream(iconFile);
return Utils.getBytes(resourceAsStream);
} catch (IOException e) {
e.printStackTrace();
return new byte[0];
}
}
private void addOnExit() {
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
stopProxy();
System.exit(0);
}
});
}
private void addButton(final BrowserType browserType, JPanel panel) {
final JButton button = new JButton();
button.setText(browserType.displayName());
setIcon(button, browserType.icon());
Dimension dimension = new Dimension(120, 40);
button.setSize(dimension);
button.setPreferredSize(dimension);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new Thread() {
@Override
public void run() {
final BrowserLauncher launcher = new BrowserLauncher(browserType);
launcher.setMaxTimeToWaitForPIDs(Configuration.getMaxTimeForPIDGatherFromDashboard());
String url = "http://" + Configuration.getCommonDomain() + "/_s_/dyn/Driver_initialized?browserType=" + browserType.name();
try {
launcher.openURL(url);
launcher.waitTillAlive();
launcher.kill();
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
});
panel.add(button);
pack();
}
private void execCommand(String cmd) {
try {
Utils.executeCommand(Utils.getCommandTokens(cmd));
} catch (Exception ex) {
logger.error("Tried to execute " + cmd, ex);
}
}
private void setTrafficLog(boolean flag) {
Configuration.setModifiedTrafficLogging(flag);
Configuration.setUnmodifiedTrafficLogging(flag);
}
private void stopProxy() {
currentInstance.stop();
}
public static void main(String args[]) {
if (args.length > 1) {
Configuration.init(args[0], args[1]);
} else {
Configuration.init();
}
new Dashboard();
}
}