From 4af6912e43237c3678f05e30c69385481f42ae76 Mon Sep 17 00:00:00 2001
From: clemenso <clemenso@8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4>
Date: Tue, 12 May 2009 14:46:41 +0000
Subject: bku web start

git-svn-id: https://joinup.ec.europa.eu/svn/mocca/trunk@354 8a26b1a7-26f0-462f-b9ef-d0e30c41f5a4
---
 .../java/at/gv/egiz/bku/webstart/BKULauncher.java  | 221 +++++++++++++++++++++
 .../src/main/java/at/gv/egiz/bku/webstart/CA.java  | 117 +++++++++++
 .../java/at/gv/egiz/bku/webstart/Container.java    |  86 ++++++++
 .../bku/webstart/ui/BKUControllerInterface.java    |  23 +++
 .../at/gv/egiz/bku/webstart/ui/TrayIconDialog.java | 202 +++++++++++++++++++
 .../bku/webstart/ui/TrayIconDialogInterface.java   |  33 +++
 BKUWebStart/src/main/jnlp/resources/logo.png       | Bin 0 -> 2609 bytes
 BKUWebStart/src/main/jnlp/resources/logo_64x64.png | Bin 0 -> 2299 bytes
 BKUWebStart/src/main/jnlp/resources/logo_90x90.png | Bin 0 -> 3294 bytes
 BKUWebStart/src/main/jnlp/resources/splash.png     | Bin 0 -> 54978 bytes
 BKUWebStart/src/main/jnlp/template.xml             |  37 ++++
 .../gv/egiz/bku/webstart/defaultConf/template.zip  | Bin 0 -> 24829 bytes
 .../gv/egiz/bku/webstart/ui/UIMessages.properties  |  13 ++
 .../at/gv/egiz/bku/webstart/ui/favicon.png         | Bin 0 -> 2149 bytes
 .../resources/at/gv/egiz/bku/webstart/ui/logo.png  | Bin 0 -> 1751 bytes
 BKUWebStart/src/main/resources/log4j.properties    |  16 ++
 BKUWebStart/src/main/resources/logo.png            | Bin 0 -> 2299 bytes
 BKUWebStart/src/main/resources/logo_32x32.png      | Bin 0 -> 1522 bytes
 BKUWebStart/src/main/resources/logo_90x90.png      | Bin 0 -> 3294 bytes
 BKUWebStart/src/main/resources/logo_RGB22x22.png   | Bin 0 -> 1751 bytes
 BKUWebStart/src/main/resources/logo_RGB32x32.png   | Bin 0 -> 2609 bytes
 BKUWebStart/src/main/resources/splash.png          | Bin 0 -> 54978 bytes
 BKUWebStart/src/main/webapp/WEB-INF/web.xml        |   7 +
 BKUWebStart/src/main/webapp/launch.html            |  17 ++
 BKUWebStart/src/main/webapp/launch.jnlp            |  30 +++
 BKUWebStart/src/main/webapp/mocca_tiny.png         | Bin 0 -> 1025 bytes
 BKUWebStart/src/main/webapp/splash.png             | Bin 0 -> 54978 bytes
 27 files changed, 802 insertions(+)
 create mode 100644 BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/BKULauncher.java
 create mode 100644 BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/CA.java
 create mode 100644 BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/Container.java
 create mode 100644 BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/ui/BKUControllerInterface.java
 create mode 100644 BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/ui/TrayIconDialog.java
 create mode 100644 BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/ui/TrayIconDialogInterface.java
 create mode 100644 BKUWebStart/src/main/jnlp/resources/logo.png
 create mode 100644 BKUWebStart/src/main/jnlp/resources/logo_64x64.png
 create mode 100644 BKUWebStart/src/main/jnlp/resources/logo_90x90.png
 create mode 100644 BKUWebStart/src/main/jnlp/resources/splash.png
 create mode 100644 BKUWebStart/src/main/jnlp/template.xml
 create mode 100644 BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/defaultConf/template.zip
 create mode 100644 BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/ui/UIMessages.properties
 create mode 100644 BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/ui/favicon.png
 create mode 100644 BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/ui/logo.png
 create mode 100644 BKUWebStart/src/main/resources/log4j.properties
 create mode 100644 BKUWebStart/src/main/resources/logo.png
 create mode 100644 BKUWebStart/src/main/resources/logo_32x32.png
 create mode 100644 BKUWebStart/src/main/resources/logo_90x90.png
 create mode 100644 BKUWebStart/src/main/resources/logo_RGB22x22.png
 create mode 100644 BKUWebStart/src/main/resources/logo_RGB32x32.png
 create mode 100644 BKUWebStart/src/main/resources/splash.png
 create mode 100644 BKUWebStart/src/main/webapp/WEB-INF/web.xml
 create mode 100644 BKUWebStart/src/main/webapp/launch.html
 create mode 100644 BKUWebStart/src/main/webapp/launch.jnlp
 create mode 100644 BKUWebStart/src/main/webapp/mocca_tiny.png
 create mode 100644 BKUWebStart/src/main/webapp/splash.png

