/* * $Id: OpenBrowserAction.java,v 1.4 2008/12/05 14:34:56 kschaefe Exp $ * * Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle, * Santa Clara, California 95054, U.S.A. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ package org.jdesktop.swingx.action; import java.awt.event.ActionEvent; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.util.logging.Logger; import javax.swing.AbstractAction; import javax.swing.Action; /** * * @author joshy */ public class OpenBrowserAction extends AbstractAction { private static Logger log = Logger.getLogger(OpenBrowserAction.class.getName()); private URL url; /** Creates a new instance of OpenBrowserAction */ public OpenBrowserAction() { } public OpenBrowserAction(String url) throws MalformedURLException { this.setUrl(new URL(url)); } public OpenBrowserAction(URL url) { this.setUrl(url); } public URL getUrl() { return url; } public void setUrl(URL url) { this.url = url; } /* code to actuall open the browser on all platforms */ private static final String osName = System.getProperty("os.name" ).toLowerCase(); private static final boolean linux = osName.startsWith("linux"); private static final boolean macosx = osName.startsWith("mac os x"); private static final boolean win95 = osName.equals("windows 95"); private static final boolean winAny = osName.startsWith("windows"); private static final boolean DEBUG = true; public void actionPerformed(ActionEvent e) { try { if(isApplet()) { log.fine("trying applet version"); openApplet(url); log.fine("succeeded applet version"); } else if(isWebStart()) { log.fine("trying applet version"); openWebstart(url); log.fine("succeeded applet version"); } else if (macosx) { log.fine("trying Mac OS X version"); openMacOSX(url); log.fine("succeeded mac os x version"); } else if (linux) { log.fine("trying linux version"); openLinux(url); log.fine("succeeded linux version"); } else if (win95) { log.fine("trying win95 version"); openWin95(url); log.fine("succeeded win95 version"); } else if (winAny) { log.fine("trying windows any version"); openWindows(url); log.fine("succeeded windows any version"); } else { log.fine("trying other version"); openOther(url); log.fine("succeeded other version"); } } catch (Throwable thr) { handleError(thr); } } protected void handleError(Throwable thr) { System.err.println(thr.getMessage()); thr.printStackTrace(System.err); } private static void openMacOSX(URL url) throws IOException { try { log.fine("trying mac version using FileManager class"); // Mac OS X can handle file types itself (thank goodness!) Class<?> fileMgr = Class.forName("com.apple.eio.FileManager"); Method openURL = fileMgr.getDeclaredMethod("openURL", new Class[] {String.class}); openURL.invoke(null, new Object[] {url.toString()}); } catch (Throwable thr) { log .fine("trying 'open' command version"); thr.printStackTrace(); // if that fails for some reason, try the 'open' commandline command Runtime.getRuntime().exec(new String[] {"open", url.toString()}); } } private void openLinux(URL url) throws IOException, InterruptedException, Exception { try { // try the xdg service first. part of free desktop? Runtime.getRuntime().exec(new String[] {"./xdg-open", url.toString()}); } catch (Throwable thr) { // if xdg fails // look for one of the browsers String[] browsers = { // list of html browsers "firefox", "opera", "konqueror", "epiphany", "mozilla", "netscape" }; String browser = null; for (int count = 0; count < browsers.length && browser == null; count++) { if (Runtime.getRuntime().exec( new String[] {"which", browsers[count]}).waitFor() == 0) { browser = browsers[count]; } } if (browser == null) { // got no browser, bummer throw new Exception("Could not find web browser"); } else {// got a browser, run it Runtime.getRuntime().exec(new String[] {browser, url.toString()}); } } } private void openWin95(URL url) throws IOException { Runtime.getRuntime().exec(new String[] {"command.com", "/C", "start", url.toString()}); } private void openWindows(URL url) throws IOException { Runtime.getRuntime().exec(new String[] {"cmd.exe", "/C", "start", url.toString()}); } private void openOther(URL url) throws IOException { Runtime.getRuntime().exec(new String[] {"open", url.toString()}); } private boolean isWebStart() { try { Class<?> svcManager = Class.forName("jnlp.ServiceManager"); Method lookup = svcManager.getDeclaredMethod("lookup", new Class[] {String.class}); lookup.invoke(null, new Object[] {"jnlp.BasicService"}); return true; } catch (Throwable thr) { return false; } } private void openWebstart(URL url) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { Class<?> svcManager = Class.forName("javax.jnlp.ServiceManager"); Method lookup = svcManager.getDeclaredMethod("lookup", new Class[] {String.class}); Object basicSvcInst = lookup.invoke(null, new Object[] {"javax.jnlp.BasicService"}); Class<?> basicSvc = Class.forName("javax.jnlp.BasicService"); Method showDocument = basicSvc.getDeclaredMethod("showDocument", new Class[] {URL.class}); showDocument.invoke(basicSvcInst, new Object[] {url}); } private boolean isApplet() { return false; } private void openApplet(URL url) { throw new UnsupportedOperationException("Not yet implemented"); } public static void main(String ... args) throws MalformedURLException { //System.out.println("trying to open a URL on the current platform"); Action action = new OpenBrowserAction("http://sun.com/"); action.actionPerformed(null); } }