/* * File : BrowserLauncher.java * Created : 02-jul-2002 18:22 * Remaked: 01-Feb-2011 17:30 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Old version was taken from: Eric Albert's BrowserLauncher class (ejalbert@cs.stanford.edu) * New version from BareBonesBrowserLauncher, by Dem Pilafian enhanced by Williem van Engen * Adapted by Francesc Busquets * * @author Eric Albert (ejalbert@cs.stanford.edu) modified by Francesc Busquets (fbusquets@xtec.cat) * @version 15.11.27 */ package edu.xtec.util; import java.awt.Component; import java.awt.Desktop; import java.lang.reflect.Method; import java.net.URI; import java.net.URL; import javax.swing.JOptionPane; /** * Class to open the system's default web browser. * <p> * Since JClic uses Java 1.6, this class can make direct calls to java.awt.Desktop.browse */ public class BrowserLauncher { /** * Added by fbusquets - command that launches the user's preferred browser * */ private static String preferredBrowser; /** * Added by fbusquets - Key used to store browser settings in properties files * */ public static final String BROWSER = "browser"; private static final String errMsg = "Error attempting to launch web browser"; /** * Open a URL * * @param url {@link URL} to open * @param parent parent component for error message dialog */ public static void openURL(URL url, Component parent) { openURL(url.toExternalForm(), parent); } /** * Open a string URL * * @param surl URL to open (as String) * @param parent parent component for error message dialog */ //@SuppressWarnings("unchecked") // to support older java compilers public static void openURL(String surl, Component parent) { // Try java desktop API first (new in Java 1.6) // basically: java.awt.Desktop.getDesktop().browse(new URI(url)); // Replace whitespaces with the URL-encoded expression "%20" surl = StrUtils.replace(surl, " ", "%20"); try { Desktop dsk; if (Desktop.isDesktopSupported() && (dsk = Desktop.getDesktop()) != null) { dsk.browse(new URI(surl)); return; } } catch (Exception e) { } // Failed, resort to executing the browser manually String osName = System.getProperty("os.name"); try { // Mac OS has special Java class if (osName.startsWith("Mac OS")) { Class<?> fileMgr = Class.forName("com.apple.eio.FileManager"); Method openURL = fileMgr.getDeclaredMethod("openURL", new Class[]{String.class}); openURL.invoke(null, new Object[]{surl}); return; } String[] cmd; // Windows execs url.dll if (osName.startsWith("Windows")) { cmd = new String[]{"rundll32", "url.dll,FileProtocolHandler", surl}; // else assume unix/linux: call one of the available browsers } else { String[] browsers = { // user's Preferred browser (will be skipped if null or empty): preferredBrowser, // Freedesktop, http://portland.freedesktop.org/xdg-utils-1.0/xdg-open.html "xdg-open", // Debian "sensible-browser", // Otherwise call browsers directly "chromium", "firefox", "opera", "konqueror", "epiphany", "mozilla", "netscape"}; String browser = null; for (int count = 0; count < browsers.length && browser == null; count++) { if (browsers[count] != null && browsers[count].length() > 0 && Runtime.getRuntime().exec( new String[]{"which", browsers[count]}).waitFor() == 0) { browser = browsers[count]; } } if (browser == null) { //logger.warning("No web browser found"); throw new Exception("Could not find web browser"); } cmd = new String[]{browser, surl}; } if (Runtime.getRuntime().exec(cmd).waitFor() != 0) { throw new Exception("Error opening page: " + surl); } } catch (Exception e) { JOptionPane.showMessageDialog(parent, errMsg + ":\n" + e.getLocalizedMessage()); } } /** * Open a URL * <p> * This is equal to {@link #openURL(URL, Component) openURL(url, null)} so any error dialog will * have no parent. * * @param url {@link URL} to open */ public static void openURL(URL url) { openURL(url, null); } /** * Open a string URL * <p> * This is equal to {@link #openURL(String, Component) openURL(surl, null)} so any error dialog * will have no parent. * * @param surl URL to open (as String) */ public static void openURL(String surl) { openURL(surl, null); } /** * Added by fbusquets Sets the path to the user's perferred browser. * * @param browserCmd The path to the browser to be used by BrowserLaunched */ public static void setPreferredBrowser(String browserCmd) { preferredBrowser = StrUtils.nullableString(browserCmd); } /** * Added by fbusquets Gets the path to the user's preferred browser. * * @param defaultValue The default choice, used only if preferred browser not set. * @return The command line corresponding to the user's preferred browser */ public static String getPreferredBrowser(String defaultValue) { return StrUtils.secureString(preferredBrowser, defaultValue); } }