/** * Copyright 1999-2009 The Pegadi Team * * 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 org.pegadi.client; import no.dusken.common.model.Person; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.io.IOUtils; import org.pegadi.games.tetris.Tetris; import org.pegadi.lister.Lister; import org.pegadi.maildialog.MailDialog; import org.pegadi.model.LoginContext; import org.pegadi.permissions.GlobalPermissions; import org.pegadi.publicationcontrol.PublicationControl; import org.pegadi.server.NoAccessException; import org.pegadi.sources.Sources; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.rmi.RMISecurityManager; import java.security.*; import java.util.Enumeration; import java.util.Locale; import java.util.Properties; import java.util.ResourceBundle; /** * Pegadi ApplicationLauncher. This is the first window the user sees, it * serves as a desktop and a portal.<br> * By default this class will log errors to ${user.home}/pegadi.log. * * @author Christian Waale Hansen <chrishan@stud.ntnu.no> */ public class ApplicationLauncher extends JFrame { protected static String PREF_DOMAIN = "General"; protected static String PREF_LOCALE = "Locale"; protected static String PREF_THEME = "Theme"; private File logFile; // hardcoded default RMI hostname final static String hostString = "localhost"; // hardcoded default RMI servername final static String nameString = "PegadiServer"; // the actual name and host used for this setup static String usedHost; static String usedName; static String servername; static String host; BorderLayout borderLayout1 = new BorderLayout(); JPanel jPanel1 = new JPanel(); FlowLayout flowLayout1 = new FlowLayout(); JButton listerButton = new JButton(); JButton publicationButton = new JButton(); JButton tetrisButton = new JButton(); JButton sourcesButton = new JButton(); static ResourceBundle str; // The application parameters fetched from file static ResourceBundle appStrings; JPanel jPanel2 = new JPanel(); JButton logoutButton = new JButton(); JButton quitButton = new JButton(); JLabel usrlabel = new JLabel(); Lister lis; PublicationControl pub; Tetris tet; Sources sources; protected JMenuBar menuBar = new JMenuBar(); protected JMenu fileMenu = new JMenu(); protected JMenu editMenu = new JMenu(); protected JMenu helpMenu = new JMenu(); protected JMenuItem prefsMenuItem = new JMenuItem(); protected JMenuItem logoutMenuItem = new JMenuItem(); protected JMenuItem quitMenuItem = new JMenuItem(); protected JMenuItem listerMenuItem = new JMenuItem(); protected JMenuItem tetrisMenuItem = new JMenuItem(); protected JMenuItem sourcesMenuItem = new JMenuItem(); AbstractAction reportBugAction; /** * User preferences. */ protected Properties prefs; private final Logger log = LoggerFactory.getLogger(getClass()); private LoginDialog loginDialog = new LoginDialog(this); private static String version; public ApplicationLauncher() { log.debug("Inside applicationlauncher constructor"); try { str = ResourceBundle.getBundle("org.pegadi.client.ClientStrings"); appStrings = ResourceBundle .getBundle("org.pegadi.client.ClientApp"); ClientContext.includeUnstable = Boolean.valueOf(appStrings.getString("pegadi.includeunstable")); log.debug("UNSTABLE:" + ClientContext.includeUnstable); jbInit(); setLocale("no_NO"); } catch (Exception e) { log.error("Error initialising strings", e); } version = str.getString("version"); setTitle(str.getString("app_title") + " " + version); registerOSXApplicationMenu(); } /** * This method registers a listener for the Quit-menuitem on OS X application menu. * To avoid platform dependent compilation, reflection is utilized. * <p/> * Basically what happens, is this: * <p/> * Application app = Application.getApplication(); * app.addApplicationListener(new ApplicationAdapter() { * public void handleQuit(ApplicationEvent e) { * e.setHandled(false); * conditionalExit(); * } * }); */ private void registerOSXApplicationMenu() { try { ClassLoader cl = getClass().getClassLoader(); // Create class-objects for the classes and interfaces we need final Class comAppleEawtApplicationClass = cl.loadClass("com.apple.eawt.Application"); final Class comAppleEawtApplicationListenerInterface = cl.loadClass("com.apple.eawt.ApplicationListener"); final Class comAppleEawtApplicationEventClass = cl.loadClass("com.apple.eawt.ApplicationEvent"); final Method applicationEventSetHandledMethod = comAppleEawtApplicationEventClass.getMethod("setHandled", new Class[]{boolean.class}); // Set up invocationhandler-object to recieve events from OS X application menu InvocationHandler handler = new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("handleQuit")) { applicationEventSetHandledMethod.invoke(args[0], new Object[]{Boolean.FALSE}); conditionalExit(); } return null; } }; // Create applicationlistener proxy Object applicationListenerProxy = Proxy.newProxyInstance(cl, new Class[]{comAppleEawtApplicationListenerInterface}, handler); // Get a real Application-object Method applicationGetApplicationMethod = comAppleEawtApplicationClass.getMethod("getApplication", new Class[0]); Object theApplicationObject = applicationGetApplicationMethod.invoke(null, new Object[0]); // Add the proxy application object as listener Method addApplicationListenerMethod = comAppleEawtApplicationClass.getMethod("addApplicationListener", new Class[]{comAppleEawtApplicationListenerInterface}); addApplicationListenerMethod.invoke(theApplicationObject, new Object[]{applicationListenerProxy}); } catch (Exception e) { log.info("we are not on OSX"); } } public static void main(String[] args) { com.sun.net.ssl.internal.ssl.Provider provider = new com.sun.net.ssl.internal.ssl.Provider(); java.security.Security.addProvider(provider); setAllPermissions(); /** * If we are on Apples operating system, we would like to use the screen * menu bar It is the first property we set in our main method. This is * to make sure that the property is set before awt is loaded. */ if (System.getProperty("os.name").toLowerCase().startsWith("mac os x")) { System.setProperty("apple.laf.useScreenMenuBar", "true"); } Logger log = LoggerFactory.getLogger(ApplicationLauncher.class); /** * Making sure default L&F is System */ if (!UIManager.getLookAndFeel().getName().equals(UIManager.getSystemLookAndFeelClassName())) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { log.warn("Unable to change L&F to System",e); } } long start = System.currentTimeMillis(); // Splash Splash splash = new Splash("/images/splash.png"); splash.setVisible(true); splash.setCursor(new Cursor(Cursor.WAIT_CURSOR)); if (System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("org/pegadi/client/client-context.xml"); closeContextOnShutdown(context); long timeToLogin = System.currentTimeMillis() - start; log.info("Connected OK after {} ms", timeToLogin); log.info("Java Version {}", System.getProperty("java.version")); splash.dispose(); } private static void closeContextOnShutdown(final ClassPathXmlApplicationContext context) { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() {context.close(); } }); } private static void setAllPermissions() { // give all permissions. needed when run from java web start, because // the rmi classloaders don't heed the security settings in the .jnlp // file. try { Policy.setPolicy(new Policy() { public PermissionCollection getPermissions(CodeSource codesource) { Permissions perms = new Permissions(); perms.add(new AllPermission()); return (perms); } public void refresh() { } }); } catch (Exception wse) { LoggerFactory.getLogger(ApplicationLauncher.class).error("Error setting policies", wse); System.exit(-1); } } private void jbInit() { ImageIcon icon = new ImageIcon(getClass().getResource("/images/pegadi.gif")); setIconImage(icon.getImage()); this.getContentPane().setLayout(borderLayout1); jPanel1.setLayout(flowLayout1); listerButton.setEnabled(false); publicationButton.setEnabled(false); tetrisButton.setEnabled(false); // ImageIcon reportBugIcon = new // ImageIcon(getClass().getResource(appStrings.getString("icon_open"))); reportBugAction = new AbstractAction(str.getString("menu_help_report")) { public void actionPerformed(ActionEvent e) { reportBug_actionPerformed(e); } }; prefsMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { prefsMenuItem_actionPerformed(e); } }); listerMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(76, java.awt.event.KeyEvent.CTRL_MASK, false)); listerMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { listerButton_actionPerformed(e); } }); sourcesMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(73, java.awt.event.KeyEvent.CTRL_MASK, false)); sourcesMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { sourcesButton_actionPerformed(); } }); tetrisMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(84, java.awt.event.KeyEvent.CTRL_MASK, false)); tetrisMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { tetrisButton_actionPerformed(e); } }); logoutMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(87, java.awt.event.KeyEvent.CTRL_MASK, false)); logoutMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { logoutMenuItem_actionPerformed(e); } }); quitMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(81, java.awt.event.KeyEvent.CTRL_MASK, false)); quitMenuItem.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { quitMenuItem_actionPerformed(e); } }); this.getContentPane().add(jPanel1, BorderLayout.NORTH); jPanel1.add(listerButton, null); listerButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { listerButton_actionPerformed(e); } }); publicationButton .addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { publicationButton_actionPerformed(e); } }); sourcesButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { sourcesButton_actionPerformed(); } }); tetrisButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { tetrisButton_actionPerformed(e); } }); logoutButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { logoutButton_actionPerformed(e); } }); quitButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(ActionEvent e) { quitButton_actionPerformed(e); } }); jPanel1.add(publicationButton, null); jPanel1.add(sourcesButton, null); jPanel1.add(tetrisButton, null); this.getContentPane().add(jPanel2, BorderLayout.EAST); jPanel2.add(usrlabel, null); jPanel2.add(logoutButton, null); jPanel2.add(quitButton, null); menuBar.add(fileMenu); menuBar.add(editMenu); menuBar.add(helpMenu); editMenu.add(prefsMenuItem); fileMenu.add(listerMenuItem); fileMenu.add(sourcesMenuItem); fileMenu.add(tetrisMenuItem); fileMenu.add(logoutMenuItem); fileMenu.add(quitMenuItem); helpMenu.add(reportBugAction); this.setJMenuBar(menuBar); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { conditionalExit(); } }); this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); } /** * Load preferences from server and apply them. */ protected void loadPrefs() { LoggerFactory.getLogger(getClass()).debug("Loading preferences"); try { prefs = LoginContext.server.getPreferences(PREF_DOMAIN, LoginContext.sessionKey); } catch (Exception e) { log.warn("Exception getting preferences for domain {}", PREF_DOMAIN, e); prefs = new Properties(); } String locale = prefs.getProperty(PREF_LOCALE); if (locale == null) { locale = "no_NO"; prefs.put(PREF_LOCALE, locale); } setLocale(locale); String theme = prefs.getProperty(PREF_THEME); if (theme == null) { theme = "system"; prefs.put(PREF_THEME, theme); } setTheme(theme); } protected void setLocale(String locale) { if (locale.equals("no_NO")) { Locale.setDefault(new Locale("no", "NO")); } else if (locale.equals("no_NO_NY")) { Locale.setDefault(new Locale("no", "NO", "NY")); } else if (locale.equals("en")) { Locale.setDefault(new Locale("en", "GB")); } else if (locale.equals("le")) { Locale.setDefault(new Locale("le","XX")); } else { throw new IllegalArgumentException("'" + locale + "' is not a supported locale"); } // TODO make resourcebundle read as utf-8 http://pegadi.underdusken.no/ticket/4 str = ResourceBundle.getBundle("org.pegadi.client.ClientStrings"); listerButton.setText(str.getString("lister_button")); listerButton.setToolTipText(str.getString("tip_lister_button")); listerButton.setMnemonic(str.getString("lister_button").charAt(0)); publicationButton.setText(str.getString("publication_button")); publicationButton.setToolTipText(str .getString("tip_publication_button")); sourcesButton.setText(str.getString("sources_button")); sourcesButton.setToolTipText(str.getString("tip_sources_button")); sourcesButton.setMnemonic(str.getString("sources_button").charAt(0)); tetrisButton.setText(str.getString("tetris_button")); tetrisButton.setToolTipText(str.getString("tip_tetris_button")); tetrisButton.setMnemonic(str.getString("tetris_button").charAt(0)); logoutButton.setText(str.getString("logout_button")); logoutButton.setToolTipText(str.getString("tip_logout_button")); quitButton.setText(str.getString("quit_button")); quitButton.setToolTipText(str.getString("tip_quit_button")); fileMenu.setMnemonic(str.getString("menu_program_mnem").charAt(0)); fileMenu.setText(str.getString("menu_program")); editMenu.setMnemonic(str.getString("menu_edit_mnem").charAt(0)); editMenu.setText(str.getString("menu_edit")); helpMenu.setMnemonic(str.getString("menu_help_mnem").charAt(0)); helpMenu.setText(str.getString("menu_help")); prefsMenuItem.setText(str.getString("menu_edit_pref")); prefsMenuItem.setMnemonic(str.getString("menu_edit_pref_mnem") .charAt(0)); logoutMenuItem.setText(str.getString("menu_program_logout")); logoutMenuItem.setMnemonic(str.getString("menu_program_logout_mnem") .charAt(0)); quitMenuItem.setMnemonic(str.getString("menu_program_quit_mnem") .charAt(0)); quitMenuItem.setText(str.getString("menu_program_quit")); listerMenuItem.setText(str.getString("lister_button")); listerMenuItem.setMnemonic(str.getString("lister_button").charAt(0)); tetrisMenuItem.setText(str.getString("tetris_button")); tetrisMenuItem.setMnemonic(str.getString("tetris_button").charAt(0)); sourcesMenuItem.setText(str.getString("sources_button")); sourcesMenuItem.setMnemonic(str.getString("sources_button").charAt(0)); reportBugAction.putValue(AbstractAction.NAME, str .getString("menu_help_report")); if (LoginContext.server != null) { try { setLoggedinUserLabel(); } catch (Exception le) { log.error("Error getting real user name", le); } } } private void setLoggedinUserLabel() throws NoAccessException { String name = LoginContext.server.getUser( LoginContext.server.getUserID(LoginContext.sessionKey), LoginContext.sessionKey).getName(); String userLabelText = String.format("%s : %s", str.getString("isLoggedOn"), name); usrlabel.setText(userLabelText); } protected void setTheme(String theme) { //TODO: fix nullpointerexception log.debug("theme: {}", theme); String lfTheme; if (theme.equalsIgnoreCase("system")) { lfTheme = UIManager.getSystemLookAndFeelClassName(); } else if (theme.equalsIgnoreCase("swing")) { lfTheme = UIManager.getCrossPlatformLookAndFeelClassName(); lfTheme = UIManager.getSystemLookAndFeelClassName(); } else if (theme.equalsIgnoreCase("gtk")) { lfTheme = "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"; //DEBUG lfTheme = UIManager.getSystemLookAndFeelClassName(); } else { log.error("Invalid L&F theme"); throw new IllegalArgumentException("'"+ theme + "' is not a supported L&F"); } if (!lfTheme.equals(UIManager.getLookAndFeel().getName())) { try { UIManager.setLookAndFeel(lfTheme); } catch (Exception e) { log.warn("Unable to set selected L&F, swapping to a default L&F"); UIManager.LookAndFeelInfo[] installedLF = UIManager.getInstalledLookAndFeels(); try { UIManager.setLookAndFeel(installedLF[0].getClassName()); } catch (Exception e2) { log.error("Unable to load any L&F, exiting", e2); System.exit(-1); } } try { log.debug("attempting to update componenttreeui"); SwingUtilities.updateComponentTreeUI(this.getContentPane()); } catch (Exception swe) { log.error("Unable to update component tree", swe); } } pack(); //Might be the cause of occasional NullpointEx due to system //not being able to locate LookAndFeel } void sourcesButton_actionPerformed() { if (sources == null) { sources = new Sources(); } sources.setLocationRelativeTo(this); sources.setVisible(true); } void listerButton_actionPerformed(ActionEvent e) { if (lis == null) { this.setCursor(new Cursor(Cursor.WAIT_CURSOR)); lis = new Lister(); lis.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { lis = null; } public void windowClosed(WindowEvent e) { lis = null; } }); // Set a reasonable size and center the window Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); int x = Math.min(((size.width / 5) * 4), 810); int y = Math.min(((size.height / 5) * 4), 600); lis.setSize(x, y); lis.setLocation((size.width - x) / 2, (size.height - y) / 2); this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); lis.setLocationRelativeTo(this); } lis.setVisible(true); } void publicationButton_actionPerformed(ActionEvent e) { if (pub == null) { this.setCursor(new Cursor(Cursor.WAIT_CURSOR)); pub = new PublicationControl(); pub.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { pub = null; } public void windowClosed(WindowEvent e) { pub = null; } }); pub.pack(); this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); pub.setLocationRelativeTo(this); } pub.setVisible(true); } void tetrisButton_actionPerformed(ActionEvent e) { if (tet == null) { this.setCursor(new Cursor(Cursor.WAIT_CURSOR)); tet = new Tetris(); tet.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { tet = null; } public void windowClosed(WindowEvent e) { tet = null; } }); tet.setSize(750, 550); tet.setLocationRelativeTo(this); this.setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); } tet.setVisible(true); } void logoutButton_actionPerformed(ActionEvent e) { relogin(); } void quitButton_actionPerformed(ActionEvent e) { conditionalExit(); } /** * Logs out the current user, and redies the system for a new user. */ protected void relogin() { if (lis != null || pub != null || tet != null) { boolean choice = displayWarning(); if (choice) { if (lis != null) { lis.closeAllArtis(); lis.dispose(); lis = null; } if (pub != null) { pub.dispose(); pub = null; } if (tet != null) { tet.dispose(); tet = null; } try { LoginContext.server.logout(LoginContext.sessionKey); } catch (Exception exc) { log.error("Error logging out!", exc); } listerButton.setEnabled(false); tetrisButton.setEnabled(false); publicationButton.setEnabled(false); this.login(); }// end choice-if } else { try { LoginContext.server.logout(LoginContext.sessionKey); } catch (Exception exc) { log.error("Error logging out!", exc); } this.hide(); listerButton.setEnabled(false); tetrisButton.setEnabled(false); publicationButton.setEnabled(false); this.login(); } } /** * Needs to be set public so that it can be called by OSX application * events. */ public void conditionalExit() { if (lis != null || pub != null || tet != null) { boolean chump = displayWarning(); if (chump) { if (lis != null) lis.closeAllArtis(); dispose(); } else { // Cancel exit return; } } // Exit confirmed, log user out try { if (LoginContext.sessionKey != null) { LoginContext.server.logout(LoginContext.sessionKey); } } catch (Exception e) { log.error("Exception when logging out in preparation for exit.", e); } System.exit(0); } protected void login() { usrlabel.setText(""); //LoginDialog loginDialog = new LoginDialog(this); String user = null; String pass = null; LoginContext.sessionKey = null; this.requestFocus(); try { do { loginDialog.pack(); loginDialog.requestFocus(); Dimension screen = Toolkit.getDefaultToolkit().getScreenSize(); Dimension dialog = loginDialog.getSize(); loginDialog.setLocation((screen.width - dialog.width) / 2, (screen.height - dialog.height) / 2); loginDialog.setVisible(true); user = loginDialog.getUserName(); pass = loginDialog.getPassword(); loginDialog.deletePassword(); LoginContext.server = loginDialog.getServer(); log.info("Trying to log in..."); LoginContext.sessionKey = LoginContext.server.login(user, pass); log.info("Got sessionkey {}", LoginContext.sessionKey); } while (LoginContext.sessionKey == null); loginDialog.loginSuccessful(); } catch (Exception ce) { JOptionPane.showMessageDialog(this, str .getString("server_down_text"), str .getString("server_down_title"), JOptionPane.WARNING_MESSAGE); log.error("Cannot connect to server", ce); System.exit(-1); } boolean isGod = false; try { log.debug("Checking isGod?"); isGod = LoginContext.server.hasGlobalPermission(LoginContext.server .getUserID(LoginContext.sessionKey), GlobalPermissions.LEGACY_IS_GOD, LoginContext.sessionKey); log.debug("Is God? {}", isGod); } catch (Exception e) { log.error("error checking users privileges", e); } // running developer mode? isGod |= "true".equals(System.getProperty("developerMode")); listerButton.setEnabled(true); if (isGod) { publicationButton.setEnabled(true); } else { publicationButton.setEnabled(false); } tetrisButton.setEnabled(true); try { setLoggedinUserLabel(); } catch (Exception le) { log.error("Error getting real name for user", le); } this.setVisible(true); loadPrefs(); String url = null; try { url = LoginContext.server.getWebBase(LoginContext.sessionKey); } catch (Exception e) { log.error("Error getting webbase", e); } log.info("Webxml is: " + url); webLogin(url, user, pass); try { GetMethod get = new GetMethod(url + "/protected/"); LoginContext.httpClient.executeMethod(get); log.info("HTTP Status for /protected is: " + get.getStatusCode()); } catch (Exception e) { log.error("Error loggin in on web", e); } } public boolean webLogin(String url, String user, String pass) { log.info("Weblogin with url {}", url); PostMethod post = new PostMethod(url + "j_security_check"); post.addParameter(new NameValuePair("j_username", user)); post.addParameter(new NameValuePair("j_password", pass)); try { LoginContext.httpClient.executeMethod(post); } catch (IOException e) { log.error("Error executing method for weblogin", e); return false; } return true; } protected boolean displayWarning() { // JOptionPane warning = new JoptionPane(); int warning = JOptionPane.showConfirmDialog(this, str .getString("want_to_exit"), str .getString("running_applications"), JOptionPane.YES_NO_OPTION, JOptionPane.ERROR_MESSAGE); if (warning == JOptionPane.YES_OPTION) { return true; } else { log.info("logout/quit cancelled by user"); return false; }// end if } void logoutMenuItem_actionPerformed(ActionEvent e) { relogin(); } void quitMenuItem_actionPerformed(ActionEvent e) { conditionalExit(); } void prefsMenuItem_actionPerformed(ActionEvent e) { PreferencesDialog d = new PreferencesDialog(this, prefs); d.setLocationRelativeTo(this); d.setVisible(true); if (d.okResult()) { Properties changed = d.getChangedPreferences(); Enumeration en = changed.keys(); while (en.hasMoreElements()) { String pkey = en.nextElement().toString(); String pvalue = changed.getProperty(pkey); prefs.put(pkey, pvalue); try { LoginContext.server.savePreference(PREF_DOMAIN, pkey, pvalue, LoginContext.sessionKey); } catch (Exception ex) { log.error("Can't save preference '{}' with value '{}'", new Object[]{pkey, pvalue, ex}); } if (pkey.equals(PREF_LOCALE)) { setLocale(pvalue); pack(); } else if (pkey.equals(PREF_THEME)) { setTheme(pvalue); } } } } public void reportBug_actionPerformed(ActionEvent e) { String[] replaceWith = new String[12]; try { Person u = LoginContext.server .getSessionUser(LoginContext.sessionKey); replaceWith[0] = u.getName(); replaceWith[1] = u.getEmailAddress(); } catch (java.rmi.RemoteException re) { log.error("Could not get user data from server"); } try { replaceWith[2] = java.net.InetAddress.getLocalHost().getHostName(); replaceWith[3] = java.net.InetAddress.getLocalHost() .getHostAddress(); } catch (java.net.UnknownHostException uhe) { log.error("Could not get local hostname", uhe); replaceWith[2] = "Unknown host"; replaceWith[3] = "Unknown host address"; } catch (java.lang.SecurityException se) { log.error("Could not connect to server", se); replaceWith[2] = "Unknown host"; replaceWith[3] = "Unknown host address"; } Properties p; try { p = System.getProperties(); } catch (SecurityException se) { p = null; } if (p == null) { for (int i = 4; i <= 9; i++) replaceWith[i] = "Not disclosed"; } else { replaceWith[4] = p.getProperty("os.name"); replaceWith[5] = p.getProperty("os.arch"); replaceWith[6] = p.getProperty("os.version"); replaceWith[7] = p.getProperty("java.vm.name"); replaceWith[8] = p.getProperty("java.vm.vendor"); replaceWith[9] = p.getProperty("java.vm.version"); replaceWith[10] = ApplicationLauncher.getVersion(); } replaceWith[11] = getLog(); String url; try { url = LoginContext.server.getWebXMLRoot(LoginContext.sessionKey); url += "/templates/bugreport.template"; } catch (java.rmi.RemoteException re) { log.error("Error getting webxmlroot", re); return; } MailDialog dialog = new MailDialog(this, "", false); dialog.loadTemplate(url, replaceWith); dialog.setFromFieldEditable(false); dialog.setToFieldEditable(false); dialog.setTitle(str.getString("menu_help_report")); dialog.pack(); dialog.setLocationRelativeTo(this); dialog.setVisible(true); } private String getLog() { if(logFile == null) { log.error("No log file set"); return "" ; } try { return IOUtils.toString(new FileReader(logFile)); } catch(IOException e) { log.error("Failed reading log file"); return "No log file"; } } /** * @param loginDialog The loginDialog to set. */ public void setLoginDialog(LoginDialog loginDialog) { this.loginDialog = loginDialog; } public static String getVersion() { return version; } public void setLogFile(File logFile) { this.logFile = logFile; } }