WindowCache: conditional JMX setup

Make it possible to programmatically suppress the JMX bean
registration. In EGit it is not needed but can be rather costly
because it occurs during plug-in activation and accesses the
git user config.

Bug: 563740
Change-Id: I07ef7ae2f0208d177d2a03862846a8efe0191956
Signed-off-by: Thomas Wolf <thomas.wolf@paranor.ch>
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCache.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCache.java
index 852302f..80c8e10 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCache.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/WindowCache.java
@@ -470,7 +470,9 @@
 
 		mbean = new StatsRecorderImpl();
 		statsRecorder = mbean;
-		Monitoring.registerMBean(mbean, "block_cache"); //$NON-NLS-1$
+		if (cfg.getExposeStatsViaJmx()) {
+			Monitoring.registerMBean(mbean, "block_cache"); //$NON-NLS-1$
+		}
 
 		if (maxFiles < 1)
 			throw new IllegalArgumentException(JGitText.get().openFilesMustBeAtLeast1);
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java
index 221353a..a12f652 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/WindowCacheConfig.java
@@ -47,6 +47,8 @@
 
 	private int streamFileThreshold;
 
+	private boolean exposeStats;
+
 	/**
 	 * Create a default configuration.
 	 */
@@ -58,6 +60,7 @@
 		packedGitMMAP = false;
 		deltaBaseCacheLimit = 10 * MB;
 		streamFileThreshold = PackConfig.DEFAULT_BIG_FILE_THRESHOLD;
+		exposeStats = true;
 	}
 
 	/**
@@ -220,6 +223,39 @@
 	}
 
 	/**
+	 * Tell whether the statistics JMX bean should be automatically registered.
+	 * <p>
+	 * Registration of that bean via JMX is additionally subject to a boolean
+	 * JGit-specific user config "jmx.WindowCacheStats". The bean will be
+	 * registered only if this user config is {@code true} <em>and</em>
+	 * {@code getExposeStatsViaJmx() == true}.
+	 * </p>
+	 * <p>
+	 * By default, this returns {@code true} unless changed via
+	 * {@link #setExposeStatsViaJmx(boolean)}.
+	 *
+	 * @return whether to expose WindowCacheStats statistics via JMX upon
+	 *         {@link #install()}
+	 * @since 5.8
+	 */
+	public boolean getExposeStatsViaJmx() {
+		return exposeStats;
+	}
+
+	/**
+	 * Defines whether the statistics JMX MBean should be automatically set up.
+	 * (By default {@code true}.) If set to {@code false}, the JMX monitoring
+	 * bean is not registered.
+	 *
+	 * @param expose
+	 *            whether to register the JMX Bean
+	 * @since 5.8
+	 */
+	public void setExposeStatsViaJmx(boolean expose) {
+		exposeStats = expose;
+	}
+
+	/**
 	 * Update properties by setting fields from the configuration.
 	 * <p>
 	 * If a property is not defined in the configuration, then it is left