diff options
Diffstat (limited to 'BKUWebStart/src/main/java/at/gv/egiz')
-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(); +} |