(limited to 'BKUWebStart/src/main')

diff --git a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/BKULauncher.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/BKULauncher.java
new file mode 100644
index 00000000..854e6535
--- /dev/null
+++ b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/BKULauncher.java
@@ -0,0 +1,221 @@
+package at.gv.egiz.bku.webstart;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.security.KeyStore;
+import java.util.Enumeration;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+//import org.apache.commons.cli.CommandLine;
+//import org.apache.commons.cli.CommandLineParser;
+//import org.apache.commons.cli.HelpFormatter;
+//import org.apache.commons.cli.Options;
+//import org.apache.commons.cli.ParseException;
+//import org.apache.commons.cli.PosixParser;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import at.gv.egiz.bku.webstart.ui.BKUControllerInterface;
+import at.gv.egiz.bku.webstart.ui.TrayIconDialog;
+import at.gv.egiz.bku.utils.StreamUtil;
+
+public class BKULauncher implements BKUControllerInterface {
+
+  private static Log log = LogFactory.getLog(BKULauncher.class);
+
+  private ResourceBundle resourceBundle = null;
+  private Container server;
+//  private SplashScreen splash = SplashScreen.getSplashScreen();
+
+  private void startUpServer() throws Exception {
+    server = new Container();
+    // XmlConfiguration xcfg = new XmlConfiguration(getClass().getClassLoader()
+    // .getResourceAsStream("at/gv/egiz/bku/local/app/jetty.xml"));
+    // xcfg.configure(server);
+    server.init();
+    server.start();
+  }
+
+  private void initTrayIcon() {
+    Locale loc = Locale.getDefault();
+    try {
+      resourceBundle = ResourceBundle.getBundle(
+          "at/gv/egiz/bku/webstart/ui/UIMessages", loc);
+    } catch (MissingResourceException mx) {
+      resourceBundle = ResourceBundle.getBundle(
+          "at/gv/egiz/bku/webstart/ui/UIMessages", Locale.ENGLISH);
+    }
+    TrayIconDialog.getInstance().init(resourceBundle);
+    TrayIconDialog.getInstance().setShutdownHook(this);
+    TrayIconDialog.getInstance().displayInfo("Greetings.Caption",
+        "Greetings.Message");
+  }
+
+  private void initStart() {
+
+  }
+
+  private void initFinished() {
+    try {
+//      if (splash != null) {
+//        try {
+//          splash.close();
+//        } catch (IllegalStateException ex) {
+//          log.warn("Failed to close splash screen: " + ex.getMessage());
+//        }
+//      }
+      server.join();
+    } catch (InterruptedException e) {
+      log.info(e);
+    }
+  }
+
+//  private void copyDirs(File srcDir, File dstDir) {
+//    for (File cf : srcDir.listFiles()) {
+//      File of = new File(dstDir, cf.getName());
+//      if (cf.isDirectory()) {
+//        log.debug("Creating directory: " + of);
+//        of.mkdir();
+//        copyDirs(cf, of);
+//      } else {
+//        log.debug("Writing file: " + of);
+//        try {
+//          FileInputStream fis = new FileInputStream(cf);
+//          FileOutputStream fos = new FileOutputStream(of);
+//          StreamUtil.copyStream(fis, fos);
+//          fis.close();
+//          fos.close();
+//        } catch (IOException e) {
+//          log.error("Cannot copy default configuration", e);
+//        }
+//      }
+//    }
+//  }
+
+  private void unzip(File zipfile) throws IOException {
+    File dir = zipfile.getParentFile();
+    ZipFile zipFile = new ZipFile(zipfile);
+    Enumeration<? extends ZipEntry> entries = zipFile.entries();
+    while (entries.hasMoreElements()) {
+      ZipEntry entry = entries.nextElement();
+      File eF = new File(dir, entry.getName());
+      if (entry.isDirectory()) {
+        eF.mkdirs();
+        continue;
+      }
+      File f = new File(eF.getParent());
+      f.mkdirs();
+      StreamUtil.copyStream(zipFile.getInputStream(entry),
+          new FileOutputStream(eF));
+    }
+    zipFile.close();
+  }
+
+  private void checkConfig(String[] args) {
+//    CommandLineParser parser = new PosixParser();
+//    Options options = new Options();
+//    options.addOption("c", true, "the configuration's base directory");
+//    options.addOption("h", false, "print this message");
+//    try {
+      File cfgDir = new File(System.getProperty("user.home") + "/.mocca/conf");
+//      CommandLine cmd = parser.parse(options, args);
+//      if (cmd.hasOption("h")) {
+//        HelpFormatter formatter = new HelpFormatter();
+//        formatter.printHelp("BKULauncher", options);
+//        System.exit(0);
+//      }
+//
+//      if (cmd.hasOption("c")) {
+//        cfgDir = new File(cmd.getOptionValue("c"));
+//      }
+      log.debug("using config directory: " + cfgDir);
+      if (cfgDir.exists() && cfgDir.isFile()) {
+        log.error("Configuration directory must not be a file");
+      }
+      if (!cfgDir.exists()) {
+        log.debug("Creating config directory: " + cfgDir);
+        cfgDir.mkdirs();
+        try {
+          InputStream is = getClass().getClassLoader().getResourceAsStream(
+              "at/gv/egiz/bku/webstart/defaultConf/template.zip");
+          OutputStream os = new FileOutputStream(new File(cfgDir,
+              "template.zip"));
+          StreamUtil.copyStream(is, os);
+          os.close();
+          unzip(new File(cfgDir, "template.zip"));
+        } catch (IOException iox) {
+          log.error("Cannot create user directory", iox);
+          return;
+        }
+        CA ca = new CA();
+        char[] password = "changeMe".toCharArray();
+        KeyStore ks = ca.generateKeyStore(password);
+        if (ks != null) {
+          File ksdir = new File(cfgDir, "keystore");
+          ksdir.mkdirs();
+          FileOutputStream fos;
+          try {
+            fos = new FileOutputStream(new File(ksdir, "keystore.ks"));
+            ks.store(fos, password);
+            fos.close();
+          } catch (Exception e) {
+            log.error("Cannot store keystore", e);
+          }
+        } else {
+          log.error("Cannot create ssl certificate");
+        }
+      }
+//    } catch (ParseException e1) {
+//      log.error(e1);
+//      HelpFormatter formatter = new HelpFormatter();
+//      formatter.printHelp("BKULauncher", options);
+//      System.exit(0);
+//    }
+  }
+
+  /**
+   * @param args
+   */
+  public static void main(String[] args) {
+    try {
+      log.warn("***** DISABLING SECURITY MANAGER *******");
+      System.setSecurityManager(null);
+      BKULauncher launcher = new BKULauncher();
+      launcher.initStart();
+      launcher.checkConfig(args);
+      launcher.startUpServer();
+      launcher.initTrayIcon();
+      launcher.initFinished();
+    } catch (Exception e) {
+      log.fatal("Cannot launch BKU", e);
+      System.exit(-1000);
+    }
+
+  }
+
+  public void shutDown() {
+    log.info("Shutting down server");
+    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);
+  }
+
+}
diff --git a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/CA.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/CA.java
new file mode 100644
index 00000000..f81d3d83
--- /dev/null
+++ b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/CA.java
@@ -0,0 +1,117 @@
+package at.gv.egiz.bku.webstart;
+
+import iaik.asn1.ObjectID;
+import iaik.asn1.structures.AlgorithmID;
+import iaik.asn1.structures.Name;
+import iaik.x509.X509Certificate;
+import iaik.x509.extensions.BasicConstraints;
+import iaik.x509.extensions.KeyUsage;
+
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.security.GeneralSecurityException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.KeyStore;
+import java.security.NoSuchAlgorithmException;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.Random;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class CA {
+  private final static Log log = LogFactory.getLog(CA.class);
+
+  private KeyPair caKeyPair;
+  private X509Certificate caCert;
+
+  private KeyPair serverKeyPair;
+  private X509Certificate serverCert;
+
+  public CA() {
+  }
+
+  private KeyPair generateKeyPair() throws NoSuchAlgorithmException {
+    KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
+    gen.initialize(2048);
+    return gen.generateKeyPair();
+  }
+
+  private void generateCA() throws GeneralSecurityException {
+    log.debug("Generating CA certificate");
+    Name subject = new Name();
+    subject.addRDN(ObjectID.country, "AT");
+    subject.addRDN(ObjectID.organization, "MOCCA");
+    subject.addRDN(ObjectID.organizationalUnit, "MOCCA-CA");
+
+    caKeyPair = generateKeyPair();
+    caCert = new X509Certificate();
+    caCert.setSerialNumber(new BigInteger(20, new Random()));
+    caCert.setSubjectDN(subject);
+    caCert.setPublicKey(caKeyPair.getPublic());
+    caCert.setIssuerDN(subject);
+
+    caCert.addExtension(new BasicConstraints(true));
+    caCert.addExtension(new KeyUsage(KeyUsage.keyCertSign | KeyUsage.cRLSign
+        | KeyUsage.digitalSignature));
+
+    GregorianCalendar date = new GregorianCalendar();
+    date.add(Calendar.HOUR_OF_DAY, -1);
+    caCert.setValidNotBefore(date.getTime());
+    date.add(Calendar.YEAR, 7);
+    caCert.setValidNotAfter(date.getTime());
+    caCert.sign(AlgorithmID.sha1WithRSAEncryption, caKeyPair.getPrivate());
+    log.debug("Successfully signed CA certificate");
+  }
+
+  private void generateServerCert() throws GeneralSecurityException {
+    log.debug("Generating SSL certificate");
+    Name subject = new Name();
+    subject.addRDN(ObjectID.country, "AT");
+    subject.addRDN(ObjectID.organization, "MOCCA");
+    try {
+      subject.addRDN(ObjectID.commonName, InetAddress.getLocalHost()
+          .getHostName());
+    } catch (UnknownHostException e) {
+      subject.addRDN(ObjectID.commonName, "localhost");
+    }
+    serverKeyPair = generateKeyPair();
+    serverCert = new X509Certificate();
+    serverCert.setSerialNumber(new BigInteger(20, new Random()));
+    serverCert.setSubjectDN(subject);
+    serverCert.setPublicKey(serverKeyPair.getPublic());
+    serverCert.setIssuerDN(caCert.getSubjectDN());
+
+    serverCert.addExtension(new BasicConstraints(false));
+    serverCert.addExtension(new KeyUsage(KeyUsage.keyEncipherment
+        | KeyUsage.digitalSignature));
+
+    GregorianCalendar date = new GregorianCalendar();
+    date.add(Calendar.HOUR_OF_DAY, -1);
+    serverCert.setValidNotBefore(date.getTime());
+    date.add(Calendar.YEAR, 7);
+    date.add(Calendar.HOUR_OF_DAY, -1);
+    serverCert.setValidNotAfter(date.getTime());
+    serverCert.sign(AlgorithmID.sha1WithRSAEncryption, caKeyPair.getPrivate());
+    log.debug("Successfully signed server certificate");
+    caKeyPair = null;
+  }
+
+  public KeyStore generateKeyStore(char[] password) {
+    try {
+      generateCA();
+      generateServerCert();
+      KeyStore ks = KeyStore.getInstance("JKS");
+      ks.load(null, null);
+      ks.setKeyEntry("server", serverKeyPair.getPrivate(), password, new X509Certificate[]{serverCert, caCert});
+      return ks;
+    } catch (Exception e) {
+      log.error("Cannot generate certificate", e);
+    }
+    return null;
+  }
+
+}
diff --git a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/Container.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/Container.java
new file mode 100644
index 00000000..ef12e4fd
--- /dev/null
+++ b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/Container.java
@@ -0,0 +1,86 @@
+package at.gv.egiz.bku.webstart;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.mortbay.jetty.Connector;
+import org.mortbay.jetty.Handler;
+import org.mortbay.jetty.Server;
+import org.mortbay.jetty.handler.DefaultHandler;
+import org.mortbay.jetty.handler.HandlerCollection;
+import org.mortbay.jetty.nio.SelectChannelConnector;
+import org.mortbay.jetty.security.SslSocketConnector;
+import org.mortbay.jetty.webapp.WebAppContext;
+import org.mortbay.thread.QueuedThreadPool;
+
+public class Container {
+
+  public static final String HTTP_PORT = "mocca.http.port";
+  public static final String HTTPS_PORT = "mocca.http.port";
+
+  private static Log log = LogFactory.getLog(Container.class);
+
+  private Server server;
+
+  public Container() {
+  }
+
+  public void init() {
+    server = new Server();
+    QueuedThreadPool qtp = new QueuedThreadPool();
+    qtp.setMaxThreads(5);
+    qtp.setMinThreads(2);
+    qtp.setLowThreads(0);
+    server.setThreadPool(qtp);
+    server.setStopAtShutdown(true);
+    server.setGracefulShutdown(3000);
+
+    SelectChannelConnector connector = new SelectChannelConnector();
+    connector.setPort(Integer.getInteger(HTTP_PORT, 3495).intValue());
+    connector.setAcceptors(1);
+    connector.setConfidentialPort(Integer.getInteger(HTTPS_PORT, 3496).intValue());
+
+    SslSocketConnector sslConnector = new SslSocketConnector();
+    sslConnector.setPort(Integer.getInteger(HTTPS_PORT, 3496).intValue());
+    sslConnector.setAcceptors(1);
+    sslConnector.setKeystore(System.getProperty("user.home")
+        + "/.mocca/conf/keystore/keystore.ks");
+    sslConnector.setPassword("changeMe");
+    sslConnector.setKeyPassword("changeMe");
+
+    server.setConnectors(new Connector[] { connector, sslConnector });
+    
+//    HandlerCollection handlers = new HandlerCollection();
+    WebAppContext webapp = new WebAppContext();
+    webapp.setContextPath("/");
+    webapp.setExtractWAR(true); //false
+    webapp.setParentLoaderPriority(false); 
+
+//    webappcontext.setWar("BKULocal-1.0.4-SNAPSHOT.war");
+    webapp.setWar(getClass().getClassLoader().getResource("BKULocalWar/").toString());
+
+//    handlers.setHandlers(new Handler[] { webappcontext, new DefaultHandler() });
+
+    server.setHandler(webapp);
+    server.setGracefulShutdown(1000*3);
+  }
+
+  public void start() throws Exception {
+    server.start();
+  }
+
+  public boolean isRunning() {
+    return server.isRunning();
+  }
+
+  public void stop() throws Exception {
+    server.stop();
+  }
+
+  public void destroy() {
+    server.destroy();
+  }
+
+  public void join() throws InterruptedException {
+    server.join();
+  }
+}
\ No newline at end of file
diff --git a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/ui/BKUControllerInterface.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/ui/BKUControllerInterface.java
new file mode 100644
index 00000000..fd9838f9
--- /dev/null
+++ b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/ui/BKUControllerInterface.java
@@ -0,0 +1,23 @@
+/*
+* 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.ui;
+
+public interface BKUControllerInterface {
+  
+  public void shutDown();
+
+}
diff --git a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/ui/TrayIconDialog.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/ui/TrayIconDialog.java
new file mode 100644
index 00000000..4679eac5
--- /dev/null
+++ b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/ui/TrayIconDialog.java
@@ -0,0 +1,202 @@
+/*
+* 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.ui;
+
+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.io.IOException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.ResourceBundle;
+
+import javax.imageio.ImageIO;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public class TrayIconDialog implements TrayIconDialogInterface {
+
+  private static Log log = LogFactory.getLog(TrayIconDialog.class);
+  private static TrayIconDialogInterface instance;
+  private boolean isSupported;
+  private BKUControllerInterface shutDown;
+  private TrayIcon trayIcon = null;
+  private ResourceBundle resourceBundle = null;
+
+  private TrayIconDialog() {
+  }
+
+  private void displayTrayMsg(String captionID, String messageID,
+      TrayIcon.MessageType type) {
+    if ((isSupported) && (resourceBundle != null)) {
+      try {
+        trayIcon.displayMessage(resourceBundle.getString(captionID),
+            resourceBundle.getString(messageID), type);
+      } catch (Exception ex) {
+        log.error(ex);
+      }
+    }
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see
+   * at.gv.egiz.bku.local.ui.TrayIconDialogInterface#displayInfo(java.lang.String
+   * , java.lang.String)
+   */
+  public void displayInfo(String captionID, String messageID) {
+    displayTrayMsg(captionID, messageID, TrayIcon.MessageType.INFO);
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see
+   * at.gv.egiz.bku.local.ui.TrayIconDialogInterface#displayWarning(java.lang
+   * .String, java.lang.String)
+   */
+  public void displayWarning(String captionID, String messageID) {
+    displayTrayMsg(captionID, messageID, TrayIcon.MessageType.WARNING);
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see
+   * at.gv.egiz.bku.local.ui.TrayIconDialogInterface#displayError(java.lang.
+   * String, java.lang.String)
+   */
+  public void displayError(String captionID, String messageID) {
+    displayTrayMsg(captionID, messageID, TrayIcon.MessageType.ERROR);
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see
+   * at.gv.egiz.bku.local.ui.TrayIconDialogInterface#init(java.util.ResourceBundle
+   * )
+   */
+  public void init(ResourceBundle resourceBundel) {
+    this.resourceBundle = resourceBundel;
+    isSupported = SystemTray.isSupported();
+    log.info("Trayicon supported: " + isSupported);
+    try {
+      if (isSupported) {
+        SystemTray tray = SystemTray.getSystemTray();
+        Image image = ImageIO.read(getClass().getClassLoader()
+            .getResourceAsStream("at/gv/egiz/bku/webstart/ui/logo.png"));
+        PopupMenu popup = new PopupMenu();
+        MenuItem exitItem = new MenuItem(resourceBundel
+            .getString("TrayMenu.Shutdown"));
+        popup.add(exitItem);
+        exitItem.addActionListener(new ActionListener() {
+          public void actionPerformed(ActionEvent e) {
+            log.info("Calling Shutdown");
+            if (shutDown != null) {
+              shutDown.shutDown();
+            }
+          }
+        });
+
+        trayIcon = new TrayIcon(image, "BKULogo", popup);
+        trayIcon.setImageAutoSize(true);
+        trayIcon.setToolTip(resourceBundel.getString("TrayMenu.Tooltip"));
+        try {
+          tray.add(trayIcon);
+        } catch (AWTException e) {
+          log.error("TrayIcon could not be added.", e);
+          isSupported = false;
+        }
+      }
+    } catch (IOException e) {
+      log.error(e);
+    }
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see
+   * at.gv.egiz.bku.local.ui.TrayIconDialogInterface#setShutdownHook(at.gv.egiz
+   * .bku.local.ui.BKUControllerInterface)
+   */
+  public void setShutdownHook(BKUControllerInterface shutDown) {
+    this.shutDown = shutDown;
+  }
+
+  @SuppressWarnings("unchecked")
+  public synchronized static TrayIconDialogInterface getInstance() {
+    ClassLoader cl = TrayIconDialog.class.getClassLoader();
+    if (instance == null) {
+      if (cl.toString().equals(cl.getParent().toString())) {
+        instance = new TrayIconDialog();
+        return instance;
+      }
+      ClassLoader parent = cl;
+      while (!parent.toString().equals(cl.getParent().toString())) {
+        parent = parent.getParent();
+      }
+      try {
+        Class<TrayIconDialog> otherClassInstance = (Class<TrayIconDialog>) parent
+            .loadClass(TrayIconDialog.class.getName());
+        Method getInstanceMethod = otherClassInstance.getDeclaredMethod(
+            "getInstance", new Class[] {});
+        Object otherSingleton = getInstanceMethod.invoke(null, new Object[] {});
+        instance = (TrayIconDialogInterface) Proxy.newProxyInstance(cl,
+            new Class[] { TrayIconDialogInterface.class },
+            new PassThroughProxyHandler(otherSingleton));
+      } catch (ClassNotFoundException ce) {
+        instance = new TrayIconDialog();
+      } catch (Exception e) {
+        log.error(e);
+        instance = new TrayIconDialog();
+      }
+      return instance;
+    }
+    return instance;
+  }
+
+  /**
+   * 
+   * Only works for public methods
+   * 
+   */
+  static class PassThroughProxyHandler implements InvocationHandler {
+    private final Object delegate;
+
+    public PassThroughProxyHandler(Object delegate) {
+      this.delegate = delegate;
+    }
+
+    public Object invoke(Object proxy, Method method, Object[] args)
+        throws Throwable {
+      Method delegateMethod = delegate.getClass().getMethod(method.getName(),
+          method.getParameterTypes());
+      return delegateMethod.invoke(delegate, args);
+    }
+  }
+
+}
diff --git a/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/ui/TrayIconDialogInterface.java b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/ui/TrayIconDialogInterface.java
new file mode 100644
index 00000000..078844cb
--- /dev/null
+++ b/BKUWebStart/src/main/java/at/gv/egiz/bku/webstart/ui/TrayIconDialogInterface.java
@@ -0,0 +1,33 @@
+/*
+* 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.ui;
+
+import java.util.ResourceBundle;
+
+public interface TrayIconDialogInterface {
+
+  public abstract void displayInfo(String captionID, String messageID);
+
+  public abstract void displayWarning(String captionID, String messageID);
+
+  public abstract void displayError(String captionID, String messageID);
+
+  public abstract void init(ResourceBundle resourceBundel);
+
+  public abstract void setShutdownHook(BKUControllerInterface shutDown);
+
+}
\ No newline at end of file
diff --git a/BKUWebStart/src/main/jnlp/resources/logo.png b/BKUWebStart/src/main/jnlp/resources/logo.png
new file mode 100644
index 00000000..2c622d88
Binary files /dev/null and b/BKUWebStart/src/main/jnlp/resources/logo.png differ
diff --git a/BKUWebStart/src/main/jnlp/resources/logo_64x64.png b/BKUWebStart/src/main/jnlp/resources/logo_64x64.png
new file mode 100644
index 00000000..fa6d7f96
Binary files /dev/null and b/BKUWebStart/src/main/jnlp/resources/logo_64x64.png differ
diff --git a/BKUWebStart/src/main/jnlp/resources/logo_90x90.png b/BKUWebStart/src/main/jnlp/resources/logo_90x90.png
new file mode 100644
index 00000000..d7f8bbd0
Binary files /dev/null and b/BKUWebStart/src/main/jnlp/resources/logo_90x90.png differ
diff --git a/BKUWebStart/src/main/jnlp/resources/splash.png b/BKUWebStart/src/main/jnlp/resources/splash.png
new file mode 100644
index 00000000..72c1d868
Binary files /dev/null and b/BKUWebStart/src/main/jnlp/resources/splash.png differ
diff --git a/BKUWebStart/src/main/jnlp/template.xml b/BKUWebStart/src/main/jnlp/template.xml
new file mode 100644
index 00000000..0a89a036
--- /dev/null
+++ b/BKUWebStart/src/main/jnlp/template.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<jnlp spec="$jnlpspec" codebase="$project.Url" href="$outputFile">
+  <information>
+    <title>$project.Name</title>
+    <vendor>$project.Organization.Name</vendor>
+    <homepage href="$project.Url"/>
+    <description>$project.Description</description>
+    <icon href="lib/splash.png" kind="splash"/>
+    <icon href="lib/logo.png" kind="default"/>
+    <shortcut online="false">
+      <desktop/>
+      <menu submenu="MOCCA"/>
+    </shortcut>
+
+#if($offlineAllowed)
+    <offline-allowed/>
+#end
+
+  </information>
+
+
+#if($allPermissions)
+  <security>
+    <all-permissions/>
+  </security>
+#end
+
+  <resources>
+    <!-- initial-heap-size="32m" max-heap-size="128m" -->
+    <j2se version="$j2seVersion"/>
+    <property name="jnlp.versionEnabled" value="true"/>
+
+     $dependencies
+
+  </resources>
+  <application-desc main-class="$mainClass"/>
+</jnlp>
\ No newline at end of file
diff --git a/BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/defaultConf/template.zip b/BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/defaultConf/template.zip
new file mode 100644
index 00000000..f14b0c19
Binary files /dev/null and b/BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/defaultConf/template.zip differ
diff --git a/BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/ui/UIMessages.properties b/BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/ui/UIMessages.properties
new file mode 100644
index 00000000..873d03ef
--- /dev/null
+++ b/BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/ui/UIMessages.properties
@@ -0,0 +1,13 @@
+#-------- tray icon messages -------
+TrayMenu.Tooltip=MOCCA
+TrayMenu.Shutdown=MOCCA Beenden
+
+Greetings.Message=MOCCA up and running
+Greetings.Caption=MOCCA Started
+
+Message.RequestCaption=New Request
+Message.InfoboxReadRequest=Reading Infobox
+Message.SecureSignatureKeypair=Reading secure signature certificate
+Message.CertifiedKeypair=Reading certified certificate
+Message.IdentityLink=Reading Identitylink
+Message.SignRequest=Creating Signature
\ No newline at end of file
diff --git a/BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/ui/favicon.png b/BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/ui/favicon.png
new file mode 100644
index 00000000..2d0276de
Binary files /dev/null and b/BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/ui/favicon.png differ
diff --git a/BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/ui/logo.png b/BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/ui/logo.png
new file mode 100644
index 00000000..598ab00b
Binary files /dev/null and b/BKUWebStart/src/main/resources/at/gv/egiz/bku/webstart/ui/logo.png differ
diff --git a/BKUWebStart/src/main/resources/log4j.properties b/BKUWebStart/src/main/resources/log4j.properties
new file mode 100644
index 00000000..4df33ab5
--- /dev/null
+++ b/BKUWebStart/src/main/resources/log4j.properties
@@ -0,0 +1,16 @@
+# loglever DEBUG, appender STDOUT
+log4j.rootLogger=TRACE, STDOUT, file
+
+# STDOUT appender
+log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
+log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
+#log4j.appender.STDOUT.layout.ConversionPattern=%5p | %d{dd HH:mm:ss,SSS} | %20c |  %10t | %m%n
+#log4j.appender.STDOUT.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
+log4j.appender.STDOUT.layout.ConversionPattern=%-5p |%d | %t | %c %x- %m%n
+
+### FILE appender
+log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.file.datePattern='.'yyyy-MM-dd
+log4j.appender.file.File=${user.home}/.mocca/logs/webstart.log
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/BKUWebStart/src/main/resources/logo.png b/BKUWebStart/src/main/resources/logo.png
new file mode 100644
index 00000000..fa6d7f96
Binary files /dev/null and b/BKUWebStart/src/main/resources/logo.png differ
diff --git a/BKUWebStart/src/main/resources/logo_32x32.png b/BKUWebStart/src/main/resources/logo_32x32.png
new file mode 100644
index 00000000..337b144b
Binary files /dev/null and b/BKUWebStart/src/main/resources/logo_32x32.png differ
diff --git a/BKUWebStart/src/main/resources/logo_90x90.png b/BKUWebStart/src/main/resources/logo_90x90.png
new file mode 100644
index 00000000..d7f8bbd0
Binary files /dev/null and b/BKUWebStart/src/main/resources/logo_90x90.png differ
diff --git a/BKUWebStart/src/main/resources/logo_RGB22x22.png b/BKUWebStart/src/main/resources/logo_RGB22x22.png
new file mode 100644
index 00000000..598ab00b
Binary files /dev/null and b/BKUWebStart/src/main/resources/logo_RGB22x22.png differ
diff --git a/BKUWebStart/src/main/resources/logo_RGB32x32.png b/BKUWebStart/src/main/resources/logo_RGB32x32.png
new file mode 100644
index 00000000..2c622d88
Binary files /dev/null and b/BKUWebStart/src/main/resources/logo_RGB32x32.png differ
diff --git a/BKUWebStart/src/main/resources/splash.png b/BKUWebStart/src/main/resources/splash.png
new file mode 100644
index 00000000..72c1d868
Binary files /dev/null and b/BKUWebStart/src/main/resources/splash.png differ
diff --git a/BKUWebStart/src/main/webapp/WEB-INF/web.xml b/BKUWebStart/src/main/webapp/WEB-INF/web.xml
new file mode 100644
index 00000000..9f88c1f9
--- /dev/null
+++ b/BKUWebStart/src/main/webapp/WEB-INF/web.xml
@@ -0,0 +1,7 @@
+<!DOCTYPE web-app PUBLIC
+ "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd" >
+
+<web-app>
+  <display-name>Archetype Created Web Application</display-name>
+</web-app>
diff --git a/BKUWebStart/src/main/webapp/launch.html b/BKUWebStart/src/main/webapp/launch.html
new file mode 100644
index 00000000..6ed6feb5
--- /dev/null
+++ b/BKUWebStart/src/main/webapp/launch.html
@@ -0,0 +1,17 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+    <head>
+        <title>Test page for launching the application via JNLP</title>
+    </head>
+    <body>
+        <h3>Test page for launching the application via JNLP</h3>
+        <a href="launch.jnlp">Launch the application</a>
+        <!-- Or use the following script element to launch with the Deployment Toolkit -->
+        <!-- Open the deployJava.js script to view its documentation -->
+        <script src="http://java.com/js/deployJava.js"></script>
+        <script>
+            var url="http://localhost:8080/BKUWebStart/launch.jnlp"
+            deployJava.createWebStartLaunchButton(url, "1.6")
+        </script>
+    </body>
+</html>
diff --git a/BKUWebStart/src/main/webapp/launch.jnlp b/BKUWebStart/src/main/webapp/launch.jnlp
new file mode 100644
index 00000000..d51d9d21
--- /dev/null
+++ b/BKUWebStart/src/main/webapp/launch.jnlp
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<jnlp codebase="http://localhost:8080/BKUWebStart/" href="launch.jnlp" spec="1.0+">
+  <information>
+    <title>BKU Web Start</title>
+    <vendor>EGIZ</vendor>
+    <homepage href="http://mocca.egovlabs.gv.at"/>
+    <description>BKU WebStart (aka. Lokale BKU)</description>
+    <description kind="short">BKU WebStart</description>
+    <icon href="splash.png" kind="splash"/>
+    <icon href="mocca_tiny.png" kind="default"/>
+    <offline-allowed/>
+  </information>
+  <security>
+    <all-permissions/>
+  </security>
+  <resources>
+    <j2se version="1.6+"/>
+    <jar eager="true" href="BKUWebStart.jar" main="true"/>
+    <jar href="lib/appframework-1.0.3.jar"/>
+    <jar href="lib/swing-worker-1.1.jar"/>
+    <jar href="lib/commons-logging-1.1.1.jar"/>
+    <jar href="lib/jetty-util-6.1.15.jar"/>
+    <jar href="lib/commons-cli-1.0.jar"/>
+    <jar href="lib/servlet-api-2.5-20081211.jar"/>
+    <jar href="lib/jetty-6.1.15.jar"/>
+    <jar href="lib/log4j-1.2.12.jar"/>
+  </resources>
+  <application-desc main-class="at.gv.egiz.bku.webstart.BKULauncher">
+  </application-desc>
+</jnlp>
diff --git a/BKUWebStart/src/main/webapp/mocca_tiny.png b/BKUWebStart/src/main/webapp/mocca_tiny.png
new file mode 100644
index 00000000..1f125d9b
Binary files /dev/null and b/BKUWebStart/src/main/webapp/mocca_tiny.png differ
diff --git a/BKUWebStart/src/main/webapp/splash.png b/BKUWebStart/src/main/webapp/splash.png
new file mode 100644
index 00000000..72c1d868
Binary files /dev/null and b/BKUWebStart/src/main/webapp/splash.png differ
-- 
cgit v1.2.3