/* * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code 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 * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package com.sun.tools.visualvm.modules.appui; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Enumeration; import java.util.HashSet; import java.util.Locale; import java.util.Properties; import java.util.Set; import java.util.StringTokenizer; import java.util.jar.Manifest; import javax.swing.AbstractAction; import javax.swing.Action; import com.sun.tools.visualvm.modules.appui.about.AboutDialog; import java.util.logging.Logger; import org.openide.modules.Places; import org.openide.util.Enumerations; import org.openide.util.NbBundle; import org.openide.util.Utilities; import org.openide.windows.WindowManager; public final class AboutAction extends AbstractAction { private final static Logger LOGGER = Logger.getLogger(AboutAction.class.getName()); private String versionString = "Dev"; // Use "Dev" for development builds // NOI18N public AboutAction() { putValue(Action.NAME, NbBundle.getMessage(AboutAction.class, "CTL_AboutAction")); // NOI18N putValue("noIconInMenu", Boolean.TRUE); // NOI18N } public void actionPerformed(final ActionEvent e) { AboutDialog ad = getAboutDialog(); if (ad != null) ad.show(); } static AboutAction getMenuAction() { if (Utilities.isMac()) { return null; } return new AboutAction(); } private AboutDialog getAboutDialog() { if (aboutDialog == null) { try { URL imageURL = getClass().getResource("/com/sun/tools/visualvm/modules/appui/about/image.png"); // NOI18N Image splashImage = Toolkit.getDefaultToolkit().createImage(imageURL); aboutDialog = AboutDialog.createInstance(WindowManager.getDefault().getMainWindow(), splashImage); aboutDialog.setCaption(NbBundle.getMessage(AboutAction.class, "LBL_About_VisualVM")); // NOI18N aboutDialog.setBuildID(NbBundle.getMessage(AboutAction.class, "LBL_Version_Build", new Object[] {versionString,getBuildNumber()})); aboutDialog.setMessage(NbBundle.getMessage(AboutAction.class, "MSG_License") + NbBundle.getMessage(AboutAction.class, "MSG_License1")); aboutDialog.setHTMLMessage(NbBundle.getMessage(AboutAction.class, "MSG_Html_License") + NbBundle.getMessage(AboutAction.class, "MSG_Html_License1")); aboutDialog.setDetails(getDetails()); aboutDialog.setLogfile(getLogfile()); } catch (Exception e) { LOGGER.throwing(AboutAction.class.getName(), "getAboutDialog", e); } } return aboutDialog; } private String getBuildNumber() { if (buildNumber == null) { buildNumber = "unknown"; try { InputStream manifestStream = getClass().getResourceAsStream("/META-INF/MANIFEST.MF"); // NOI18N buildNumber = new Manifest(manifestStream).getMainAttributes().getValue("OpenIDE-Module-Implementation-Version"); // NOI18N } catch (IOException ex) {} } return buildNumber; } private String getLogfile() { String logfilePath = "var/log/messages.log"; // NOI18N File logfile = new File(Places.getUserDirectory(), logfilePath); if (logfile.exists() && logfile.isFile() && logfile.canRead()) return logfile.getAbsolutePath(); else return null; } private String getDetails() { if (details == null) { StringBuffer sb = new StringBuffer(); sb.append("<table border=\"0\">"); // NOI18N sb.append("<tr>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + "<b>Version: </b>" + "</td>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + versionString + " (Build " + getBuildNumber() + "); platform " + System.getProperty("netbeans.buildnumber") + "</td>"); // NOI18N sb.append("</tr>"); // NOI18N sb.append("<tr>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + "<b>System: </b>" + "</td>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + getOSInfo() + "</td>"); // NOI18N sb.append("</tr>"); // NOI18N sb.append("<tr>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + "<b>Java: </b>" + "</td>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + getJavaInfo() + "</td>"); // NOI18N sb.append("</tr>"); // NOI18N sb.append("<tr>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + "<b>Vendor: </b>" + "</td>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + getJavaVendor() + "</td>"); // NOI18N sb.append("</tr>"); // NOI18N sb.append("<tr>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + "<b>Environment: </b>" + "</td>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + getEnvironment() + "</td>"); // NOI18N sb.append("</tr>"); // NOI18N sb.append("<tr>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + "<b>User directory: </b>" + "</td>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + getUserDir() + "</td>"); // NOI18N sb.append("</tr>"); // NOI18N sb.append("<tr>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + "<b>Cache directory: </b>" + "</td>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + Places.getCacheDirectory().getAbsolutePath() + "</td>"); // NOI18N sb.append("</tr>"); // NOI18N sb.append("<tr>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + "<b>Clusters: </b>" + "</td>"); // NOI18N sb.append("<td valign=\"top\" nowrap>" + getIDEInstallValue() + "</td>"); // NOI18N sb.append("</tr>"); // NOI18N sb.append("</table>"); // NOI18N details = sb.toString(); } return details; } private static String getOSInfo() { Properties systemProperties = System.getProperties(); String osName = systemProperties.getProperty("os.name", "<not available>"); // NOI18N String osVersion = systemProperties.getProperty("os.version", ""); // NOI18N String patchLevel = systemProperties.getProperty("sun.os.patch.level", ""); // NOI18N String osArch = systemProperties.getProperty("os.arch", "<not available>"); // NOI18N String sunArch = systemProperties.getProperty("sun.arch.data.model", "?") + "bit"; // NOI18N return osName + " (" + osVersion + ") " + ("unknown".equals(patchLevel) ? "" : patchLevel) + ", " + osArch + " " + sunArch; // NOI18N } private static String getJavaInfo() { Properties systemProperties = System.getProperties(); String javaVersion = systemProperties.getProperty("java.version", "unknown"); // NOI18N String vmName = systemProperties.getProperty("java.vm.name", "<not available>"); // NOI18N String vmVerison = systemProperties.getProperty("java.vm.version", ""); // NOI18N String vmInfo = systemProperties.getProperty("java.vm.info", ""); // NOI18N return javaVersion + "; " + vmName + " (" + vmVerison + ", " + vmInfo + ")"; } private static String getJavaVendor() { Properties systemProperties = System.getProperties(); String javaVendor = systemProperties.getProperty("java.vendor", "unknown"); // NOI18N String javaVendorUrl = systemProperties.getProperty("java.vendor.url", null); // NOI18N return javaVendor + (javaVendorUrl == null ? "" : ", " + javaVendorUrl); // NOI18N } private static String getEnvironment() { String branding = NbBundle.getBranding(); String encoding = System.getProperty("file.encoding", "unknown"); // NOI18N String locale = Locale.getDefault().toString() + (branding == null ? "" : (" (" + branding + ")")); // NOI18N return encoding + "; " + locale; } private static String getUserDir() { File userdirf = Places.getUserDirectory(); String userdir = userdirf != null ? userdirf.getAbsolutePath() : null; return userdir != null ? userdir : "unknown"; // NOI18N } private static String getIDEInstallValue() { String nbhome = System.getProperties().getProperty("netbeans.home"); // NOI18N String nbdirs = System.getProperty("netbeans.dirs"); // NOI18N Enumeration<Object> more; if (nbdirs != null) { more = new StringTokenizer(nbdirs, File.pathSeparator); } else { more = Enumerations.empty(); } Enumeration<Object> all = Enumerations.concat(Enumerations.singleton(nbhome), more); Set<File> files = new HashSet<File>(); StringBuilder sb = new StringBuilder (); String prefix = ""; while (all.hasMoreElements ()) { String s = (String)all.nextElement (); if (s == null) { continue; } File f = (new File(s)); if (files.add (f)) { // new file sb.append (prefix); try { sb.append(f.getCanonicalPath()); } catch (IOException e) { sb.append(f.getAbsolutePath()); } prefix = "\n"; // NOI18N } } return sb.toString (); } private AboutDialog aboutDialog; private String buildNumber; private String details; }