Automatically register plugin bindings
If a plugin has no modules declared in the manifest, automatically
generate the modules for the plugin based on the class files that
appear in the plugin and the @Export annotations that appear on these
concrete classes.
For any non-abstract command that extends SshCommand (or really the
internal MINA SSHD Command interface that Gerrit uses), plugins may
declare the command with @Export("name") to bind the implementation
as that SSH command, e.g.:
@Export("print-hello")
class Hello extend SshCommand {
Likewise HTTP servlets can also be bound to URLs, but this only works
for standard servlet mappings like "/foo" or "/foo/*". Regex style
bindings must use the Guice ServletModule declared in the manifest:
@Export("/print-hello")
class Hello extends HttpServlet {
Change-Id: Iae4cffcd62d7d2911d3f2705e226fbe21434be68
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
// 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.httpd.plugins;
|
||||
|
||||
import com.google.common.collect.Maps;
|
||||
import com.google.gerrit.extensions.annotations.Export;
|
||||
import com.google.gerrit.server.plugins.InvalidPluginException;
|
||||
import com.google.gerrit.server.plugins.ModuleGenerator;
|
||||
import com.google.inject.Module;
|
||||
import com.google.inject.Scopes;
|
||||
import com.google.inject.servlet.ServletModule;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import javax.servlet.http.HttpServlet;
|
||||
|
||||
class HttpAutoRegisterModuleGenerator extends ServletModule
|
||||
implements ModuleGenerator {
|
||||
private final Map<String, Class<HttpServlet>> serve = Maps.newHashMap();
|
||||
|
||||
@Override
|
||||
protected void configureServlets() {
|
||||
for (Map.Entry<String, Class<HttpServlet>> e : serve.entrySet()) {
|
||||
bind(e.getValue()).in(Scopes.SINGLETON);
|
||||
serve(e.getKey()).with(e.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPluginName(String name) {
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@Override
|
||||
public void export(Export export, Class<?> type)
|
||||
throws InvalidPluginException {
|
||||
if (HttpServlet.class.isAssignableFrom(type)) {
|
||||
Class<HttpServlet> old = serve.get(export.value());
|
||||
if (old != null) {
|
||||
throw new InvalidPluginException(String.format(
|
||||
"@Export(\"%s\") has duplicate bindings:\n %s\n %s",
|
||||
export.value(), old.getName(), type.getName()));
|
||||
}
|
||||
serve.put(export.value(), (Class<HttpServlet>) type);
|
||||
} else {
|
||||
throw new InvalidPluginException(String.format(
|
||||
"Class %s with @Export(\"%s\") must extend %s",
|
||||
type.getName(), export.value(),
|
||||
HttpServlet.class.getName()));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Module create() throws InvalidPluginException {
|
||||
return this;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user