diff options
3 files changed, 77 insertions, 28 deletions
diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java index cf78246e74..4ef9aa18c8 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/Activator.java @@ -24,6 +24,7 @@ import org.osgi.util.tracker.ServiceTracker; */ public class Activator extends Plugin { private static Activator plugin; + private RepositoryCache repositoryCache; /** * @return the singleton {@link Activator} @@ -80,12 +81,21 @@ public class Activator extends Plugin { GitTraceLocation.initializeFromOptions(opts, true); } + repositoryCache = new RepositoryCache(); GitProjectData.reconfigureWindowCache(); GitProjectData.attachToWorkspace(true); } + /** + * @return cache for Repository objects + */ + public RepositoryCache getRepositoryCache() { + return repositoryCache; + } + public void stop(final BundleContext context) throws Exception { GitProjectData.detachFromWorkspace(); + repositoryCache = null; super.stop(context); plugin = null; } diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryCache.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryCache.java new file mode 100644 index 0000000000..ca7f96c3ed --- /dev/null +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/RepositoryCache.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (C) 2010, Jens Baumgart <jens.baumgart@sap.com> + * Copyright (C) 2008, Robin Rosenberg <robin.rosenberg@dewire.com> + * Copyright (C) 2008, Shawn O. Pearce <spearce@spearce.org> + * Copyright (C) 2008, Google Inc. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + *******************************************************************************/ +package org.eclipse.egit.core; + +import java.io.File; +import java.io.IOException; +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import org.eclipse.jgit.lib.Repository; + +/** + * Central cache for Repository instances + * + */ +public class RepositoryCache { + private final Map<File, Reference<Repository>> repositoryCache = new HashMap<File, Reference<Repository>>(); + + RepositoryCache() { + // package private constructor + } + + /** + * + * @param gitDir + * @return an existing instance of Repository for <code>gitDir</code> or a + * new one if no Repository instance for <code>gitDir</code> exists + * in the cache. + * @throws IOException + */ + public synchronized Repository lookupRepository(final File gitDir) + throws IOException { + Reference<Repository> r = repositoryCache.get(gitDir); + Repository d = r != null ? r.get() : null; + if (d == null) { + d = new Repository(gitDir); + repositoryCache.put(gitDir, new WeakReference<Repository>(d)); + } + prune(repositoryCache); + return d; + } + + private static <K, V> void prune(Map<K, Reference<V>> map) { + for (final Iterator<Map.Entry<K, Reference<V>>> i = map.entrySet() + .iterator(); i.hasNext();) { + if (i.next().getValue().get() == null) + i.remove(); + } + } + +} diff --git a/org.eclipse.egit.core/src/org/eclipse/egit/core/project/GitProjectData.java b/org.eclipse.egit.core/src/org/eclipse/egit/core/project/GitProjectData.java index f9b21fa5b5..60550af6ad 100644 --- a/org.eclipse.egit.core/src/org/eclipse/egit/core/project/GitProjectData.java +++ b/org.eclipse.egit.core/src/org/eclipse/egit/core/project/GitProjectData.java @@ -15,13 +15,10 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; -import java.lang.ref.Reference; -import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.Map; import java.util.Properties; import java.util.Set; @@ -40,12 +37,12 @@ import org.eclipse.egit.core.CoreText; import org.eclipse.egit.core.GitCorePreferences; import org.eclipse.egit.core.GitProvider; import org.eclipse.egit.core.internal.trace.GitTraceLocation; -import org.eclipse.osgi.util.NLS; -import org.eclipse.team.core.RepositoryProvider; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.WindowCache; import org.eclipse.jgit.lib.WindowCacheConfig; +import org.eclipse.osgi.util.NLS; +import org.eclipse.team.core.RepositoryProvider; /** * This class keeps information about how a project is mapped to @@ -54,8 +51,6 @@ import org.eclipse.jgit.lib.WindowCacheConfig; public class GitProjectData { private static final Map<IProject, GitProjectData> projectDataCache = new HashMap<IProject, GitProjectData>(); - private static final Map<File, Reference<Repository>> repositoryCache = new HashMap<File, Reference<Repository>>(); - private static Set<RepositoryChangeListener> repositoryChangeListeners = new HashSet<RepositoryChangeListener>(); @SuppressWarnings("synthetic-access") @@ -215,26 +210,6 @@ public class GitProjectData { return projectDataCache.get(p); } - private synchronized static Repository lookupRepository(final File gitDir) - throws IOException { - Reference<Repository> r = repositoryCache.get(gitDir); - Repository d = r != null ? r.get() : null; - if (d == null) { - d = new Repository(gitDir); - repositoryCache.put(gitDir, new WeakReference<Repository>(d)); - } - prune(repositoryCache); - return d; - } - - private static <K, V> void prune(Map<K, Reference<V>> map) { - for (final Iterator<Map.Entry<K, Reference<V>>> i = map.entrySet() - .iterator(); i.hasNext();) { - if (i.next().getValue().get() == null) - i.remove(); - } - } - /** * Update the settings for the global window cache of the workspace. */ @@ -470,7 +445,8 @@ public class GitProjectData { } try { - m.setRepository(lookupRepository(git)); + m.setRepository(Activator.getDefault().getRepositoryCache() + .lookupRepository(git)); } catch (IOException ioe) { Activator.logError(CoreText.GitProjectData_mappedResourceGone, new FileNotFoundException(m.getContainerPath().toString())); |