diff options
| author | clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4> | 2011-03-04 13:58:24 +0000 | 
|---|---|---|
| committer | clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4> | 2011-03-04 13:58:24 +0000 | 
| commit | 1c33971524f9fa72026cc14253a522228f01627e (patch) | |
| tree | 8c46494250fd94681c46a49a05f4a0f0bfac7ee2 /BKUWebStart/src/main/java/at/gv | |
| parent | 1819f5598e7390bd3703b8bd05e504cbfc9cc7a2 (diff) | |
| download | mocca-1c33971524f9fa72026cc14253a522228f01627e.tar.gz mocca-1c33971524f9fa72026cc14253a522228f01627e.tar.bz2 mocca-1c33971524f9fa72026cc14253a522228f01627e.zip | |
TrayIcon  new
git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@914 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4
Diffstat (limited to 'BKUWebStart/src/main/java/at/gv')
| -rw-r--r-- | BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/Launcher.java | 593 | ||||
| -rw-r--r-- | BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/PINManagementInvoker.java (renamed from BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/PINManagementInvoker.java) | 16 | ||||
| -rw-r--r-- | BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/BKUControllerInterface.java | 8 | ||||
| -rw-r--r-- | BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/MOCCAIcon.java | 191 | ||||
| -rw-r--r-- | BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/StatusNotifier.java | 54 | 
5 files changed, 494 insertions, 368 deletions
| diff --git a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/Launcher.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/Launcher.java index e1cdb657..f622fff7 100644 --- a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/Launcher.java +++ b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/Launcher.java @@ -1,402 +1,279 @@ +/*
 + * Copyright 2008 Federal Chancellery Austria and
 + * Graz University of Technology
 + *
 + * 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 at.gv.egiz.bku.webstart;
 -import at.gv.egiz.bku.webstart.gui.AboutDialog;
 +import at.gv.egiz.bku.webstart.gui.StatusNotifier;
  import at.gv.egiz.bku.webstart.gui.BKUControllerInterface;
 -import at.gv.egiz.bku.webstart.gui.PINManagementInvoker;
 +import at.gv.egiz.bku.webstart.gui.MOCCAIcon;
  import iaik.asn1.CodingException;
  import java.io.IOException;
  import java.net.URISyntaxException;
  import java.util.Locale;
 -import java.util.ResourceBundle;
  import javax.jnlp.UnavailableServiceException;
  //import com.sun.javaws.security.JavaWebStartSecurity;
 -import java.awt.AWTException;
  import java.awt.Desktop;
 -import java.awt.Image;
 -import java.awt.MenuItem;
 -import java.awt.PopupMenu;
  import java.awt.SplashScreen;
 -import java.awt.SystemTray;
 -import java.awt.TrayIcon;
 -import java.awt.event.ActionEvent;
 -import java.awt.event.ActionListener;
 -import java.awt.event.WindowAdapter;
  import java.net.BindException;
  import java.net.MalformedURLException;
  import java.net.URL;
  import java.security.GeneralSecurityException;
 -import java.text.MessageFormat;
  import java.util.jar.Attributes;
  import java.util.jar.Manifest;
 -import javax.imageio.ImageIO;
  import javax.jnlp.BasicService;
  import javax.jnlp.ServiceManager;
 -import javax.swing.JFrame;
  import org.mortbay.util.MultiException;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
 -public class Launcher implements BKUControllerInterface, ActionListener {
 -  public static final String HELP_COMMAND = "help";
 +public class Launcher implements BKUControllerInterface {
 -  public static final String WEBAPP_RESOURCE = "BKULocal.war";
 -  public static final String CERTIFICATES_RESOURCE = "BKUCertificates.jar";
 -  public static final String WEBAPP_FILE = "BKULocal.war";
 -  /** no leading slash for messages, but for image */
 -  public static final String MESSAGES_RESOURCE = "at/gv/egiz/bku/webstart/messages";
 -  public static final String TRAYICON_RESOURCE = "/at/gv/egiz/bku/webstart/chip";
 -  /** resource bundle messages */
 -  public static final String CAPTION_DEFAULT = "tray.caption.default";
 -  public static final String CAPTION_ERROR = "tray.caption.error";
 -  public static final String MESSAGE_START = "tray.message.start";
 -  public static final String MESSAGE_START_OFFLINE = "tray.message.start.offline";
 -  public static final String MESSAGE_CONFIG = "tray.message.config";
 -  public static final String MESSAGE_CERTS = "tray.message.certs";
 -  public static final String MESSAGE_FINISHED = "tray.message.finished";
 -  public static final String MESSAGE_SHUTDOWN = "tray.message.shutdown";
 -  public static final String ERROR_START = "tray.error.start";
 -  public static final String ERROR_CONFIG = "tray.error.config";
 -  public static final String ERROR_BIND = "tray.error.bind";
 -  public static final String ERROR_PIN = "tray.error.pin.connect";
 -  public static final String ERROR_OPEN_URL = "tray.error.open.url";
 -  public static final String LABEL_SHUTDOWN = "tray.label.shutdown";
 -  public static final String LABEL_PIN = "tray.label.pin";
 -  public static final String LABEL_HELP = "tray.label.help";
 -  public static final String LABEL_ABOUT = "tray.label.about";
 -  public static final String TOOLTIP_DEFAULT = "tray.tooltip.default";
 +	public static final String WEBAPP_RESOURCE = "BKULocal.war";
 +	public static final String CERTIFICATES_RESOURCE = "BKUCertificates.jar";
 +	public static final String WEBAPP_FILE = "BKULocal.war";
 +	/** no leading slash for messages, but for image */
 +	public static final String MESSAGES_RESOURCE = "at/gv/egiz/bku/webstart/messages";
 +	public static final String TRAYICON_RESOURCE = "/at/gv/egiz/bku/webstart/chip";
 +	private static Logger log = LoggerFactory.getLogger(Launcher.class);
 +	/** local bku uri */
 +	public static final URL HTTP_SECURITY_LAYER_URL;
 +	public static final URL HTTPS_SECURITY_LAYER_URL;
 +	public static final URL INSTALL_CERT_URL;
 +	public static final URL PIN_MANAGEMENT_URL;
 +	public static final URL HELP_URL;
 -  /** action commands for tray menu */
 -  public static final String SHUTDOWN_COMMAND = "shutdown";
 -  public static final String PIN_COMMAND = "pin";
 -  public static final String ABOUT_COMMAND = "about";
 -  
 -  private static Logger log = LoggerFactory.getLogger(Launcher.class);
 +	static {
 +		URL http = null;
 +		URL https = null;
 +		URL pin = null;
 +		URL cert = null;
 +		URL help = null;
 +		try {
 +			http = new URL("http://localhost:" + Integer.getInteger(Container.HTTPS_PORT_PROPERTY, 3495).intValue() + '/');
 +			https = new URL("https://localhost:" + Integer.getInteger(Container.HTTPS_PORT_PROPERTY, 3496).intValue() + '/');
 +			pin = new URL(http, "/PINManagement");
 +			cert = new URL(http, "/ca.crt");
 +			help = new URL(http, "/help/");
 +		} catch (MalformedURLException ex) {
 +			log.error("Failed to create URL.", ex);
 +		} finally {
 +			HTTP_SECURITY_LAYER_URL = http;
 +			HTTPS_SECURITY_LAYER_URL = https;
 +			PIN_MANAGEMENT_URL = pin;
 +			INSTALL_CERT_URL = cert;
 +			HELP_URL = help;
 +		}
 +	}
 +	public static final String version;
 -  
 -  /** local bku uri */
 -  public static final URL HTTP_SECURITY_LAYER_URL;
 -  public static final URL HTTPS_SECURITY_LAYER_URL;
 -  public static final URL INSTALL_CERT_URL;
 -  public static final URL PIN_MANAGEMENT_URL;
 -  public static final URL HELP_URL;
 -  static {
 -    URL http = null;
 -    URL https = null;
 -    URL pin = null;
 -    URL cert = null;
 -    URL help = null;
 -    try {
 -      http = new URL("http://localhost:" + Integer.getInteger(Container.HTTPS_PORT_PROPERTY, 3495).intValue() + '/');
 -      https = new URL("https://localhost:" + Integer.getInteger(Container.HTTPS_PORT_PROPERTY, 3496).intValue() + '/');
 -      pin = new URL(http, "/PINManagement");
 -      cert = new URL(http, "/ca.crt");
 -      help = new URL(http, "/help/");
 -    } catch (MalformedURLException ex) {
 -      log.error("Failed to create URL.", ex);
 -    } finally {
 -      HTTP_SECURITY_LAYER_URL = http;
 -      HTTPS_SECURITY_LAYER_URL = https;
 -      PIN_MANAGEMENT_URL = pin;
 -      INSTALL_CERT_URL = cert;
 -      HELP_URL = help;
 -    }
 -  }
 -  public static final String version;
 -  static {
 -    String tmp = Configurator.UNKOWN_VERSION;
 -    try {
 -      String bkuWebStartJar = Launcher.class.getProtectionDomain().getCodeSource().getLocation().toString();
 -      URL manifestURL = new URL("jar:" + bkuWebStartJar + "!/META-INF/MANIFEST.MF");
 -      if (log.isTraceEnabled()) {
 -        log.trace("read version information from " + manifestURL);
 -      }
 -      Manifest manifest = new Manifest(manifestURL.openStream());
 -      Attributes atts = manifest.getMainAttributes();
 -      if (atts != null) {
 -        tmp = atts.getValue("Implementation-Build");
 -      }
 -    } catch (IOException ex) {
 -      log.error("failed to read version", ex);
 -    } finally {
 -      version = tmp;
 -      log.info("BKU Web Start " + version);
 -    }
 -  }
 -  private Configurator config;
 -  private Container server;
 -  private BasicService basicService;
 -  private TrayIcon trayIcon;
 -  private ResourceBundle messages;
 -  private AboutDialog aboutDialog;
 +	static {
 +		String tmp = Configurator.UNKOWN_VERSION;
 +		try {
 +			String bkuWebStartJar = Launcher.class.getProtectionDomain().getCodeSource().getLocation().toString();
 +			URL manifestURL = new URL("jar:" + bkuWebStartJar + "!/META-INF/MANIFEST.MF");
 +			if (log.isTraceEnabled()) {
 +				log.trace("read version information from " + manifestURL);
 +			}
 +			Manifest manifest = new Manifest(manifestURL.openStream());
 +			Attributes atts = manifest.getMainAttributes();
 +			if (atts != null) {
 +				tmp = atts.getValue("Implementation-Build");
 +			}
 +		} catch (IOException ex) {
 +			log.error("failed to read version", ex);
 +		} finally {
 +			version = tmp;
 +			log.info("BKU Web Start " + version);
 +		}
 +	}
 +	private Configurator config;
 +	private Container server;
 +	private BasicService basicService;
 +	private StatusNotifier status;
 -  
 -  public Launcher() {
 -    log.info("Initializing Launcher");
 +	public Launcher() {
 +		log.info("Initializing Launcher");
 -    // SocketPerm * required (DataURL), FilePermission * write (JFileChooser) required,
 -    // jetty does not allow fine-grained permission config (codeBase?)
 -    // ie. we don't need a security manager
 -    log.trace("disabling (JNLP) security manager");
 -    System.setSecurityManager(null);
 +		// SocketPerm * required (DataURL), FilePermission * write (JFileChooser) required,
 +		// jetty does not allow fine-grained permission config (codeBase?)
 +		// ie. we don't need a security manager
 +		log.trace("disabling (JNLP) security manager");
 +		System.setSecurityManager(null);
 -    messages = ResourceBundle.getBundle(MESSAGES_RESOURCE, Locale.getDefault());
 -    //TODO replace with statusNotifier
 -    trayIcon = initTrayIcon();
 -  }
 +		status = new MOCCAIcon(this);
 +	}
 -  public void launch() throws Exception {
 -    initStart();
 -    try {
 -      initConfig();
 -    } catch (Exception ex) {
 -      log.error("Failed to initialize configuration", ex);
 -      trayIcon.displayMessage(messages.getString(CAPTION_ERROR),
 -              messages.getString(ERROR_CONFIG), TrayIcon.MessageType.ERROR);
 -      throw ex;
 -    }
 -    try {
 -      startServer();
 -      initFinished();
 -    } catch (BindException ex) {
 -      log.error("Failed to launch server, " + ex.getMessage(), ex);
 -      trayIcon.displayMessage(messages.getString(CAPTION_ERROR),
 -              messages.getString(ERROR_BIND), TrayIcon.MessageType.ERROR);
 -      throw ex;
 -    } catch (MultiException ex) {
 -      log.error("Failed to launch server, " + ex.getMessage(), ex);
 -      if (ex.getThrowable(0) instanceof BindException) {
 -        trayIcon.displayMessage(messages.getString(CAPTION_ERROR),
 -                messages.getString(ERROR_BIND), TrayIcon.MessageType.ERROR);
 -      } else {
 -        trayIcon.displayMessage(messages.getString(CAPTION_ERROR),
 -                messages.getString(ERROR_START), TrayIcon.MessageType.ERROR);
 -      }
 -      throw ex;
 -    } catch (Exception ex) {
 -      ex.printStackTrace();
 -      log.error("Failed to launch server, " + ex.getMessage(), ex);
 -      trayIcon.displayMessage(messages.getString(CAPTION_ERROR),
 -              messages.getString(ERROR_START), TrayIcon.MessageType.ERROR);
 -      throw ex;
 -    }
 -  }
 +	public void launch() throws Exception {
 +		initStart();
 +		try {
 +			initConfig();
 +		} catch (Exception ex) {
 +			log.error("Failed to initialize configuration", ex);
 +			status.error(StatusNotifier.ERROR_CONFIG);
 +			throw ex;
 +		}
 +		try {
 +			startServer();
 +			initFinished();
 +		} catch (BindException ex) {
 +			log.error("Failed to launch server, " + ex.getMessage(), ex);
 +			status.error(StatusNotifier.ERROR_BIND);
 +			throw ex;
 +		} catch (MultiException ex) {
 +			log.error("Failed to launch server, " + ex.getMessage(), ex);
 +			if (ex.getThrowable(0) instanceof BindException) {
 +				status.error(StatusNotifier.ERROR_BIND);
 +			} else {
 +				status.error(StatusNotifier.ERROR_START);
 +			}
 +			throw ex;
 +		} catch (Exception ex) {
 +			ex.printStackTrace();
 +			log.error("Failed to launch server, " + ex.getMessage(), ex);
 +			status.error(StatusNotifier.ERROR_START);
 +			throw ex;
 +		}
 +	}
 -  private void browse(URL url) throws IOException, URISyntaxException {
 -    // don't use basicService.showDocument(), which causes a java ssl warning dialog
 -    if (Desktop.isDesktopSupported()) {
 -      Desktop desktop = Desktop.getDesktop();
 -      if (desktop.isSupported(Desktop.Action.BROWSE)) {
 -        desktop.browse(url.toURI());
 -        return;
 -      }
 -    }
 -    throw new IOException("current platform does not support Java Desktop API");
 -  }
 -  
 -  private TrayIcon initTrayIcon() {
 -    if (SystemTray.isSupported()) {
 -      try {
 -        // get the SystemTray instance
 -        SystemTray tray = SystemTray.getSystemTray();
 -        log.debug("TrayIcon size: " + tray.getTrayIconSize());
 +	private void browse(URL url) throws IOException, URISyntaxException {
 +		// don't use basicService.showDocument(), which causes a java ssl warning dialog
 +		if (Desktop.isDesktopSupported()) {
 +			Desktop desktop = Desktop.getDesktop();
 +			if (desktop.isSupported(Desktop.Action.BROWSE)) {
 +				desktop.browse(url.toURI());
 +				return;
 +			}
 +		}
 +		throw new IOException("current platform does not support Java Desktop API");
 +	}
 -        String iconResource;
 -        if (tray.getTrayIconSize().height < 17) {
 -          iconResource = TRAYICON_RESOURCE + "16.png";
 -        } else if (tray.getTrayIconSize().height < 25) {
 -          iconResource = TRAYICON_RESOURCE + "24.png";
 -        } else if (tray.getTrayIconSize().height < 33) {
 -          iconResource = TRAYICON_RESOURCE + "32.png";
 -        } else {
 -          iconResource = TRAYICON_RESOURCE + "48.png";
 -        }
 -        Image image = ImageIO.read(getClass().getResourceAsStream(iconResource));
 +	private void initStart() {
 +		try {
 +			status.info(StatusNotifier.MESSAGE_START);
 +			basicService = (BasicService) ServiceManager.lookup("javax.jnlp.BasicService");
 +			if (basicService.isOffline()) {
 +				log.info("launching MOCCA Web Start offline");
 +			} else {
 +				log.info("launching MOCCA Web Start online");
 +			}
 +		} catch (UnavailableServiceException ex) {
 +			log.info("Failed to obtain JNLP service: " + ex.getMessage());
 +		}
 +	}
 -        PopupMenu popup = new PopupMenu();
 +	private void initConfig() throws IOException, CodingException, GeneralSecurityException {
 +		config = new Configurator();
 +		config.ensureConfiguration();
 +		config.ensureCertificates();
 +	}
 -        MenuItem helpItem = new MenuItem(messages.getString(LABEL_HELP));
 -        helpItem.addActionListener(this);
 -        helpItem.setActionCommand(HELP_COMMAND);
 -        popup.add(helpItem);
 +	private void startServer() throws Exception {
 +		log.info("init servlet container and MOCCA webapp");
 +		server = new Container();
 +		server.init();
 +		server.start();
 +	}
 -        MenuItem pinItem = new MenuItem(messages.getString(LABEL_PIN));
 -        pinItem.addActionListener(this);
 -        pinItem.setActionCommand(PIN_COMMAND);
 -        popup.add(pinItem);
 +	private void initFinished() {
 +		try {
 +			status.info(StatusNotifier.MESSAGE_FINISHED);
 +			// standalone (non-webstart) version has splashscreen
 +			if (SplashScreen.getSplashScreen() != null) {
 +				try {
 +					SplashScreen.getSplashScreen().close();
 +				} catch (IllegalStateException ex) {
 +					log.warn("Failed to close splash screen: " + ex.getMessage());
 +				}
 +			}
 +			if (config.isCertRenewed()) {
 +				try {
 +					if ("".equals(status.getLocale().getLanguage())) {
 +						browse(HTTP_SECURITY_LAYER_URL);
 +					} else {
 +						browse(new URL(HTTP_SECURITY_LAYER_URL, status.getLocale().getLanguage()));
 +					}
 +				} catch (Exception ex) {
 +					log.error("failed to open system browser, install TLS certificate manually: " + HTTPS_SECURITY_LAYER_URL, ex);
 +				}
 +			}
 +			log.info("BKU successfully started");
 +			server.join();
 +		} catch (InterruptedException e) {
 +			log.warn("failed to join server: " + e.getMessage(), e);
 +		}
 +	}
 -        MenuItem shutdownItem = new MenuItem(messages.getString(LABEL_SHUTDOWN));
 -        shutdownItem.addActionListener(this);
 -        shutdownItem.setActionCommand(SHUTDOWN_COMMAND);
 -        popup.add(shutdownItem);
 +	@Override
 +	public void shutDown() {
 +		log.info("Shutting down server");
 +		status.info(StatusNotifier.MESSAGE_SHUTDOWN);
 +		if ((server != null) && (server.isRunning())) {
 +			try {
 +				if (server.isRunning()) {
 +					server.stop();
 +				}
 +			} catch (Exception e) {
 +				log.debug(e.toString());
 +			} finally {
 +				if (server.isRunning()) {
 +					server.destroy();
 +				}
 +			}
 +		}
 +		System.exit(0);
 +	}
 -        popup.addSeparator();
 +	public static void main(String[] args) throws InterruptedException, IOException {
 +		try {
 +			Launcher launcher = new Launcher();
 +			launcher.launch();
 +		} catch (Exception ex) {
 +			ex.printStackTrace();
 +			log.debug("Caught exception " + ex.getMessage(), ex);
 +			log.info("waiting to shutdown...");
 +			Thread.sleep(5000);
 +			log.info("exit");
 +			System.exit(-1000);
 +		}
 +	}
 -        MenuItem aboutItem = new MenuItem(messages.getString(LABEL_ABOUT));
 -        aboutItem.setActionCommand(ABOUT_COMMAND);
 -        aboutItem.addActionListener(this);
 -        popup.add(aboutItem);
 +	@Override
 +	public void showHelp(Locale locale) {
 +		try {
 +			if ("".equals(locale.getLanguage())) {
 +				browse(HELP_URL);
 +			} else {
 +				browse(new URL(HELP_URL, locale.getLanguage()));
 +			}
 +		} catch (Exception ex) {
 +			log.error("Failed to open " + HELP_URL, ex);
 +			status.error(StatusNotifier.ERROR_OPEN_URL, HELP_URL);
 +		}
 -        TrayIcon ti = new TrayIcon(image, messages.getString(TOOLTIP_DEFAULT), popup);
 -        ti.setImageAutoSize(true);
 -        ti.addActionListener(this);
 -        tray.add(ti);
 -        return ti;
 -      } catch (AWTException ex) {
 -        log.error("Failed to init tray icon", ex);
 -      } catch (IOException ex) {
 -        log.error("Failed to load tray icon image", ex);
 -      }
 -    } else {
 -      log.error("No system tray support");
 -    }
 -    return null;
 -  }
 +	}
 -  private void initStart() {
 -    try {
 -      trayIcon.displayMessage(messages.getString(CAPTION_DEFAULT),
 -            messages.getString(MESSAGE_START), TrayIcon.MessageType.INFO);
 -      basicService = (BasicService) ServiceManager.lookup("javax.jnlp.BasicService");
 -      if (basicService.isOffline()) {
 -        log.info("launching MOCCA Web Start offline");
 -        trayIcon.displayMessage(messages.getString(CAPTION_DEFAULT),
 -                messages.getString(MESSAGE_START_OFFLINE), TrayIcon.MessageType.INFO);
 -      } else {
 -        log.info("launching MOCCA Web Start online");
 -      }
 -    } catch (UnavailableServiceException ex) {
 -      log.info("Failed to obtain JNLP service: " + ex.getMessage());
 -    }
 -  }
 +	@Override
 +	public void pinManagement(Locale locale) {
 +		new Thread(new PINManagementInvoker(status)).start();
 +	}
 -  private void initConfig() throws IOException, CodingException, GeneralSecurityException {
 -    trayIcon.displayMessage(messages.getString(CAPTION_DEFAULT),
 -              messages.getString(MESSAGE_CONFIG), TrayIcon.MessageType.INFO);
 -    config = new Configurator();
 -    config.ensureConfiguration();
 -    trayIcon.displayMessage(messages.getString(CAPTION_DEFAULT),
 -              messages.getString(MESSAGE_CERTS), TrayIcon.MessageType.INFO);
 -    config.ensureCertificates();
 -  }
 -
 -  private void startServer() throws Exception {
 -    log.info("init servlet container and MOCCA webapp");
 -//    trayIcon.displayMessage(messages.getString(CAPTION_DEFAULT),
 -//              messages.getString(MESSAGE_START), TrayIcon.MessageType.INFO);
 -    server = new Container();
 -    server.init();
 -    server.start();
 -  }
 -
 -  private void initFinished() {
 -    try {
 -      trayIcon.displayMessage(messages.getString(CAPTION_DEFAULT),
 -              messages.getString(MESSAGE_FINISHED), TrayIcon.MessageType.INFO);
 -      // standalone (non-webstart) version has splashscreen
 -      if (SplashScreen.getSplashScreen() != null) {
 -        try {
 -          SplashScreen.getSplashScreen().close();
 -        } catch (IllegalStateException ex) {
 -          log.warn("Failed to close splash screen: " + ex.getMessage());
 -        }
 -      }
 -      if (config.isCertRenewed()) {
 -        try {
 -          if ("".equals(messages.getLocale().getLanguage())) {
 -            browse(HTTP_SECURITY_LAYER_URL);
 -          } else {
 -            browse(new URL(HTTP_SECURITY_LAYER_URL, messages.getLocale().getLanguage()));
 -          }
 -        } catch (Exception ex) {
 -          log.error("failed to open system browser, install TLS certificate manually: " + HTTPS_SECURITY_LAYER_URL, ex);
 -        }
 -      }
 -      log.info("BKU successfully started");
 -      server.join();
 -    } catch (InterruptedException e) {
 -      log.warn("failed to join server: " + e.getMessage(), e);
 -    }
 -  }
 -
 -  @Override
 -  public void shutDown() {
 -    log.info("Shutting down server");
 -    trayIcon.displayMessage(messages.getString(CAPTION_DEFAULT), 
 -            messages.getString(MESSAGE_SHUTDOWN), TrayIcon.MessageType.INFO);
 -    if ((server != null) && (server.isRunning())) {
 -      try {
 -        if (server.isRunning()) {
 -          server.stop();
 -        }
 -      } catch (Exception e) {
 -        log.debug(e.toString());
 -      } finally {
 -        if (server.isRunning()) {
 -          server.destroy();
 -        }
 -      }
 -    }
 -    System.exit(0);
 -  }
 -
 -  /**
 -   * Listen for TrayMenu actions (display error messages on trayIcon)
 -   * @param e
 -   */
 -  @Override
 -  public void actionPerformed(ActionEvent e) {
 -    if (SHUTDOWN_COMMAND.equals(e.getActionCommand())) {
 -      log.debug("shutdown requested via tray menu");
 -      this.shutDown();
 -    } else if (ABOUT_COMMAND.equals(e.getActionCommand())) {
 -      log.debug("about dialog requested via tray menu");
 -      if (aboutDialog == null) {
 -        aboutDialog = new AboutDialog(new JFrame(), true, version);
 -        aboutDialog.addWindowListener(new WindowAdapter() {
 -
 -          @Override
 -          public void windowClosing(java.awt.event.WindowEvent e) {
 -            aboutDialog.setVisible(false);
 -          }
 -        });
 -      }
 -      aboutDialog.setLocationByPlatform(true);
 -      aboutDialog.setVisible(true);
 -    } else if (PIN_COMMAND.equals(e.getActionCommand())) {
 -      log.debug("pin management dialog requested via tray menu");
 -
 -      new Thread(new PINManagementInvoker(trayIcon, messages)).start();
 -    } else if (HELP_COMMAND.equals(e.getActionCommand())) {
 -      log.debug("help page requested via tray menu");
 -      try {
 -        if ("".equals(messages.getLocale().getLanguage())) {
 -          browse(HELP_URL);
 -        } else {
 -          browse(new URL(HELP_URL, messages.getLocale().getLanguage()));
 -        }
 -      } catch (Exception ex) {
 -        log.error("Failed to open " + HELP_URL, ex);
 -        String msg = MessageFormat.format(messages.getString(ERROR_OPEN_URL), HELP_URL);
 -        trayIcon.displayMessage(messages.getString(CAPTION_ERROR), msg, TrayIcon.MessageType.ERROR);
 -      }
 -    } else {
 -      log.error("unknown tray menu command: " + e.getActionCommand());
 -    }
 -  }
 -
 -  public static void main(String[] args) throws InterruptedException, IOException {
 -    try {
 -      Launcher launcher = new Launcher();
 -      launcher.launch();
 -    } catch (Exception ex) {
 -      ex.printStackTrace();
 -      log.debug("Caught exception " + ex.getMessage(), ex);
 -      log.info("waiting to shutdown...");
 -      Thread.sleep(5000);
 -      log.info("exit");
 -      System.exit(-1000);
 -    }
 -  }
 +	@Override
 +	public String getVersion() {
 +		return version;
 +	}
  }
 diff --git a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/PINManagementInvoker.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/PINManagementInvoker.java index 1f14d751..4bccc648 100644 --- a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/PINManagementInvoker.java +++ b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/PINManagementInvoker.java @@ -14,13 +14,12 @@   * See the License for the specific language governing permissions and   * limitations under the License.   */ -package at.gv.egiz.bku.webstart.gui; +package at.gv.egiz.bku.webstart;  import at.gv.egiz.bku.webstart.Launcher; -import java.awt.TrayIcon; +import at.gv.egiz.bku.webstart.gui.StatusNotifier;  import java.io.IOException;  import java.net.HttpURLConnection; -import java.util.ResourceBundle;  import org.slf4j.Logger;  import org.slf4j.LoggerFactory; @@ -34,12 +33,10 @@ public class PINManagementInvoker implements Runnable {    private static final Logger log = LoggerFactory.getLogger(PINManagementInvoker.class); -  TrayIcon trayIcon; -  ResourceBundle messages; +  StatusNotifier status; -  public PINManagementInvoker(TrayIcon trayIcon, ResourceBundle messages) { -    this.trayIcon = trayIcon; -    this.messages = messages; +  public PINManagementInvoker(StatusNotifier status) { +      this.status = status;    }    @Override @@ -61,8 +58,7 @@ public class PINManagementInvoker implements Runnable {        }      } catch (IOException ex) {        log.error("Failed to connect to PIN Management", ex); -      trayIcon.displayMessage(messages.getString(Launcher.CAPTION_ERROR), -              messages.getString(Launcher.ERROR_PIN), TrayIcon.MessageType.ERROR); +      status.error(StatusNotifier.ERROR_PIN);      } finally {        if (connection != null) {          connection.disconnect(); diff --git a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/BKUControllerInterface.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/BKUControllerInterface.java index 886b55f7..6355de92 100644 --- a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/BKUControllerInterface.java +++ b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/BKUControllerInterface.java @@ -16,8 +16,16 @@  */  package at.gv.egiz.bku.webstart.gui; +import java.util.Locale; +  public interface BKUControllerInterface {    public void shutDown(); +	public String getVersion(); +	 +	public void showHelp(Locale locale); + +	public void pinManagement(Locale locale); +  } diff --git a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/MOCCAIcon.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/MOCCAIcon.java new file mode 100644 index 00000000..5c44dac3 --- /dev/null +++ b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/MOCCAIcon.java @@ -0,0 +1,191 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package at.gv.egiz.bku.webstart.gui; + +import java.awt.AWTException; +import java.awt.Image; +import java.awt.MenuItem; +import java.awt.PopupMenu; +import java.awt.SystemTray; +import java.awt.TrayIcon; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.io.IOException; +import java.text.MessageFormat; +import java.util.Locale; +import java.util.ResourceBundle; +import javax.imageio.ImageIO; +import javax.swing.JFrame; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * + * @author clemens + */ +public class MOCCAIcon implements StatusNotifier, ActionListener { + +	public static final String LABEL_SHUTDOWN = "tray.label.shutdown"; +	public static final String LABEL_PIN = "tray.label.pin"; +	public static final String LABEL_HELP = "tray.label.help"; +	public static final String LABEL_ABOUT = "tray.label.about"; +	public static final String TOOLTIP_DEFAULT = "tray.tooltip.default"; +	/** action commands for tray menu */ +	public static final String SHUTDOWN_COMMAND = "shutdown"; +	public static final String PIN_COMMAND = "pin"; +	public static final String ABOUT_COMMAND = "about"; +	public static final String HELP_COMMAND = "help"; +	private static final Logger log = LoggerFactory.getLogger(MOCCAIcon.class); +	protected BKUControllerInterface controller; +	protected TrayIcon trayIcon; +	protected ResourceBundle messages; + +	private AboutDialog aboutDialog; + +	public MOCCAIcon(BKUControllerInterface controller) { +		this.controller = controller; +		messages = ResourceBundle.getBundle(MESSAGES_RESOURCE, Locale.getDefault()); +		this.trayIcon = initTrayIcon(); +	} + +	private TrayIcon initTrayIcon() { +		if (SystemTray.isSupported()) { +			try { +				// get the SystemTray instance +				SystemTray tray = SystemTray.getSystemTray(); +				log.debug("TrayIcon size: " + tray.getTrayIconSize()); + +				String iconResource; +				if (tray.getTrayIconSize().height < 17) { +					iconResource = TRAYICON_RESOURCE + "16.png"; +				} else if (tray.getTrayIconSize().height < 25) { +					iconResource = TRAYICON_RESOURCE + "24.png"; +				} else if (tray.getTrayIconSize().height < 33) { +					iconResource = TRAYICON_RESOURCE + "32.png"; +				} else { +					iconResource = TRAYICON_RESOURCE + "48.png"; +				} +				Image image = ImageIO.read(getClass().getResourceAsStream(iconResource)); + +				PopupMenu menu = new PopupMenu(); + +				MenuItem helpItem = new MenuItem(messages.getString(LABEL_HELP)); +				helpItem.addActionListener(this); +				helpItem.setActionCommand(HELP_COMMAND); +				menu.add(helpItem); + +				MenuItem pinItem = new MenuItem(messages.getString(LABEL_PIN)); +				pinItem.addActionListener(this); +				pinItem.setActionCommand(PIN_COMMAND); +				menu.add(pinItem); + +				MenuItem shutdownItem = new MenuItem(messages.getString(LABEL_SHUTDOWN)); +				shutdownItem.addActionListener(this); +				shutdownItem.setActionCommand(SHUTDOWN_COMMAND); +				menu.add(shutdownItem); + +				menu.addSeparator(); + +				MenuItem aboutItem = new MenuItem(messages.getString(LABEL_ABOUT)); +				aboutItem.setActionCommand(ABOUT_COMMAND); +				aboutItem.addActionListener(this); +				menu.add(aboutItem); + +				TrayIcon ti = new TrayIcon(image, messages.getString(TOOLTIP_DEFAULT), menu); +				ti.setImageAutoSize(true); +				ti.addActionListener(this); +				tray.add(ti); +				return ti; +			} catch (AWTException ex) { +				log.error("Failed to init tray icon", ex); +			} catch (IOException ex) { +				log.error("Failed to load tray icon image", ex); +			} +		} else { +			log.error("No system tray support"); +		} +		return null; +	} + +	@Override +	public void error(String msgKey) { +		if (trayIcon != null) { +			trayIcon.displayMessage( +							messages.getString(CAPTION_ERROR), +							messages.getString(msgKey), +							TrayIcon.MessageType.ERROR); +		} else { +			log.error(messages.getString(msgKey)); +		} +	} + +	@Override +	public void error(String msgPatternKey, Object... argument) { +		if (trayIcon != null) { +			trayIcon.displayMessage( +							messages.getString(CAPTION_ERROR), +							MessageFormat.format(messages.getString(msgPatternKey), argument), +							TrayIcon.MessageType.ERROR); +		} else { +			log.error(MessageFormat.format(messages.getString(msgPatternKey), argument)); +		} +	} + +	@Override +	public void info(String msgKey) { +		if (trayIcon != null) { +			trayIcon.displayMessage( +							messages.getString(CAPTION_DEFAULT), +							messages.getString(msgKey), +							TrayIcon.MessageType.INFO); +		} else { +			log.info(messages.getString(msgKey)); +		} +	} + +	@Override +	public Locale getLocale() { +		return messages.getLocale(); +	} + +	/** +	 * Listen for TrayMenu actions (display error messages on trayIcon) +	 * @param e +	 */ +	@Override +	public void actionPerformed(ActionEvent e) { +		if (SHUTDOWN_COMMAND.equals(e.getActionCommand())) { +			log.debug("shutdown requested via tray menu"); +			controller.shutDown(); +		} else if (ABOUT_COMMAND.equals(e.getActionCommand())) { +			log.debug("about dialog requested via tray menu"); + +			if (aboutDialog == null) { +				aboutDialog = new AboutDialog(new JFrame(), true, controller.getVersion()); +				aboutDialog.addWindowListener(new WindowAdapter() { + +					@Override +					public void windowClosing(java.awt.event.WindowEvent e) { +						aboutDialog.setVisible(false); +					} +				}); +			} +			aboutDialog.setLocationByPlatform(true); +			aboutDialog.setVisible(true); + +		} else if (PIN_COMMAND.equals(e.getActionCommand())) { +			log.debug("pin management dialog requested via tray menu"); +			controller.pinManagement(messages.getLocale()); + +		} else if (HELP_COMMAND.equals(e.getActionCommand())) { +			log.debug("help page requested via tray menu"); +			controller.showHelp(messages.getLocale()); + +		} else { +			log.error("unknown tray menu command: " + e.getActionCommand()); +		} +	} +} diff --git a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/StatusNotifier.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/StatusNotifier.java new file mode 100644 index 00000000..1259ed36 --- /dev/null +++ b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/StatusNotifier.java @@ -0,0 +1,54 @@ +/* + * Copyright 2008 Federal Chancellery Austria and + * Graz University of Technology + * + * 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 at.gv.egiz.bku.webstart.gui; + +import java.util.Locale; + +/** + * + * @author clemens + */ +public interface StatusNotifier { + +    /** no leading slash for messages, but for image */ +    public static final String MESSAGES_RESOURCE = "at/gv/egiz/bku/webstart/messages"; +    public static final String TRAYICON_RESOURCE = "/at/gv/egiz/bku/webstart/chip"; +    /** resource bundle messages */ +    public static final String CAPTION_DEFAULT = "tray.caption.default"; +    public static final String CAPTION_ERROR = "tray.caption.error"; +    public static final String MESSAGE_START = "tray.message.start"; +    public static final String MESSAGE_START_OFFLINE = "tray.message.start.offline"; +    public static final String MESSAGE_CONFIG = "tray.message.config"; +    public static final String MESSAGE_CERTS = "tray.message.certs"; +    public static final String MESSAGE_FINISHED = "tray.message.finished"; +    public static final String MESSAGE_SHUTDOWN = "tray.message.shutdown"; +    public static final String ERROR_START = "tray.error.start"; +    public static final String ERROR_BIND = "tray.error.bind"; +    public static final String ERROR_CONFIG = "tray.error.config"; +    public static final String ERROR_PIN = "tray.error.pin.connect"; +    public static final String ERROR_OPEN_URL = "tray.error.open.url"; + +     +    public void error(String msgKey); + +    public void error(String msgPatternKey, Object... argument); + +    public void info(String msgKey); + +		public Locale getLocale(); +} | 
