Enable plugins to listen on updates of plugin project config

Change-Id: I6dbb45ed79385ae7299fb83992072dab57485332
Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
This commit is contained in:
Edwin Kempin
2013-11-17 18:55:48 +01:00
parent fb053c3846
commit b64d397667
3 changed files with 120 additions and 0 deletions

View File

@@ -17,8 +17,23 @@ package com.google.gerrit.server.config;
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.gerrit.extensions.annotations.ExtensionPoint;
import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.extensions.registration.DynamicMap.Entry;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.git.MetaDataUpdate;
import com.google.gerrit.server.git.ProjectConfig;
import com.google.gerrit.server.project.ProjectState;
import com.google.inject.Inject;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.ObjectId;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
@@ -126,4 +141,103 @@ public class ProjectConfigEntry {
public boolean isEditable(ProjectState project) {
return true;
}
public void onUpdate(Project.NameKey project, String oldValue, String newValue) {
}
public void onUpdate(Project.NameKey project, Boolean oldValue, Boolean newValue) {
}
public void onUpdate(Project.NameKey project, Integer oldValue, Integer newValue) {
}
public void onUpdate(Project.NameKey project, Long oldValue, Long newValue) {
}
public static class UpdateChecker implements GitReferenceUpdatedListener {
private static final Logger log = LoggerFactory.getLogger(UpdateChecker.class);
private final MetaDataUpdate.Server metaDataUpdateFactory;
private final DynamicMap<ProjectConfigEntry> pluginConfigEntries;
@Inject
UpdateChecker(MetaDataUpdate.Server metaDataUpdateFactory,
DynamicMap<ProjectConfigEntry> pluginConfigEntries) {
this.metaDataUpdateFactory = metaDataUpdateFactory;
this.pluginConfigEntries = pluginConfigEntries;
}
@Override
public void onGitReferenceUpdated(Event event) {
Project.NameKey p = new Project.NameKey(event.getProjectName());
if (!event.getRefName().equals(RefNames.REFS_CONFIG)) {
return;
}
try {
ProjectConfig oldCfg = parseConfig(p, event.getOldObjectId());
ProjectConfig newCfg = parseConfig(p, event.getNewObjectId());
if (oldCfg != null && newCfg != null) {
for (Entry<ProjectConfigEntry> e : pluginConfigEntries) {
ProjectConfigEntry configEntry = e.getProvider().get();
String newValue = getValue(newCfg, e);
String oldValue = getValue(oldCfg, e);
if ((newValue == null && oldValue == null)
|| (newValue != null && newValue.equals(oldValue))) {
return;
}
switch (configEntry.getType()) {
case BOOLEAN:
configEntry.onUpdate(p, toBoolean(oldValue), toBoolean(newValue));
break;
case INT:
configEntry.onUpdate(p, toInt(oldValue), toInt(newValue));
break;
case LONG:
configEntry.onUpdate(p, toLong(oldValue), toLong(newValue));
break;
case LIST:
case STRING:
default:
configEntry.onUpdate(p, oldValue, newValue);
}
}
}
} catch (IOException | ConfigInvalidException e) {
log.error(String.format(
"Failed to check if plugin config of project %s was updated.",
p.get()), e);
}
}
private ProjectConfig parseConfig(Project.NameKey p, String idStr)
throws IOException, ConfigInvalidException, RepositoryNotFoundException {
ObjectId id = ObjectId.fromString(idStr);
if (ObjectId.zeroId().equals(id)) {
return null;
}
return ProjectConfig.read(metaDataUpdateFactory.create(p), id);
}
private static String getValue(ProjectConfig cfg, Entry<ProjectConfigEntry> e) {
String value = cfg.getPluginConfig(e.getPluginName()).getString(e.getExportName());
if (value == null) {
value = e.getProvider().get().getDefaultValue();
}
return value;
}
}
private static Boolean toBoolean(String value) {
return value != null ? Boolean.parseBoolean(value) : null;
}
private static int toInt(String value) {
return value != null ? Integer.parseInt(value) : null;
}
private static long toLong(String value) {
return value != null ? Long.parseLong(value) : null;
}
}