diff options
author | Mathias Kinzler <mathias.kinzler@sap.com> | 2010-08-19 09:11:03 +0200 |
---|---|---|
committer | Shawn O. Pearce <spearce@spearce.org> | 2010-08-19 11:36:56 -0700 |
commit | b7388637d80b1a73bf617a3656caea80f5ac682f (patch) | |
tree | 4c52bd6fd8312a2cda2f4098bf3deb5c9d849ae4 /org.eclipse.jgit | |
parent | 75c9b2438594dc6ac125ff1bdf97022c7f429b78 (diff) | |
download | jgit-b7388637d80b1a73bf617a3656caea80f5ac682f.tar.gz jgit-b7388637d80b1a73bf617a3656caea80f5ac682f.zip |
Fix missing Configuration Change eventing
Configuration change events were not being triggered, now they are
forwarded from the FileConfig up to the Repository's listeners.
Change-Id: Ida94a59f5a2b7fa8ae0126e33c13343275483ee5
Signed-off-by: Mathias Kinzler <mathias.kinzler@sap.com>
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'org.eclipse.jgit')
3 files changed, 63 insertions, 0 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java index 2e1ab9a07b..335cada7a3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Config.java @@ -1,4 +1,5 @@ /* + * Copyright (C) 2010, Mathias Kinzler <mathias.kinzler@sap.com> * Copyright (C) 2009, Constantine Plotnikov <constantine.plotnikov@gmail.com> * Copyright (C) 2007, Dave Watson <dwatson@mimvista.com> * Copyright (C) 2008-2010, Google Inc. @@ -62,6 +63,10 @@ import java.util.concurrent.atomic.AtomicReference; import org.eclipse.jgit.JGitText; import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.events.ConfigChangedEvent; +import org.eclipse.jgit.events.ConfigChangedListener; +import org.eclipse.jgit.events.ListenerHandle; +import org.eclipse.jgit.events.ListenerList; import org.eclipse.jgit.util.StringUtils; @@ -74,6 +79,9 @@ public class Config { private static final long MiB = 1024 * KiB; private static final long GiB = 1024 * MiB; + /** the change listeners */ + private final ListenerList listeners = new ListenerList(); + /** * Immutable current state of the configuration data. * <p> @@ -450,6 +458,43 @@ public class Config { state.get().cache.remove(parser); } + /** + * Adds a listener to be notified about changes. + * <p> + * Clients are supposed to remove the listeners after they are done with + * them using the {@link ListenerHandle#remove()} method + * + * @param listener + * the listener + * @return the handle to the registered listener + */ + public ListenerHandle addChangeListener(ConfigChangedListener listener) { + return listeners.addConfigChangedListener(listener); + } + + /** + * Determine whether to issue change events for transient changes. + * <p> + * If <code>true</code> is returned (which is the default behavior), + * {@link #fireConfigChangedEvent()} will be called upon each change. + * <p> + * Subclasses that override this to return <code>false</code> are + * responsible for issuing {@link #fireConfigChangedEvent()} calls + * themselves. + * + * @return <code></code> + */ + protected boolean notifyUponTransientChanges() { + return true; + } + + /** + * Notifies the listeners + */ + protected void fireConfigChangedEvent() { + listeners.dispatch(new ConfigChangedEvent()); + } + private String getRawString(final String section, final String subsection, final String name) { final List<String> lst = getRawStringList(section, subsection, name); @@ -681,6 +726,8 @@ public class Config { src = state.get(); res = replaceStringList(src, section, subsection, name, values); } while (!state.compareAndSet(src, res)); + if (notifyUponTransientChanges()) + fireConfigChangedEvent(); } private State replaceStringList(final State srcState, diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileBasedConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileBasedConfig.java index 8ffbe80cc2..da1f3af603 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileBasedConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileBasedConfig.java @@ -101,6 +101,12 @@ public class FileBasedConfig extends StoredConfig { this.fs = fs; } + @Override + protected boolean notifyUponTransientChanges() { + // we will notify listeners upon save() + return false; + } + /** @return location of the configuration file on disk */ public final File getFile() { return configFile; @@ -159,6 +165,8 @@ public class FileBasedConfig extends StoredConfig { lf.unlock(); } lastModified = lf.getCommitLastModified(); + // notify the listeners + fireConfigChangedEvent(); } @Override diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepository.java index 9ee1e605e2..1452248070 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepository.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/file/FileRepository.java @@ -54,6 +54,8 @@ import java.util.Set; import org.eclipse.jgit.JGitText; import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.events.ConfigChangedEvent; +import org.eclipse.jgit.events.ConfigChangedListener; import org.eclipse.jgit.lib.BaseRepositoryBuilder; import org.eclipse.jgit.lib.ConfigConstants; import org.eclipse.jgit.lib.Constants; @@ -157,6 +159,12 @@ public class FileRepository extends Repository { loadUserConfig(); loadRepoConfig(); + getConfig().addChangeListener(new ConfigChangedListener() { + public void onConfigChanged(ConfigChangedEvent event) { + fireEvent(event); + } + }); + refs = new RefDirectory(this); objectDatabase = new ObjectDirectory(repoConfig, // options.getObjectDirectory(), // |