/*
* FindBugs - Find bugs in Java programs
* Copyright (C) 2003-2005 University of Maryland
*
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package edu.umd.cs.findbugs;
import java.io.InputStream;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Locale;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import javax.annotation.CheckForNull;
import edu.umd.cs.findbugs.cloud.CloudPlugin;
import edu.umd.cs.findbugs.updates.UpdateChecker;
import edu.umd.cs.findbugs.util.FutureValue;
import edu.umd.cs.findbugs.util.Util;
/**
* Version number and release date information.
*/
public class Version {
/**
* Major version number.
*/
public static final int MAJOR = 2;
/**
* Minor version number.
*/
public static final int MINOR = 0;
/**
* Patch level.
*/
public static final int PATCHLEVEL = 3;
/**
* Development version or release candidate?
*/
public static final boolean IS_DEVELOPMENT = false;
/**
* Release candidate number. "0" indicates that the version is not a release
* candidate.
*/
public static final int RELEASE_CANDIDATE = 0;
public static final String SVN_REVISION = System.getProperty("svn.revision", "Unknown");
/**
* Release date.
*/
private static final String COMPUTED_DATE;
public static final String DATE;
public static final String CORE_PLUGIN_RELEASE_DATE;
private static final String COMPUTED_ECLIPSE_DATE;
private static final String COMPUTED_PLUGIN_RELEASE_DATE;
private static String applicationName = "";
private static String applicationVersion = "";
static {
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss z, dd MMMM, yyyy", Locale.ENGLISH);
SimpleDateFormat eclipseDateFormat = new SimpleDateFormat("yyyyMMdd", Locale.ENGLISH);
SimpleDateFormat releaseDateFormat = new SimpleDateFormat(UpdateChecker.PLUGIN_RELEASE_DATE_FMT, Locale.ENGLISH);
Date now = new Date();
COMPUTED_DATE = dateFormat.format(now);
COMPUTED_ECLIPSE_DATE = eclipseDateFormat.format(now);
String tmp = releaseDateFormat.format(now);
COMPUTED_PLUGIN_RELEASE_DATE = tmp;
}
/**
* Preview release number. "0" indicates that the version is not a preview
* release.
*/
public static final int PREVIEW = 0;
private static final String RELEASE_SUFFIX_WORD;
static {
String suffix;
if (RELEASE_CANDIDATE > 0)
suffix = "rc" + RELEASE_CANDIDATE;
else if (PREVIEW > 0)
suffix = "preview" + PREVIEW;
else {
suffix = "dev-" + COMPUTED_ECLIPSE_DATE;
if (!SVN_REVISION.equals("Unknown"))
suffix += "-r" + SVN_REVISION;
}
RELEASE_SUFFIX_WORD = suffix;
}
public static final String RELEASE_BASE = MAJOR + "." + MINOR + "." + PATCHLEVEL;
/**
* Release version string.
*/
public static final String COMPUTED_RELEASE = RELEASE_BASE + (IS_DEVELOPMENT ? "-" + RELEASE_SUFFIX_WORD : "");
/**
* Release version string.
*/
public static final String RELEASE;
/**
* Version of Eclipse plugin.
*/
private static final String COMPUTED_ECLIPSE_UI_VERSION = RELEASE_BASE + "." + COMPUTED_ECLIPSE_DATE;
static {
Class<Version> c = Version.class;
URL u = c.getResource(c.getSimpleName() + ".class");
boolean fromFile = u.getProtocol().equals("file");
InputStream in = null;
String release = null;
String date = null;
String plugin_release_date = null;
if (!fromFile)
try {
Properties versionProperties = new Properties();
in = Version.class.getResourceAsStream("version.properties");
if (in != null) {
versionProperties.load(in);
release = (String) versionProperties.get("release.number");
date = (String) versionProperties.get("release.date");
plugin_release_date = (String) versionProperties.get("plugin.release.date");
}
} catch (Exception e) {
assert true; // ignore
} finally {
Util.closeSilently(in);
}
if (release == null)
release = COMPUTED_RELEASE;
if (date == null)
date = COMPUTED_DATE;
if (plugin_release_date == null)
plugin_release_date = COMPUTED_PLUGIN_RELEASE_DATE;
RELEASE = release;
DATE = date;
CORE_PLUGIN_RELEASE_DATE = plugin_release_date;
Date parsedDate;
try {
SimpleDateFormat fmt = new SimpleDateFormat(UpdateChecker.PLUGIN_RELEASE_DATE_FMT, Locale.ENGLISH);
parsedDate = fmt.parse(CORE_PLUGIN_RELEASE_DATE);
} catch (ParseException e) {
if (SystemProperties.ASSERTIONS_ENABLED)
e.printStackTrace();
parsedDate = null;
}
releaseDate = parsedDate;
}
/**
* FindBugs website.
*/
public static final String WEBSITE = "http://findbugs.sourceforge.net";
/**
* Downloads website.
*/
public static final String DOWNLOADS_WEBSITE = "http://prdownloads.sourceforge.net/findbugs";
/**
* Support email.
*/
public static final String SUPPORT_EMAIL = "http://findbugs.sourceforge.net/reportingBugs.html";
private static Date releaseDate;
public static void registerApplication(String name, String version) {
applicationName = name;
applicationVersion = version;
}
public static @CheckForNull String getApplicationName() {
return applicationName;
}
public static @CheckForNull String getApplicationVersion() {
return applicationVersion;
}
public static void main(String[] argv) throws InterruptedException {
if (!IS_DEVELOPMENT && RELEASE_CANDIDATE != 0) {
throw new IllegalStateException("Non developmental version, but is release candidate " + RELEASE_CANDIDATE);
}
if (argv.length == 0) {
printVersion(false);
return;
}
String arg = argv[0];
if (arg.equals("-release"))
System.out.println(RELEASE);
else if (arg.equals("-date"))
System.out.println(DATE);
else if (arg.equals("-props")) {
System.out.println("release.base=" + RELEASE_BASE);
System.out.println("release.number=" + COMPUTED_RELEASE);
System.out.println("release.date=" + COMPUTED_DATE);
System.out.println("plugin.release.date=" + COMPUTED_PLUGIN_RELEASE_DATE);
System.out.println("eclipse.ui.version=" + COMPUTED_ECLIPSE_UI_VERSION);
System.out.println("findbugs.website=" + WEBSITE);
System.out.println("findbugs.downloads.website=" + DOWNLOADS_WEBSITE);
System.out.println("findbugs.svn.revision=" + SVN_REVISION);
} else if (arg.equals("-plugins")) {
DetectorFactoryCollection.instance();
for(Plugin p : Plugin.getAllPlugins()) {
System.out.println("Plugin: " + p.getPluginId());
System.out.println(" description: " + p.getShortDescription());
System.out.println(" provider: " + p.getProvider());
String version = p.getVersion();
if (version != null && version.length() > 0)
System.out.println(" version: " + version);
String website = p.getWebsite();
if (website != null && website.length() > 0)
System.out.println(" website: " + website);
System.out.println();
}
} else if (arg.equals("-configuration")){
printVersion(true);
} else {
usage();
System.exit(1);
}
}
private static void usage() {
System.err.println("Usage: " + Version.class.getName() + " [(-release|-date|-props|-configuration)]");
}
public static String getReleaseWithDateIfDev() {
if (IS_DEVELOPMENT)
return RELEASE + " (" + DATE + ")";
return RELEASE;
}
public static @CheckForNull Date getReleaseDate() {
return releaseDate;
}
/**
* @param justPrintConfiguration
* @throws InterruptedException
*/
public static void printVersion(boolean justPrintConfiguration) throws InterruptedException {
System.out.println("FindBugs " + Version.COMPUTED_RELEASE);
if (justPrintConfiguration) {
for (Plugin plugin : Plugin.getAllPlugins()) {
System.out.printf("Plugin %s, version %s, loaded from %s%n", plugin.getPluginId(), plugin.getVersion(),
plugin.getPluginLoader().getURL());
if (plugin.isCorePlugin())
System.out.println(" is core plugin");
if (plugin.isInitialPlugin())
System.out.println(" is initial plugin");
if (plugin.isEnabledByDefault())
System.out.println(" is enabled by default");
if (plugin.isGloballyEnabled())
System.out.println(" is globally enabled");
Plugin parent = plugin.getParentPlugin();
if (parent != null) {
System.out.println(" has parent plugin " + parent.getPluginId());
}
for (CloudPlugin cloudPlugin : plugin.getCloudPlugins()) {
System.out.printf(" cloud %s%n", cloudPlugin.getId());
System.out.printf(" %s%n", cloudPlugin.getDescription());
}
for (DetectorFactory factory : plugin.getDetectorFactories()) {
System.out.printf(" detector %s%n", factory.getShortName());
}
System.out.println();
}
printPluginUpdates(true, 10);
} else
printPluginUpdates(false, 3);
}
private static void printPluginUpdates(boolean verbose, int secondsToWait) throws InterruptedException {
DetectorFactoryCollection dfc = DetectorFactoryCollection.instance();
if (dfc.getUpdateChecker().updateChecksGloballyDisabled()) {
if (verbose) {
System.out.println();
System.out.print("Update checking globally disabled");
}
return;
}
if (verbose) {
System.out.println();
System.out.print("Checking for plugin updates...");
}
FutureValue<Collection<UpdateChecker.PluginUpdate>>
updateHolder = dfc.getUpdates();
try {
Collection<UpdateChecker.PluginUpdate> updates = updateHolder.get(secondsToWait, TimeUnit.SECONDS);
if (updates.isEmpty()) {
if (verbose)
System.out.println("none!");
} else {
System.out.println();
for (UpdateChecker.PluginUpdate update : updates) {
System.out.println(update);
System.out.println();
}
}
} catch (TimeoutException e) {
if (verbose)
System.out.println("Timeout while trying to get updates");
}
}
}
// vim:ts=4