/******************************************************************************* * Copyright (c) MOBAC developers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package mobac.utilities; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FilenameFilter; import java.util.regex.Pattern; import javax.naming.NameNotFoundException; import javax.swing.JOptionPane; import org.apache.log4j.Logger; public class OSUtilities { static Logger log = Logger.getLogger(OSUtilities.class); public enum OperatingSystem { Windows, Linux, MacOs, MacOsX, Solaris, Unknown }; public enum DesktopType { Windows, Gnome, Kde, Unknown { @Override public String toString() { return super.toString() + " (" + System.getProperty("sun.desktop") + ")"; } } }; public static OperatingSystem detectOs() { String osName = System.getProperty("os.name").toLowerCase(); if (osName.indexOf("windows") > -1) return OperatingSystem.Windows; if (osName.indexOf("linux") > -1) return OperatingSystem.Linux; if (osName.indexOf("mac os x") > -1) return OperatingSystem.MacOsX; if (osName.indexOf("mac os") > -1) return OperatingSystem.MacOs; if (osName.indexOf("sunos") > -1) return OperatingSystem.Solaris; return OperatingSystem.Unknown; } public static DesktopType detectDesktopType() { String desktopName = System.getProperty("sun.desktop"); if (desktopName == null) return DesktopType.Unknown; desktopName = desktopName.toLowerCase().trim(); if (desktopName.startsWith("windows")) return DesktopType.Windows; if (desktopName.startsWith("gnome")) return DesktopType.Gnome; if (desktopName.startsWith("kde")) return DesktopType.Kde; log.error("Unknown desktop type: " + desktopName); return DesktopType.Unknown; } public static void openFolderBrowser(File directory) throws NameNotFoundException { if (!directory.isDirectory()) throw new NameNotFoundException("Directory does not exist or is not a directory"); String[] strCmd = null; try { String dirPath = directory.getCanonicalPath(); DesktopType dt = detectDesktopType(); switch (dt) { case Windows: strCmd = new String[] { "rundll32.exe", "url.dll,FileProtocolHandler", "\"" + dirPath + "\"" }; break; case Gnome: strCmd = new String[] { "nautilus", dirPath }; break; case Kde: strCmd = new String[] { "konqueror", dirPath }; break; default: OperatingSystem os = detectOs(); switch (os) { case MacOsX: strCmd = new String[] { "/usr/bin/open", dirPath }; break; case Linux: strCmd = new String[] { "/usr/bin/xdg-open", dirPath }; break; default: JOptionPane.showMessageDialog(null, String.format(I18nUtils.localizedStringForKey("msg_environment_not_support"), dt, os), I18nUtils.localizedStringForKey("msg_environment_not_support_title"), JOptionPane.ERROR_MESSAGE); return; } } for (String s : strCmd) log.trace("exec/params: " + s); Runtime.getRuntime().exec(strCmd); } catch (Exception e) { StringBuilder sb = new StringBuilder(512); sb.append(I18nUtils.localizedStringForKey("msg_environment_failed_open_output")); sb.append(e.getMessage()); sb.append(String.format(I18nUtils.localizedStringForKey("msg_environment_use_commond"), strCmd[0])); for (int i = 1; i < strCmd.length; i++) { sb.append(String.format(I18nUtils.localizedStringForKey("msg_environment_commond_param"), i, strCmd[i])); } sb.append("</html>"); String msg = sb.toString(); JOptionPane.showMessageDialog(null, msg, I18nUtils.localizedStringForKey("msg_environment_failed_open_output_title"), JOptionPane.ERROR_MESSAGE); log.error(msg, e); } } /** * Reads the Linux distribution name (last line) from the first file that matches the pattern * * <pre> * /etc/*-release * </pre> * * @return Linux distrbution name or <code>null</code> */ public static String getLinuxDistributionName() { try { File etcDir = new File("/etc"); if (!etcDir.exists()) return null; File[] files = etcDir.listFiles(new FilenameFilter() { Pattern pattern = Pattern.compile(".*-release"); public boolean accept(File dir, String name) { return pattern.matcher(name).matches(); } }); if (files.length == 0) return null; BufferedReader br = new BufferedReader(new FileReader(files[0])); String result = null; String line = null; line = br.readLine(); while (line != null) { result = line; line = br.readLine(); } br.close(); if (result != null) { int index = result.indexOf('='); if (index > 0) result = result.substring(index + 1); if (result.startsWith("\"") && result.endsWith("\"")) result = result.substring(1, result.length() - 2); } return result; } catch (Exception e) { log.trace("", e); return null; } } /** * Replies true if we are currently running on OSX * * @return true if we are currently running on OSX */ public static boolean isPlatformOsx() { String os = System.getProperty("os.name"); return os != null && os.toLowerCase().startsWith("mac os x"); } }