Support JSON for plugin list command
Move the plugin list command implementation to the server, so it can be used from HTTP. Add a format option. Signed-off-by: Brad Larson <bklarson@gmail.com> Change-Id: Ie0621d78eb0f3f0fbd37e9fb42452f027ab7c349
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
// Copyright (C) 2012 The Android Open Source Project
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package com.google.gerrit.server.plugins;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.gerrit.server.OutputFormat;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import com.google.inject.Inject;
|
||||
|
||||
import org.kohsuke.args4j.Option;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.OutputStream;
|
||||
import java.io.OutputStreamWriter;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/** List projects visible to the calling user. */
|
||||
public class ListPlugins {
|
||||
private final PluginLoader pluginLoader;
|
||||
|
||||
@Option(name = "--format", metaVar = "FMT", usage = "Output display format")
|
||||
private OutputFormat format = OutputFormat.TEXT;
|
||||
|
||||
@Inject
|
||||
protected ListPlugins(PluginLoader pluginLoader) {
|
||||
this.pluginLoader = pluginLoader;
|
||||
}
|
||||
|
||||
public OutputFormat getFormat() {
|
||||
return format;
|
||||
}
|
||||
|
||||
public ListPlugins setFormat(OutputFormat fmt) {
|
||||
this.format = fmt;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void display(OutputStream out) {
|
||||
final PrintWriter stdout;
|
||||
try {
|
||||
stdout =
|
||||
new PrintWriter(new BufferedWriter(new OutputStreamWriter(out,
|
||||
"UTF-8")));
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
// Our encoding is required by the specifications for the runtime.
|
||||
throw new RuntimeException("JVM lacks UTF-8 encoding", e);
|
||||
}
|
||||
|
||||
Map<String, PluginInfo> output = Maps.newTreeMap();
|
||||
|
||||
List<Plugin> plugins = Lists.newArrayList(pluginLoader.getPlugins());
|
||||
Collections.sort(plugins, new Comparator<Plugin>() {
|
||||
@Override
|
||||
public int compare(Plugin a, Plugin b) {
|
||||
return a.getName().compareTo(b.getName());
|
||||
}
|
||||
});
|
||||
|
||||
if (!format.isJson()) {
|
||||
stdout.format("%-30s %-10s\n", "Name", "Version");
|
||||
stdout
|
||||
.print("----------------------------------------------------------------------\n");
|
||||
}
|
||||
|
||||
for (Plugin p : plugins) {
|
||||
PluginInfo info = new PluginInfo();
|
||||
info.version = p.getVersion();
|
||||
|
||||
if (format.isJson()) {
|
||||
output.put(p.getName(), info);
|
||||
} else {
|
||||
stdout.format("%-30s %-10s\n", p.getName(),
|
||||
Strings.nullToEmpty(info.version));
|
||||
}
|
||||
}
|
||||
|
||||
if (format.isJson()) {
|
||||
format.newGson().toJson(output,
|
||||
new TypeToken<Map<String, PluginInfo>>() {}.getType(), stdout);
|
||||
stdout.print('\n');
|
||||
}
|
||||
stdout.flush();
|
||||
}
|
||||
|
||||
private static class PluginInfo {
|
||||
String version;
|
||||
}
|
||||
}
|
@@ -14,39 +14,29 @@
|
||||
|
||||
package com.google.gerrit.sshd.commands;
|
||||
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.Lists;
|
||||
import com.google.gerrit.common.data.GlobalCapability;
|
||||
import com.google.gerrit.server.plugins.Plugin;
|
||||
import com.google.gerrit.server.plugins.PluginLoader;
|
||||
import com.google.gerrit.server.plugins.ListPlugins;
|
||||
import com.google.gerrit.sshd.BaseCommand;
|
||||
import com.google.gerrit.sshd.RequiresCapability;
|
||||
import com.google.gerrit.sshd.SshCommand;
|
||||
import com.google.inject.Inject;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import org.apache.sshd.server.Environment;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
@RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
|
||||
final class PluginLsCommand extends SshCommand {
|
||||
final class PluginLsCommand extends BaseCommand {
|
||||
@Inject
|
||||
private PluginLoader loader;
|
||||
private ListPlugins impl;
|
||||
|
||||
@Override
|
||||
protected void run() {
|
||||
List<Plugin> running = Lists.newArrayList(loader.getPlugins());
|
||||
Collections.sort(running, new Comparator<Plugin>() {
|
||||
public void start(Environment env) throws IOException {
|
||||
startThread(new CommandRunnable() {
|
||||
@Override
|
||||
public int compare(Plugin a, Plugin b) {
|
||||
return a.getName().compareTo(b.getName());
|
||||
public void run() throws Exception {
|
||||
parseCommandLine(impl);
|
||||
impl.display(out);
|
||||
}
|
||||
});
|
||||
|
||||
stdout.format("%-30s %-10s\n", "Name", "Version");
|
||||
stdout.print("----------------------------------------------------------------------\n");
|
||||
for (Plugin p : running) {
|
||||
stdout.format("%-30s %-10s\n", p.getName(),
|
||||
Strings.nullToEmpty(p.getVersion()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user