Merge "Support easy access to global plugin configuration in own config file"

This commit is contained in:
Edwin Kempin
2013-11-13 07:18:10 +00:00
committed by Gerrit Code Review
2 changed files with 104 additions and 10 deletions

View File

@@ -497,9 +497,9 @@ $ ssh -p 29418 review.example.com sh ls
$ ssh -p 29418 review.example.com sh ps
----
[[configuration]]
Configuration
-------------
[[simple-configuration]]
Simple Configuration in `gerrit.config`
---------------------------------------
In Gerrit, global configuration is stored in the `gerrit.config` file.
If a plugin needs global configuration, this configuration should be
@@ -509,12 +509,12 @@ This approach of storing the plugin configuration is only suitable for
plugins that have a simple configuration that only consists of
key-value pairs. With this approach it is not possible to have
subsections in the plugin configuration. Plugins that require a complex
configuration need to store their configuration in their own
configuration file where they can make use of subsections. On the other
hand storing the plugin configuration in a 'plugin' subsection in the
`gerrit.config` file has the advantage that administrators have all
configuration parameters in one file, instead of having one
configuration file per plugin.
configuration need to store their configuration in their
link:#configuration[own configuration file] where they can make use of
subsections. On the other hand storing the plugin configuration in a
'plugin' subsection in the `gerrit.config` file has the advantage that
administrators have all configuration parameters in one file, instead
of having one configuration file per plugin.
To avoid conflicts with other plugins, it is recommended that plugins
only use the `plugin` subsection with their own name. For example the
@@ -541,6 +541,49 @@ String language = cfg.getFromGerritConfig("helloworld")
.getString("language", "English");
----
[[configuration]]
Configuration in own config file
--------------------------------
Plugins can store their configuration in an own configuration file.
This makes sense if the plugin configuration is rather complex and
requires the usage of subsections. Plugins that have a simple
key-value pair configuration can store their configuration in a
link:#simple-configuration[`plugin` subsection of the `gerrit.config`
file].
The plugin configuration file must be named after the plugin and must
be located in the `etc` folder of the review site. For example a
configuration file for a `default-reviewer` plugin could look like
this:
.$site_path/etc/default-reviewer.config
----
[branch "refs/heads/master"]
reviewer = Project Owners
reviewer = john.doe@example.com
[match "file:^.*\.txt"]
reviewer = My Info Developers
----
Via the `com.google.gerrit.server.config.PluginConfigFactory` class a
plugin can easily access its configuration:
[source,java]
----
@Inject
private com.google.gerrit.server.config.PluginConfigFactory cfg;
[...]
String[] reviewers = cfg.getGlobalPluginConfig("default-reviewer")
.getStringList("branch", "refs/heads/master", "reviewer");
----
The plugin configuration is loaded only once and is then cached.
Similar to changes in 'gerrit.config', changes to the plugin
configuration file will only become effective after a Gerrit restart.
[[project-specific-configuration]]
Project Specific Configuration
------------------------------

View File

@@ -14,6 +14,7 @@
package com.google.gerrit.server.config;
import com.google.common.collect.Maps;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.project.NoSuchProjectException;
import com.google.gerrit.server.project.ProjectCache;
@@ -21,20 +22,36 @@ import com.google.gerrit.server.project.ProjectState;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.util.FS;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.util.Map;
@Singleton
public class PluginConfigFactory {
private static final Logger log =
LoggerFactory.getLogger(PluginConfigFactory.class);
private final SitePaths site;
private final Config cfg;
private final ProjectCache projectCache;
private final ProjectState.Factory projectStateFactory;
private final Map<String, Config> pluginConfigs;
@Inject
PluginConfigFactory(@GerritServerConfig Config cfg,
PluginConfigFactory(SitePaths site, @GerritServerConfig Config cfg,
ProjectCache projectCache, ProjectState.Factory projectStateFactory) {
this.site = site;
this.cfg = cfg;
this.projectCache = projectCache;
this.projectStateFactory = projectStateFactory;
this.pluginConfigs = Maps.newHashMap();
}
/**
@@ -128,4 +145,38 @@ public class PluginConfigFactory {
return getFromProjectConfig(projectName, pluginName).withInheritance(
projectStateFactory);
}
/**
* Returns the configuration for the specified plugin that is stored in the
* plugin configuration file 'etc/<plugin-name>.config'.
*
* The plugin configuration is only loaded once and is then cached.
*
* @param pluginName the name of the plugin for which the configuration should
* be returned
* @return the plugin configuration from the 'etc/<plugin-name>.config' file
*/
public Config getGlobalPluginConfig(String pluginName) {
if (pluginConfigs.containsKey(pluginName)) {
return pluginConfigs.get(pluginName);
}
File pluginConfigFile = new File(site.etc_dir, pluginName + ".config");
FileBasedConfig cfg = new FileBasedConfig(pluginConfigFile, FS.DETECTED);
pluginConfigs.put(pluginName, cfg);
if (!cfg.getFile().exists()) {
log.info("No " + pluginConfigFile.getAbsolutePath() + "; assuming defaults");
return cfg;
}
try {
cfg.load();
} catch (IOException e) {
log.warn("Failed to load " + pluginConfigFile.getAbsolutePath(), e);
} catch (ConfigInvalidException e) {
log.warn("Failed to load " + pluginConfigFile.getAbsolutePath(), e);
}
return cfg;
}
}