Auto register static/init.js as JavaScript plugin

When plugin does not expose Guice Modules explicitly,
auto discover and register static/init.js as WebUi extension
if found by the plugin content scanner.
This simplify JavaScript development from now on
no Java (or other scripting) code/classes are
required to extend Gerrit WebUi.

(based on the idea and initial patch by Dariusz: Ia5b3cb63f62)

Change-Id: I8c793764ac1876dc62d740d28c0d4cf6b9409b10
This commit is contained in:
Luca Milanesio
2014-07-09 10:05:28 +01:00
parent 64802216fa
commit f721eb5772
6 changed files with 67 additions and 7 deletions

View File

@@ -14,14 +14,18 @@
package com.google.gerrit.httpd.plugins;
import static com.google.common.base.Preconditions.checkState;
import static com.google.gerrit.server.plugins.AutoRegisterUtil.calculateBindAnnotation;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.gerrit.extensions.annotations.Export;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.extensions.webui.JavaScriptPlugin;
import com.google.gerrit.extensions.webui.WebUiPlugin;
import com.google.gerrit.server.plugins.HttpModuleGenerator;
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.TypeLiteral;
@@ -33,9 +37,10 @@ import java.util.Map;
import javax.servlet.http.HttpServlet;
class HttpAutoRegisterModuleGenerator extends ServletModule
implements ModuleGenerator {
implements HttpModuleGenerator {
private final Map<String, Class<HttpServlet>> serve = Maps.newHashMap();
private final Multimap<TypeLiteral<?>, Class<?>> listeners = LinkedListMultimap.create();
private String javascript;
@Override
protected void configureServlets() {
@@ -53,6 +58,10 @@ class HttpAutoRegisterModuleGenerator extends ServletModule
Annotation n = calculateBindAnnotation(impl);
bind(type).annotatedWith(n).to(impl);
}
if (javascript != null) {
DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(
new JavaScriptPlugin(javascript));
}
}
@Override
@@ -79,6 +88,14 @@ class HttpAutoRegisterModuleGenerator extends ServletModule
}
}
@Override
public void export(String javascript) {
checkState(this.javascript == null,
"Multiple JavaScript plugins detected: %s, %s", this.javascript,
javascript);
this.javascript = javascript;
}
@Override
public void listen(TypeLiteral<?> tl, Class<?> clazz) {
listeners.put(tl, clazz);

View File

@@ -15,6 +15,7 @@
package com.google.gerrit.httpd.plugins;
import com.google.gerrit.server.cache.CacheModule;
import com.google.gerrit.server.plugins.HttpModuleGenerator;
import com.google.gerrit.server.plugins.ModuleGenerator;
import com.google.gerrit.server.plugins.ReloadPluginListener;
import com.google.gerrit.server.plugins.StartPluginListener;
@@ -37,7 +38,7 @@ public class HttpPluginModule extends ServletModule {
.annotatedWith(UniqueAnnotations.create())
.to(HttpPluginServlet.class);
bind(ModuleGenerator.class)
bind(HttpModuleGenerator.class)
.to(HttpAutoRegisterModuleGenerator.class);
install(new CacheModule() {