/**
* Copyright (c) 2009 - 2010 AppWork UG(haftungsbeschränkt) <e-mail@appwork.org>
*
* This file is part of org.appwork.utils.os
*
* This software is licensed under the Artistic License 2.0,
* see the LICENSE file or http://www.opensource.org/licenses/artistic-license-2.0.php
* for details
*/
package org.appwork.utils.os;
import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.logging.Level;
import javax.swing.filechooser.FileFilter;
import org.appwork.storage.JSonStorage;
import org.appwork.storage.StorageException;
import org.appwork.utils.locale.APPWORKUTILS;
import org.appwork.utils.logging.Log;
import org.appwork.utils.os.mime.Mime;
import org.appwork.utils.os.mime.MimeDefault;
import org.appwork.utils.os.mime.MimeLinux;
import org.appwork.utils.os.mime.MimeWindows;
import org.appwork.utils.swing.dialog.Dialog;
import org.appwork.utils.swing.dialog.DialogCanceledException;
import org.appwork.utils.swing.dialog.DialogClosedException;
import org.appwork.utils.swing.dialog.DialogNoAnswerException;
/**
* This class provides a few native features.
*
* @author $Author: unknown$
*/
public class CrossSystem {
public static final byte OS_LINUX_OTHER = 6;
public static final byte OS_MAC_OTHER = 5;
public static final byte OS_WINDOWS_OTHER = 4;
public static final byte OS_WINDOWS_NT = 3;
public static final byte OS_WINDOWS_2000 = 2;
public static final byte OS_WINDOWS_XP = 0;
public static final byte OS_WINDOWS_2003 = 7;
public static final byte OS_WINDOWS_VISTA = 1;
public static final byte OS_WINDOWS_7 = 8;
public static final byte OS_WINDOWS_SERVER_2008 = 9;
/**
* Cache to store the OS string in
*/
private final static String OS_STRING;
/**
* Cache to store the OS ID in
*/
private final static byte OS_ID;
/**
* Cache to store the Mime Class in
*/
private static final Mime MIME;
static {
OS_STRING = System.getProperty("os.name");
final String OS = CrossSystem.OS_STRING.toLowerCase();
if (OS.contains("windows 7")) {
OS_ID = CrossSystem.OS_WINDOWS_7;
} else if (OS.contains("windows xp")) {
OS_ID = CrossSystem.OS_WINDOWS_XP;
} else if (OS.contains("windows vista")) {
OS_ID = CrossSystem.OS_WINDOWS_VISTA;
} else if (OS.contains("windows 2000")) {
OS_ID = CrossSystem.OS_WINDOWS_2000;
} else if (OS.contains("windows 2003")) {
OS_ID = CrossSystem.OS_WINDOWS_2003;
} else if (OS.contains("windows server 2008")) {
OS_ID = CrossSystem.OS_WINDOWS_SERVER_2008;
} else if (OS.contains("nt")) {
OS_ID = CrossSystem.OS_WINDOWS_NT;
} else if (OS.contains("windows")) {
OS_ID = CrossSystem.OS_WINDOWS_OTHER;
} else if (OS.contains("mac")) {
OS_ID = CrossSystem.OS_MAC_OTHER;
} else {
OS_ID = CrossSystem.OS_LINUX_OTHER;
}
if (CrossSystem.isWindows()) {
MIME = new MimeWindows();
} else if (CrossSystem.isLinux()) {
MIME = new MimeLinux();
} else {
MIME = new MimeDefault();
}
}
/**
* internal function to open a file/folder
*
* @param file
* @throws IOException
*/
private static void _openFILE(final File file) throws IOException {
if (CrossSystem.isWindows()) {
// workaround for windows
// see http://bugs.sun.com/view_bug.do?bug_id=6599987
Runtime.getRuntime().exec(new String[] { "rundll32.exe", "url.dll,FileProtocolHandler", file.getAbsolutePath() });
} else {
final Desktop desktop = Desktop.getDesktop();
final URI uri = file.getCanonicalFile().toURI();
desktop.open(new File(uri));
}
}
/**
* internal function to open an URL in a browser
*
* @param _url
* @throws IOException
* @throws URISyntaxException
*/
private static void _openURL(final String _url) throws IOException, URISyntaxException {
final URL url = new URL(_url);
if (CrossSystem.isWindows()) {
Runtime.getRuntime().exec(new String[] { "rundll32.exe", "url.dll,FileProtocolHandler", _url });
} else {
final Desktop desktop = Desktop.getDesktop();
desktop.browse(url.toURI());
}
}
public static String[] getEditor(final String extension) throws DialogCanceledException, DialogClosedException, StorageException {
final File[] ret = Dialog.getInstance().showFileChooser("FILE_EDIT_CONTROLLER_" + extension, APPWORKUTILS.T.fileditcontroller_geteditor_for(extension), Dialog.FileChooserSelectionMode.FILES_ONLY, new FileFilter() {
@Override
public boolean accept(final File f) {
if (f.isDirectory()) { return true; }
if (CrossSystem.isWindows()) {
return f.getName().endsWith(".exe");
} else {
return f.canExecute();
}
}
@Override
public String getDescription() {
return APPWORKUTILS.T.fileeditcontroller_exechooser_description(extension);
}
}, false, Dialog.FileChooserType.OPEN_DIALOG_WITH_PRESELECTION, new File(JSonStorage.getPlainStorage("EDITORS").get(extension, "")));
if (ret != null && ret.length > 0) {
JSonStorage.getPlainStorage("EDITORS").put(extension, ret[0].toString());
return new String[] { ret[0].toString() };
} else {
return null;
}
}
public static byte getID() {
return CrossSystem.OS_ID;
}
/**
* Returns the Mime Class for the current OS
*
* @return
* @see Mime
*/
public static Mime getMime() {
return CrossSystem.MIME;
}
public static String getOSString() {
return CrossSystem.OS_STRING;
}
/**
* Returns true if the OS is a linux system
*
* @return
*/
public static boolean isLinux() {
return CrossSystem.OS_ID == CrossSystem.OS_LINUX_OTHER;
}
/**
* Returns true if the OS is a MAC System
*
* @return
*/
public static boolean isMac() {
return CrossSystem.OS_ID == CrossSystem.OS_MAC_OTHER;
}
/**
* returns true in case of "open an URL in a browser" is supported
*
* @return
*/
public static boolean isOpenBrowserSupported() {
if (CrossSystem.isWindows()) { return true; }
try {
if (!Desktop.isDesktopSupported()) { return false; }
final Desktop desktop = Desktop.getDesktop();
if (!desktop.isSupported(Desktop.Action.BROWSE)) { return false; }
return true;
} catch (final Throwable e) {
Log.exception(Level.WARNING, e);
}
return false;
}
/**
* returns true in case of "open a File" is supported
*
* @return
*/
public static boolean isOpenFileSupported() {
if (CrossSystem.isWindows()) { return true; }
try {
if (!Desktop.isDesktopSupported()) { return false; }
final Desktop desktop = Desktop.getDesktop();
if (!desktop.isSupported(Desktop.Action.OPEN)) { return false; }
return true;
} catch (final Throwable e) {
Log.exception(Level.WARNING, e);
}
return false;
}
/**
* Returns true if the OS is a Windows System
*
* @return
*/
public static boolean isWindows() {
switch (CrossSystem.OS_ID) {
case OS_WINDOWS_XP:
case OS_WINDOWS_VISTA:
case OS_WINDOWS_2000:
case OS_WINDOWS_2003:
case OS_WINDOWS_NT:
case OS_WINDOWS_OTHER:
case OS_WINDOWS_7:
return true;
}
return false;
}
/**
* Opens a file or directory
*
* @see java.awt.Desktop#open(File)
* @param file
*/
public static void openFile(final File file) {
try {
CrossSystem._openFILE(file);
} catch (final Throwable e) {
Log.exception(Level.WARNING, e);
}
}
/**
* Open an url in the systems default browser
*
* @param url
*/
public static void openURL(final String url) {
try {
CrossSystem._openURL(url);
} catch (final Throwable e) {
Log.exception(Level.WARNING, e);
}
}
public static void openURL(final URL url) {
CrossSystem.openURL(url.toString());
}
/**
* @param update_dialog_news_button_url
*/
public static void openURLOrShowMessage(final String urlString) {
try {
CrossSystem._openURL(urlString);
} catch (final Throwable e) {
Log.exception(Level.WARNING, e);
try {
Dialog.getInstance().showInputDialog(Dialog.BUTTONS_HIDE_CANCEL, APPWORKUTILS.T.crossSystem_open_url_failed_msg(), urlString);
} catch (final DialogNoAnswerException donothing) {
}
}
}
}