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>
This commit is contained in:
Mathias Kinzler 2010-08-19 09:11:03 +02:00 committed by Shawn O. Pearce
parent 75c9b24385
commit b7388637d8
5 changed files with 146 additions and 1 deletions

View File

@ -9,13 +9,14 @@ Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Import-Package: junit.framework;version="[3.8.2,4.0.0)",
junit.textui;version="[3.8.2,4.0.0)",
org.eclipse.jgit.api;version="[0.9.0,0.10.0)",
org.eclipse.jgit;version="[0.9.0,0.10.0)",
org.eclipse.jgit.api;version="[0.9.0,0.10.0)",
org.eclipse.jgit.awtui;version="[0.9.0,0.10.0)",
org.eclipse.jgit.console;version="[0.9.0,0.10.0)",
org.eclipse.jgit.diff;version="[0.9.0,0.10.0)",
org.eclipse.jgit.dircache;version="[0.9.0,0.10.0)",
org.eclipse.jgit.errors;version="[0.9.0,0.10.0)",
org.eclipse.jgit.events;version="[0.9.0,0.10.0)",
org.eclipse.jgit.fnmatch;version="[0.9.0,0.10.0)",
org.eclipse.jgit.http.server;version="[0.9.0,0.10.0)",
org.eclipse.jgit.ignore;version="[0.9.0,0.10.0)",

View File

@ -0,0 +1,81 @@
/*
* Copyright (C) 2010, Mathias Kinzler <mathias.kinzler@sap.com>
* and other copyright owners as documented in the project's IP log.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Distribution License v1.0 which
* accompanies this distribution, is reproduced below, and is
* available at http://www.eclipse.org/org/documents/edl-v10.php
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* - Neither the name of the Eclipse Foundation, Inc. nor the
* names of its contributors may be used to endorse or promote
* products derived from this software without specific prior
* written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.eclipse.jgit.events;
import org.eclipse.jgit.lib.RepositoryTestCase;
import org.eclipse.jgit.storage.file.FileBasedConfig;
public class ConfigChangeEventTest extends RepositoryTestCase {
public void testFileRepository_ChangeEventsOnlyOnSave() throws Exception {
final ConfigChangedEvent[] events = new ConfigChangedEvent[1];
db.getListenerList().addConfigChangedListener(
new ConfigChangedListener() {
public void onConfigChanged(ConfigChangedEvent event) {
events[0] = event;
}
});
FileBasedConfig config = db.getConfig();
assertNull(events[0]);
// set a value to some arbitrary key
config.setString("test", "section", "event", "value");
// no changes until we save
assertNull(events[0]);
config.save();
assertNotNull(events[0]);
// correct repository?
assertEquals(events[0].getRepository(), db);
// reset for the next test
events[0] = null;
// unset the value we have just set above
config.unset("test", "section", "event");
// no changes until we save
assertNull(events[0]);
config.save();
assertNotNull(events[0]);
// correct repository?
assertEquals(events[0].getRepository(), db);
}
}

View File

@ -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 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 void uncache(final SectionParser<?> parser) {
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 void setStringList(final String section, final String subsection,
src = state.get();
res = replaceStringList(src, section, subsection, name, values);
} while (!state.compareAndSet(src, res));
if (notifyUponTransientChanges())
fireConfigChangedEvent();
}
private State replaceStringList(final State srcState,

View File

@ -101,6 +101,12 @@ public FileBasedConfig(Config base, File cfgLocation, FS fs) {
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 void save() throws IOException {
lf.unlock();
}
lastModified = lf.getCommitLastModified();
// notify the listeners
fireConfigChangedEvent();
}
@Override

View File

@ -54,6 +54,8 @@
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 FileRepository(final BaseRepositoryBuilder options) throws IOException {
loadUserConfig();
loadRepoConfig();
getConfig().addChangeListener(new ConfigChangedListener() {
public void onConfigChanged(ConfigChangedEvent event) {
fireEvent(event);
}
});
refs = new RefDirectory(this);
objectDatabase = new ObjectDirectory(repoConfig, //
options.getObjectDirectory(), //