From 1c33971524f9fa72026cc14253a522228f01627e Mon Sep 17 00:00:00 2001 From: clemenso Date: Fri, 4 Mar 2011 13:58:24 +0000 Subject: TrayIcon new git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@914 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4 --- .../java/at/gv/egiz/bku/webstart/Launcher.java | 593 ++++++++------------- .../gv/egiz/bku/webstart/PINManagementInvoker.java | 68 +++ .../bku/webstart/gui/BKUControllerInterface.java | 8 + .../at/gv/egiz/bku/webstart/gui/MOCCAIcon.java | 191 +++++++ .../bku/webstart/gui/PINManagementInvoker.java | 72 --- .../gv/egiz/bku/webstart/gui/StatusNotifier.java | 54 ++ 6 files changed, 556 insertions(+), 430 deletions(-) create mode 100644 BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/PINManagementInvoker.java create mode 100644 BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/MOCCAIcon.java delete mode 100644 BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/PINManagementInvoker.java create mode 100644 BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/StatusNotifier.java 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/PINManagementInvoker.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/PINManagementInvoker.java new file mode 100644 index 00000000..4bccc648 --- /dev/null +++ b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/PINManagementInvoker.java @@ -0,0 +1,68 @@ +/* + * 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.Launcher; +import at.gv.egiz.bku.webstart.gui.StatusNotifier; +import java.io.IOException; +import java.net.HttpURLConnection; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * GUI is painted using SwingUtilities.invokeLater, but TrayIcon ActionListener Thread (== webstart thread) joined Jetty Thread + * + * @author Clemens Orthacker + */ +public class PINManagementInvoker implements Runnable { + + private static final Logger log = LoggerFactory.getLogger(PINManagementInvoker.class); + + StatusNotifier status; + + public PINManagementInvoker(StatusNotifier status) { + this.status = status; + } + + @Override + public void run() { + HttpURLConnection connection = null; + try { + log.debug("Connecting to: " + Launcher.PIN_MANAGEMENT_URL); + + connection = (HttpURLConnection) Launcher.PIN_MANAGEMENT_URL.openConnection(); + + connection.setRequestMethod("GET"); + connection.setReadTimeout(0); + connection.connect(); + + if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { + log.debug("pin management dialog returned"); + } else { + log.error("unexpected response from pin management: " + connection.getResponseMessage()); + } + } catch (IOException ex) { + log.error("Failed to connect to PIN Management", ex); + 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/PINManagementInvoker.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/PINManagementInvoker.java deleted file mode 100644 index 1f14d751..00000000 --- a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/gui/PINManagementInvoker.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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 at.gv.egiz.bku.webstart.Launcher; -import java.awt.TrayIcon; -import java.io.IOException; -import java.net.HttpURLConnection; -import java.util.ResourceBundle; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * GUI is painted using SwingUtilities.invokeLater, but TrayIcon ActionListener Thread (== webstart thread) joined Jetty Thread - * - * @author Clemens Orthacker - */ -public class PINManagementInvoker implements Runnable { - - private static final Logger log = LoggerFactory.getLogger(PINManagementInvoker.class); - - TrayIcon trayIcon; - ResourceBundle messages; - - public PINManagementInvoker(TrayIcon trayIcon, ResourceBundle messages) { - this.trayIcon = trayIcon; - this.messages = messages; - } - - @Override - public void run() { - HttpURLConnection connection = null; - try { - log.debug("Connecting to: " + Launcher.PIN_MANAGEMENT_URL); - - connection = (HttpURLConnection) Launcher.PIN_MANAGEMENT_URL.openConnection(); - - connection.setRequestMethod("GET"); - connection.setReadTimeout(0); - connection.connect(); - - if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { - log.debug("pin management dialog returned"); - } else { - log.error("unexpected response from pin management: " + connection.getResponseMessage()); - } - } 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); - } finally { - if (connection != null) { - connection.disconnect(); - } - } - } -} 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(); +} -- cgit v1.2.3