//----------------------------------------------------------------------------//
// //
// W e b B r o w s e r //
// //
//----------------------------------------------------------------------------//
// <editor-fold defaultstate="collapsed" desc="hdr"> //
// Copyright (C) Brenton Partridge 2007. All rights reserved. //
// This software is released under the GNU General Public License. //
// Goto http://kenai.com/projects/audiveris to report bugs or suggestions. //
//----------------------------------------------------------------------------//
// </editor-fold>
package omr.ui.util;
import omr.WellKnowns;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.awt.Desktop;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URI;
/**
* Class {@code WebBrowser} gathers functionality to
* browse a webpage in an external web browser. Uses
* reflection for compatibility with Java 5 and Mac OS X.
*
* <p>Nota: Since using Desktop.browse() on a file under Windows crashes JVM 6,
* this feature is currently delegated to an external and free utility named
* BareBonesBrowserLaunch, written by Dem Pilafian.
* See its web site on http://www.centerkey.com/java/browser/
*
* @author Brenton Partridge
* @author Hervé Bitteur (for delegation to BareBonesBrowserLaunch)
*
*/
public class WebBrowser
{
//~ Static fields/initializers ---------------------------------------------
/** Usual logger utility */
private static final Logger logger = LoggerFactory.getLogger(WebBrowser.class);
/** Major browsers. */
private static final String[] browsers = {
"firefox", "opera", "konqueror", "epiphany", "mozilla", "netscape"
};
/** Singleton instance, initially null. */
private static WebBrowser instance;
//~ Constructors -----------------------------------------------------------
//
//------------//
// WebBrowser //
//------------//
private WebBrowser ()
{
}
//~ Methods ----------------------------------------------------------------
//------------//
// getBrowser //
//------------//
/**
* Get the singleton WebBrowser implementation.
*
* @return a WebBrowser implementation, not null
* in normal operation
*/
public static synchronized WebBrowser getBrowser ()
{
if (instance == null) {
instance = setupBrowser();
}
return instance;
}
//-------------//
// isSupported //
//-------------//
/**
* Checks if web browsing is supported by this implementation.
*
* @return false
*/
public boolean isSupported ()
{
return false;
}
//--------//
// launch //
//--------//
/**
* Launches a web browser to browse a site.
*
* @param uri URI the browser should open.
*/
public void launch (URI uri)
{
String osName = System.getProperty("os.name");
if (true) {
logger.info(
"Desktop.browse {} with {} on {}", uri, this, osName);
try {
Desktop desktop = Desktop.getDesktop();
desktop.browse(uri);
} catch (IOException ex) {
logger.warn("Could not launch browser " + uri, ex);
}
} else {
// Delegate to BareBonesBrowserLaunch-like code
logger.info("openURL {} with {} on {}", uri, this, osName);
openURL(uri.toString());
}
}
//----------//
// toString //
//----------//
@Override
public String toString ()
{
return "WebBrowser(unimplemented fallback)";
}
//---------//
// openURL //
//---------//
/**
* Workaround copied from BareBonesBrowserLaunch.
*
* @param url
*/
private static void openURL (String url)
{
try {
if (WellKnowns.MAC_OS_X) {
Class fileMgr = Class.forName("com.apple.eio.FileManager");
Method openURL = fileMgr.getDeclaredMethod(
"openURL",
new Class[]{String.class});
openURL.invoke(null, new Object[]{url});
} else if (WellKnowns.WINDOWS) {
Runtime.getRuntime()
.exec("rundll32 url.dll,FileProtocolHandler " + url);
} else { //assume Unix or Linux
for (String browser : browsers) {
if (Runtime.getRuntime()
.exec(new String[]{"which", browser})
.waitFor() == 0) {
Runtime.getRuntime()
.exec(new String[]{browser, url});
return;
}
}
logger.warn("Could not find any suitable web browser");
}
} catch (ClassNotFoundException | NoSuchMethodException |
SecurityException | IllegalAccessException |
IllegalArgumentException | InvocationTargetException |
IOException | InterruptedException ex) {
logger.warn("Could not launch browser", ex);
}
}
//--------------//
// setupBrowser //
//--------------//
@SuppressWarnings("unchecked")
private static WebBrowser setupBrowser ()
{
//First, try java.awt.Desktop
try {
final Class<?> desktopClass = Class.forName("java.awt.Desktop");
return new WebBrowser()
{
@Override
public boolean isSupported ()
{
try {
Method supported = desktopClass.getMethod(
"isDesktopSupported");
return (Boolean) supported.invoke(null);
} catch (Exception e) {
return false;
}
}
@Override
public String toString ()
{
return "WebBrowser(java.awt.Desktop)";
}
};
} catch (Exception e) {
logger.debug("java.awt.Desktop unsupported or error initializing");
}
//If it's not supported, see if we have the Mac FileManager
if (WellKnowns.MAC_OS_X) {
try {
final Class<?> fileMgr = Class.forName(
"com.apple.eio.FileManager");
return new WebBrowser()
{
@Override
public boolean isSupported ()
{
return true;
}
@Override
public String toString ()
{
return "WebBrowser(com.apple.eio.FileManager)";
}
};
} catch (Exception e) {
logger.debug("Apple EIO FileManager unsupported");
}
}
//Otherwise, return the no-op fallback
return new WebBrowser();
}
}